diff --git a/BUILD.gn b/BUILD.gn index 2a1fb96a..d27a3d8ef 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -1228,9 +1228,6 @@ # https://chromium.googlesource.com/chromium/src/+/main/docs/testing/web_tests.md script_test("blink_web_tests") { - if (is_mac) { - run_under_python2 = true - } script = _common_web_test_script args = _common_web_test_args @@ -1315,6 +1312,7 @@ "//third_party/blink/web_tests/scrollbars/", "//third_party/blink/web_tests/scrollingcoordinator/", "//third_party/blink/web_tests/security/", + "//third_party/blink/web_tests/handwriting/", "//third_party/blink/web_tests/shadow-dom/", "//third_party/blink/web_tests/storage/", "//third_party/blink/web_tests/svg/", @@ -1376,8 +1374,6 @@ } script_test("devtools_web_tests") { - run_under_python2 = true - # This target differs from :blink_web_tests in that it uses the # same test harness but runs an entirely different set of tests # and doesn't have a dependency on the web_test directory at all. @@ -1395,8 +1391,6 @@ } script_test("webgpu_blink_web_tests") { - run_under_python2 = true - # This target differs from :blink_web_tests in that it uses the same # test harness and a few additional flags but, more importantly, only runs # the web_tests/wpt_internal/webgpu tests, so it doesn't have a data
diff --git a/DEPS b/DEPS index 1dc154cb..b324f1d 100644 --- a/DEPS +++ b/DEPS
@@ -239,11 +239,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': 'c307c5566d11d2bd6de84ade4fc3cb8c026fa627', + 'skia_revision': 'b4d01cbe41b1b9bfdd6ba8603e457293210cfb32', # 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': '4f8420cf9e3d16e48b0abae6a365466f0fff2915', + 'v8_revision': 'e218afa8473132b56a9e1532be7920dd130aeb7e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -251,11 +251,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': 'a4232c15e287a38b93d2a55bd1d7894cb4effac3', + 'swiftshader_revision': '4625f84e8d56feaf9ba0122f49a04f9cccbad909', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'cc766ddbbfd6db6c54f854c07a60ca1e5886104b', + 'pdfium_revision': '7555375264d234a42305f85d37999d1f8b656099', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -270,7 +270,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling googletest # and whatever else without interference from each other. - 'googletest_revision': '4c5650f68866e3c2e60361d5c4c95c6f335fb64b', + 'googletest_revision': '054a986a8513149e8374fc669a5fe40117ca6b41', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling lighttpd # and whatever else without interference from each other. @@ -306,7 +306,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': 'fcd455d2e403f6ffd4e893131119af007dccadc7', + 'catapult_revision': 'd16203a89ed9ac8af19f92a11e4c2cea48744d99', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -314,7 +314,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': 'dc4a43902dde2bfa61f0b00cd830ae3c7d079a78', + 'devtools_frontend_revision': 'a0f5d966740ebe948b79cdf1ed05a0ddd74f3a2d', # 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. @@ -354,7 +354,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': '370e6bd7341034c840bbea8e2bd017ceab0257ea', + 'dawn_revision': '3b06c01bbb4394e92f0223d2d54dca17ad5a8eeb', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -402,7 +402,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. - 'libunwind_revision': 'c8c0ec928e46328fa284e7290c4ef052c7d285d4', + 'libunwind_revision': 'd81cd6236cd771e78d7e1a1807404ef3f1d21820', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -421,7 +421,7 @@ 'libcxx_revision': '79a2e924d96e2fc1e4b937c42efd08898fa472d7', # GN CIPD package version. - 'gn_version': 'git_revision:fc295f3ac7ca4fe7acc6cb5fb052d22909ef3a8f', + 'gn_version': 'git_revision:a754274e2bb5c67349fa78451e8b6a8cdf94a078', } # Only these hosts are allowed for dependencies in this DEPS file. @@ -608,7 +608,7 @@ Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248', 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + 'bdf47bc33c3c0b32c9a5b0306f0e0c94baff08a4', + 'url': Var('chromium_git') + '/website.git' + '@' + '1edba759b3139ce6bfef223fc969b6a472ed68a1', }, 'src/ios/third_party/earl_grey2/src': { @@ -796,7 +796,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'PgnGqqy0bbqQJKzX07UHW_YOERUm1QSGiUErq2_HN84C', + 'version': 'ZXiG8aqK-I4SG-IHCzog9Uk1AUWULpee7Wo5OGj3sSYC', }, ], 'condition': 'checkout_android', @@ -1047,7 +1047,7 @@ Var('chromium_git') + '/external/gitlab.com/libeigen/eigen.git' + '@' + '163f11e24a1011ac8ba1cecfaf53e9b11ace5f5c', 'src/third_party/emoji-metadata/src': { - 'url': Var('chromium_git') + '/external/github.com/googlefonts/emoji-metadata' + '@' + '61428030e0f71dfb7bfae8d7742c60f45b7d3d0c', + 'url': Var('chromium_git') + '/external/github.com/googlefonts/emoji-metadata' + '@' + '84fcb4151d2d110abfb4451369469048f28b73ff', 'condition': 'checkout_chromeos', }, @@ -1304,7 +1304,7 @@ }, 'src/third_party/libvpx/source/libvpx': - Var('chromium_git') + '/webm/libvpx.git' + '@' + '13f984c2162d8392d3fd0ffb8666ee518f60665a', + Var('chromium_git') + '/webm/libvpx.git' + '@' + 'ab35ee100a38347433af24df05a5e1578172a2ae', 'src/third_party/libwebm/source': Var('chromium_git') + '/webm/libwebm.git' + '@' + 'e4fbea0c9751ae8aa86629b197a28d8276a2b0da', @@ -1418,7 +1418,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '496f94a1281c8430d4657b6df90b72fcbcc0b3c6', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '514135fb1a37ba15cf7daad4918e17cfc1724de4', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1600,7 +1600,7 @@ 'src/third_party/usrsctp/usrsctplib': Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '62d7d0c928c9a040dce96aa2f16c00e7e67d59cb', - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@befff92adbd2455e6eca3599a9cd089c4b12bdd5', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@38603b300bcee065a9d9f0203eb389775a06e1ee', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '5e49f57a6e71a026a54eb42e366de09a4142d24e', @@ -1697,7 +1697,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@4f888a3599e27fb57ac630613be09547b6951881', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@06ee9744c78f2927d013d075ba6740945d02dfcd', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/SaveRestoreStateTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/SaveRestoreStateTest.java index b83f7df7..1d78377e 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/SaveRestoreStateTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/SaveRestoreStateTest.java
@@ -4,6 +4,7 @@ package org.chromium.android_webview.test; +import android.os.Build; import android.os.Bundle; import android.support.test.InstrumentationRegistry; @@ -18,6 +19,7 @@ import org.chromium.android_webview.AwContents; import org.chromium.android_webview.test.util.CommonResources; +import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.Feature; import org.chromium.content_public.browser.NavigationController; import org.chromium.content_public.browser.NavigationHistory; @@ -143,6 +145,8 @@ @Test @SmallTest + @DisableIf. + Build(sdk_is_less_than = Build.VERSION_CODES.N, message = "https://crbug.com/1275392") @Feature({"AndroidWebView"}) public void testSaveRestoreStateWithHistoryItemList() throws Throwable { setServerResponseAndLoad(mVars, NUM_NAVIGATIONS);
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn index be71da9..0a53b2c 100644 --- a/android_webview/test/BUILD.gn +++ b/android_webview/test/BUILD.gn
@@ -40,7 +40,6 @@ script_test("system_webview_crx_smoke_tests") { script = "//android_webview/test/components/run_webview_component_smoketest.py" - run_under_python2 = true args = [ "--webview-package-name=$system_webview_package_name" ] data = [ "//android_webview/test/components/crx_smoke_tests.py" ] data_deps = [
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc index 55ac307c..db188c86 100644 --- a/ash/app_list/app_list_controller_impl.cc +++ b/ash/app_list/app_list_controller_impl.cc
@@ -1186,6 +1186,38 @@ } } + const bool is_tablet_mode = IsTabletMode(); + switch (launched_from) { + case AppListLaunchedFrom::kLaunchedFromSearchBox: + switch (launch_type) { + case AppListLaunchType::kSearchResult: + RecordLauncherWorkflowMetrics(AppListUserAction::kOpenSearchResult, + is_tablet_mode, last_show_timestamp_); + break; + case AppListLaunchType::kAppSearchResult: + RecordLauncherWorkflowMetrics(AppListUserAction::kOpenAppSearchResult, + is_tablet_mode, last_show_timestamp_); + break; + case AppListLaunchType::kApp: + NOTREACHED(); + break; + } + break; + case AppListLaunchedFrom::kLaunchedFromSuggestionChip: + RecordLauncherWorkflowMetrics(AppListUserAction::kOpenSuggestionChip, + is_tablet_mode, last_show_timestamp_); + break; + case AppListLaunchedFrom::kLaunchedFromContinueTask: + RecordLauncherWorkflowMetrics(AppListUserAction::kOpenContinueSectionTask, + is_tablet_mode, last_show_timestamp_); + break; + case AppListLaunchedFrom::kLaunchedFromGrid: + case AppListLaunchedFrom::kLaunchedFromRecentApps: + case AppListLaunchedFrom::kLaunchedFromShelf: + NOTREACHED(); + break; + } + UMA_HISTOGRAM_ENUMERATION("Apps.AppListSearchResultOpenDisplayType", result->display_type(), SearchResultDisplayType::kLast); @@ -1283,6 +1315,24 @@ AppListLaunchedFrom launched_from) { RecordAppLaunched(launched_from); + const bool is_tablet_mode = IsTabletMode(); + switch (launched_from) { + case AppListLaunchedFrom::kLaunchedFromGrid: + RecordLauncherWorkflowMetrics(AppListUserAction::kAppLaunchFromAppsGrid, + is_tablet_mode, last_show_timestamp_); + break; + case AppListLaunchedFrom::kLaunchedFromRecentApps: + RecordLauncherWorkflowMetrics(AppListUserAction::kAppLaunchFromRecentApps, + is_tablet_mode, last_show_timestamp_); + break; + case AppListLaunchedFrom::kLaunchedFromSuggestionChip: + case AppListLaunchedFrom::kLaunchedFromContinueTask: + case AppListLaunchedFrom::kLaunchedFromSearchBox: + case AppListLaunchedFrom::kLaunchedFromShelf: + NOTREACHED(); + break; + } + if (client_) client_->ActivateItem(profile_id_, id, event_flags); @@ -1495,6 +1545,7 @@ metric_params->app_list_view_state = GetAppListViewState(); metric_params->is_tablet_mode = IsTabletMode(); metric_params->app_list_shown = last_visible_; + metric_params->launcher_show_timestamp = last_show_timestamp_; } gfx::Rect AppListControllerImpl::SnapBoundsToDisplayEdge( @@ -1599,6 +1650,9 @@ last_visible_display_id_ = display_id; + if (visible) + last_show_timestamp_ = base::TimeTicks::Now(); + AppListView* const app_list_view = fullscreen_presenter_->GetView(); if (app_list_view) { app_list_view->UpdatePageResetTimer(real_visibility);
diff --git a/ash/app_list/app_list_controller_impl.h b/ash/app_list/app_list_controller_impl.h index 32d50372..7255b35f 100644 --- a/ash/app_list/app_list_controller_impl.h +++ b/ash/app_list/app_list_controller_impl.h
@@ -502,6 +502,9 @@ // change before the metric is recorded. absl::optional<bool> recorded_app_list_visibility_; + // The last time the app list was shown. + absl::optional<base::TimeTicks> last_show_timestamp_; + // ScopedClosureRunner which while in scope keeps background blur in home // screen (in particular, apps container suggestion chips background) // disabled. Set while home screen transitions are in progress.
diff --git a/ash/app_list/app_list_metrics.cc b/ash/app_list/app_list_metrics.cc index 816f3fe..1cbd5b0 100644 --- a/ash/app_list/app_list_metrics.cc +++ b/ash/app_list/app_list_metrics.cc
@@ -61,6 +61,31 @@ // disabled in clamshell mode) and the Shelf. constexpr char kAppListAppLaunched[] = "Apps.AppListAppLaunchedV2"; +// UMA histograms that log app launches within the app list, and the shelf. +// Split depending on whether tablet mode is active or not. +constexpr char kAppLaunchInTablet[] = "Apps.AppList.AppLaunched.TabletMode"; +constexpr char kAppLaunchInClamshell[] = + "Apps.AppList.AppLaunched.ClamshellMode"; + +// UMA histograms that log launcher workflow actions (launching an app, search +// result, or a continue section task) in the app list UI. Split depending on +// whether tablet mode is active or not. Note that unlike `kAppListAppLaunched` +// histograms, these do not include actions from shelf, but do include non-app +// launch actions. +constexpr char kLauncherUserActionInTablet[] = + "Apps.AppList.UserAction.TabletMode"; +constexpr char kLauncherUserActionInClamshell[] = + "Apps.AppList.UserAction.ClamshellMode"; + +// UMA histograms that log time elapsed from launcher getting shown at the time +// of an user taking a launcher workflow action (launching an app, search +// result, or a continue section task) in the app list UI. Split depending on +// whether tablet mode is active or not. +constexpr char kTimeToLauncherUserActionInTablet[] = + "Apps.AppList.TimeToUserAction.TabletMode"; +constexpr char kTimeToLauncherUserActionInClamshell[] = + "Apps.AppList.TimeToUserAction.ClamshellMode"; + // The UMA histograms that log app launches within the AppList, AppListBubble // and Shelf. The app launches are divided by histogram for each of the the // different AppList states. @@ -95,6 +120,21 @@ kMaxApplistSearchResultOpenedSource = 3, }; +AppLaunchedMetricParams::AppLaunchedMetricParams() = default; + +AppLaunchedMetricParams::AppLaunchedMetricParams( + const AppLaunchedMetricParams&) = default; + +AppLaunchedMetricParams& AppLaunchedMetricParams::operator=( + const AppLaunchedMetricParams&) = default; + +AppLaunchedMetricParams::AppLaunchedMetricParams( + AppListLaunchedFrom launched_from, + AppListLaunchType launch_type) + : launched_from(launched_from), launch_type(launch_type) {} + +AppLaunchedMetricParams::~AppLaunchedMetricParams() = default; + void AppListRecordPageSwitcherSourceByEventType(ui::EventType type, bool is_tablet_mode) { AppListPageSwitcherSource source; @@ -224,6 +264,13 @@ bool app_list_shown) { UMA_HISTOGRAM_ENUMERATION(kAppListAppLaunched, launched_from); + if (is_tablet_mode) { + base::UmaHistogramEnumeration(kAppLaunchInTablet, launched_from); + + } else { + base::UmaHistogramEnumeration(kAppLaunchInClamshell, launched_from); + } + if (features::IsProductivityLauncherEnabled() && !is_tablet_mode) { if (!app_list_shown) { UMA_HISTOGRAM_ENUMERATION(kAppListAppLaunchedClosed, launched_from); @@ -284,6 +331,29 @@ } } +ASH_EXPORT void RecordLauncherWorkflowMetrics( + AppListUserAction action, + bool is_tablet_mode, + absl::optional<base::TimeTicks> launcher_show_time) { + if (is_tablet_mode) { + base::UmaHistogramEnumeration(kLauncherUserActionInTablet, action); + + if (launcher_show_time) { + base::UmaHistogramMediumTimes( + kTimeToLauncherUserActionInTablet, + base::TimeTicks::Now() - *launcher_show_time); + } + } else { + base::UmaHistogramEnumeration(kLauncherUserActionInClamshell, action); + + if (launcher_show_time) { + base::UmaHistogramMediumTimes( + kTimeToLauncherUserActionInClamshell, + base::TimeTicks::Now() - *launcher_show_time); + } + } +} + bool IsCommandIdAnAppLaunch(int command_id_number) { CommandId command_id = static_cast<CommandId>(command_id_number);
diff --git a/ash/app_list/app_list_metrics.h b/ash/app_list/app_list_metrics.h index ae83544..410ec72 100644 --- a/ash/app_list/app_list_metrics.h +++ b/ash/app_list/app_list_metrics.h
@@ -8,6 +8,7 @@ #include "ash/ash_export.h" #include "ash/public/cpp/app_list/app_list_types.h" #include "base/time/time.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/events/event.h" namespace ash { @@ -182,14 +183,47 @@ kFadeOutOverview, }; +// Different actions that complete a user workflow within the launcher UI. +// Used as bucket values in histograms that track completed user actions within +// the launcher - do not remove/renumber existing items. +enum class AppListUserAction { + // User launched an app from the apps grid within the app list UI. + kAppLaunchFromAppsGrid = 0, + + // User launched an app from list of recent apps within the app list UI. + kAppLaunchFromRecentApps = 1, + + // User opened a non-app search result from the app list search results page. + kOpenSearchResult = 2, + + // User opened an app search result from the app list search result page. + kOpenAppSearchResult = 3, + + // User opened an item shown in continue section within the app list UI. + kOpenContinueSectionTask = 4, + + // User opened a suggestion chip shown in the app list UI. + kOpenSuggestionChip = 5, + + kMaxValue = kOpenSuggestionChip, +}; + // Parameters to call RecordAppListAppLaunched. Passed to code that does not // directly have access to them, such ash AppListMenuModelAdapter. struct AppLaunchedMetricParams { + AppLaunchedMetricParams(); + AppLaunchedMetricParams(AppListLaunchedFrom launched_from, + AppListLaunchType launch_type); + AppLaunchedMetricParams(const AppLaunchedMetricParams&); + AppLaunchedMetricParams& operator=(const AppLaunchedMetricParams&); + ~AppLaunchedMetricParams(); + AppListLaunchedFrom launched_from = AppListLaunchedFrom::kLaunchedFromGrid; - AppListLaunchType search_launch_type = AppListLaunchType::kSearchResult; + AppListLaunchType launch_type = AppListLaunchType::kSearchResult; AppListViewState app_list_view_state = AppListViewState::kClosed; bool is_tablet_mode = false; bool app_list_shown = false; + absl::optional<base::TimeTicks> launcher_show_timestamp; }; void AppListRecordPageSwitcherSourceByEventType(ui::EventType type, @@ -223,6 +257,11 @@ bool is_tablet_mode, bool app_list_shown); +ASH_EXPORT void RecordLauncherWorkflowMetrics( + AppListUserAction action, + bool is_tablet_mode, + absl::optional<base::TimeTicks> launcher_show_time); + ASH_EXPORT bool IsCommandIdAnAppLaunch(int command_id); ASH_EXPORT void ReportPaginationSmoothness(bool is_tablet_mode, int smoothness);
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc index 5b72ee501..b1b2565 100644 --- a/ash/app_list/views/app_list_item_view.cc +++ b/ash/app_list/views/app_list_item_view.cc
@@ -665,23 +665,26 @@ // Anchor the menu to the same rect that is used for selection highlight. AdaptBoundsForSelectionHighlight(&anchor_rect); - AppLaunchedMetricParams metric_params = { - AppListLaunchedFrom::kLaunchedFromGrid}; - view_delegate_->GetAppLaunchedMetricParams(&metric_params); - // Assign the correct app type to `item_menu_model_adapter_` according to the // parent view of the app list item view. AppListMenuModelAdapter::AppListViewAppType app_type; + AppLaunchedMetricParams metric_params; switch (context_) { case Context::kAppsGridView: app_type = features::IsProductivityLauncherEnabled() ? AppListMenuModelAdapter::PRODUCTIVITY_LAUNCHER_APP_GRID : AppListMenuModelAdapter::FULLSCREEN_APP_GRID; + metric_params.launched_from = AppListLaunchedFrom::kLaunchedFromGrid; + metric_params.launch_type = AppListLaunchType::kApp; break; case Context::kRecentAppsView: app_type = AppListMenuModelAdapter::PRODUCTIVITY_LAUNCHER_RECENT_APP; + metric_params.launched_from = + AppListLaunchedFrom::kLaunchedFromRecentApps; + metric_params.launch_type = AppListLaunchType::kAppSearchResult; break; } + view_delegate_->GetAppLaunchedMetricParams(&metric_params); item_menu_model_adapter_ = std::make_unique<AppListMenuModelAdapter>( item_weak_->GetMetadata()->id, std::move(menu_model), GetWidget(),
diff --git a/ash/app_list/views/app_list_menu_model_adapter.cc b/ash/app_list/views/app_list_menu_model_adapter.cc index bca193af..c330ba7b 100644 --- a/ash/app_list/views/app_list_menu_model_adapter.cc +++ b/ash/app_list/views/app_list_menu_model_adapter.cc
@@ -206,19 +206,41 @@ if (!IsCommandIdAnAppLaunch(command_id)) return; - // Note that |search_launch_type| only matters when |launched_from| is - // kLaunchedFromSearchBox. Early out if it is not launched as an app search - // result. - if (metric_params_.launched_from == - AppListLaunchedFrom::kLaunchedFromSearchBox && - metric_params_.search_launch_type != - AppListLaunchType::kAppSearchResult) { - return; - } + switch (metric_params_.launch_type) { + case AppListLaunchType::kSearchResult: + break; + case AppListLaunchType::kAppSearchResult: + case AppListLaunchType::kApp: + RecordAppListAppLaunched( + metric_params_.launched_from, metric_params_.app_list_view_state, + metric_params_.is_tablet_mode, metric_params_.app_list_shown); - RecordAppListAppLaunched( - metric_params_.launched_from, metric_params_.app_list_view_state, - metric_params_.is_tablet_mode, metric_params_.app_list_shown); + switch (metric_params_.launched_from) { + case AppListLaunchedFrom::kLaunchedFromGrid: + RecordLauncherWorkflowMetrics( + AppListUserAction::kAppLaunchFromAppsGrid, + metric_params_.is_tablet_mode, + metric_params_.launcher_show_timestamp); + break; + case AppListLaunchedFrom::kLaunchedFromRecentApps: + RecordLauncherWorkflowMetrics( + AppListUserAction::kAppLaunchFromRecentApps, + metric_params_.is_tablet_mode, + metric_params_.launcher_show_timestamp); + break; + case AppListLaunchedFrom::kLaunchedFromSearchBox: + RecordLauncherWorkflowMetrics(AppListUserAction::kOpenAppSearchResult, + metric_params_.is_tablet_mode, + metric_params_.launcher_show_timestamp); + break; + case AppListLaunchedFrom::kLaunchedFromSuggestionChip: + case AppListLaunchedFrom::kLaunchedFromContinueTask: + case AppListLaunchedFrom::kLaunchedFromShelf: + NOTREACHED(); + break; + } + break; + } } } // namespace ash
diff --git a/ash/app_list/views/continue_task_view.cc b/ash/app_list/views/continue_task_view.cc index 8f4246b..9e767ec 100644 --- a/ash/app_list/views/continue_task_view.cc +++ b/ash/app_list/views/continue_task_view.cc
@@ -262,8 +262,8 @@ DCHECK(result()); view_delegate_->OpenSearchResult( result()->id(), result()->result_type(), event_flags, - AppListLaunchedFrom::kLaunchedFromSuggestionChip, - AppListLaunchType::kAppSearchResult, index_in_container(), + AppListLaunchedFrom::kLaunchedFromContinueTask, + AppListLaunchType::kSearchResult, index_in_container(), false /* launch_as_default */); }
diff --git a/ash/app_list/views/recent_apps_view.cc b/ash/app_list/views/recent_apps_view.cc index a020e76..56e39eb 100644 --- a/ash/app_list/views/recent_apps_view.cc +++ b/ash/app_list/views/recent_apps_view.cc
@@ -58,14 +58,6 @@ return app_id; } -// Returns true if `type` is an application result. -bool IsAppType(AppListSearchResultType type) { - return type == AppListSearchResultType::kInstalledApp || - type == AppListSearchResultType::kPlayStoreApp || - type == AppListSearchResultType::kInstantApp || - type == AppListSearchResultType::kInternalApp; -} - // Returns a list of recent apps by filtering suggestion chip data. // TODO(crbug.com/1216662): Replace with a real implementation after the ML team // gives us a way to query directly for recent apps. @@ -73,7 +65,7 @@ SearchModel* search_model) { SearchModel::SearchResults* results = search_model->results(); auto is_app_suggestion = [](const SearchResult& r) -> bool { - return IsAppType(r.result_type()) && + return IsAppListSearchResultAnApp(r.result_type()) && r.display_type() == SearchResultDisplayType::kList; }; std::vector<SearchResult*> app_suggestion_results =
diff --git a/ash/app_list/views/search_result_list_view.cc b/ash/app_list/views/search_result_list_view.cc index 1cf65ae0..d5c7a17 100644 --- a/ash/app_list/views/search_result_list_view.cc +++ b/ash/app_list/views/search_result_list_view.cc
@@ -383,10 +383,14 @@ GetSearchResultsForLogging(search_result_views_), view->index_in_container()); + AppListLaunchType launch_type = + IsAppListSearchResultAnApp(result->result_type()) + ? AppListLaunchType::kAppSearchResult + : AppListLaunchType::kSearchResult; view_delegate_->OpenSearchResult( result->id(), result->result_type(), event_flags, - AppListLaunchedFrom::kLaunchedFromSearchBox, - AppListLaunchType::kSearchResult, -1 /* suggestion_index */, + AppListLaunchedFrom::kLaunchedFromSearchBox, launch_type, + -1 /* suggestion_index */, !by_button_press && view->is_default_result() /* launch_as_default */); }
diff --git a/ash/app_list/views/search_result_tile_item_view.cc b/ash/app_list/views/search_result_tile_item_view.cc index f4cf2ac..c23a6d4 100644 --- a/ash/app_list/views/search_result_tile_item_view.cc +++ b/ash/app_list/views/search_result_tile_item_view.cc
@@ -353,9 +353,9 @@ gfx::Rect anchor_rect = gfx::ToEnclosingRect(GetSelectionRingBounds()); views::View::ConvertRectToScreen(this, &anchor_rect); - AppLaunchedMetricParams metric_params = { + AppLaunchedMetricParams metric_params( AppListLaunchedFrom::kLaunchedFromSearchBox, - AppListLaunchType::kAppSearchResult}; + AppListLaunchType::kAppSearchResult); view_delegate_->GetAppLaunchedMetricParams(&metric_params); context_menu_ = std::make_unique<AppListMenuModelAdapter>(
diff --git a/ash/capture_mode/capture_mode_session.cc b/ash/capture_mode/capture_mode_session.cc index cd3e517..bfa4ae1 100644 --- a/ash/capture_mode/capture_mode_session.cc +++ b/ash/capture_mode/capture_mode_session.cc
@@ -22,6 +22,7 @@ #include "ash/constants/ash_features.h" #include "ash/display/mouse_cursor_event_filter.h" #include "ash/display/screen_orientation_controller.h" +#include "ash/keyboard/ui/keyboard_ui_controller.h" #include "ash/projector/projector_controller_impl.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/resources/vector_icons/vector_icons.h" @@ -655,20 +656,7 @@ void CaptureModeSession::OnWaitingForDlpConfirmationStarted() { is_waiting_for_dlp_confirmation_ = true; - cursor_setter_.reset(); - - for (auto* widget : GetAvailableWidgets()) { - // The order here matters. We need to disable the animation before we hide - // to avoid any hide animation here, or until the widgets are shown (also - // without animation) when OnWaitingForDlpConfirmationEnded() is called. - widget->GetNativeWindow()->SetProperty(aura::client::kAnimationsDisabledKey, - true); - widget->Hide(); - } - - // Refresh painting the layer, since we don't paint anything while a DLP - // dialog might be shown. - layer()->SchedulePaint(layer()->bounds()); + HideAllUis(); } void CaptureModeSession::OnWaitingForDlpConfirmationEnded(bool will_proceed) { @@ -685,20 +673,7 @@ // continue the capture operation, it doesn't always mean the session is // ending immediately, since we may proceed to the 3-second countdown, for // which the capture mode UIs need to be returned back to normal. - - cursor_setter_ = std::make_unique<CursorSetter>(); - - for (auto* widget : GetAvailableWidgets()) { - // The order here matters. See OnWaitingForDlpConfirmationStarted() above. - // At this point the animation is still disabled, so we show the window now - // before we re-enable the animations. This is to avoid having those widgets - // show up in the captured images or videos. - widget->Show(); - widget->GetNativeWindow()->SetProperty(aura::client::kAnimationsDisabledKey, - false); - } - - layer()->SchedulePaint(layer()->bounds()); + ShowAllUis(); } void CaptureModeSession::SetSettingsMenuShown(bool shown) { @@ -807,7 +782,6 @@ void CaptureModeSession::OpenFolderSelectionDialog() { DCHECK(!folder_selection_dialog_controller_); - cursor_setter_.reset(); folder_selection_dialog_controller_ = std::make_unique<FolderSelectionDialogController>(/*delegate=*/this, current_root_); @@ -843,8 +817,7 @@ } void CaptureModeSession::OnPaintLayer(const ui::PaintContext& context) { - // We don't paint anything while a DLP system-modal dialog might be shown. - if (is_waiting_for_dlp_confirmation_) + if (!is_all_uis_visible_) return; ui::PaintRecorder recorder(context, layer()->size()); @@ -1016,18 +989,30 @@ } } +void CaptureModeSession::OnSelectionWindowAdded() { + // Hide all the capture session UIs so that they don't show on top of the + // selection dialog window and block it. + HideAllUis(); +} + void CaptureModeSession::OnSelectionWindowClosed() { DCHECK(folder_selection_dialog_controller_); + + ShowAllUis(); + const bool did_user_select_a_folder = folder_selection_dialog_controller_->did_user_select_a_folder(); folder_selection_dialog_controller_.reset(); - cursor_setter_ = std::make_unique<CursorSetter>(); // If the selection window is closed by user selecting a folder, no need to // update the capture folder settings menu here, since it's covered by // `SetCustomCaptureFolder` via `OnFolderSelected`. if (!did_user_select_a_folder) OnCaptureFolderMayHaveChanged(); + + // Explicitly hide any virtual keyboard that may have remained open from + // interacting with the dialog selection window. + keyboard::KeyboardUIController::Get()->HideKeyboardExplicitlyBySystem(); } void CaptureModeSession::UpdateCursor(const gfx::Point& location_in_screen, @@ -1125,6 +1110,42 @@ return result; } +void CaptureModeSession::HideAllUis() { + is_all_uis_visible_ = false; + cursor_setter_.reset(); + + for (auto* widget : GetAvailableWidgets()) { + // The order here matters. We need to disable the animation before we hide + // to avoid any hide animation here, or until the widgets are shown (also + // without animation) when ShowAllUis() is called. + widget->GetNativeWindow()->SetProperty(aura::client::kAnimationsDisabledKey, + true); + widget->Hide(); + } + + // Refresh painting the layer, since we don't paint anything while a DLP + // dialog might be shown. + layer()->SchedulePaint(layer()->bounds()); +} + +void CaptureModeSession::ShowAllUis() { + is_all_uis_visible_ = true; + cursor_setter_ = std::make_unique<CursorSetter>(); + + for (auto* widget : GetAvailableWidgets()) { + // The order here matters. See HideAllUis() above. + // At this point the animation is still disabled, so we show the window now + // before we re-enable the animations. This is to avoid having those widgets + // show up in the captured images or videos in case this is used right + // before ending the session to perform the capture. + widget->Show(); + widget->GetNativeWindow()->SetProperty(aura::client::kAnimationsDisabledKey, + false); + } + + layer()->SchedulePaint(layer()->bounds()); +} + void CaptureModeSession::RefreshBarWidgetBounds() { DCHECK(capture_mode_bar_widget_); capture_mode_bar_widget_->SetBounds(
diff --git a/ash/capture_mode/capture_mode_session.h b/ash/capture_mode/capture_mode_session.h index 51c08d10..f75efcf 100644 --- a/ash/capture_mode/capture_mode_session.h +++ b/ash/capture_mode/capture_mode_session.h
@@ -173,6 +173,7 @@ // FolderSelectionDialogController::Delegate: void OnFolderSelected(const base::FilePath& path) override; + void OnSelectionWindowAdded() override; void OnSelectionWindowClosed() override; // Updates the current cursor depending on current |location_in_screen| and @@ -207,6 +208,11 @@ // this session. std::vector<views::Widget*> GetAvailableWidgets(); + // All UI elements, cursors, widgets and paintings on the session's layer can + // be either shown or hidden with the below functions. + void HideAllUis(); + void ShowAllUis(); + // Sets the correct screen bounds on the `capture_mode_bar_widget_` based on // the `current_root_`, potentially moving the bar to a new display if // `current_root_` is different`. @@ -383,6 +389,10 @@ // Magnifier glass used during a region capture session. MagnifierGlass magnifier_glass_; + // True if all UIs (cursors, widgets, and paintings on the layer) of the + // capture mode session is visible. + bool is_all_uis_visible_ = true; + // Whether this session was started from a projector workflow. const bool is_in_projector_mode_ = false;
diff --git a/ash/capture_mode/capture_mode_unittests.cc b/ash/capture_mode/capture_mode_unittests.cc index 8e8aece..9f46031 100644 --- a/ash/capture_mode/capture_mode_unittests.cc +++ b/ash/capture_mode/capture_mode_unittests.cc
@@ -347,6 +347,8 @@ session_->folder_selection_dialog_controller_->dialog_window(); } + bool IsAllUisVisible() const { return session_->is_all_uis_visible_; } + private: const CaptureModeSession* const session_; }; @@ -396,6 +398,12 @@ return CaptureModeSessionTestApi(session).IsFolderSelectionDialogShown(); } + bool IsAllCaptureSessionUisVisible() const { + auto* session = CaptureModeController::Get()->capture_mode_session(); + DCHECK(session); + return CaptureModeSessionTestApi(session).IsAllUisVisible(); + } + CaptureModeToggleButton* GetImageToggleButton() const { auto* controller = CaptureModeController::Get(); DCHECK(controller->IsActive()); @@ -5477,6 +5485,7 @@ ClickOnView(test_api.GetSelectFolderMenuItem(), event_generator); EXPECT_TRUE(IsFolderSelectionDialogShown()); + EXPECT_FALSE(IsAllCaptureSessionUisVisible()); auto* dialog_factory = FakeFolderSelectionDialogFactory::Get(); auto* dialog_window = dialog_factory->GetDialogWindow(); @@ -5492,6 +5501,7 @@ dialog_factory->AcceptPath(custom_folder); WaitForSettingsMenuToBeRefreshed(); EXPECT_FALSE(IsFolderSelectionDialogShown()); + EXPECT_TRUE(IsAllCaptureSessionUisVisible()); EXPECT_TRUE(save_to_menu_group->IsOptionChecked(kCustomFolder)); EXPECT_FALSE(save_to_menu_group->IsOptionChecked(kDownloadsFolder)); EXPECT_EQ(u"test",
diff --git a/ash/capture_mode/folder_selection_dialog_controller.cc b/ash/capture_mode/folder_selection_dialog_controller.cc index 66b003ee..8c616f6f 100644 --- a/ash/capture_mode/folder_selection_dialog_controller.cc +++ b/ash/capture_mode/folder_selection_dialog_controller.cc
@@ -6,6 +6,7 @@ #include <memory> +#include "ash/keyboard/ui/keyboard_ui_controller.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/strings/grit/ash_strings.h" #include "ash/style/ash_color_provider.h" @@ -50,8 +51,11 @@ Delegate* delegate, aura::Window* root) : delegate_(delegate), + // The SettingBubbleContainer was chosen since it's below the virtual + // keyboard container, and therefore users can use the VK to interact with + // this dialog e.g. to rename a folder. dialog_background_dimmer_( - root->GetChildById(kShellWindowId_OverlayContainer)), + root->GetChildById(kShellWindowId_SettingBubbleContainer)), select_folder_dialog_(ui::SelectFileDialog::Create( /*listener=*/this, std::make_unique<NullSelectFolderPolicy>())) { @@ -89,7 +93,24 @@ if (!dialog_window_) return true; - return !IsEventTargetingWindowInSubtree(event, dialog_window_); + if (IsEventTargetingWindowInSubtree(event, dialog_window_)) + return false; + + // The event maybe targeting a virtual keyboard window that is being used to + // interact with the dialog. In this case the event should not be consumed. + auto* keyboard_ui_controller = keyboard::KeyboardUIController::Get(); + DCHECK(keyboard_ui_controller); + + if (!keyboard_ui_controller->IsKeyboardVisible()) + return true; + + auto* keyboard_window = keyboard_ui_controller->GetKeyboardWindow(); + if (!keyboard_window || + keyboard_window->GetRootWindow() != dialog_window_->GetRootWindow()) { + return true; + } + + return !IsEventTargetingWindowInSubtree(event, keyboard_window); } void FolderSelectionDialogController::FileSelected(const base::FilePath& path, @@ -116,6 +137,8 @@ widget_delegate->SetCanMinimize(false); widget_delegate->SetCanMaximize(false); + delegate_->OnSelectionWindowAdded(); + if (on_dialog_window_added_callback_for_test_) std::move(on_dialog_window_added_callback_for_test_).Run(); }
diff --git a/ash/capture_mode/folder_selection_dialog_controller.h b/ash/capture_mode/folder_selection_dialog_controller.h index 2866825..4d7f3f1 100644 --- a/ash/capture_mode/folder_selection_dialog_controller.h +++ b/ash/capture_mode/folder_selection_dialog_controller.h
@@ -30,9 +30,12 @@ // Called to inform the delegate that the user selected the given |path|. virtual void OnFolderSelected(const base::FilePath& path) = 0; + // Called to inform the delegate that the dialog window has been added. + virtual void OnSelectionWindowAdded() = 0; + // Called to inform the delegate that the dialog window has been closed. // This will be called for both when the user selects and accepts a folder - // or cancel or close the dialog without making a selection. + // or cancels or closes the dialog without making a selection. virtual void OnSelectionWindowClosed() = 0; protected:
diff --git a/ash/components/arc/mojom/video.mojom b/ash/components/arc/mojom/video.mojom index 3d29e79..9995293 100644 --- a/ash/components/arc/mojom/video.mojom +++ b/ash/components/arc/mojom/video.mojom
@@ -31,9 +31,23 @@ [MinVersion=5] Init@1(pending_remote<VideoHost> host_remote) => (); }; +// This interface allows ARC++/ARCVM to create connections to various hardware +// video acceleration interfaces. There's always an implementation of this +// interface living in the browser process which handles connections from +// ARC++/ARCVM. However, we declare this interface as needing a +// kHardwareVideoDecoding sandbox so that the browser process has the option of +// starting a utility process to host an implementation of this interface and +// delegating the connection of the video accelerator interfaces to that +// process. This is intended for out-of-process video decoding where we want +// accelerated video decoding to run outside the GPU process. +// +// TODO(b/195769334): we would probably want different sandboxes for decoding +// and encoding. Figure out the best way to do this when we implement +// out-of-process video encoding. +// // Deprecated method IDs: 0 // Next method ID: 4 -[ServiceSandbox=sandbox.mojom.Sandbox.kUtility] +[ServiceSandbox=sandbox.mojom.Sandbox.kHardwareVideoDecoding] interface VideoAcceleratorFactory { [MinVersion=1] CreateEncodeAccelerator@1(
diff --git a/ash/components/fwupd/firmware_update_manager.cc b/ash/components/fwupd/firmware_update_manager.cc index c51055b3..5dba5415 100644 --- a/ash/components/fwupd/firmware_update_manager.cc +++ b/ash/components/fwupd/firmware_update_manager.cc
@@ -166,8 +166,10 @@ // to remain dynamic. // Fwupd Install Dbus flags, flag documentation can be found in // https://github.com/fwupd/fwupd/blob/main/libfwupd/fwupd-enums.h#L749. - std::map<std::string, bool> options = { - {"none", false}, {"force", true}, {"allow-older", true}}; + std::map<std::string, bool> options = {{"none", false}, + {"force", true}, + {"allow-older", true}, + {"allow-reinstall", true}}; task_runner_->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&OpenFileAndGetFileDescriptor, patch_path),
diff --git a/ash/components/fwupd/firmware_update_manager.h b/ash/components/fwupd/firmware_update_manager.h index 59c3dfb..5bf34aa 100644 --- a/ash/components/fwupd/firmware_update_manager.h +++ b/ash/components/fwupd/firmware_update_manager.h
@@ -17,6 +17,7 @@ #include "base/task/sequenced_task_runner.h" #include "chromeos/dbus/fwupd/fwupd_client.h" #include "chromeos/dbus/fwupd/fwupd_device.h" +#include "chromeos/dbus/fwupd/fwupd_properties.h" #include "chromeos/dbus/fwupd/fwupd_update.h" #include "mojo/public/cpp/bindings/remote_set.h" @@ -49,6 +50,10 @@ void OnUpdateListResponse(const std::string& device_id, chromeos::FwupdUpdateList* updates) override; void OnInstallResponse(bool success) override; + // TODO(jimmyxgong): Implement this function to send property updates via + // mojo. + void OnPropertiesChangedResponse( + chromeos::FwupdProperties* properties) override {} // Query all updates for all devices. void RequestAllUpdates();
diff --git a/ash/components/fwupd/firmware_update_manager_unittest.cc b/ash/components/fwupd/firmware_update_manager_unittest.cc index fa1e93f..f4b4a15c 100644 --- a/ash/components/fwupd/firmware_update_manager_unittest.cc +++ b/ash/components/fwupd/firmware_update_manager_unittest.cc
@@ -100,7 +100,7 @@ GetObjectProxy(kFwupdServiceName, fwupd_service_path)) .WillRepeatedly(testing::Return(proxy_.get())); - EXPECT_CALL(*proxy_, DoConnectToSignal(kFwupdServiceName, _, _, _)) + EXPECT_CALL(*proxy_, DoConnectToSignal(_, _, _, _)) .WillRepeatedly(Return()); dbus_client_ = FwupdClient::Create(); @@ -419,6 +419,7 @@ // Create a temporary file to simulate a .cab available for install. base::WriteFile(full_path, "", 0); EXPECT_TRUE(base::PathExists(full_path)); + base::RunLoop().RunUntilIdle(); EXPECT_EQ(0, GetOnInstallResponseCallbackCallCountForTesting()); StartInstall(std::string(kFakeDeviceIdForTesting), /*release=*/0);
diff --git a/ash/constants/ash_pref_names.cc b/ash/constants/ash_pref_names.cc index 18d4f81e..41afbc5 100644 --- a/ash/constants/ash_pref_names.cc +++ b/ash/constants/ash_pref_names.cc
@@ -897,6 +897,10 @@ // across devices. const char kFilesAppFolderShortcuts[] = "ash.filesapp.folder_shortcuts"; +// A boolean pref that indicates if the Files app UI prefs have migrated from +// the Chrome app to System Web App. +const char kFilesAppUIPrefsMigrated[] = "ash.filesapp.ui_prefs_migrated"; + // An integer pref counting the number of times the Onboarding flow has been // shown to the user inside the Projector Gallery. const char kProjectorGalleryOnboardingShowCount[] =
diff --git a/ash/constants/ash_pref_names.h b/ash/constants/ash_pref_names.h index c5acb49..4669b48 100644 --- a/ash/constants/ash_pref_names.h +++ b/ash/constants/ash_pref_names.h
@@ -409,6 +409,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kFilesAppFolderShortcuts[]; +COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kFilesAppUIPrefsMigrated[]; + COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kProjectorGalleryOnboardingShowCount[];
diff --git a/ash/public/cpp/app_list/app_list_types.cc b/ash/public/cpp/app_list/app_list_types.cc index 99e3d6d..851650b 100644 --- a/ash/public/cpp/app_list/app_list_types.cc +++ b/ash/public/cpp/app_list/app_list_types.cc
@@ -12,6 +12,34 @@ // Generated using crx_file::id_util::GenerateId("LinuxAppsFolder") const char kCrostiniFolderId[] = "ddolnhmblagmcagkedkbfejapapdimlk"; +bool IsAppListSearchResultAnApp(AppListSearchResultType result_type) { + switch (result_type) { + case AppListSearchResultType::kInstalledApp: + case AppListSearchResultType::kInternalApp: + case AppListSearchResultType::kPlayStoreApp: + case AppListSearchResultType::kPlayStoreReinstallApp: + case AppListSearchResultType::kArcAppShortcut: + case AppListSearchResultType::kInstantApp: + return true; + case AppListSearchResultType::kUnknown: + case AppListSearchResultType::kOmnibox: + case AppListSearchResultType::kLauncher: + case AppListSearchResultType::kAnswerCard: + case AppListSearchResultType::kZeroStateFile: + case AppListSearchResultType::kZeroStateDrive: + case AppListSearchResultType::kFileChip: + case AppListSearchResultType::kDriveChip: + case AppListSearchResultType::kAssistantChip: + case AppListSearchResultType::kOsSettings: + case AppListSearchResultType::kInternalPrivacyInfo: + case AppListSearchResultType::kAssistantText: + case AppListSearchResultType::kHelpApp: + case AppListSearchResultType::kFileSearch: + case AppListSearchResultType::kDriveSearch: + return false; + } +} + // IconColor ------------------------------------------------------------------- // static
diff --git a/ash/public/cpp/app_list/app_list_types.h b/ash/public/cpp/app_list/app_list_types.h index d61fd3bd..f5ff7c7c 100644 --- a/ash/public/cpp/app_list/app_list_types.h +++ b/ash/public/cpp/app_list/app_list_types.h
@@ -221,14 +221,13 @@ kMaxValue = kLaunchedFromContinueTask, }; -// The UI representation of the search result. Currently all search results -// that are not apps (OminboxResult, LauncherSearcResult, etc.) are grouped -// into kSearchResult. Meanwhile SearchResultTileItemView (shown in zero state) -// and suggested chips are considered kAppSearchResult. -enum class AppListLaunchType { - kSearchResult = 0, - kAppSearchResult, -}; +// The UI representation of the app that's being launched. Currently all search +// results that are not apps (OminboxResult, LauncherSearcResult, etc.) are +// grouped into kSearchResult. Meanwhile app search results, apps that appear in +// the recent apps section, and suggested chips (if productivity launcher is +// disabled) are considered kAppSearchResult. kApp is used for apps launched +// from the apps grid. +enum class AppListLaunchType { kSearchResult, kAppSearchResult, kApp }; // Type of the search result, which is set in Chrome. These values are persisted // to logs. Entries should not be renumbered and numeric values should never be @@ -262,6 +261,9 @@ kMaxValue = kDriveSearch, }; +ASH_PUBLIC_EXPORT bool IsAppListSearchResultAnApp( + AppListSearchResultType result_type); + // The different categories a search result can be part of. Every search result // to be displayed in the search box should be associated with one category. It // is an error for results displayed in the search box to have a kUnknown
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_kk.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_kk.xtb index 621a74a..c2724c1 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_kk.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_kk.xtb
@@ -17,6 +17,7 @@ <translation id="1516966594427080024">Жаңа терезені инкогнито режимінде ашу</translation> <translation id="152892567002884378">Дыбысты арттыру</translation> <translation id="1560480564179555003"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, одан кейін <ph name="ESC" /></translation> +<translation id="1586324912145647027">Жұмыс үстелдеріне (1–8) өту</translation> <translation id="1652741121070700329">Алдыңғы сөздің басына ауысу</translation> <translation id="1679841710523778799">Жарықтықты арттыру</translation> <translation id="168356808214100546"><ph name="ALT" /> пернесін, одан кейін <ph name="TAB" /> пернесін басып тұрып, қажет терезеге ауысқанда жіберіңіз.</translation> @@ -129,6 +130,7 @@ <translation id="5563050856984839829"><ph name="CTRL" /><ph name="SEPARATOR" /><ph name="SHIFT" /> пернесін басып, сілтемені түртіңіз</translation> <translation id="561814908794220892">Веббетті жаңа қойындыда ашу</translation> <translation id="5620219513321115856">Іске қосулы терезені оң жақтағы жұмыс үстеліне жылжыту</translation> +<translation id="5699366815052349604">Қолданыстағы терезені барлық жұмыс үстеліне тағайындау</translation> <translation id="5710621673935162997"><ph name="CTRL" /><ph name="SEPARATOR1" /><ph name="L" /> немесе <ph name="ALT" /><ph name="SEPARATOR2" /><ph name="D" /></translation> <translation id="5757111373163288447">Сілтемені қойындыда ашу</translation> <translation id="5757474750054631686">Пернетақта жарықтығын азайту (тек артқы жарығы бар пернетақталар үшін)</translation>
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index 918f7f8..721e9b6 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Maak oop wanneer dit volledig is</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> en nog <ph name="UNAVAILABLE_APPS_COUNT" /> is nie op hierdie toestel nie.</translation> <translation id="3742055079367172538">Skermkiekie geneem</translation> -<translation id="3744282433224562605">Voer wagwoord in om jou Chromebook te ontsluit</translation> <translation id="3771549900096082774">Hoëkontrasmodus</translation> <translation id="3773700760453577392">'n Administrateur laat nie veelvuldige aanmeldings deur <ph name="USER_EMAIL" /> toe nie. Alle gebruikers moet afmeld om voort te gaan.</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">Wys in vouer</translation> <translation id="5176318573511391780">Neem gedeeltelike skerm op</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> is met <ph name="IN_PLACE_APP" /> gekombineer om 'n nuwe vouer te skep.</translation> -<translation id="5199367439331364630">Voer wagwoord in om by jou Chromebook aan te meld</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 ander kennisgewing}other{# ander kennisgewings}}</translation> <translation id="5207949376430453814">Lig tekskaret uit</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">Die Google Assistent is nie in 'n gastesessie beskikbaar nie.</translation> <translation id="6134259848159370930">Deursoek jou toestel, programme en die web.</translation> <translation id="6137566720514957455">Maak verwyderingdialoog oop vir <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Bevestig aflaai</translation> <translation id="6154006699632741460">Randtoestel word nie gesteun nie</translation> <translation id="6156262341071374681">Brei uit na alle programme</translation> <translation id="615957422585914272">Wys opskerm-sleutelbord</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 8777028..6dabb49 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">ሲጠናቀቅ ይክፈቱ</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />፣ <ph name="UNAVAILABLE_APPS_TWO" /> እና <ph name="UNAVAILABLE_APPS_COUNT" /> ሌሎች በዚህ መሳሪያ ላይ የሉም።</translation> <translation id="3742055079367172538">ቅጽበታዊ ገጽ እይታ ተነስቷል</translation> -<translation id="3744282433224562605">የእርስዎን Chromebook ለመክፈት የይለፍ ቃል ያስገቡ</translation> <translation id="3771549900096082774">ባለከፍተኛ ንፅፅር ሁነታ</translation> <translation id="3773700760453577392">አንድ አስተዳዳሪ ለ<ph name="USER_EMAIL" /> በበርካታ መለያ መግባቶችን ከልክሏል። ለመቀጠል ሁሉም ተጠቃሚዎች ዘግተው መውጣት አለባቸው።</translation> <translation id="3779139509281456663"><ph name="NAME" /> በማገናኘት ላይ</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">በአቃፊ አሳይ</translation> <translation id="5176318573511391780">ከፊል የማያ ገጽን ቅረጽ</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> ከ<ph name="IN_PLACE_APP" /> ጋር አዲስ አቃፊ ለመፍጠር ተጣምሯል።</translation> -<translation id="5199367439331364630">ወደ የእርስዎ Chromebook ለመግባት የይለፍ ቃል ያስገቡ</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />፣ <ph name="NOTIFICATION_TITLE" />፦ <ph name="MESSAGE" />፣ <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 ሌላ ማሳወቂያ}one{# ሌሎች ማሳወቂያዎች}other{# ሌሎች ማሳወቂያዎች}}</translation> <translation id="5207949376430453814">የጽሑፍ ድፋቱን አድምቅ</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">የGoogle ረዳቱ በእንግዳ ክፍለ-ጊዜ ውስጥ አይገኝም።</translation> <translation id="6134259848159370930">የእርስዎን መሣሪያ፣ መተግበሪያዎች፣ ቅንብሮች እና ድር ይፈልጉ።</translation> <translation id="6137566720514957455">ለ<ph name="USER_EMAIL_ADDRESS" /> የአስወግድ መገናኛን ክፈት</translation> +<translation id="6141988275892716286">ማውረድ ያረጋግጡ</translation> <translation id="6154006699632741460">መለዋወጫ አይደገፍም</translation> <translation id="6156262341071374681">ወደ ሁሉም መተግበሪያዎች ዘርጋ</translation> <translation id="615957422585914272">የማያ ገጽ ላይ ቁልፍ ሰሌዳ አሳይ</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index 8c101810..340796fb 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -417,7 +417,6 @@ <translation id="3713734891607377840">فتح الملف بعد اكتمال تنزيله</translation> <translation id="3726171378575546917">التطبيقات <ph name="UNAVAILABLE_APPS_ONE" /> و<ph name="UNAVAILABLE_APPS_TWO" /> و<ph name="UNAVAILABLE_APPS_COUNT" /> غير مثبَّتة على هذا الجهاز.</translation> <translation id="3742055079367172538">تم التقاط لقطة الشاشة</translation> -<translation id="3744282433224562605">لفتح قفل جهاز Chromebook، أدخِل كلمة المرور.</translation> <translation id="3771549900096082774">وضع التباين العالي</translation> <translation id="3773700760453577392">منع أحد المشرفين الدخول المتعدد لـ <ph name="USER_EMAIL" />. لذا على جميع المستخدمين تسجيل الخروج للمتابعة.</translation> <translation id="3779139509281456663">جارٍ ربط <ph name="NAME" /></translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">العرض في المجلد</translation> <translation id="5176318573511391780">تسجيل جزء من الشاشة</translation> <translation id="5198715732953550718">تم جمع <ph name="MOVED_APP_NAME" /> مع <ph name="IN_PLACE_APP" /> لإنشاء مجلد جديد.</translation> -<translation id="5199367439331364630">لتسجيل الدخول إلى جهاز Chromebook، أدخِل كلمة المرور.</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />، <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />، <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{إشعار واحد آخر}zero{# إشعار آخر}two{إشعاران آخران}few{# إشعارات أخرى}many{# إشعارًا آخر}other{# إشعار آخر}}</translation> <translation id="5207949376430453814">تمييز علامة إقحام النص</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">لا يتوفر "مساعد Google" في جلسة ضيف.</translation> <translation id="6134259848159370930">يمكنك البحث في الجهاز والتطبيقات والإعدادات والويب.</translation> <translation id="6137566720514957455">فتح مربع الحوار لإزالة الحساب <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">تأكيد التنزيل</translation> <translation id="6154006699632741460">الجهاز الملحق غير متوافق</translation> <translation id="6156262341071374681">التوسيع لعرض كل التطبيقات</translation> <translation id="615957422585914272">إظهار لوحة مفاتيح على الشاشة</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index aa55bef..c60d2209 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">লেপটপ ম’ডলৈ সলনি হ’ল</translation> <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" />এ তথাপিও পিছত ছাইন ইন কৰিব পাৰে।</translation> <translation id="3321628682574733415">পেৰেণ্ট ক'ডটো ভুল</translation> +<translation id="3340475855009870209">ডাউনল’ড স্কেন কৰি থকা হৈছে <ph name="FILENAME" /></translation> <translation id="3341303451326249809">স্ক্ৰীনশ্বট কেপচাৰ কৰা হ'ল</translation> <translation id="334252345105450327">এটা স্ক্ৰীনশ্বট লওক</translation> <translation id="3351879221545518001">আপুনি বর্তমান স্ক্ৰীণ কাষ্ট কৰি আছে।</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">সম্পূৰ্ণ হোৱাৰ পাছত খোলক</translation> <translation id="3726171378575546917">এই ডিভাইচটোত <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> আৰু <ph name="UNAVAILABLE_APPS_COUNT" /> টা নাই।</translation> <translation id="3742055079367172538">স্ক্ৰীণশ্বট লোৱা হ’ল</translation> -<translation id="3744282433224562605">আপোনাৰ Chromebook আনলক কৰিবলৈ পাছৱৰ্ড দিয়ক</translation> <translation id="3771549900096082774">হাই কনট্ৰাষ্ট ম’ড</translation> <translation id="3773700760453577392">কোনো প্ৰশাসকে <ph name="USER_EMAIL" />ৰ বাবে একাধিক ছাইন ইনৰ সুবিধাটোৰ অনুমতি বাতিল কৰিছে। অব্যাহত ৰাখিবলৈ সকলো ব্যৱহাৰকাৰীয়ে ছাইন আউট কৰিবই লাগিব।</translation> <translation id="3779139509281456663"><ph name="NAME" /> সংযোগ কৰি থকা হৈছে</translation> @@ -627,7 +627,6 @@ <translation id="5170568018924773124">ফ’ল্ডাৰত দেখুৱাওক</translation> <translation id="5176318573511391780">আংশিক স্ক্ৰীন ৰেকৰ্ড কৰক</translation> <translation id="5198715732953550718">নতুন ফ’ল্ডাৰ সৃষ্টি কৰিবলৈ <ph name="MOVED_APP_NAME" />ক <ph name="IN_PLACE_APP" />ৰ সৈতে একত্ৰিত কৰা হৈছে।</translation> -<translation id="5199367439331364630">আপোনাৰ Chromebookত ছাইন ইন কৰিবলৈ পাছৱৰ্ড দিয়ক</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{১ টা অন্য জাননী}one{# টা অন্য জাননী}other{# টা অন্য জাননী}}</translation> <translation id="5207949376430453814">পাঠৰ কেৰেট হাইলাইট কৰক</translation> @@ -765,6 +764,7 @@ <translation id="612734058257491180">অতিথিৰ ছেশ্বনত Google Assistant উপলব্ধ নহয়।</translation> <translation id="6134259848159370930">আপোনাৰ ডিভাইচ, এপ্, ছেটিংসমূহ আৰু ৱেব সন্ধান কৰক।</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" />ৰ বাবে আঁতৰোৱাৰ ডায়লগ খোলক</translation> +<translation id="6141988275892716286">ডাউনল’ড নিশ্চিত কৰক</translation> <translation id="6154006699632741460">আনুষংগিক সামগ্ৰী সমৰ্থিত নহয়</translation> <translation id="6156262341071374681">সূচীখন সকলো এপ্ দেখুৱাকৈ বিস্তাৰ কৰক</translation> <translation id="615957422585914272">অন-স্ক্ৰীণ কীব’ৰ্ড দেখুৱাওক</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index 118f869..a8d68b4 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Tamamlandıqda açın</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> və daha <ph name="UNAVAILABLE_APPS_COUNT" /> tətbiq bu cihazda yoxdur.</translation> <translation id="3742055079367172538">Skrinşot çəkildi</translation> -<translation id="3744282433224562605">Chromebook'u kiliddən çıxarmaq üçün parolu daxil edin</translation> <translation id="3771549900096082774">Yüksək Kontrast Rejimi</translation> <translation id="3773700760453577392">Administrator <ph name="USER_EMAIL" /> üçün çoxsaylı girişə icazə verməyib. Bütün istifadəçilər davam etmək üçün çıxış etməlidir.</translation> <translation id="3779139509281456663"><ph name="NAME" /> qoşulur</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Qovluqda göstərin</translation> <translation id="5176318573511391780">Ekranın bir hissəsini çəkin</translation> <translation id="5198715732953550718">Yeni qovluq yaratmaq üçün <ph name="MOVED_APP_NAME" /> <ph name="IN_PLACE_APP" /> ilə birləşdirilib.</translation> -<translation id="5199367439331364630">Chromebook'a daxil olmaq üçün parolu daxil edin</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Digər 1 bildiriş}other{Digər # bildiriş}}</translation> <translation id="5207949376430453814">Mətn karetini vurğulayın</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google Assistent qonaq sessiyasında əlçatan deyil.</translation> <translation id="6134259848159370930">Cihaz, tətbiqlər, ayarlar və vebdə axtarın.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> üçün silinmə dialoqunu açın</translation> +<translation id="6141988275892716286">Endirməni təsdiq edin</translation> <translation id="6154006699632741460">Əlavə cihaz dəstəklənmir</translation> <translation id="6156262341071374681">Bütün tətbiqləri genişləndirin</translation> <translation id="615957422585914272">Ekrandakı klaviaturanı göstərin</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index 33d2eb2..a4ca050 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Адкрыць пасля завяршэння</translation> <translation id="3726171378575546917">На гэтай прыладзе няма праграм "<ph name="UNAVAILABLE_APPS_ONE" />", "<ph name="UNAVAILABLE_APPS_TWO" />" і яшчэ <ph name="UNAVAILABLE_APPS_COUNT" />.</translation> <translation id="3742055079367172538">Здымак экрана зроблены</translation> -<translation id="3744282433224562605">Каб разблакіраваць Chromebook, увядзіце пароль</translation> <translation id="3771549900096082774">Рэжым высокай кантраснасці</translation> <translation id="3773700760453577392">Адміністратар забараніў уваход у некалькі ўліковых запісаў для карыстальніка <ph name="USER_EMAIL" />. Каб працягнуць, усе карыстальнікі павінны выйсці.</translation> <translation id="3779139509281456663">Ідзе падключэнне прылады "<ph name="NAME" />"</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Паказаць у папцы</translation> <translation id="5176318573511391780">Запіс часткі экрана</translation> <translation id="5198715732953550718">Праграма <ph name="MOVED_APP_NAME" /> была выкарыстана з праграмай <ph name="IN_PLACE_APP" /> для стварэння новай папкі.</translation> -<translation id="5199367439331364630">Каб увайсці на прыладзе Chromebook, увядзіце пароль</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{яшчэ 1 апавяшчэнне}one{яшчэ # апавяшчэнне}few{яшчэ # апавяшчэнні}many{яшчэ # апавяшчэнняў}other{яшчэ # апавяшчэння}}</translation> <translation id="5207949376430453814">Указваць на курсор рэдагавання тэксту</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Памочнік Google недаступны ў гасцявым сеансе.</translation> <translation id="6134259848159370930">Пошук на прыладзе, у праграмах, наладах і інтэрнэце.</translation> <translation id="6137566720514957455">Адкрыць дыялогавае акно выдалення ўліковага запісу <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Пацвярджэнне спампоўвання</translation> <translation id="6154006699632741460">Перыферыйная прылада не падтрымліваецца</translation> <translation id="6156262341071374681">Разгарнуць да ўсіх праграм</translation> <translation id="615957422585914272">Паказаць экранную клавіятуру</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index 13979656..a109065 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Отваряне, когато е завършено</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> и още <ph name="UNAVAILABLE_APPS_COUNT" /> приложения не са инсталирани на това устройство.</translation> <translation id="3742055079367172538">Направена бе екранна снимка</translation> -<translation id="3744282433224562605">За да отключите своя Chromebook, въведете паролата си</translation> <translation id="3771549900096082774">Режим на висок контраст</translation> <translation id="3773700760453577392">Администратор е деактивирал централизирания вход за <ph name="USER_EMAIL" />. За да се продължи, всички потребители трябва да излязат от профилите си.</translation> <translation id="3779139509281456663">Установява се връзка с(ъс) <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Показване в папката</translation> <translation id="5176318573511391780">Записване на част от екрана</translation> <translation id="5198715732953550718">Приложението <ph name="MOVED_APP_NAME" /> бе комбинирано със <ph name="IN_PLACE_APP" /> и бе създадена нова папка.</translation> -<translation id="5199367439331364630">За да влезете в своя Chromebook, въведете паролата си</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Още 1 известие}other{Още # известия}}</translation> <translation id="5207949376430453814">Открояване на точката на вмъкване в текста</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google Асистент не се поддържа по време на сесия като гост.</translation> <translation id="6134259848159370930">Търсете в устройството, приложенията, настройките и мрежата.</translation> <translation id="6137566720514957455">Отваряне на диалоговия прозорец за премахване на профила <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Потвърждаване на изтеглянето</translation> <translation id="6154006699632741460">Периферното устройство не се поддържа</translation> <translation id="6156262341071374681">Разгъване на списъка с всички приложения</translation> <translation id="615957422585914272">Показване на екранната клавиатура</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index de07d58..b094a18 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">সম্পূর্ণ হলে খুলুন</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> এবং আরও <ph name="UNAVAILABLE_APPS_COUNT" />টি অ্যাপ এই ডিভাইসে উপলভ্য নেই।</translation> <translation id="3742055079367172538">স্ক্রিনশট নেওয়া হয়েছে</translation> -<translation id="3744282433224562605">Chromebook আনলক করতে, পাসওয়ার্ড লিখুন</translation> <translation id="3771549900096082774">উচ্চ কনট্রাস্ট মোড</translation> <translation id="3773700760453577392">একজন অ্যাডমিনিস্ট্রেটর <ph name="USER_EMAIL" />-র জন্য একাধিক সাইন-ইন বাতিল করেছেন। চালিয়ে যাওয়ার জন্য, সব ব্যবহারকারীকে অবশ্যই সাইন-আউট করতে হবে।</translation> <translation id="3779139509281456663"><ph name="NAME" /> কানেক্ট করা হচ্ছে</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">ফোল্ডারে দেখান</translation> <translation id="5176318573511391780">আংশিক স্ক্রিন রেকর্ড করুন</translation> <translation id="5198715732953550718">নতুন ফোল্ডার তৈরি করতে <ph name="MOVED_APP_NAME" /> অ্যাপ <ph name="IN_PLACE_APP" /> অ্যাপের সঙ্গে যোগ করা হয়েছে।</translation> -<translation id="5199367439331364630">Chromebook-এ সাইন-ইন করতে, পাসওয়ার্ড লিখুন</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{অন্যান্য ১টি বিজ্ঞপ্তি}one{অন্যান্য #টি বিজ্ঞপ্তি}other{অন্যান্য #টি বিজ্ঞপ্তি}}</translation> <translation id="5207949376430453814">পাঠ্যের কার্সার হাইলাইট করুন</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google অ্যাসিস্ট্যান্ট কোনও গেস্ট সেশনে উপলভ্য নয়।</translation> <translation id="6134259848159370930">আপনার ডিভাইস, অ্যাপ, সেটিংস এবং ওয়েবে সার্চ করুন।</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" />-এর জন্য, 'অ্যাকাউন্ট সরিয়ে দিন' ডায়ালগ খুলুন</translation> +<translation id="6141988275892716286">ডাউনলোড নিশ্চিত করুন</translation> <translation id="6154006699632741460">পেরিফেরাল কাজ করে না</translation> <translation id="6156262341071374681">সমস্ত অ্যাপ দেখুন</translation> <translation id="615957422585914272">অন-স্ক্রিন কীবোর্ড প্রদর্শন করুন</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index 47cdb6d3..7a02d9b 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Otvori kada se završi</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> i još <ph name="UNAVAILABLE_APPS_COUNT" /> aplikacije(a) nisu na ovom uređaju.</translation> <translation id="3742055079367172538">Snimak ekrana je napravljen</translation> -<translation id="3744282433224562605">Da otključate Chromebook, unesite lozinku</translation> <translation id="3771549900096082774">Način rada visokog kontrasta</translation> <translation id="3773700760453577392">Administrator nije dozvolio višestruku prijavu za korisnika <ph name="USER_EMAIL" />. Svi korisnici se moraju odjaviti kako bi se nastavilo.</translation> <translation id="3779139509281456663">Povezivanje s uređajem <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Pokaži u mapi</translation> <translation id="5176318573511391780">Snimanje dijela ekrana</translation> <translation id="5198715732953550718">Aplikacija <ph name="MOVED_APP_NAME" /> je kombinirana s aplikacijom <ph name="IN_PLACE_APP" /> za kreiranje novog foldera.</translation> -<translation id="5199367439331364630">Da se prijavite na Chromebook, unesite lozinku</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Još 1 obavještenje}one{Još # obavještenje}few{Još # obavještenja}other{Još # obavještenja}}</translation> <translation id="5207949376430453814">Istakni kursor u tekstu</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google Asistent nije dostupan u sesiji gosta.</translation> <translation id="6134259848159370930">Pretražite uređaj, aplikacije, postavke i web.</translation> <translation id="6137566720514957455">Otvaranje dijaloškog okvira za uklanjanje korisnika <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Potvrdite lozinku</translation> <translation id="6154006699632741460">Periferni uređaj nije podržan</translation> <translation id="6156262341071374681">Proširite na sve aplikacije</translation> <translation id="615957422585914272">Prikaži tastaturu na ekranu</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 1adc2f0..088b0fc 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Obre'l en acabar</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> i <ph name="UNAVAILABLE_APPS_COUNT" /> aplicacions més no estan disponibles en aquest dispositiu.</translation> <translation id="3742055079367172538">Captura de pantalla feta</translation> -<translation id="3744282433224562605">Per desbloquejar el Chromebook, introdueix la contrasenya</translation> <translation id="3771549900096082774">Mode d'alt contrast</translation> <translation id="3773700760453577392">Un administrador ha desactivat l'inici de sessió múltiple per a <ph name="USER_EMAIL" />. Tots els usuaris han de tancar la sessió per continuar.</translation> <translation id="3779139509281456663">S'està connectant <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Mostra a la carpeta</translation> <translation id="5176318573511391780">Grava una part de la pantalla</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> i <ph name="IN_PLACE_APP" /> s'han combinat per crear una carpeta nova.</translation> -<translation id="5199367439331364630">Per iniciar la sessió al Chromebook, introdueix la contrasenya</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 notificació més}other{# notificacions més}}</translation> <translation id="5207949376430453814">Ressalta la marca d'inserció de text</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">L'Assistent de Google no està disponible a les sessions de convidat.</translation> <translation id="6134259848159370930">Cerca al dispositiu, en aplicacions, a la configuració i al web.</translation> <translation id="6137566720514957455">Obre el quadre de diàleg per suprimir <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Confirma la baixada</translation> <translation id="6154006699632741460">Perifèric no admès</translation> <translation id="6156262341071374681">Amplia a totes les aplicacions</translation> <translation id="615957422585914272">Mostra el teclat en pantalla</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index eb6731d..621db93 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">Přepnuto na režim notebooku</translation> <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> se i nadále bude moci přihlásit.</translation> <translation id="3321628682574733415">Nesprávný kód rodiče</translation> +<translation id="3340475855009870209">Stahovaný soubor <ph name="FILENAME" /> se kontroluje</translation> <translation id="3341303451326249809">Snímek obrazovky byl pořízen</translation> <translation id="334252345105450327">Pořídit snímek obrazovky</translation> <translation id="3351879221545518001">Právě odesíláte obrazovku.</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">Po dokončení otevřít</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> a další aplikace (<ph name="UNAVAILABLE_APPS_COUNT" />) na tomto zařízení nejsou.</translation> <translation id="3742055079367172538">Byl vytvořen snímek obrazovky</translation> -<translation id="3744282433224562605">Pokud chcete Chromebook odemknout, zadejte heslo</translation> <translation id="3771549900096082774">Režim vysokého kontrastu</translation> <translation id="3773700760453577392">Administrátor zakázal vícenásobné přihlášení pro účet <ph name="USER_EMAIL" />. Všichni uživatelé se před pokračováním musejí odhlásit.</translation> <translation id="3779139509281456663">Připojování zařízení <ph name="NAME" /></translation> @@ -627,7 +627,6 @@ <translation id="5170568018924773124">Zobrazit ve složce</translation> <translation id="5176318573511391780">Zaznamenat část obrazovky</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> byla sloučena s aplikací <ph name="IN_PLACE_APP" /> a byla vytvořena nová složka.</translation> -<translation id="5199367439331364630">Pokud se chcete přihlásit do Chromebooku, zadejte heslo</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 další oznámení}few{# další oznámení}many{# dalšího oznámení}other{# dalších oznámení}}</translation> <translation id="5207949376430453814">Zvýraznit textový kurzor</translation> @@ -765,6 +764,7 @@ <translation id="612734058257491180">Asistent Google v relaci hosta není k dispozici.</translation> <translation id="6134259848159370930">Prohledejte zařízení, aplikace, nastavení a internet.</translation> <translation id="6137566720514957455">Otevřít dialogové okno odstranění účtu <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Potvrzení stahování</translation> <translation id="6154006699632741460">Periferní zařízení není podporováno</translation> <translation id="6156262341071374681">Rozšířit na všechny aplikace</translation> <translation id="615957422585914272">Zobrazit softwarovou klávesnici</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 023b0990..48405e2 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Åbn efter download</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> og <ph name="UNAVAILABLE_APPS_COUNT" /> mere er ikke på denne enhed.</translation> <translation id="3742055079367172538">Screenshottet blev gemt</translation> -<translation id="3744282433224562605">Angiv din adgangskode for at låse din Chromebook op</translation> <translation id="3771549900096082774">Tilstanden Høj kontrast</translation> <translation id="3773700760453577392">En administrator har afvist samlet login fra flere konti for <ph name="USER_EMAIL" />. Alle brugere skal logge ud for at fortsætte.</translation> <translation id="3779139509281456663">Tilknytter <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Vis i mappe</translation> <translation id="5176318573511391780">Optag dele af skærmen</translation> <translation id="5198715732953550718">En ny mappe blev oprettet ved at slå <ph name="MOVED_APP_NAME" /> og <ph name="IN_PLACE_APP" /> sammen.</translation> -<translation id="5199367439331364630">Hvis du vil låse din Chromebook op, skal du angive din adgangskode</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 anden notifikation}one{# anden notifikation}other{# andre notifikationer}}</translation> <translation id="5207949376430453814">Fremhæv tekstmarkør</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google Assistent er ikke tilgængelig i en gæstesession.</translation> <translation id="6134259848159370930">Søg på din enhed, i dine apps, i indstillingerne og på nettet.</translation> <translation id="6137566720514957455">Åbn dialogboksen til fjernelse for <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Bekræft download</translation> <translation id="6154006699632741460">Den eksterne enhed understøttes ikke</translation> <translation id="6156262341071374681">Vis alle apps</translation> <translation id="615957422585914272">Vis skærmtastatur</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index 8c7a643..e152716a 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Nach dem Herunterladen öffnen</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> und <ph name="UNAVAILABLE_APPS_COUNT" /> weitere sind nicht auf diesem Gerät installiert.</translation> <translation id="3742055079367172538">Screenshot erstellt</translation> -<translation id="3744282433224562605">Zum Entsperren des Chromebooks Passwort eingeben</translation> <translation id="3771549900096082774">Modus mit hohem Kontrast</translation> <translation id="3773700760453577392">Ein Administrator hat die Mehrfachanmeldung für <ph name="USER_EMAIL" /> deaktiviert. Alle Nutzer müssen sich abmelden, um fortfahren zu können.</translation> <translation id="3779139509281456663">Verbindung mit <ph name="NAME" /> wird hergestellt</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">In Ordner zeigen</translation> <translation id="5176318573511391780">Teil des Bildschirms aufzeichnen</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> wurde mit <ph name="IN_PLACE_APP" /> kombiniert, um einen neuen Ordner zu erstellen.</translation> -<translation id="5199367439331364630">Zum Anmelden auf dem Chromebook Passwort eingeben</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 weitere Benachrichtigung}other{# weitere Benachrichtigungen}}</translation> <translation id="5207949376430453814">Textcursor hervorheben</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">In Gastsitzungen ist Google Assistant nicht verfügbar.</translation> <translation id="6134259848159370930">Auf Ihrem Gerät, in Apps, Einstellungen und im Web suchen.</translation> <translation id="6137566720514957455">Dialog „Entfernen“ für <ph name="USER_EMAIL_ADDRESS" /> öffnen</translation> +<translation id="6141988275892716286">Download bestätigen</translation> <translation id="6154006699632741460">Peripheriegerät wird nicht unterstützt</translation> <translation id="6156262341071374681">Maximieren und alle Apps anzeigen</translation> <translation id="615957422585914272">Bildschirmtastatur anzeigen</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index 9a426d59..25489bc0 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">Έγινε εναλλαγή σε λειτουργία φορητού υπολογιστή.</translation> <translation id="3308453408813785101">Ο χρήστης <ph name="USER_EMAIL_ADDRESS" /> μπορεί να συνδεθεί αργότερα.</translation> <translation id="3321628682574733415">Λανθασμένος κωδικός γονέα</translation> +<translation id="3340475855009870209">Γίνεται σάρωση της λήψης <ph name="FILENAME" /></translation> <translation id="3341303451326249809">Έγινε λήψη του στιγμιότυπου οθόνης.</translation> <translation id="334252345105450327">Λήψη στιγμιότυπου οθόνης</translation> <translation id="3351879221545518001">Αυτήν τη στιγμή πραγματοποιείτε μετάδοση της οθόνης.</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">Άνοιγμα όταν ολοκληρωθεί</translation> <translation id="3726171378575546917">Οι εφαρμογές <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> και <ph name="UNAVAILABLE_APPS_COUNT" /> ακόμη εφαρμογές δεν βρίσκονται σε αυτήν τη συσκευή.</translation> <translation id="3742055079367172538">Το στιγμιότυπο οθόνης έχει ληφθεί</translation> -<translation id="3744282433224562605">Για να ξεκλειδώσετε το Chromebook, εισαγάγετε κωδικό πρόσβασης</translation> <translation id="3771549900096082774">Λειτουργία υψηλής αντίθεσης</translation> <translation id="3773700760453577392">Ένας διαχειριστής δεν επιτρέπει τη σύνδεση σε πολλούς λογαριασμούς για τον χρήστη <ph name="USER_EMAIL" />. Όλοι οι χρήστες πρέπει να αποσυνδεθούν για να συνεχίσετε.</translation> <translation id="3779139509281456663">Σύνδεση <ph name="NAME" /></translation> @@ -627,7 +627,6 @@ <translation id="5170568018924773124">Εμφάνιση στο φάκελο</translation> <translation id="5176318573511391780">Εγγραφή μέρους της οθόνης</translation> <translation id="5198715732953550718">Η εφαρμογή <ph name="MOVED_APP_NAME" /> συνδυάστηκε με την εφαρμογή <ph name="IN_PLACE_APP" /> για τη δημιουργία νέου φακέλου.</translation> -<translation id="5199367439331364630">Για να συνδεθείτε στο Chromebook, εισαγάγετε κωδικό πρόσβασης</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 ακόμη ειδοποίηση}other{# ακόμη ειδοποιήσεις}}</translation> <translation id="5207949376430453814">Επισήμανση δρομέα κειμένου</translation> @@ -765,6 +764,7 @@ <translation id="612734058257491180">Ο Βοηθός Google δεν είναι διαθέσιμος σε περιόδους σύνδεσης επισκέπτη.</translation> <translation id="6134259848159370930">Κάντε αναζήτηση στη συσκευή, στις εφαρμογές, στις ρυθμίσεις και στον ιστό.</translation> <translation id="6137566720514957455">Άνοιγμα παραθύρου διαλόγου κατάργησης για το <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Επιβεβαίωση λήψης</translation> <translation id="6154006699632741460">Το περιφερειακό δεν υποστηρίζεται</translation> <translation id="6156262341071374681">Επέκταση σε όλες τις εφαρμογές</translation> <translation id="615957422585914272">Εμφάνιση πληκτρολογίου οθόνης</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 5ae0764..8ae9066 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -417,7 +417,6 @@ <translation id="3713734891607377840">Open when complete</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> and <ph name="UNAVAILABLE_APPS_COUNT" /> more aren't on this device.</translation> <translation id="3742055079367172538">Screenshot taken</translation> -<translation id="3744282433224562605">To unlock your Chromebook, enter password</translation> <translation id="3771549900096082774">High contrast mode</translation> <translation id="3773700760453577392">An administrator has disallowed multiple sign-in for <ph name="USER_EMAIL" />. All users must sign out to continue.</translation> <translation id="3779139509281456663">Connecting <ph name="NAME" /></translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">Show in folder</translation> <translation id="5176318573511391780">Record partial screen</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> combined with <ph name="IN_PLACE_APP" /> to create new folder.</translation> -<translation id="5199367439331364630">To sign in to your Chromebook, enter password</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 other notification}other{# other notifications}}</translation> <translation id="5207949376430453814">Highlight text caret</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">The Google Assistant is not available in a guest session.</translation> <translation id="6134259848159370930">Search your device, apps, settings and web.</translation> <translation id="6137566720514957455">Open remove dialogue for <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Confirm download</translation> <translation id="6154006699632741460">Peripheral not supported</translation> <translation id="6156262341071374681">Expand to all apps</translation> <translation id="615957422585914272">Show on-screen keyboard</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index b864c9a..52693be 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Abrir cuando se complete la descarga</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> y<ph name="UNAVAILABLE_APPS_COUNT" /> más no están disponibles en este dispositivo.</translation> <translation id="3742055079367172538">Captura de pantalla tomada</translation> -<translation id="3744282433224562605">Para desbloquear la Chromebook, ingresa la contraseña</translation> <translation id="3771549900096082774">Modo de contraste alto</translation> <translation id="3773700760453577392">Un administrador inhabilitó el acceso múltiple para <ph name="USER_EMAIL" />. Todos los usuarios deben salir de sus cuentas para continuar.</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">Mostrar en carpeta</translation> <translation id="5176318573511391780">Grabar parte de la pantalla</translation> <translation id="5198715732953550718">Se combinó <ph name="MOVED_APP_NAME" /> con <ph name="IN_PLACE_APP" /> para crear una nueva carpeta.</translation> -<translation id="5199367439331364630">Para acceder a la Chromebook, ingresa la contraseña</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 notificación más}other{# notificaciones más}}</translation> <translation id="5207949376430453814">Destacar el símbolo de intercalación de texto</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">El Asistente de Google no está disponible en las sesiones de invitado.</translation> <translation id="6134259848159370930">Realiza búsquedas en tu dispositivo, apps, configuración y la Web.</translation> <translation id="6137566720514957455">Abrir el diálogo para quitar la cuenta <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Confirmar la descarga</translation> <translation id="6154006699632741460">El dispositivo periférico no es compatible</translation> <translation id="6156262341071374681">Expande la lista a todas las apps</translation> <translation id="615957422585914272">Mostrar el teclado en pantalla</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index d6d31791..e43d9f33 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Abrir al terminar</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> y <ph name="UNAVAILABLE_APPS_COUNT" /> más no están en este dispositivo.</translation> <translation id="3742055079367172538">Captura de pantalla hecha</translation> -<translation id="3744282433224562605">Para desbloquear tu Chromebook, escribe la contraseña</translation> <translation id="3771549900096082774">Modo de contraste alto</translation> <translation id="3773700760453577392">Un administrador ha inhabilitado el inicio de sesión múltiple para <ph name="USER_EMAIL" />. Todos los usuarios deben cerrar sesión para continuar.</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">Mostrar en carpeta</translation> <translation id="5176318573511391780">Grabar una parte de la pantalla</translation> <translation id="5198715732953550718">Se ha combinado <ph name="MOVED_APP_NAME" /> con <ph name="IN_PLACE_APP" /> para crear una carpeta.</translation> -<translation id="5199367439331364630">Para iniciar sesión en tu Chromebook, escribe la contraseña</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 notificación más}other{# notificaciones más}}</translation> <translation id="5207949376430453814">Resaltar el símbolo de intercalación del texto</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">El Asistente de Google no está disponible en las sesiones de invitado.</translation> <translation id="6134259848159370930">Busca en el dispositivo, en las aplicaciones, en los ajustes y en la Web.</translation> <translation id="6137566720514957455">Abre el cuadro de diálogo para quitar la cuenta de <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Confirmar descarga</translation> <translation id="6154006699632741460">Periférico no admitido</translation> <translation id="6156262341071374681">Mostrar todas las aplicaciones</translation> <translation id="615957422585914272">Mostrar teclado en pantalla</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index 7bc73e7..155c491 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Lõpetamisel avatakse</translation> <translation id="3726171378575546917">Rakendusi <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ja veel <ph name="UNAVAILABLE_APPS_COUNT" /> rakendust pole selles seadmes.</translation> <translation id="3742055079367172538">Ekraanipilt on tehtud</translation> -<translation id="3744282433224562605">Chromebooki avamiseks sisestage parool</translation> <translation id="3771549900096082774">Suure kontrastsusega režiim</translation> <translation id="3773700760453577392">Administraator on keelanud e-posti aadressi <ph name="USER_EMAIL" /> puhul mitmele kontole sisselogimise. Jätkamiseks peavad kõik kasutajad välja logima.</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">Kuva kaustas</translation> <translation id="5176318573511391780">Ekraani osa salvestamine</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> kombineeriti uue kausta loomiseks rakendusega <ph name="IN_PLACE_APP" />.</translation> -<translation id="5199367439331364630">Chromebooki sisselogimiseks sisestage parool</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 muu märguanne}other{# muud märguannet}}</translation> <translation id="5207949376430453814">Tekstisisestusmärgi esiletõstmine</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">Google'i assistent ei ole külastajaseansis saadaval.</translation> <translation id="6134259848159370930">Otsige oma seadmest, rakendustest, seadetest ja veebist.</translation> <translation id="6137566720514957455">Kasutaja <ph name="USER_EMAIL_ADDRESS" /> eemaldamise dialoogi avamine</translation> +<translation id="6141988275892716286">Allalaadimise kinnitamine</translation> <translation id="6154006699632741460">Välisseadet ei toetata</translation> <translation id="6156262341071374681">Laiendage kõikide rakenduste kuvamiseks</translation> <translation id="615957422585914272">Ekraanil kuvatava klaviatuuri kuvamine</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index 1297af5..540faed 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Deskarga amaitzen denean irekiko da</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> eta beste <ph name="UNAVAILABLE_APPS_COUNT" /> ez daude gailuan.</translation> <translation id="3742055079367172538">Pantaila-argazkia hartu da</translation> -<translation id="3744282433224562605">Chromebook-a desblokeatzeko, idatzi pasahitza</translation> <translation id="3771549900096082774">Kontraste handiko modua</translation> <translation id="3773700760453577392">Administratzaile batek <ph name="USER_EMAIL" /> erabiltzaileari saio-hasiera anitza desgaitu dio. Jarraitu ahal izateko, erabiltzaile guztiek saioa amaitu behar dute.</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">Erakutsi karpetan</translation> <translation id="5176318573511391780">Grabatu pantailaren zati bat</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> eta <ph name="IN_PLACE_APP" /> aplikazioak karpeta berri batean taldekatu dira.</translation> -<translation id="5199367439331364630">Chromebook-ean saioa hasteko, idatzi pasahitza</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Beste jakinarazpen bat}other{Beste # jakinarazpen}}</translation> <translation id="5207949376430453814">Nabarmendu testu-kurtsorea</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">Google-ren Laguntzailea ez dago erabilgarri gonbidatuentzako saioetan.</translation> <translation id="6134259848159370930">Bilatu gailuan, aplikazioetan, ezarpenetan eta sarean</translation> <translation id="6137566720514957455">Ireki <ph name="USER_EMAIL_ADDRESS" /> erabiltzailearen leihoa kentzeko aukera</translation> +<translation id="6141988275892716286">Berretsi deskarga</translation> <translation id="6154006699632741460">Ez da onartzen gailu periferikoa</translation> <translation id="6156262341071374681">Erakutsi aplikazio guztiak</translation> <translation id="615957422585914272">Erakutsi pantailako teklatua</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index b7d7ce65..5a4e6f9 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">بعداز تکمیل بارگیری باز میشود</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />، <ph name="UNAVAILABLE_APPS_TWO" />، و <ph name="UNAVAILABLE_APPS_COUNT" /> برنامه دیگر در این دستگاه وجود ندارند.</translation> <translation id="3742055079367172538">نماگرفت گرفته شد</translation> -<translation id="3744282433224562605">برای باز کردن قفل Chromebook، گذرواژه را وارد کنید</translation> <translation id="3771549900096082774">حالت تضاد بالا</translation> <translation id="3773700760453577392">یکی از سرپرستان ورود چندگانه به سیستم را برای <ph name="USER_EMAIL" /> غیرمجاز کرده است. برای ادامه دادن، همه کاربران باید از سیستم خارج شوند.</translation> <translation id="3779139509281456663">درحال اتصال <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">نمایش در پوشه</translation> <translation id="5176318573511391780">ضبط کردن نیمصفحه</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> با <ph name="IN_PLACE_APP" /> ترکیب شد تا پوشه جدیدی ایجاد شود.</translation> -<translation id="5199367439331364630">برای ورود به سیستم Chromebook، گذرواژه را وارد کنید</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />، <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />، <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{۱ اعلان دیگر}one{# اعلان دیگر}other{# اعلان دیگر}}</translation> <translation id="5207949376430453814">برجسته کردن هشتک نوشتار</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">«دستیار Google» در جلسه مهمان دردسترس نیست.</translation> <translation id="6134259848159370930">دستگاه، برنامهها، تنظیمات، و وب را جستجو کنید.</translation> <translation id="6137566720514957455">باز کردن کادر گفتگوی برداشتن <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">تأیید بارگیری</translation> <translation id="6154006699632741460">از دستگاههای جانبی پشتیبانی نمیشود</translation> <translation id="6156262341071374681">بزرگ کردن برای مشاهده همه برنامهها</translation> <translation id="615957422585914272">نمایش صفحهکلید مجازی</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index 45d3bc8..bce0dc62 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Avaa kun valmis</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ja <ph name="UNAVAILABLE_APPS_COUNT" /> muuta puuttuvat laitteelta.</translation> <translation id="3742055079367172538">Kuvakaappaus otettu</translation> -<translation id="3744282433224562605">Avaa Chromebookin lukitus lisäämällä salasana</translation> <translation id="3771549900096082774">Suuri kontrasti ‑tila</translation> <translation id="3773700760453577392">Järjestelmänvalvoja on estänyt käyttäjää <ph name="USER_EMAIL" /> kirjautumasta sisään useille tileille. Kaikkien käyttäjien on kirjauduttava ulos jatkaakseen käyttöä.</translation> <translation id="3779139509281456663">Yhdistetään <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Näytä kansiossa</translation> <translation id="5176318573511391780">Tallenna osittainen näyttö</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> ja <ph name="IN_PLACE_APP" /> yhdistettiin uudeksi kansioksi.</translation> -<translation id="5199367439331364630">Voit kirjautua Chromebookiin lisäämällä salasanan</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 muu ilmoitus}other{# muuta ilmoitusta}}</translation> <translation id="5207949376430453814">Korosta tekstikursori</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google Assistantia ei voi käyttää Vierailija-käyttökerralla.</translation> <translation id="6134259848159370930">Hae laitteelta, sovelluksista, asetuksista ja verkosta.</translation> <translation id="6137566720514957455">Avaa poiston valintaikkuna: <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Vahvista lataus</translation> <translation id="6154006699632741460">Lisälaitetta ei tueta</translation> <translation id="6156262341071374681">Laajenna ja näytä kaikki sovellukset.</translation> <translation id="615957422585914272">Näytä ruutunäppäimistö</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index df2a07d..a89ed027 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Buksan kapag kumpleto na</translation> <translation id="3726171378575546917">Wala ang <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, at <ph name="UNAVAILABLE_APPS_COUNT" /> pa sa device na ito.</translation> <translation id="3742055079367172538">Nakakuha na ng screenshot</translation> -<translation id="3744282433224562605">Para i-unlock ang iyong Chromebook, ilagay ang password</translation> <translation id="3771549900096082774">High Contrast Mode</translation> <translation id="3773700760453577392">Hindi pinayagan ng isang administrator ang maraming pag-sign in para sa <ph name="USER_EMAIL" />. Dapat mag-sign out ang lahat ng user para makapagpatuloy.</translation> <translation id="3779139509281456663">Ikinokonekta ang <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Ipinakita sa folder</translation> <translation id="5176318573511391780">I-record ang hindi buong screen</translation> <translation id="5198715732953550718">Ipinagsama ang <ph name="MOVED_APP_NAME" /> at <ph name="IN_PLACE_APP" /> para gumawa ng bagong folder.</translation> -<translation id="5199367439331364630">Para mag-sign in sa iyong Chromebook, ilagay ang password</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 pang notification}one{# pang notification}other{# pang notification}}</translation> <translation id="5207949376430453814">I-highlight ang text caret</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Hindi available ang Google Assistant sa session ng bisita.</translation> <translation id="6134259848159370930">Maghanap sa iyong device, mga app, mga setting, at web.</translation> <translation id="6137566720514957455">Buksan ang alisin ang dialog para sa <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Kumpirmahin ang pag-download</translation> <translation id="6154006699632741460">Hindi sinusuportahan ang peripheral</translation> <translation id="6156262341071374681">Palawakin sa lahat ng app</translation> <translation id="615957422585914272">Ipakita ang on-screen na keyboard</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index 42eeab46..accb44ae 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Ouvrir une fois terminé</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> et <ph name="UNAVAILABLE_APPS_COUNT" /> autres applications ne sont pas sur cet appareil.</translation> <translation id="3742055079367172538">Saisie d'écran enregistrée</translation> -<translation id="3744282433224562605">Pour déverrouiller votre Chromebook, entrez votre mot de passe</translation> <translation id="3771549900096082774">Mode de contraste élevé</translation> <translation id="3773700760453577392">Un administrateur a désactivé la connexion multicompte pour <ph name="USER_EMAIL" />. Tous les utilisateurs doivent se déconnecter pour continuer.</translation> <translation id="3779139509281456663">Connexion à <ph name="NAME" /> en cours…</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Afficher dans le dossier</translation> <translation id="5176318573511391780">Enregistrer une partie de l'écran</translation> <translation id="5198715732953550718">Les applications <ph name="MOVED_APP_NAME" /> et <ph name="IN_PLACE_APP" /> ont été combinées pour créer un dossier.</translation> -<translation id="5199367439331364630">Pour vous connecter à votre Chromebook, entrez votre mot de passe</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" /> : <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 autre notification}one{# autre notification}other{# autres notifications}}</translation> <translation id="5207949376430453814">Mettre le point d'insertion de texte en surbrillance</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">L'Assistant Google n'est pas accessible dans une session d'invité.</translation> <translation id="6134259848159370930">Recherchez dans votre appareil, dans vos applications, dans vos paramètres et sur le Web.</translation> <translation id="6137566720514957455">Ouvrir la boîte de dialogue de retrait pour <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Confirmer le téléchargement</translation> <translation id="6154006699632741460">Ce périphérique n'est pas pris en charge</translation> <translation id="6156262341071374681">Afficher toutes les applications</translation> <translation id="615957422585914272">Afficher le clavier à l'écran</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index 1514de5..edac3200 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Ouvrir une fois terminé</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> et <ph name="UNAVAILABLE_APPS_COUNT" /> autres applis ne sont pas sur cet appareil.</translation> <translation id="3742055079367172538">Capture d'écran réalisée</translation> -<translation id="3744282433224562605">Pour déverrouiller votre Chromebook, saisissez le mot de passe</translation> <translation id="3771549900096082774">Mode Contraste élevé</translation> <translation id="3773700760453577392">Un administrateur a désactivé la connexion multicompte pour <ph name="USER_EMAIL" />. Tous les utilisateurs doivent se déconnecter pour continuer.</translation> <translation id="3779139509281456663">Connexion à <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Afficher le dossier</translation> <translation id="5176318573511391780">Enregistrer une partie de l'écran</translation> <translation id="5198715732953550718">Les applications <ph name="MOVED_APP_NAME" /> et <ph name="IN_PLACE_APP" /> ont été combinées pour créer un dossier.</translation> -<translation id="5199367439331364630">Pour vous connecter à votre Chromebook, saisissez le mot de passe</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" /> : <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 autre notification}one{# autre notification}other{# autres notifications}}</translation> <translation id="5207949376430453814">Mettre le curseur de texte en surbrillance</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">L'Assistant Google n'est pas disponible dans une session Invité.</translation> <translation id="6134259848159370930">Effectuez des recherches sur votre appareil, dans vos applications et paramètres, et sur le Web.</translation> <translation id="6137566720514957455">Ouvrir la boîte de dialogue de suppression du compte <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Confirmer le téléchargement</translation> <translation id="6154006699632741460">Périphérique non compatible</translation> <translation id="6156262341071374681">Développer pour afficher toutes les applications</translation> <translation id="615957422585914272">Afficher le clavier à l'écran</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index eb05b8b..db5d732 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Abrir ao finalizar</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> e <ph name="UNAVAILABLE_APPS_COUNT" /> aplicacións máis non están neste dispositivo.</translation> <translation id="3742055079367172538">Captura de pantalla feita</translation> -<translation id="3744282433224562605">Para desbloquear o Chromebook, mete o contrasinal</translation> <translation id="3771549900096082774">Modo de alto contraste</translation> <translation id="3773700760453577392">Un administrador non permitiu o inicio de sesión múltiple de <ph name="USER_EMAIL" />. Todos os usuarios deben pechar sesión para poder continuar.</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">Mostrar no cartafol</translation> <translation id="5176318573511391780">Gravar pantalla parcial</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> combinouse con <ph name="IN_PLACE_APP" /> para crear un cartafol novo.</translation> -<translation id="5199367439331364630">Para iniciar sesión no Chromebook, mete o contrasinal</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 notificación máis}other{# notificacións máis}}</translation> <translation id="5207949376430453814">Destacar o cursor de texto</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">O Asistente de Google non está dispoñible cando se utiliza unha sesión de convidado.</translation> <translation id="6134259848159370930">Realiza buscas no teu dispositivo, nas aplicacións, nas opcións de configuración e na Web.</translation> <translation id="6137566720514957455">Abrir cadro de diálogo de eliminación para <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Confirma a descarga</translation> <translation id="6154006699632741460">O periférico non é compatible</translation> <translation id="6156262341071374681">Despregar todas as aplicacións</translation> <translation id="615957422585914272">Mostrar teclado en pantalla</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 1016758..99b6954 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">પૂર્ણ થાય ત્યારે ખોલો</translation> <translation id="3726171378575546917">આ ડિવાઇસ પર <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> અને વધુ <ph name="UNAVAILABLE_APPS_COUNT" /> ઍપ ઉપલબ્ધ નથી.</translation> <translation id="3742055079367172538">સ્ક્રીનશૉટ લેવાયો</translation> -<translation id="3744282433224562605">તમારી Chromebook અનલૉક કરવા માટે પાસવર્ડ દાખલ કરો</translation> <translation id="3771549900096082774">ઉચ્ચ કોન્ટ્રાસ્ટ મોડ</translation> <translation id="3773700760453577392">એડમિને <ph name="USER_EMAIL" /> માટે એકથી વધુ સાઇન ઇનને નામંજૂર કર્યું છે. ચાલુ રાખવા માટે બધા વપરાશકર્તાઓએ સાઇન આઉટ કરવું જરૂરી છે.</translation> <translation id="3779139509281456663"><ph name="NAME" /> કનેક્ટ કરી રહ્યાં છીએ</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">ફોલ્ડરમાં બતાવો</translation> <translation id="5176318573511391780">આંશિક સ્ક્રીન રેકોર્ડ કરો</translation> <translation id="5198715732953550718">નવું ફોલ્ડર બનાવવા માટે <ph name="MOVED_APP_NAME" />ને <ph name="IN_PLACE_APP" /> સાથે જોડી.</translation> -<translation id="5199367439331364630">શું તમારી Chromebookમાં સાઇન ઇન કરવા માટે પાસવર્ડ દાખલ કરો</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{અન્ય 1 નોટિફિકેશન}one{અન્ય # નોટિફિકેશન}other{અન્ય # નોટિફિકેશન}}</translation> <translation id="5207949376430453814">ટેક્સ્ટ કૅરેટને હાઇલાઇટ કરો</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">અતિથિ સત્રમાં Google Assistant ઉપલબ્ધ હોતું નથી.</translation> <translation id="6134259848159370930">તમારા ડિવાઇસ, ઍપ, સેટિંગ અને વેબ પર શોધો.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> માટે કાઢી નાખવાનો સંવાદ ખોલો</translation> +<translation id="6141988275892716286">ડાઉનલોડની પુષ્ટિ કરો</translation> <translation id="6154006699632741460">પેરિફેરલને સપોર્ટ આપવામાં આવતો નથી</translation> <translation id="6156262341071374681">બધી ઍપ માટે વિસ્તૃત કરો</translation> <translation id="615957422585914272">ઑન-સ્ક્રીન કીબોર્ડ બતાવો</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index d9baca0..12434512 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">पूरा होने पर खोलें</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, और <ph name="UNAVAILABLE_APPS_COUNT" /> ऐप्लिकेशन इस डिवाइस पर मौजूद नहीं हैं.</translation> <translation id="3742055079367172538">स्क्रीनशॉट लिया गया</translation> -<translation id="3744282433224562605">अपना Chromebook अनलॉक करने के लिए, पासवर्ड डालें</translation> <translation id="3771549900096082774">उच्च कंट्रास्ट मोड</translation> <translation id="3773700760453577392">किसी एडमिन ने <ph name="USER_EMAIL" /> के लिए एक से ज़्यादा 'साइन इन' नामंज़ूर कर दिए हैं. जारी रखने के लिए सभी उपयोगकर्ताओं को साइन आउट करना होगा.</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">फ़ोल्डर में दिखाएं</translation> <translation id="5176318573511391780">स्क्रीन के कुछ हिस्से को रिकॉर्ड करें</translation> <translation id="5198715732953550718">नया फ़ोल्डर बनाने के लिए <ph name="MOVED_APP_NAME" /> को <ph name="IN_PLACE_APP" /> में जोड़ा गया.</translation> -<translation id="5199367439331364630">अपने Chromebook में साइन इन करने के लिए, पासवर्ड डालें</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 अन्य सूचना}one{# अन्य सूचना}other{# अन्य सूचनाएं}}</translation> <translation id="5207949376430453814">लेख कैरेट हाइलाइट करें</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">Google Assistant की सुविधा मेहमान के तौर पर ब्राउज़ करने के सेशन में उपलब्ध नहीं है.</translation> <translation id="6134259848159370930">अपने डिवाइस, ऐप्लिकेशन, सेटिंग, के साथ-साथ वेब पर भी खोजें.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> के लिए, खाता हटाएं वाला डायलॉग खोलें</translation> +<translation id="6141988275892716286">डाउनलोड की पुष्टि करें</translation> <translation id="6154006699632741460">सहायक डिवाइस (जैसे, कीबोर्ड, माउस, मॉनिटर, वेबकैम वगैरह) काम नहीं कर रहा</translation> <translation id="6156262341071374681">सभी ऐप्लिकेशन दिखाएं</translation> <translation id="615957422585914272">ऑन-स्क्रीन कीबोर्ड दिखाएं</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index a49ba7b..5421f64 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Otvaranje nakon završetka</translation> <translation id="3726171378575546917">Aplikacije <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> i njih još <ph name="UNAVAILABLE_APPS_COUNT" /> nisu instalirane na ovom uređaju.</translation> <translation id="3742055079367172538">Izrađena je snimka zaslona</translation> -<translation id="3744282433224562605">Da biste otključali Chromebook, unesite zaporku</translation> <translation id="3771549900096082774">Način visokog kontrasta</translation> <translation id="3773700760453577392">Administrator je onemogućio višestruku prijavu za <ph name="USER_EMAIL" />. Svi se korisnici moraju odjaviti da bi nastavili.</translation> <translation id="3779139509281456663">Povezivanje s uređajem <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Pokaži u mapi</translation> <translation id="5176318573511391780">Snimanje dijela zaslona</translation> <translation id="5198715732953550718">Aplikacija <ph name="MOVED_APP_NAME" /> povezana je s aplikacijom <ph name="IN_PLACE_APP" /> u novu mapu.</translation> -<translation id="5199367439331364630">Da biste se prijavili na Chromebook, unesite zaporku</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Još jedna obavijest}one{Još # obavijest}few{Još # obavijesti}other{Još # obavijesti}}</translation> <translation id="5207949376430453814">Istakni znak za umetanje teksta</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google asistent nije dostupan u gostujućoj sesiji.</translation> <translation id="6134259848159370930">Pretražite uređaj, aplikacije, postavke i web.</translation> <translation id="6137566720514957455">Otvorite dijalog za uklanjanje za <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Potvrda preuzimanja</translation> <translation id="6154006699632741460">Periferni uređaj nije podržan</translation> <translation id="6156262341071374681">Proširivanje na sve aplikacije</translation> <translation id="615957422585914272">Prikaži tipkovnicu na zaslonu</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index 491220a5..39e4829 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Megnyitás, ha kész</translation> <translation id="3726171378575546917">A(z) <ph name="UNAVAILABLE_APPS_ONE" />, a(z) <ph name="UNAVAILABLE_APPS_TWO" /> és <ph name="UNAVAILABLE_APPS_COUNT" /> további alkalmazás nincs telepítve erre az eszközre.</translation> <translation id="3742055079367172538">Képernyőkép elkészítve</translation> -<translation id="3744282433224562605">A Chromebook zárolásának feloldásához írja be jelszavát.</translation> <translation id="3771549900096082774">Nagy kontrasztú mód</translation> <translation id="3773700760453577392">Egy rendszergazda letiltotta a többfiókos bejelentkezést <ph name="USER_EMAIL" /> számára. Az összes felhasználónak ki kell jelentkeznie a folytatáshoz.</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">Megjelenítés mappában</translation> <translation id="5176318573511391780">Részleges képernyő rögzítése</translation> <translation id="5198715732953550718">A következő alkalmazások össze lettek vonva egy új mappába: <ph name="MOVED_APP_NAME" /> és <ph name="IN_PLACE_APP" />.</translation> -<translation id="5199367439331364630">A Chromebookba való bejelentkezéshez írja be a jelszót</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 egyéb értesítés}other{# egyéb értesítés}}</translation> <translation id="5207949376430453814">Szövegbeszúrási pont kiemelése</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">A Google Segéd nem áll rendelkezésre Vendég-munkafolyamatban.</translation> <translation id="6134259848159370930">Kereshet az eszközén, az alkalmazások és a beállítások között, valamint az interneten.</translation> <translation id="6137566720514957455">Eltávolítási párbeszédpanel megnyitása, <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Letöltés megerősítése</translation> <translation id="6154006699632741460">A periféria nem támogatott</translation> <translation id="6156262341071374681">Összes alkalmazás kibontása</translation> <translation id="615957422585914272">A képernyő-billentyűzet megjelenítése</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index 1b16388..51b5f8d 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">Անցում կատարվեց նոթբուքի ռեժիմին</translation> <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> օգտատերը կարող է ավելի ուշ հաշիվ մտնել։</translation> <translation id="3321628682574733415">Ծնողի մուտքի կոդը սխալ է</translation> +<translation id="3340475855009870209">Ներբեռնվող <ph name="FILENAME" /> ֆայլը ստուգվում է</translation> <translation id="3341303451326249809">Սքրինշոթը ստեղծվեց</translation> <translation id="334252345105450327">Սքրինշոթ անել</translation> <translation id="3351879221545518001">Դուք հեռարձակում եք ձեր էկրանի պատկերը:</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">Բացել ներբեռնելուց հետո</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" /> և <ph name="UNAVAILABLE_APPS_TWO" /> հավելվածներն ու ևս <ph name="UNAVAILABLE_APPS_COUNT" /> հավելված տեղադրված չեն այս սարքում։</translation> <translation id="3742055079367172538">Սքրինշոթը ստեղծված է</translation> -<translation id="3744282433224562605">Ձեր Chromebook-ն ապակողպելու համար մուտքագրեք գաղտնաբառը</translation> <translation id="3771549900096082774">Բարձր կոնտրաստով ռեժիմ</translation> <translation id="3773700760453577392">Ադմինիստրատորն արգելել է բազմակի մուտքը <ph name="USER_EMAIL" />-ի հաշվի համար: Շարունակելու համար բոլոր օգտատերերը պետք է դուրս գրվեն:</translation> <translation id="3779139509281456663"><ph name="NAME" /> սարքը զուգակցվում է</translation> @@ -627,7 +627,6 @@ <translation id="5170568018924773124">Ցույց տալ պանակում</translation> <translation id="5176318573511391780">Տեսագրել էկրանի մի մասը</translation> <translation id="5198715732953550718">Նոր պանակ ստեղծելու համար «<ph name="MOVED_APP_NAME" />» և «<ph name="IN_PLACE_APP" />» հավելվածները միավորվեցին։</translation> -<translation id="5199367439331364630">Ձեր Chromebook մուտք գործելու համար մուտքագրեք գաղտնաբառը</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />․ <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Եվս 1 ծանուցում}one{Եվս # ծանուցում}other{Եվս # ծանուցում}}</translation> <translation id="5207949376430453814">Ընդգծել տեքստի նշորդը</translation> @@ -765,6 +764,7 @@ <translation id="612734058257491180">Google Օգնականը հասանելի չէ հյուրի աշխատաշրջանում:</translation> <translation id="6134259848159370930">Որոնեք սարքում, հավելվածներում, կարգավորումներում և համացանցում։</translation> <translation id="6137566720514957455">Բացել <ph name="USER_EMAIL_ADDRESS" /> հաշվի հեռացման երկխոսության պատուհանը</translation> +<translation id="6141988275892716286">Հաստատեք ներբեռնումը</translation> <translation id="6154006699632741460">Արտաքին սարքերը չեն աջակցվում</translation> <translation id="6156262341071374681">Ցուցադրել բոլոր հավելվածները</translation> <translation id="615957422585914272">Ցույց տալ էկրանի ստեղնաշարը</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index 17dd2b4..616c20b 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Buka saat selesai</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, dan <ph name="UNAVAILABLE_APPS_COUNT" /> lainnya tidak ada di perangkat ini.</translation> <translation id="3742055079367172538">Screenshot telah diambil</translation> -<translation id="3744282433224562605">Untuk membuka kunci Chromebook, masukkan sandi</translation> <translation id="3771549900096082774">Mode Kontras Tinggi</translation> <translation id="3773700760453577392">Administrator telah melarang fitur login multipel untuk <ph name="USER_EMAIL" />. Semua pengguna harus logout untuk melanjutkan.</translation> <translation id="3779139509281456663">Menghubungkan <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Tampilkan dalam folder</translation> <translation id="5176318573511391780">Rekam sebagian layar</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> digabungkan dengan <ph name="IN_PLACE_APP" /> untuk membuat folder baru.</translation> -<translation id="5199367439331364630">Untuk login ke Chromebook, masukkan sandi</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 notifikasi lainnya}other{# notifikasi lainnya}}</translation> <translation id="5207949376430453814">Sorot tempat penyisipan teks</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Asisten Google tidak tersedia dalam sesi tamu.</translation> <translation id="6134259848159370930">Telusuri perangkat, aplikasi, setelan, dan web.</translation> <translation id="6137566720514957455">Buka dialog hapus untuk <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Konfirmasi download</translation> <translation id="6154006699632741460">Periferal tidak didukung</translation> <translation id="6156262341071374681">Tampilkan semua aplikasi</translation> <translation id="615957422585914272">Tampilkan keyboard di layar</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index 446b0559..a733d23 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Opna þegar niðurhali lýkur</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> og <ph name="UNAVAILABLE_APPS_COUNT" /> í viðbót eru ekki í þessu tæki.</translation> <translation id="3742055079367172538">Skjámynd tekin</translation> -<translation id="3744282433224562605">Sláðu inn aðgangsorð til að taka Chromebook úr lás</translation> <translation id="3771549900096082774">Mikil birtuskil</translation> <translation id="3773700760453577392">Stjórnandi hefur lokað á innskráningu fleiri en eins notanda fyrir <ph name="USER_EMAIL" />. Allir notendur verða að skrá sig út til að halda áfram.</translation> <translation id="3779139509281456663">Tengist <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Sýna í möppu</translation> <translation id="5176318573511391780">Upptaka á hluta skjás</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> var sameinað við <ph name="IN_PLACE_APP" /> til að búa til nýja möppu.</translation> -<translation id="5199367439331364630">Sláðu inn aðgangsorð til að skrá þig inn á Chromebook</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 tilkynning í viðbót}one{# tilkynning í viðbót}other{# tilkynningar í viðbót}}</translation> <translation id="5207949376430453814">Auðkenna textainnskotsmerki</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google hjálparinn er ekki í boði í gestalotu.</translation> <translation id="6134259848159370930">Leitaðu í tækinu þínu, forritum, stillingum og á netinu.</translation> <translation id="6137566720514957455">Opna fjarlægingarglugga fyrir <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Staðfesta niðurhal</translation> <translation id="6154006699632741460">Jaðartæki er ekki stutt</translation> <translation id="6156262341071374681">Fara í öll forrit</translation> <translation id="615957422585914272">Sýna skjályklaborðið</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index 1660f05..c9c749a 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Apri dopo il completamento</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> e altre <ph name="UNAVAILABLE_APPS_COUNT" /> app non sono disponibili su questo dispositivo.</translation> <translation id="3742055079367172538">Screenshot acquisito</translation> -<translation id="3744282433224562605">Per sbloccare Chromebook, inserisci la password</translation> <translation id="3771549900096082774">Modalità ad alto contrasto</translation> <translation id="3773700760453577392">Un amministratore ha vietato l'accesso simultaneo per <ph name="USER_EMAIL" />. Per continuare, devono disconnettersi tutti gli utenti.</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">Mostra nella cartella</translation> <translation id="5176318573511391780">Registra schermo parziale</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> combinata con <ph name="IN_PLACE_APP" /> per creare una nuova cartella.</translation> -<translation id="5199367439331364630">Per accedere a Chromebook, inserisci la password</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 altra notifica}one{altre # notifiche}other{altre # notifiche}}</translation> <translation id="5207949376430453814">Evidenzia il cursore di testo</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">L'Assistente Google non è disponibile in una sessione Ospite.</translation> <translation id="6134259848159370930">Cerca sul dispositivo, nelle app, nelle impostazioni e sul Web.</translation> <translation id="6137566720514957455">Apri la finestra di dialogo di rimozione per <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Conferma download</translation> <translation id="6154006699632741460">Periferica non supportata</translation> <translation id="6156262341071374681">Espandi per vedere tutte le app</translation> <translation id="615957422585914272">Mostra tastiera sullo schermo</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index 7f77097..25571d0 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">פתיחה לאחר השלמת ההורדה</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ועוד <ph name="UNAVAILABLE_APPS_COUNT" /> אפליקציות נוספות לא נמצאות במכשיר הזה.</translation> <translation id="3742055079367172538">צילום המסך בוצע</translation> -<translation id="3744282433224562605">כדי לבטל את נעילת ה-Chromebook, עליך להזין סיסמה</translation> <translation id="3771549900096082774">מצב ניגודיות גבוהה</translation> <translation id="3773700760453577392">מנהל מערכת ביטל הרשאה של כניסה עם מספר חשבונות עבור <ph name="USER_EMAIL" />. כדי להמשיך, כל המשתמשים חייבים לבצע יציאה.</translation> <translation id="3779139509281456663">מתבצע חיבור של <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">הצגה בתיקייה</translation> <translation id="5176318573511391780">הקלטה של מסך חלקי</translation> <translation id="5198715732953550718">האפליקציה <ph name="MOVED_APP_NAME" /> משולבת ביחד עם האפליקציה <ph name="IN_PLACE_APP" /> ליצירת תיקייה חדשה.</translation> -<translation id="5199367439331364630">כדי לבטל את נעילת ה-Chromebook, עליך להזין סיסמה</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{התראה אחת נוספת}two{# התראות נוספות}many{# התראות נוספות}other{# התראות נוספות}}</translation> <translation id="5207949376430453814">הדגשה של סמן הטקסט</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google Assistant לא זמינה בגלישה כאורח.</translation> <translation id="6134259848159370930">אפשר לחפש במכשיר, באפליקציות ובאינטרנט.</translation> <translation id="6137566720514957455">פתיחת תיבת דו-דיח להסרה של <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">אישור הורדה</translation> <translation id="6154006699632741460">אין תמיכה בציוד ההיקפי</translation> <translation id="6156262341071374681">הרחבה לכל האפליקציות</translation> <translation id="615957422585914272">הצגת מקלדת במסך</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index 5355c68..e926684 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">完了したら開く</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />、<ph name="UNAVAILABLE_APPS_TWO" />、<ph name="UNAVAILABLE_APPS_COUNT" /> はこのデバイスにありません。</translation> <translation id="3742055079367172538">スクリーンショット撮影完了</translation> -<translation id="3744282433224562605">Chromebook のロックを解除するには、パスワードを入力します</translation> <translation id="3771549900096082774">ハイ コントラスト モード</translation> <translation id="3773700760453577392"><ph name="USER_EMAIL" /> へのマルチログインは、管理者によって禁止されています。続行するには、すべてのユーザーがログアウトする必要があります。</translation> <translation id="3779139509281456663"><ph name="NAME" /> を接続中</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">フォルダを開く</translation> <translation id="5176318573511391780">画面の一部を録画</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> で <ph name="IN_PLACE_APP" /> を使用して新しいフォルダが作成されました。</translation> -<translation id="5199367439331364630">Chromebook にログインするには、パスワードを入力します</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />、<ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />、<ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{他 1 件の通知}other{他 # 件の通知}}</translation> <translation id="5207949376430453814">テキスト カーソルをハイライト表示する</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google アシスタントは、ゲスト セッションではご利用いただけません。</translation> <translation id="6134259848159370930">デバイス、アプリ、設定、ウェブを検索します。</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> の削除ダイアログを開きます</translation> +<translation id="6141988275892716286">ダウンロードの確認</translation> <translation id="6154006699632741460">サポートされていない周辺機器です</translation> <translation id="6156262341071374681">すべてのアプリを表示</translation> <translation id="615957422585914272">画面キーボードを表示する</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index 23ced80..226f3f6 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -417,7 +417,6 @@ <translation id="3713734891607377840">დასრულებისას გახსნა</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> და <ph name="UNAVAILABLE_APPS_COUNT" /> სხვა აპი არ არის ამ მოწყობილობაზე.</translation> <translation id="3742055079367172538">ეკრანის ანაბეჭდი გადაღებულია</translation> -<translation id="3744282433224562605">თქვენი Chromebook-ის განსაბლოკად შეიყვანეთ პაროლი</translation> <translation id="3771549900096082774">მაღალკონტრასტული რეჟიმი</translation> <translation id="3773700760453577392">ადმინისტრატორმა აკრძალა მრავალჯერადი შესვლა <ph name="USER_EMAIL" />-ისთვის. გასაგრძელებლად საჭიროა ყველა მომხმარებლის გამოსვლა სისტემიდან.</translation> <translation id="3779139509281456663">მიმდინარეობს <ph name="NAME" />-ის დაკავშირება</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">საქაღალდეში ჩვენება</translation> <translation id="5176318573511391780">ეკრანის ნაწილის ჩაწერა</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> დაჯგუფდა <ph name="IN_PLACE_APP" />-თან ახალი საქაღალდის შესაქმნელად.</translation> -<translation id="5199367439331364630">თქვენს Chromebook-ში შესასვლელად შეიყვანეთ პაროლი</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 სხვა შეტყობინება}other{# სხვა შეტყობინება}}</translation> <translation id="5207949376430453814">ტექსტის კურსორის გამოყოფა</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">Google ასისტენტი მიუწვდომელია სტუმრის სესიაში.</translation> <translation id="6134259848159370930">წამოიწყეთ ძიება თქვენს მოწყობილობაში, აპებში, პარამეტრებსა და ვებში.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" />-ის ამოშლის დიალოგის გახსნა</translation> +<translation id="6141988275892716286">დაადასტურეთ ჩამოტვირთვა</translation> <translation id="6154006699632741460">პერიფერიული მოწყობილობა მხარდაუჭერელია</translation> <translation id="6156262341071374681">გაშლა ყველა აპის გამოსაჩენად</translation> <translation id="615957422585914272">ეკრანული კლავიატურის ჩვენება</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index f2d9f79..8b40c4d 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C құрылғысы (алдыңғы ұяшық)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> дисплейі <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Гц) ажыратымдылығына өзгерді. Өзгерістерді сақтау үшін "Растау" түймесін басыңыз. Алдыңғы параметрлер <ph name="TIMEOUT_SECONDS" /> кейін қалпына келтіріледі.</translation> <translation id="1013923882670373915">"<ph name="DEVICE_NAME" />" Bluetooth құрылғысы жұптауды сұрайды. Аталмыш құрылғыда осы PIN кодын енгізіңіз. <ph name="PINCODE" /></translation> +<translation id="1014111206066007277">Скринкаст құралдары</translation> <translation id="1024261588257374085">Экран скриншотының бір бөлігі таңдалды.</translation> <translation id="1032891413405719768">Стилус батареясының заряды аз қалды</translation> <translation id="1036073649888683237">Хабарландыруларды басқару үшін "Параметрлер" бөліміне өтіңіз.</translation> @@ -36,6 +37,7 @@ <translation id="1181037720776840403">Өшіру</translation> <translation id="118532027333893379">Толық экранды түсіру үшін кез келген жерді басыңыз.</translation> <translation id="1190609913194133056">Хабарландыру орталығы</translation> +<translation id="1190678134285018527">Құрылғыны алдыңғы нұсқаға қайтару керек</translation> <translation id="1195412055398077112">көрінбейтін бөлік</translation> <translation id="119944043368869598">Барлығын өшіру</translation> <translation id="1199716647557067911">Switch Access функциясын шынымен өшіргіңіз келе ме?</translation> @@ -124,6 +126,7 @@ <translation id="1743570585616704562">Анықталмады</translation> <translation id="1746730358044914197">Енгізу әдістерін әкімші конфигурациялайды.</translation> <translation id="1747827819627189109">Экрандық пернетақта қосылды</translation> +<translation id="1749109475624620922"><ph name="WINDOW_TITLE" /> терезесі барлық жұмыс үстеліне тағайындалды.</translation> <translation id="1750088060796401187">Ең көбі <ph name="MAX_DESK_LIMIT" /> жұмыс үстелін ашуға болады. Жаңасын ашу үшін жұмыс үстелін жойыңыз.</translation> <translation id="1761222317188459878">Желі байланысын қосу/өшіру. <ph name="STATE_TEXT" /></translation> <translation id="1768366657309696705"><ph name="LAUNCHER_KEY_NAME" /> + нүкте пернелер тіркесімінің функциясы өзгерді. Insert пернесінің әрекетін орындау үшін <ph name="LAUNCHER_KEY_NAME" /> + Shift + Backspace пернелер тіркесімін басыңыз.</translation> @@ -257,6 +260,7 @@ <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> құрылғысын <ph name="MANAGER" /> басқарады.</translation> <translation id="2782591952652094792">Түсіру режимінен шығу</translation> <translation id="2792498699870441125">Alt+Іздеу</translation> +<translation id="2797741504905337289">Shelf Party</translation> <translation id="2803313416453193357">Қалтаны ашу</translation> <translation id="2805756323405976993">Қолданбалар</translation> <translation id="2814448776515246190">Экранның бір бөлігін түсіру</translation> @@ -314,6 +318,7 @@ <translation id="3153444934357957346">Бірнеше аккаунтқа кіру мүмкіндігінде <ph name="MULTI_PROFILE_USER_LIMIT" /> аккаунтқа ғана рұқсат етілген.</translation> <translation id="3154351730702813399">Құрылғы әкімшісі интернетті шолуыңызға қатысты ақпаратты көре алады.</translation> <translation id="316086887565479535">Үлгіде қолдау көрсетілмейтін қолданбалар бар</translation> +<translation id="316356270129335934"><ph name="MANAGER" /> <ph name="DEVICE_TYPE" /> құрылғыңызды алдыңғы нұсқаға қайтарады. Құрылғы бастапқы күйге қайтарылады және барлық дерек жойылады.</translation> <translation id="3181441307743005334">Қайту іске қосуға біраз уақыт қажет болуы мүмкін</translation> <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Құрылғыға жалғанған}other{# құрылғыға жалғанған}}</translation> <translation id="320207200541803018">Таймерді орнату</translation> @@ -411,7 +416,6 @@ <translation id="3713734891607377840">Жүктеп алынған соң ашу</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> және тағы <ph name="UNAVAILABLE_APPS_COUNT" /> қолданба бұл құрылғыда жоқ.</translation> <translation id="3742055079367172538">Скриншот түсірілді</translation> -<translation id="3744282433224562605">Chromebook құлпын ашу үшін құпия сөзді енгізіңіз.</translation> <translation id="3771549900096082774">Жоғары контраст режимі</translation> <translation id="3773700760453577392">Әкімшінің шешімі бойынша енді <ph name="USER_EMAIL" /> электрондық поштасына бір уақытта бірнеше пайдаланушы кіре алмайды. Жалғастыру үшін пайдаланушылардың барлығы аккаунттан шығуы керек.</translation> <translation id="3779139509281456663"><ph name="NAME" /> құрылғысы қосылуда</translation> @@ -436,6 +440,7 @@ <translation id="3899995891769452915">Дауыспен енгізу</translation> <translation id="3900355044994618856">Сеанс <ph name="SESSION_TIME_REMAINING" /> өткен соң аяқталады</translation> <translation id="3901991538546252627"><ph name="NAME" /> желісіне қосылу</translation> +<translation id="3922427723338465344">{0,plural, =1{Құрылғыны 1 минутта алдыңғы нұсқаға қайтару қажет}other{Құрылғыны # минутта алдыңғы нұсқаға қайтару қажет}}</translation> <translation id="3923494859158167397">Ешқандай мобильдік желі реттелмеген.</translation> <translation id="3932043219784172185">Жалғанған құрылғы жоқ.</translation> <translation id="3943857333388298514">Қою</translation> @@ -553,6 +558,7 @@ <translation id="4623167406982293031">Аккаунтты растау</translation> <translation id="4628757576491864469">Құрылғылар</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, рейтингісі: <ph name="RATING_SCORE" /></translation> +<translation id="4633185660152240791">{0,plural, =1{Құрылғыны бір күн ішінде алдыңғы нұсқаға қайтару қажет}other{Құрылғыны # күн ішінде алдыңғы нұсқаға қайтару қажет}}</translation> <translation id="4642092649622328492">Экранның бір бөлігін түсіру</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, қолданба ұсынысы</translation> <translation id="4659419629803378708">ChromeVox қосылды</translation> @@ -593,6 +599,7 @@ <translation id="4946376291507881335">Суретке түсіру</translation> <translation id="495046168593986294">Жоғарыға айналдыру</translation> <translation id="4952936045814352993">Дабыл сигналы өшірілсе, телефонды табу функциясы қолжетімді болмайды.</translation> +<translation id="4960324571663582548"><ph name="MANAGER" /> сізден <ph name="DEVICE_TYPE" /> құрылғысын алдыңғы нұсқаға қайтаруды талап етеді. Құрылғы бастапқы күйге қайтарылады және барлық дерек жойылады.</translation> <translation id="4961318399572185831">Экран трансляциясы</translation> <translation id="4969092041573468113"><ph name="HOURS" />с <ph name="MINUTES" />м <ph name="SECONDS" />с</translation> <translation id="4975771730019223894">Қолданбаға танымбелгі қою</translation> @@ -619,7 +626,6 @@ <translation id="5170568018924773124">Қалтада көрсету</translation> <translation id="5176318573511391780">Экранның бір бөлігін жазу</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> және <ph name="IN_PLACE_APP" /> қолданбалары қосылып, бір қалта жасалды.</translation> -<translation id="5199367439331364630">Chromebook құрылғысына кіру үшін құпия сөзді енгізіңіз.</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Тағы 1 хабарландыру}other{Тағы # хабарландыру}}</translation> <translation id="5207949376430453814">Мәтін курсорын бөлектеу</translation> @@ -697,6 +703,7 @@ <translation id="5745612484876805746">Күн батқанда, Night Light режимі автоматты түрде іске қосылады</translation> <translation id="5750765938512549687">Bluetooth өшірулі</translation> <translation id="576341972084747908">Қауіпті <ph name="FILENAME" /> файлы жүктеп алынуда</translation> +<translation id="5763928712329149804">Shelf Party режимі өшірулі.</translation> <translation id="576453121877257266">"Түнгі жарық" функциясы қосулы.</translation> <translation id="5769373120130404283">Құпиялылық экраны</translation> <translation id="5777841717266010279">Экран бөлісуді тоқтату қажет пе?</translation> @@ -713,6 +720,7 @@ <translation id="5867217927013474703">Желі туралы ақпарат жиналуда</translation> <translation id="5876666360658629066">Ата-ана кодын енгізіңіз</translation> <translation id="5881540930187678962">Phone Hub кейін орнату</translation> +<translation id="5887954372087850114"><ph name="WINDOW_TITLE" /> терезесі <ph name="DESK_TITLE" /> жұмыс үстеліне тағайындалып, басқаларының бәрінен алынды.</translation> <translation id="5895138241574237353">Қайта іске қосу</translation> <translation id="589817443623831496">Нүктемен сканерлеу</translation> <translation id="5901316534475909376">Shift+Esc</translation> @@ -755,6 +763,7 @@ <translation id="612734058257491180">Google Assistant қонақ сеансында жұмыс істемейді.</translation> <translation id="6134259848159370930">Құрылғыдан, қолданбалардан, параметрлерден және интернеттен іздеңіз.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> аккаунтын өшіру диалогтік терезесін ашу</translation> +<translation id="6141988275892716286">Жүктеп алуды растау</translation> <translation id="6154006699632741460">Перифериялық құрылғыға қолдау жоқ</translation> <translation id="6156262341071374681">Барлық қолданбаларды көрсету</translation> <translation id="615957422585914272">Экрандағы пернетақтаны көрсету</translation> @@ -774,6 +783,7 @@ <translation id="6315170314923504164">Микрофон</translation> <translation id="6330012934079202188">Терезелер барлық жұмыс үстелінен көрсетіліп тұр. Терезелерді қазіргі жұмыс үстелінен көрсету үшін жоғарыға бағыттауыш пернені басыңыз.</translation> <translation id="6338485349199627913"><ph name="DISPLAY_NAME" /> – <ph name="MANAGER" /> басқаратын сеанс.</translation> +<translation id="6344138931392227467"><ph name="DEVICE_NAME" /> қосылды</translation> <translation id="6351032674660237738">ҚОЛДАНБА ҰСЫНЫСТАРЫ</translation> <translation id="6376931439017688372">Bluetooth қосулы</translation> <translation id="6381109794406942707">Құрылғының құлпын ашу үшін PIN кодын енгізіңіз.</translation> @@ -790,6 +800,7 @@ <translation id="6459472438155181876">Экранды <ph name="DISPLAY_NAME" /> дисплейіне кеңейту</translation> <translation id="6482559668224714696">Толық экран ұлғайтқышы</translation> <translation id="6490471652906364588">USB-C құрылғысы (оң жақ ұяшық)</translation> +<translation id="6491071886865974820">Мерзім аяқталғанға дейін, <ph name="MANAGER" /> сізден <ph name="DEVICE_TYPE" /> құрылғысын жаңартуыңызды талап етеді.</translation> <translation id="649452524636452238">Смарт картаның PIN коды</translation> <translation id="6495400115277918834">"Суреттегі сурет" режимі қосылды, ерекшелеу үшін Alt+Shift+V пернелер тіркесімін басыңыз.</translation> <translation id="6501401484702599040">Экранды <ph name="RECEIVER_NAME" /> құрылғысына трансляциялау</translation> @@ -824,6 +835,7 @@ <translation id="6671661918848783005">Chromebook құлпын ашу мүмкін емес.</translation> <translation id="6696025732084565524">Алынбалы пернетақтаны жаңарту қажет</translation> <translation id="6700713906295497288">IME мәзір түймесі</translation> +<translation id="6707693040195709527">Құрылғыны алдыңғы нұсқаға қайтару мерзімі өтіп кетті</translation> <translation id="6710213216561001401">Алдыңғы</translation> <translation id="6713285437468012787">"<ph name="DEVICE_NAME" />" Bluetooth құрылғысы жұпталды және қазір барлық пайдаланушылар үшін қолжетімді. Бұл жұптауды параметрлердің көмегімен жоюыңызға болады.</translation> <translation id="6723839937902243910">Күш</translation> @@ -879,6 +891,7 @@ <translation id="7067196344162293536">Автоматты бұру</translation> <translation id="7068360136237591149">Файлдарды ашу</translation> <translation id="7076293881109082629">Кіру</translation> +<translation id="7086931198345821656">Бұл жаңарту үшін <ph name="DEVICE_TYPE" /> құрылғысын зауыттық параметрлерге қайтару қажет. Барлық дерек жойылады. <ph name="SYSTEM_APP_NAME" /> жүйесінің ең соңғы нұсқасы туралы толығырақ ақпарат алыңыз.</translation> <translation id="7088960765736518739">Switch Access</translation> <translation id="7098389117866926363">USB-C құрылғысы (артқы сол жақ порты)</translation> <translation id="7106330611027933926">Іздеу жолағын көрсету</translation> @@ -899,6 +912,7 @@ <translation id="7302889331339392448">Live Caption өшірулі.</translation> <translation id="7303365578352795231">Басқа құрылғыдан жауап берілуде.</translation> <translation id="7305884605064981971">EDGE</translation> +<translation id="731589979057211264">Shelf Party режимі қосулы.</translation> <translation id="7319740667687257810">Launcher, жартылай көрініс</translation> <translation id="7346909386216857016">Жарайды, түсінікті</translation> <translation id="7348093485538360975">Экрандық пернетақта</translation> @@ -1037,12 +1051,15 @@ <translation id="8196787716797768628">Қолданбалар арасында жылдам ауысып, Chromebook-ті планшет режимінде қолдану үшін қимылдарды пайдаланыңыз.</translation> <translation id="8200772114523450471">Жалғастыру</translation> <translation id="8203795194971602413">Тінтуірдің оң жақ түймесін басу</translation> +<translation id="8209010265547628927">Бастапқы күйге қайтару</translation> <translation id="8219451629189078428">Chromebook құрылғысы осы уақыт бойы қосулы болып, қуат көзіне жалғанулы тұруы керек. Зарядтағыш не адаптер кабельдері Chromebook құрылғысына да, розеткаға да толығымен жалғанғанын тексеріңіз. Chromebook құрылғысын өшірмеңіз.</translation> <translation id="8236042855478648955">Үзіліс жасайтын кез келді</translation> <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, сигнал күші: <ph name="SIGNAL_STRENGTH" />, телефонның батарея заряды: <ph name="BATTERY_STATUS" /></translation> <translation id="8247998213073982446"><ph name="APP_NAME" />, қолданба</translation> +<translation id="8255234195843591763">Жаңарту үшін бастапқы күйге қайтарыңыз.</translation> <translation id="826107067893790409">Enter пернесін басып, <ph name="USER_EMAIL_ADDRESS" /> үшін құрылғының құлпын ашыңыз.</translation> <translation id="8261506727792406068">Жою</translation> +<translation id="8270450402312105425">{0,plural, =1{Құрылғыны бір сағатта алдыңғы нұсқаға қайтару қажет}other{Құрылғыны # сағатта алдыңғы нұсқаға қайтару қажет}}</translation> <translation id="8281279285293265212">Скринкаст сақталмады.</translation> <translation id="8284362522226889623">Алдыңғы жұмыс үстеліне ауысу үшін төрт саусақпен солға қарай сырғытыңыз.</translation> <translation id="828708037801473432">Өшірулі</translation> @@ -1051,6 +1068,7 @@ <translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" /> <ph name="GET_STARTED" /></translation> <translation id="8345019317483336363"><ph name="WINDOW_TITLE" /> терезесі таңдалды</translation> <translation id="8351131234907093545">Ескертпе жасау</translation> +<translation id="8364673525741149932">Shelf Party режимін қосу/өшіру. <ph name="STATE_TEXT" /></translation> <translation id="8371779926711439835">Бір әріпке алға жылжу</translation> <translation id="8371991222807690464">Қонақ режимінде перифериялық құрылғының өнімділігі шектеулі болуы мүмкін.</translation> <translation id="8375916635258623388"><ph name="DEVICE_NAME" /> және телефоныңыз автоматты түрде жалғанады</translation> @@ -1079,6 +1097,7 @@ <translation id="851458219935658693">Терезелерді қазіргі жұмыс үстелінен көрсету, ауыстырып қосқыш таңдалды.</translation> <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> іске қосылғанда зарядталмауы мүмкін.</translation> <translation id="8553395910833293175">Барлық жұмыс үстеліне әлдеқашан тағайындалған.</translation> +<translation id="856298576161209842"><ph name="MANAGER" /> сізге <ph name="DEVICE_TYPE" /> құрылғысын жаңартуды ұсынады.</translation> <translation id="8563862697512465947">Хабарландыру параметрлері</translation> <translation id="857201607579416096">Мәзір экранның төменгі оң жақ бұрышына жылжытылды.</translation> <translation id="8594115950068821369">–<ph name="FORMATTED_TIME" /></translation> @@ -1183,6 +1202,7 @@ <translation id="9220525904950070496">Аккаунтты жою</translation> <translation id="923686485342484400">Шығу үшін Control + Shift + Q тіркесімін екі рет басыңыз.</translation> <translation id="925832987464884575">Алдын ала көріністерді жасыру</translation> +<translation id="937214777182567951"><ph name="MANAGER" /> сізден <ph name="DEVICE_TYPE" /> құрылғысын дереу жаңартуды талап етеді.</translation> <translation id="938963181863597773">Күнтізбемде не бар?</translation> <translation id="945522503751344254">Пікір жіберу</translation> <translation id="951991426597076286">Қабылдамау</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb index 291709c..169699db 100644 --- a/ash/strings/ash_strings_km.xtb +++ b/ash/strings/ash_strings_km.xtb
@@ -417,7 +417,6 @@ <translation id="3713734891607377840">បើកនៅពេលបញ្ចប់</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> និង <ph name="UNAVAILABLE_APPS_COUNT" /> ទៀតមិនមាននៅលើឧបករណ៍នេះទេ។</translation> <translation id="3742055079367172538">រូបថតអេក្រង់ត្រូវបានថតយក</translation> -<translation id="3744282433224562605">ដើម្បីដោះសោ Chromebook របស់អ្នក សូមបញ្ចូលពាក្យសម្ងាត់</translation> <translation id="3771549900096082774">មុខងារភាពដិតកម្រិតខ្ពស់</translation> <translation id="3773700760453577392">អ្នកគ្រប់គ្រងបានដកការអនុញ្ញាតមិនឱ្យមានការចូលគណនីច្រើនសម្រាប់ <ph name="USER_EMAIL" /> ទេ។ អ្នកប្រើប្រាស់ទាំងអស់ត្រូវចាកចេញដើម្បីបន្ត។</translation> <translation id="3779139509281456663">កំពុងភ្ជាប់ <ph name="NAME" /></translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">បង្ហាញនៅក្នុងថតឯកសារ</translation> <translation id="5176318573511391780">ថតវីដេអូអេក្រង់ដោយផ្នែក</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> ត្រូវបានរួមបញ្ចូលជាមួយ <ph name="IN_PLACE_APP" /> ដើម្បីបង្កើតថតថ្មី។</translation> -<translation id="5199367439331364630">ដើម្បីចូល Chromebook របស់អ្នក សូមបញ្ចូលពាក្យសម្ងាត់</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />៖ <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{ការជូនដំណឹង 1 ផ្សេងទៀត}other{ការជូនដំណឹង # ផ្សេងទៀត}}</translation> <translation id="5207949376430453814">រំលេចសញ្ញាអត្ថបទ</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">មិនអាចប្រើ Google ជំនួយការនៅក្នុងវេនភ្ញៀវបានទេ។</translation> <translation id="6134259848159370930">ស្វែងរកឧបករណ៍ កម្មវិធី ការកំណត់ និងបណ្ដាញរបស់អ្នក។</translation> <translation id="6137566720514957455">បើក "ប្រអប់លុបគណនី" សម្រាប់ <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">បញ្ជាក់ការទាញយក</translation> <translation id="6154006699632741460">មិនអាចប្រើឧបករណ៍ខាងក្រៅបានទេ</translation> <translation id="6156262341071374681">ពង្រីកទៅកម្មវិធីទាំងអស់</translation> <translation id="615957422585914272">បង្ហាញក្តារចុចលើអេក្រង់</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index 1ae46ce..f432da3 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">ಪೂರ್ಣವಾದಾಗ ತೆರೆಯಿರಿ</translation> <translation id="3726171378575546917">ಈ ಸಾಧನದಲ್ಲಿ <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ಮತ್ತು ಇನ್ನೂ <ph name="UNAVAILABLE_APPS_COUNT" /> ಆ್ಯಪ್ಗಳು ಲಭ್ಯವಿಲ್ಲ.</translation> <translation id="3742055079367172538">ಸ್ಕ್ರಿನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲಾಗಿದೆ</translation> -<translation id="3744282433224562605">ನಿಮ್ಮ Chromebook ಅನ್ಲಾಕ್ ಮಾಡಲು, ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ</translation> <translation id="3771549900096082774">ಉನ್ನತ ಕಾಂಟ್ರಾಸ್ಟ್ ಮೋಡ್</translation> <translation id="3773700760453577392"><ph name="USER_EMAIL" /> ಗೆ ಬಹು ಸೈನ್-ಇನ್ ಅನುಮತಿಯನ್ನು ನಿರ್ವಾಹಕರು ರದ್ದುಗೊಳಿಸಿದ್ದಾರೆ. ಮುಂದುವರಿಯಲು ಎಲ್ಲ ಬಳಕೆದಾರರು ಸೈನ್ ಔಟ್ ಮಾಡಬೇಕು.</translation> <translation id="3779139509281456663"><ph name="NAME" /> ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">ಫೋಲ್ಡರ್ನಲ್ಲಿ ತೋರಿಸಿ</translation> <translation id="5176318573511391780">ಭಾಗಶಃ ಸ್ಕ್ರೀನ್ ಅನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಿ</translation> <translation id="5198715732953550718">ಹೊಸ ಫೋಲ್ಡರ್ ಅನ್ನು ರಚಿಸಲು <ph name="MOVED_APP_NAME" /> ಆ್ಯಪ್, <ph name="IN_PLACE_APP" /> ಆ್ಯಪ್ ಜೊತೆಗೆ ಸಂಯೋಜಿತವಾಗಿದೆ.</translation> -<translation id="5199367439331364630">ನಿಮ್ಮ Chromebook ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು, ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{ಇತರ 1 ಅಧಿಸೂಚನೆ}one{ಇತರ # ಅಧಿಸೂಚನೆಗಳು}other{ಇತರ # ಅಧಿಸೂಚನೆಗಳು}}</translation> <translation id="5207949376430453814">ಪಠ್ಯದಲ್ಲಿ ಕೆರೆಟ್ ಅನ್ನು ಎದ್ದುಗಾಣಿಸಿ</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">Google ಅಸಿಸ್ಟೆಂಟ್ ಅತಿಥಿ ಸೆಶನ್ನಲ್ಲಿ ಲಭ್ಯವಿಲ್ಲ.</translation> <translation id="6134259848159370930">ನಿಮ್ಮ ಸಾಧನ, ಆ್ಯಪ್ಗಳು, ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ವೆಬ್ನಲ್ಲಿ ಹುಡುಕಿ.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> ಗೆ ಸಂಬಂಧಿಸಿದ ತೆಗೆದುಹಾಕಿ ಡೈಲಾಗ್ ಅನ್ನು ತೆರೆಯಿರಿ</translation> +<translation id="6141988275892716286">ಡೌನ್ಲೋಡ್ ಅನ್ನು ದೃಢೀಕರಿಸಿ</translation> <translation id="6154006699632741460">ಪರಿಫೆರಲ್ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ</translation> <translation id="6156262341071374681">ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ವಿಸ್ತೃತಗೊಳಿಸಿ</translation> <translation id="615957422585914272">ಆನ್-ಸ್ಕ್ರೀನ್ ಕೀಬೋರ್ಡ್ ತೋರಿಸು</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index 62aefdc..0439e2e 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">완료되면 열기</translation> <translation id="3726171378575546917">이 기기에 <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> 외 앱 <ph name="UNAVAILABLE_APPS_COUNT" />개가 없습니다.</translation> <translation id="3742055079367172538">찍은 스크린샷</translation> -<translation id="3744282433224562605">Chromebook을 잠금 해제하려면 비밀번호를 입력하세요.</translation> <translation id="3771549900096082774">고대비 모드</translation> <translation id="3773700760453577392">관리자가 <ph name="USER_EMAIL" />의 멀티 로그인을 허용하지 않습니다. 계속하려면 모든 사용자가 로그아웃해야 합니다.</translation> <translation id="3779139509281456663"><ph name="NAME" /> 연결 중</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">폴더 열기</translation> <translation id="5176318573511391780">화면 일부 녹화</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> 앱과 <ph name="IN_PLACE_APP" /> 앱이 포함된 새 폴더를 만들었습니다.</translation> -<translation id="5199367439331364630">Chromebook에 로그인하려면 비밀번호를 입력하세요.</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{기타 알림 1개}other{기타 알림 #개}}</translation> <translation id="5207949376430453814">텍스트 캐럿 강조표시</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">게스트 세션에서는 Google 어시스턴트를 사용할 수 없습니다.</translation> <translation id="6134259848159370930">기기, 앱, 설정, 웹에서 검색합니다.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> 삭제 대화상자 열기</translation> +<translation id="6141988275892716286">다운로드 확인</translation> <translation id="6154006699632741460">지원되지 않는 주변기기</translation> <translation id="6156262341071374681">펼쳐서 모든 앱 보기</translation> <translation id="615957422585914272">터치 키보드 표시</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index 31f138c0..7cce731 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">Ноутбук режимине которулду</translation> <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> аккаунтка кийинчерээк дагы кире алат.</translation> <translation id="3321628682574733415">Ата-эненин кирүү коду туура эмес</translation> +<translation id="3340475855009870209">Жүктөлүп алынган <ph name="FILENAME" /> текшерилүүдө</translation> <translation id="3341303451326249809">Скриншот тартылды</translation> <translation id="334252345105450327">Скриншот тартып алуу</translation> <translation id="3351879221545518001">Учурда экраныңызды бөлүшүп жатасыз.</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">Жүктөлүп бүткөндөн кийин ачылсын</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> жана дагы<ph name="UNAVAILABLE_APPS_COUNT" /> колдонмо бул түзмөктө жок.</translation> <translation id="3742055079367172538">Скриншот тартылды</translation> -<translation id="3744282433224562605">Chromebook'тун кулпусун ачуу үчүн сырсөздү териңиз</translation> <translation id="3771549900096082774">Жогорку контраст режими</translation> <translation id="3773700760453577392">Администратор <ph name="USER_EMAIL" /> дарегине бир убакта бир нече колдонуучуга кирүүгө тыюу салды. Улантуу үчүн бардык колдонуучулар чыгышы керек.</translation> <translation id="3779139509281456663"><ph name="NAME" /> туташтырылууда</translation> @@ -627,7 +627,6 @@ <translation id="5170568018924773124">Куржунда көрсөтүү</translation> <translation id="5176318573511391780">Экрандын жарымын видеого жаздырып алуу</translation> <translation id="5198715732953550718">Жаңы папка түзүү үчүн <ph name="MOVED_APP_NAME" /> менен <ph name="IN_PLACE_APP" /> бириктирилди.</translation> -<translation id="5199367439331364630">Chromebook'ка кирүү үчүн сырсөздү териңиз</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Дагы 1 билдирме}other{Дагы # билдирме}}</translation> <translation id="5207949376430453814">Текст киргизүү учурунда курсор баса белгиленсин</translation> @@ -765,6 +764,7 @@ <translation id="612734058257491180">Google Жардамчысы конок сеансында жеткиликсиз.</translation> <translation id="6134259848159370930">Түзмөктөн, колдонмолордон, жөндөөлөрдөн жана Интернеттен издеңиз.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> аккаунтун өчүрүү диалогун ачуу</translation> +<translation id="6141988275892716286">Жүктөп алууну ырастаңыз</translation> <translation id="6154006699632741460">Сырткы түзмөк колдоого алынбайт</translation> <translation id="6156262341071374681">Бардык колдонмолорду көрсөтүү</translation> <translation id="615957422585914272">Экрандагы баскычтопту көрсөтүү</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index 84574d7..245b7e3 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -417,7 +417,6 @@ <translation id="3713734891607377840">ເປີດເມື່ອສຳເລັດ</translation> <translation id="3726171378575546917">ບໍ່ມີ <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ແລະ ອີກ <ph name="UNAVAILABLE_APPS_COUNT" /> ແອັບຢູ່ອຸປະກອນນີ້.</translation> <translation id="3742055079367172538">ຖ່າຍຮູບໜ້າຈໍແລ້ວ</translation> -<translation id="3744282433224562605">ເພື່ອປົດລັອກ Chromebook ຂອງທ່ານ, ໃຫ້ໃສ່ລະຫັດຜ່ານກ່ອນ</translation> <translation id="3771549900096082774">ໂໝດສີຕັດກັນສູງ</translation> <translation id="3773700760453577392">ຜູ້ເບິ່ງແຍງລະບົບໄດ້ເຊົາອະນຸຍາດການເຂົ້າສູ່ລະບົບແບບຫຼາຍບັນຊີສໍາລັບ <ph name="USER_EMAIL" /> ແລ້ວ. ຜູ້ໃຊ້ທັງໝົດຕ້ອງອອກຈາກລະບົບເພື່ອສືບຕໍ່.</translation> <translation id="3779139509281456663">ກຳລັງເຊື່ອມຕໍ່ <ph name="NAME" /></translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">ສະແດງຢູ່ໃນໂຟລເດີ</translation> <translation id="5176318573511391780">ບັນທຶກໜ້າຈໍບາງສ່ວນ</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> ຮວມກັນກັບ <ph name="IN_PLACE_APP" /> ເພື່ອສ້າງໂຟນເດີໃໝ່.</translation> -<translation id="5199367439331364630">ເພື່ອເຂົ້າສູ່ລະບົບຫາ Chromebook ຂອງທ່ານ, ໃຫ້ໃສ່ລະຫັດຜ່ານ</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{ການແຈ້ງເຕືອນອື່ນໆ 1 ລາຍການ}other{ການແຈ້ງເຕືອນອື່ນໆ # ລາຍການ}}</translation> <translation id="5207949376430453814">ໝາຍເຄື່ອງໝາຍກຸບຂໍ້ຄວາມ</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">ຜູ້ຊ່ວຍ Google ບໍ່ສາມາດໃຊ້ໄດ້ໃນເຊດຊັນແຂກ.</translation> <translation id="6134259848159370930">ຊອກຫາໃນອຸປະກອນ, ແອັບ, ການຕັ້ງຄ່າ ແລະ ເວັບ.</translation> <translation id="6137566720514957455">ເປີດກ່ອງໂຕ້ຕອບລຶບອອກສຳລັບ <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">ຢືນຢັນການດາວໂຫຼດ</translation> <translation id="6154006699632741460">ບໍ່ຮອງຮັບອຸປະກອນຕໍ່ພ່ວງ</translation> <translation id="6156262341071374681">ຂະຫຍາຍກວມເອົາທຸກແອັບ</translation> <translation id="615957422585914272">ສະແດງຄີບອດເທິງຫນ້າຈໍ</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index a9f6e285..fe9bdfd 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -415,7 +415,6 @@ <translation id="3713734891607377840">Baigus atidaryti</translation> <translation id="3726171378575546917">Šiame įrenginyje nėra „<ph name="UNAVAILABLE_APPS_ONE" />“, „<ph name="UNAVAILABLE_APPS_TWO" />“ ir dar <ph name="UNAVAILABLE_APPS_COUNT" /> program.</translation> <translation id="3742055079367172538">Ekrano kopija padaryta</translation> -<translation id="3744282433224562605">Kad atrakintumėte „Chromebook“, įveskite slaptažodį</translation> <translation id="3771549900096082774">Didelio kontrasto režimas</translation> <translation id="3773700760453577392">Administratorius neleido <ph name="USER_EMAIL" /> prisijungti prie kelių paskyrų. Norėdami tęsti, visi naudotojai turi atsijungti.</translation> <translation id="3779139509281456663">Susiejamas įrenginys „<ph name="NAME" />“</translation> @@ -626,7 +625,6 @@ <translation id="5170568018924773124">Rodyti aplanke</translation> <translation id="5176318573511391780">Įrašyti dalinį ekrano vaizdą</translation> <translation id="5198715732953550718">„<ph name="MOVED_APP_NAME" />“ derinama su „<ph name="IN_PLACE_APP" />“ kuriant naują aplanką.</translation> -<translation id="5199367439331364630">Jei norite prisijungti prie „Chromebook“, įveskite slaptažodį</translation> <translation id="5206028654245650022">„<ph name="APP_NAME" />“, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, „<ph name="PHONE_NAME" />“</translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Dar 1 pranešimas}one{Dar # pranešimas}few{Dar # pranešimai}many{Dar # pranešimo}other{Dar # pranešimų}}</translation> <translation id="5207949376430453814">Paryškinti teksto žymeklį</translation> @@ -764,6 +762,7 @@ <translation id="612734058257491180">„Google Assistant“ nepasiekiamas svečio sesijoje.</translation> <translation id="6134259848159370930">Ieškokite įrenginyje, programose, nustatymuose ir žiniatinklyje.</translation> <translation id="6137566720514957455">Atidaryti <ph name="USER_EMAIL_ADDRESS" /> pašalinimo dialogo langą</translation> +<translation id="6141988275892716286">Atsisiuntimo patvirtinimas</translation> <translation id="6154006699632741460">Išoriniai įrenginiai nepalaikomi</translation> <translation id="6156262341071374681">Išskleisti, kad būtų rodomos visos programos</translation> <translation id="615957422585914272">Rodyti ekrano klaviatūrą</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index d370cbd2..dfa562b 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Kad gatavs, atvērt</translation> <translation id="3726171378575546917">Šajā ierīcē nav lietotņu <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> un vēl <ph name="UNAVAILABLE_APPS_COUNT" /> lietotnes(-ņu).</translation> <translation id="3742055079367172538">Ekrānuzņēmums ir uzņemts</translation> -<translation id="3744282433224562605">Lai atbloķētu Chromebook datoru, ievadiet paroli.</translation> <translation id="3771549900096082774">Augsta kontrasta režīms</translation> <translation id="3773700760453577392">Administrators ir aizliedzis lietotājam <ph name="USER_EMAIL" /> vairākkārtēju pierakstīšanos. Lai turpinātu, visiem lietotājiem ir jāizrakstās.</translation> <translation id="3779139509281456663">Tiek veidots savienojums ar ierīci <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Rādīt mapē</translation> <translation id="5176318573511391780">Ierakstīt daļu ekrāna</translation> <translation id="5198715732953550718">Lietotne <ph name="MOVED_APP_NAME" /> kombinēta ar lietotni <ph name="IN_PLACE_APP" />, lai izveidotu jaunu mapi.</translation> -<translation id="5199367439331364630">Lai pierakstītos Chromebook datorā, ievadiet paroli.</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 cits paziņojums}zero{# citu paziņojumu}one{# cits paziņojums}other{# citi paziņojumi}}</translation> <translation id="5207949376430453814">Izcelt teksta ievietošanas punktu</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google asistents nav pieejams viesa sesijā.</translation> <translation id="6134259848159370930">Varat meklēt ierīcē, lietotnēs, iestatījumos un tīmeklī.</translation> <translation id="6137566720514957455">Atvērt lietotāja <ph name="USER_EMAIL_ADDRESS" /> noņemšanas dialoglodziņu</translation> +<translation id="6141988275892716286">Lejupielādes apstiprināšana</translation> <translation id="6154006699632741460">Neatbalstīta perifērijas ierīce</translation> <translation id="6156262341071374681">Skatīt visas lietotnes</translation> <translation id="615957422585914272">Rādīt ekrāna tastatūru</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index e606449..d3b5c96 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Отвори кога ќе заврши преземањето</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> и уште <ph name="UNAVAILABLE_APPS_COUNT" /> не се на уредов.</translation> <translation id="3742055079367172538">Направена е слика од екранот</translation> -<translation id="3744282433224562605">За да го отклучите вашиот Chromebook, внесете лозинка</translation> <translation id="3771549900096082774">Режим на голем контраст</translation> <translation id="3773700760453577392">Администраторот оневозможил повеќекратно најавување за <ph name="USER_EMAIL" />. За продолжување, сите корисници треба да се одјават.</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">Прикажи во папка</translation> <translation id="5176318573511391780">Делумно снимање екран</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> е комбинирана со <ph name="IN_PLACE_APP" /> за да се создаде нова папка.</translation> -<translation id="5199367439331364630">За да се најавите на вашиот Chromebook, внесете лозинка</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 друго известување}one{# друго известување}other{# други известувања}}</translation> <translation id="5207949376430453814">Нагласи го каретот за текст</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">„Помошникот на Google“ не е достапен во гостинска сесија.</translation> <translation id="6134259848159370930">Пребарувајте низ уредот, апликациите, поставките и на интернет.</translation> <translation id="6137566720514957455">Отвори го дијалогот за отстранување за <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Потврдете го преземањето</translation> <translation id="6154006699632741460">Периферните уреди не се поддржани</translation> <translation id="6156262341071374681">Прошири за приказ на сите апликации</translation> <translation id="615957422585914272">Покажи тастатура на екран</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index dd600f7..22f5060 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -417,7 +417,6 @@ <translation id="3713734891607377840">പൂർത്തിയാകുമ്പോൾ തുറക്കുക</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> എന്നിവയും മറ്റ് <ph name="UNAVAILABLE_APPS_COUNT" /> എണ്ണവും ഈ ഉപകരണത്തിൽ ലഭ്യമല്ല.</translation> <translation id="3742055079367172538">സ്ക്രീൻഷോട്ട് എടുത്തു</translation> -<translation id="3744282433224562605">നിങ്ങളുടെ Chromebook അൺലോക്ക് ചെയ്യാൻ പാസ്വേഡ് നൽകുക</translation> <translation id="3771549900096082774">ഉയർന്ന ദൃശ്യതീവ്രതാ മോഡ്</translation> <translation id="3773700760453577392"><ph name="USER_EMAIL" /> എന്ന ഇമെയിലിലേക്ക് ഒന്നിലധികം പേർ സൈൻ ഇൻ ചെയ്യുന്നത് ഒരു അഡ്മിനിസ്ട്രേറ്റർ വിലക്കിയിരിക്കുന്നു. തുടരാൻ, എല്ലാ ഉപയോക്താക്കളും സൈൻ ഔട്ട് ചെയ്യണം.</translation> <translation id="3779139509281456663"><ph name="NAME" /> കണക്റ്റ് ചെയ്യുന്നു</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">ഫോള്ഡറില് കാണിക്കുക</translation> <translation id="5176318573511391780">ഭാഗിക സ്ക്രീൻ റെക്കോർഡ് ചെയ്യുക</translation> <translation id="5198715732953550718">പുതിയ ഫോൾഡർ സൃഷ്ടിക്കുന്നതിനായി <ph name="MOVED_APP_NAME" /> എന്നതിനെ <ph name="IN_PLACE_APP" /> എന്നതുമായി സംയോജിപ്പിച്ചു.</translation> -<translation id="5199367439331364630">നിങ്ങളുടെ Chromebook-ലേക്ക് സൈൻ ഇൻ ചെയ്യാൻ പാസ്വേഡ് നൽകുക</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{മറ്റൊരു അറിയിപ്പ്}other{മറ്റ് # അറിയിപ്പുകൾ}}</translation> <translation id="5207949376430453814">ടെക്സ്റ്റ് കാരറ്റ് ഹൈലൈറ്റ് ചെയ്യുക</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">അതിഥി സെഷനിൽ Google അസിസ്റ്റന്റ് ലഭ്യമല്ല.</translation> <translation id="6134259848159370930">നിങ്ങളുടെ ഉപകരണവും ആപ്പുകളും ക്രമീകരണവും വെബും തിരയുക.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> -നുള്ള ഡയലോഗ് നീക്കം ചെയ്യുക തുറക്കുക</translation> +<translation id="6141988275892716286">ഡൗൺലോഡ് സ്ഥിരീകരിക്കുക</translation> <translation id="6154006699632741460">പെരിഫറലിനെ പിന്തുണയ്ക്കുന്നില്ല</translation> <translation id="6156262341071374681">എല്ലാ ആപ്പുകളിലേക്കും വികസിപ്പിക്കുക</translation> <translation id="615957422585914272">ഓൺ-സ്ക്രീൻ കീബോർഡ് ദൃശ്യമാക്കുക</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index 68f1d05..c3ff555 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -417,7 +417,6 @@ <translation id="3713734891607377840">Дуусах үед нээх</translation> <translation id="3726171378575546917">Энэ төхөөрөмж дээр <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> болон өөр <ph name="UNAVAILABLE_APPS_COUNT" /> апп байхгүй байна.</translation> <translation id="3742055079367172538">Дэлгэцний зургийг авсан болно (Screenshot)</translation> -<translation id="3744282433224562605">Chromebook-нхээ түгжээг тайлахын тулд нууц үг оруулна уу</translation> <translation id="3771549900096082774">Өндөр ялгаралтай горим</translation> <translation id="3773700760453577392">Админ <ph name="USER_EMAIL" />-д олон зэрэг нэвтрэхийг зөвшөөрөөгүй байна. Үргэлжлүүлэхийн тулд бүх хэрэглэгч гарах шаардлагатай.</translation> @@ -629,7 +628,6 @@ <translation id="5170568018924773124">Хавтсанд харуул</translation> <translation id="5176318573511391780">Хэсэгчилсэн дэлгэцийг бичих</translation> <translation id="5198715732953550718">Шинэ фолдер үүсгэхийн тулд <ph name="MOVED_APP_NAME" />-г <ph name="IN_PLACE_APP" />-тай цуг нийлүүлсэн.</translation> -<translation id="5199367439331364630">Chromebook-дээ нэвтрэхийн тулд нууц үг оруулна уу</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Бусад 1 мэдэгдэл}other{Бусад # мэдэгдэл}}</translation> <translation id="5207949376430453814">Текст оруулах тэмдгийг тодруулах</translation> @@ -767,6 +765,7 @@ <translation id="612734058257491180">Зочны сургалтад Google Туслах боломжгүй байна.</translation> <translation id="6134259848159370930">Төхөөрөмж, апп, тохиргоо, вебээс хайна уу.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" />-н хасах харилцах цонхыг нээнэ үү</translation> +<translation id="6141988275892716286">Таталтыг баталгаажуулах</translation> <translation id="6154006699632741460">Нэмэлтийг дэмждэггүй</translation> <translation id="6156262341071374681">Бүх аппыг харуулах</translation> <translation id="615957422585914272">Дэлгэц дээрх гарыг харуулах</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index cf807ba6..5f51c77 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">पूर्ण झाल्यावर उघडा</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> आणि<ph name="UNAVAILABLE_APPS_COUNT" /> ही ॲप्स या डिव्हाइसवर उपलब्ध नाहीत.</translation> <translation id="3742055079367172538">स्क्रीनशॉट घेतला</translation> -<translation id="3744282433224562605">तुमचे Chromebook अनलॉक करण्यासाठी, पासवर्ड एंटर करा</translation> <translation id="3771549900096082774">उच्च कॉन्ट्रास्ट मोड</translation> <translation id="3773700760453577392">ॲडमिनिस्ट्रेटरने <ph name="USER_EMAIL" /> साठी एकाहून अधिक साइन-इन बंद केले आहे. सुरू ठेवण्यासाठी सर्व वापरकर्त्यांनी साइन आउट करणे आवश्यक आहे.</translation> <translation id="3779139509281456663"><ph name="NAME" /> कनेक्ट करत आहे</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">फोल्डरमध्ये दर्शवा</translation> <translation id="5176318573511391780">स्क्रीन अंशतः रेकॉर्ड करा</translation> <translation id="5198715732953550718">नवीन फोल्डर तयार करण्यासाठी <ph name="IN_PLACE_APP" /> सोबत <ph name="MOVED_APP_NAME" /> एकत्रित केले गेले.</translation> -<translation id="5199367439331364630">तुमच्या Chromebook मध्ये साइन इन करण्यासाठी, पासवर्ड एंटर करा</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{एक इतर सूचना}other{# इतर सूचना}}</translation> <translation id="5207949376430453814">मजकूर कॅरेट हायलाइट करा</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">अतिथी सत्रामध्ये Google असिस्टंट उपलब्ध नाही.</translation> <translation id="6134259848159370930">तुमच्या डिव्हाइस, अॅप्स, सेटिंग्ज, वेबवर शोधा.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> साठी काढून टाकणे डायलॉग उघडा</translation> +<translation id="6141988275892716286">डाउनलोड करण्याचे निश्चित करा</translation> <translation id="6154006699632741460">पेरिफेरलला सपोर्ट नाही</translation> <translation id="6156262341071374681">सर्व अॅप्सवर विस्तार करा</translation> <translation id="615957422585914272">ऑन-स्क्रीन कीबोर्ड दर्शवा</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index da49747..c39b5cb 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Buka apabila sudah selesai</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> dan <ph name="UNAVAILABLE_APPS_COUNT" /> lagi tidak tersedia pada peranti ini.</translation> <translation id="3742055079367172538">Tangkapan skrin diambil</translation> -<translation id="3744282433224562605">Untuk membuka kunci Chromebook anda, masukkan kata laluan</translation> <translation id="3771549900096082774">Mod Kontras Tinggi</translation> <translation id="3773700760453577392">Pentadbir tidak membenarkan log masuk berbilang untuk <ph name="USER_EMAIL" />. Semua pengguna mesti log keluar untuk meneruskan.</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">Paparkan dalam folder</translation> <translation id="5176318573511391780">Rakam skrin separa</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> digabungkan dengan <ph name="IN_PLACE_APP" /> untuk membuat folder baharu.</translation> -<translation id="5199367439331364630">Untuk log masuk ke Chromebook anda, masukkan kata laluan</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 pemberitahuan lain}other{# pemberitahuan lain}}</translation> <translation id="5207949376430453814">Serlahkan karet teks</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">Google Assistant tidak tersedia dalam sesi tetamu.</translation> <translation id="6134259848159370930">Cari dalam peranti anda, apl, tetapan dan web.</translation> <translation id="6137566720514957455">Buka dialog alih keluar untuk <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Sahkan muat turun</translation> <translation id="6154006699632741460">Peranti persisian tidak disokong</translation> <translation id="6156262341071374681">Kembangkan kepada semua apl</translation> <translation id="615957422585914272">Paparkan papan kekunci pada skrin</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index edf3277..f209051 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">လက်ပ်တော့မုဒ်သို့ ပြောင်းထားသည်</translation> <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> သည် နောက်ပိုင်းတွင် လက်မှတ်ထိုး ဝင်နိုင်ပါသေးသည်။</translation> <translation id="3321628682574733415">မိဘသုံးခွင့်ကုဒ် မှားနေသည်</translation> +<translation id="3340475855009870209"><ph name="FILENAME" /> ဒေါင်းလုဒ်ဖိုင်ကို စစ်ဆေးနေသည်</translation> <translation id="3341303451326249809">ဖန်သားပြင်ဓာတ်ပုံ ဖမ်းယူပြီးပြီ</translation> <translation id="334252345105450327">ဖန်သားပြင်ဓာတ်ပုံတစ်ပုံရိုက်ပါ</translation> <translation id="3351879221545518001">သင်သည် လောလောဆယ် မျက်နှာပြင်ကို ကာ့စ်လုပ်နေပါသည်။</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">ပြီးသွားပါက ဖွင့်မည်</translation> <translation id="3726171378575546917">ဤစက်တွင် <ph name="UNAVAILABLE_APPS_ONE" />၊<ph name="UNAVAILABLE_APPS_TWO" /> နှင့် အခြားအက်ပ်<ph name="UNAVAILABLE_APPS_COUNT" /> ခု မရှိပါ။</translation> <translation id="3742055079367172538">မျက်နှာပြင်ပုံရိပ် ရယူပြီး</translation> -<translation id="3744282433224562605">သင့် Chromebook ကို လော့ခ်ဖွင့်ရန် စကားဝှက်ထည့်ပါ</translation> <translation id="3771549900096082774">အဖြူအမဲခြားနားချက် မြင့်သောမုဒ်</translation> <translation id="3773700760453577392">စီမံခန့်ခွဲသူသည် <ph name="USER_EMAIL" /> အတွက် အကောင့်များစွာ လက်မှတ်ထိုးဝင်ခွင့်ကို ပိတ်ထားသည်။ ရှေ့ဆက်နိုင်ရန်အတွက် အသုံးပြုသူများအားလုံး ထွက်ရပါမည်။</translation> <translation id="3779139509281456663"><ph name="NAME" /> နှင့် ချိတ်ဆက်နေသည်</translation> @@ -627,7 +627,6 @@ <translation id="5170568018924773124">ဖိုလ်ဒါ ထဲမှာ ပြရန်</translation> <translation id="5176318573511391780">ဖန်သားပြင်တစ်စိတ်တစ်ပိုင်းကို ရိုက်ကူးရန်</translation> <translation id="5198715732953550718">ဖိုင်တွဲအသစ်ပြုလုပ်ရန် <ph name="MOVED_APP_NAME" /> သည် <ph name="IN_PLACE_APP" /> နှင့် ပေါင်းစည်းထားသည်။</translation> -<translation id="5199367439331364630">သင့် Chromebook သို့ လက်မှတ်ထိုးဝင်ရန် စကားဝှက်ထည့်ပါ</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />၊ <ph name="NOTIFICATION_TITLE" />- <ph name="MESSAGE" />၊ <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{အခြား အကြောင်းကြားချက် 1 ခု}other{အခြား အကြောင်းကြားချက် # ခု}}</translation> <translation id="5207949376430453814">စာရိုက်ထည့်ရန်အကွက်ကို မြင်သာထင်သာဖြစ်အောင်ပြုလုပ်ရန်</translation> @@ -765,6 +764,7 @@ <translation id="612734058257491180">ဧည့်သည်စက်ရှင်တွင် Google Assistant ကို အသုံးပြု၍ မရပါ။</translation> <translation id="6134259848159370930">သင့်စက်ပစ္စည်း၊ အက်ပ်၊ ဆက်တင်နှင့် ဝဘ်တွင် ရှာပါ။</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> အတွက် ဖယ်ရှားမှုဒိုင်ယာလော့ခ် ဖွင့်မည်</translation> +<translation id="6141988275892716286">ဒေါင်းလုဒ်လုပ်ရန် အတည်ပြုခြင်း</translation> <translation id="6154006699632741460">ချိတ်ဆက်ပစ္စည်းကို မပံ့ပိုးပါ</translation> <translation id="6156262341071374681">အက်ပ်အားလုံးကို ပြရန်</translation> <translation id="615957422585914272">မျက်နှာပြင် ပေါ်က ကီးဘုတ်ကို ပြရန်</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index 57d0dfa5..6c37ad9 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">ल्यापटप मोड प्रयोग गर्न थालियो</translation> <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> अझै पनि पछि साइन इन गर्न सक्नुहुन्छ।</translation> <translation id="3321628682574733415">अभिभावकको कोड गलत छ</translation> +<translation id="3340475855009870209">डाउनलोड गरिएको <ph name="FILENAME" /> स्क्यान गरिँदै छ</translation> <translation id="3341303451326249809">स्क्रिनसट खिचियो</translation> <translation id="334252345105450327">स्क्रिनसट खिच्नुहोस्</translation> <translation id="3351879221545518001">तपाईं अहिले स्क्रिन cast गर्दै हुनुहुन्छ।</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">डाउनलोड भएपछि खुल्ने छ</translation> <translation id="3726171378575546917">यो डिभाइसमा <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> र <ph name="UNAVAILABLE_APPS_COUNT" /> उपलब्ध छैनन्।</translation> <translation id="3742055079367172538">स्क्रिनसट लिइयो</translation> -<translation id="3744282433224562605">तपाईं आफ्नो Chromebook अनलक गर्न चाहनुहुन्छ भने पासवर्ड हाल्नुहोस्</translation> <translation id="3771549900096082774">उच्च कन्ट्रास्ट मोड</translation> <translation id="3773700760453577392">कुनै प्रशासकले <ph name="USER_EMAIL" /> बाट एकभन्दा बढी साइन इन गर्ने अनुमति दिनुभएको छैन। जारी राख्न सबै प्रयोगकर्ताहरूले अनिवार्य रूपमा साइन आउट गर्नु पर्छ।</translation> <translation id="3779139509281456663"><ph name="NAME" /> कनेक्ट गरिँदै छ</translation> @@ -627,7 +627,6 @@ <translation id="5170568018924773124">फोल्डरमा देखाउनुहोस्</translation> <translation id="5176318573511391780">स्क्रिनको केही भागको भिडियो रेकर्ड गर्नुहोस्</translation> <translation id="5198715732953550718">नयाँ फोल्डर सिर्जना गर्न <ph name="MOVED_APP_NAME" /> <ph name="IN_PLACE_APP" /> सँग समायोजन गरियो</translation> -<translation id="5199367439331364630">तपाईं आफ्नो Chromebook मा साइन इन गर्न चाहनुहुन्छ भने पासवर्ड हाल्नुहोस्</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{अन्य १ सूचना}other{अन्य # वटा सूचना}}</translation> <translation id="5207949376430453814">पाठको क्योरटलाई हाइलाइट</translation> @@ -765,6 +764,7 @@ <translation id="612734058257491180">Google सहायक अतिथिको सत्रमा उपलब्ध हुँदैन।</translation> <translation id="6134259848159370930">आफ्नो यन्त्र, एप, सेटिङ र वेबमा खोज्नुहोस्।</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> को खाता हटाउने कार्यसम्बन्धी डायलग खोल्नुहोस्</translation> +<translation id="6141988275892716286">डाउनलोड गर्ने पुष्टि गर्नुहोस्</translation> <translation id="6154006699632741460">यो सहायक उपकरण प्रयोग गर्न मिल्दैन</translation> <translation id="6156262341071374681">पूर्णस्क्रिनमा अनुप्रयोगहरूको विस्तृत सूची देखाउनुहोस्</translation> <translation id="615957422585914272">अन-स्क्रिन कुञ्जीपाटी देखाउनुहोस्</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 3ec913c..6ef4dbe 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -417,7 +417,6 @@ <translation id="3713734891607377840">Openen na afronding</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> en nog <ph name="UNAVAILABLE_APPS_COUNT" /> staan niet op dit apparaat.</translation> <translation id="3742055079367172538">Screenshot gemaakt</translation> -<translation id="3744282433224562605">Geef het wachtwoord op om je Chromebook je ontgrendelen</translation> <translation id="3771549900096082774">Modus voor hoog contrast</translation> <translation id="3773700760453577392">Een beheerder heeft geen toestemming gegeven voor toegang tot meerdere accounts voor <ph name="USER_EMAIL" />. Alle gebruikers moeten uitloggen om door te gaan.</translation> <translation id="3779139509281456663"><ph name="NAME" /> koppelen</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">Tonen in map</translation> <translation id="5176318573511391780">Opname van gedeeltelijk scherm maken</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> is gecombineerd met <ph name="IN_PLACE_APP" /> om een nieuwe map te maken.</translation> -<translation id="5199367439331364630">Geef het wachtwoord op om in te loggen op je Chromebook</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 andere melding}other{# andere meldingen}}</translation> <translation id="5207949376430453814">Tekstcursor markeren</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">De Google Assistent is niet beschikbaar in een gastsessie.</translation> <translation id="6134259848159370930">Zoek op je apparaat, in apps en instellingen en op internet.</translation> <translation id="6137566720514957455">Dialoogvenster 'Account verwijderen' openen voor <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Download bevestigen</translation> <translation id="6154006699632741460">Randapparaat niet ondersteund</translation> <translation id="6156262341071374681">Uitbreiden naar alle apps</translation> <translation id="615957422585914272">Schermtoetsenbord bekijken</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 0bc1886b..86b98e0 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Åpne når nedlastingen er fullført</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> og <ph name="UNAVAILABLE_APPS_COUNT" /> til er ikke på denne enheten.</translation> <translation id="3742055079367172538">Skjermdump tatt</translation> -<translation id="3744282433224562605">For å låse opp Chromebooken, skriv inn passordet</translation> <translation id="3771549900096082774">Høykontrastmodus</translation> <translation id="3773700760453577392">En administrator har slått av multipålogging for <ph name="USER_EMAIL" />. Alle brukere må logge av for å fortsette.</translation> <translation id="3779139509281456663">Kobler til <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Vis i mappen</translation> <translation id="5176318573511391780">Ta opp en del av skjermen</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> er kombinert med <ph name="IN_PLACE_APP" /> for å opprette en ny mappe.</translation> -<translation id="5199367439331364630">For å logge på Chromebooken, skriv inn passordet</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 annet varsel}other{# andre varsler}}</translation> <translation id="5207949376430453814">Fremhev tekstinnsettingspunktet</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google-assistenten er ikke tilgjengelig i gjesteøkter.</translation> <translation id="6134259848159370930">Søk på enheten, i apper, i innstillinger og på nettet.</translation> <translation id="6137566720514957455">Åpne dialogboksen for fjerning av <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Bekreft nedlastingen</translation> <translation id="6154006699632741460">Den eksterne enheten støttes ikke</translation> <translation id="6156262341071374681">Vis alle apper</translation> <translation id="615957422585914272">Vis skjermtastaturet</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb index 212d4a1..3f330b50 100644 --- a/ash/strings/ash_strings_or.xtb +++ b/ash/strings/ash_strings_or.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">ଲାପଟପ୍ ମୋଡକୁ ସ୍ୱିଚ୍ କରାଯାଇଛି</translation> <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> ଏବେ ମଧ୍ୟ ପରେ ସାଇନ୍ ଇନ୍ କରିପାରିବେ।</translation> <translation id="3321628682574733415">ଅବୈଧ ପ୍ୟାରେଣ୍ଟ କୋଡ୍</translation> +<translation id="3340475855009870209">ଡାଉନଲୋଡକୁ ସ୍କାନ କରାଯାଉଛି <ph name="FILENAME" /></translation> <translation id="3341303451326249809">ସ୍କ୍ରିନସଟକୁ କ୍ୟାପଚର୍ କରାଯାଇଛି</translation> <translation id="334252345105450327">ଏକ ସ୍କ୍ରିନସଟ୍ ନିଅନ୍ତୁ</translation> <translation id="3351879221545518001">ଆପଣ ବର୍ତ୍ତମାନ ସ୍କ୍ରିନ୍ କାଷ୍ଟ କରୁଛନ୍ତି।</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">ସମ୍ପୂର୍ଣ୍ଣ ହେବା ପରେ ଖୋଲନ୍ତୁ</translation> <translation id="3726171378575546917">ଏହି ଡିଭାଇସରେ <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ଏବଂ <ph name="UNAVAILABLE_APPS_COUNT" />ଟି ଅଧିକ ଆପ ନାହିଁ।</translation> <translation id="3742055079367172538">ସ୍କ୍ରିନ୍ସଟ୍ ନିଆଯାଇଛି</translation> -<translation id="3744282433224562605">ଆପଣଙ୍କ Chromebookକୁ ଅନଲକ୍ କରିବା ପାଇଁ ପାସୱାର୍ଡ ଲେଖନ୍ତୁ</translation> <translation id="3771549900096082774">ଉଚ୍ଚ କଣ୍ଟ୍ରାଷ୍ଟ୍ ମୋଡ୍</translation> <translation id="3773700760453577392">ଜଣେ ବ୍ୟବସ୍ଥାପକ <ph name="USER_EMAIL" /> ପାଇଁ ଏକାଧିକ ସାଇନ୍-ଇନ୍କୁ ଅନୁମୋଦିତ କରିନାହାନ୍ତି। ଜାରି ରଖିବା ନିମନ୍ତେ ସମସ୍ତ ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ସାଇନ୍ ଆଉଟ୍ କରିବାକୁ ହେବ।</translation> <translation id="3779139509281456663"><ph name="NAME" /> ସହ ସଂଯୋଗ କରାଯାଉଛି</translation> @@ -627,7 +627,6 @@ <translation id="5170568018924773124">ଫୋଲ୍ଡରରେ ଦେଖାନ୍ତୁ</translation> <translation id="5176318573511391780">ଆଂଶିକ ସ୍କ୍ରିନ୍ ରେକର୍ଡ କରନ୍ତୁ</translation> <translation id="5198715732953550718">ନୂଆ ଫୋଲ୍ଡର୍ ତିଆରି କରିବାକୁ<ph name="MOVED_APP_NAME" /> <ph name="IN_PLACE_APP" /> ସହ ସମ୍ମିଳିତ ହୋଇଛି।</translation> -<translation id="5199367439331364630">ଆପଣଙ୍କ Chromebookରେ ସାଇନ୍ ଇନ୍ କରିବା ପାଇଁ, ପାସୱାର୍ଡ ଲେଖନ୍ତୁ</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1ଟି ଅନ୍ୟ ବିଜ୍ଞପ୍ତି}other{#ଟି ଅନ୍ୟ ବିଜ୍ଞପ୍ତି}}</translation> <translation id="5207949376430453814">ଟେକ୍ସଟ୍ କ୍ୟାରେଟ୍ ହାଇଲାଇଟ୍ କରନ୍ତୁ</translation> @@ -765,6 +764,7 @@ <translation id="612734058257491180">ଏକ ଅତିଥି ସମୟ ଅବଧିରେ Google Assistant ଉପଲବ୍ଧ ନାହିଁ।</translation> <translation id="6134259848159370930">ଆପଣଙ୍କ ଡିଭାଇସ୍, ଆପ୍ସ, ସେଟିଂସ୍ ଏବଂ ୱେବରେ ସନ୍ଧାନ କରନ୍ତୁ।</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> ପାଇଁ କାଢ଼ି ଦିଅନ୍ତୁ ଡାଏଲଗ୍ ଖୋଲନ୍ତୁ</translation> +<translation id="6141988275892716286">ଡାଉନ୍ଲୋଡ୍ ସୁନିଶ୍ଚିତ କରନ୍ତୁ</translation> <translation id="6154006699632741460">ପେରିଫେରାଲ୍ ସମର୍ଥିତ ନୁହେଁ</translation> <translation id="6156262341071374681">ସମସ୍ତ ଆପ୍ଗୁଡ଼ିକ ପାଇଁ ବିସ୍ତାର କରନ୍ତୁ</translation> <translation id="615957422585914272">ଅନ୍-ସ୍କ୍ରିନ୍ କୀବୋର୍ଡ ଦେଖାନ୍ତୁ</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index 6a94f39..18a2acf 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">ਪੂਰਾ ਹੋਣ 'ਤੇ ਖੁੱਲ੍ਹੇ</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ਅਤੇ <ph name="UNAVAILABLE_APPS_COUNT" /> ਹੋਰ ਐਪਾਂ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਉਪਲਬਧ ਨਹੀਂ ਹਨ।</translation> <translation id="3742055079367172538">ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਿਆ ਗਿਆ</translation> -<translation id="3744282433224562605">ਆਪਣੀ Chromebook ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ</translation> <translation id="3771549900096082774">ਉੱਚ ਵਖਰੇਵਾਂ ਮੋਡ</translation> <translation id="3773700760453577392">ਕਿਸੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ <ph name="USER_EMAIL" /> ਲਈ ਬਹੁ-ਗਿਣਤੀ ਸਾਈਨ-ਇਨ ਨੂੰ ਅਸਵੀਕਾਰ ਕੀਤਾ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦਾ ਸਾਈਨ-ਆਊਟ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ।</translation> <translation id="3779139509281456663"><ph name="NAME" /> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">ਫੋਲਡਰ ਵਿੱਚ ਦਿਖਾਓ</translation> <translation id="5176318573511391780">ਅੰਸ਼ਕ ਸਕ੍ਰੀਨ ਨੂੰ ਰਿਕਾਰਡ ਕਰੋ</translation> <translation id="5198715732953550718">ਨਵਾਂ ਫੋਲਡਰ ਬਣਾਉਣ ਲਈ <ph name="MOVED_APP_NAME" /> ਨੂੰ <ph name="IN_PLACE_APP" /> ਨਾਲ ਮਿਲਾਇਆ ਜਾਂਦਾ ਹੈ।</translation> -<translation id="5199367439331364630">ਆਪਣੀ Chromebook ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 ਹੋਰ ਸੂਚਨਾ}one{# ਹੋਰ ਸੂਚਨਾ}other{# ਹੋਰ ਸੂਚਨਾਵਾਂ}}</translation> <translation id="5207949376430453814">ਲਿਖਤ ਕੈਰੇਟ ਨੂੰ ਉਜਾਗਰ ਕਰੋ</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google Assistant ਮਹਿਮਾਨ ਸੈਸ਼ਨ ਵਿੱਚ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।</translation> <translation id="6134259848159370930">ਆਪਣਾ ਡੀਵਾਈਸ, ਐਪਾਂ, ਸੈਟਿੰਗਾਂ ਅਤੇ ਵੈੱਬ ਖੋਜੋ।</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> ਲਈ 'ਹਟਾਓ' ਵਿੰਡੋ ਖੋਲ੍ਹੋ</translation> +<translation id="6141988275892716286">ਡਾਊਨਲੋਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation> <translation id="6154006699632741460">ਪੈਰੀਫੈਰਲ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ</translation> <translation id="6156262341071374681">ਸਾਰੀਆਂ ਐਪਾਂ ਲਈ ਵਿਸਤਾਰ ਕਰੋ</translation> <translation id="615957422585914272">ਔਨ-ਸਕ੍ਰੀਨ ਕੀ-ਬੋਰਡ ਦਿਖਾਓ</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index 5bb40d5..ef71dbd 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Otwórz po pobraniu</translation> <translation id="3726171378575546917">Aplikacji <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ani jeszcze <ph name="UNAVAILABLE_APPS_COUNT" /> nie ma na tym urządzeniu.</translation> <translation id="3742055079367172538">Wykonano zrzut ekranu</translation> -<translation id="3744282433224562605">Aby odblokować Chromebooka, wpisz hasło</translation> <translation id="3771549900096082774">Tryb wysokiego kontrastu</translation> <translation id="3773700760453577392">Administrator nie zezwolił na wielokrotne logowanie użytkownika <ph name="USER_EMAIL" />. Aby kontynuować, wszyscy użytkownicy muszą się wylogować.</translation> <translation id="3779139509281456663">Łączę z urządzeniem <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Pokaż w folderze</translation> <translation id="5176318573511391780">Nagraj fragment ekranu</translation> <translation id="5198715732953550718">Aplikacja <ph name="MOVED_APP_NAME" /> została połączona z aplikacją <ph name="IN_PLACE_APP" />, by utworzyć nowy folder.</translation> -<translation id="5199367439331364630">Aby zalogować się na Chromebooku, wpisz hasło</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 inne powiadomienie}few{# inne powiadomienia}many{# innych powiadomień}other{# innego powiadomienia}}</translation> <translation id="5207949376430453814">Podświetlaj kursor tekstu</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Asystent Google jest niedostępny w sesji gościa.</translation> <translation id="6134259848159370930">Przeszukaj urządzenie, aplikacje, ustawienia i internet.</translation> <translation id="6137566720514957455">Otwórz okno usuwania konta <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Potwierdź pobranie</translation> <translation id="6154006699632741460">Nieobsługiwane urządzenie peryferyjne</translation> <translation id="6156262341071374681">Rozwiń, by wyświetlić wszystkie aplikacje</translation> <translation id="615957422585914272">Pokaż klawiaturę ekranową</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index c4e1bc9..dff1a1f 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">Modo laptop ativado</translation> <translation id="3308453408813785101">O usuário <ph name="USER_EMAIL_ADDRESS" /> ainda poderá fazer login mais tarde.</translation> <translation id="3321628682574733415">Código de pai/mãe incorreto</translation> +<translation id="3340475855009870209">Verificando download de <ph name="FILENAME" /></translation> <translation id="3341303451326249809">Captura de tela feita</translation> <translation id="334252345105450327">Fazer uma captura de tela</translation> <translation id="3351879221545518001">Você está transmitindo a tela.</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">Abrir quando o download for concluído</translation> <translation id="3726171378575546917">Os apps <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> e <ph name="UNAVAILABLE_APPS_COUNT" /> não estão no dispositivo.</translation> <translation id="3742055079367172538">Captura de tela realizada</translation> -<translation id="3744282433224562605">Para desbloquear o Chromebook, digite sua senha</translation> <translation id="3771549900096082774">Modo de alto contraste</translation> <translation id="3773700760453577392">Um administrador desativou o login múltiplo para <ph name="USER_EMAIL" />. Todos os usuários precisam sair para continuar.</translation> <translation id="3779139509281456663">Conectando <ph name="NAME" /></translation> @@ -627,7 +627,6 @@ <translation id="5170568018924773124">Mostrar na pasta</translation> <translation id="5176318573511391780">Gravar tela parcial</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> combinado com <ph name="IN_PLACE_APP" /> para criar uma nova pasta.</translation> -<translation id="5199367439331364630">Para fazer login no Chromebook, digite sua senha</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Mais 1 notificação}one{Mais # notificação}other{Mais # notificações}}</translation> <translation id="5207949376430453814">Destacar cursor de texto</translation> @@ -765,6 +764,7 @@ <translation id="612734058257491180">O Google Assistente não está disponível em uma sessão de visitante.</translation> <translation id="6134259848159370930">Pesquise no dispositivo, em apps, nas configurações e na Web.</translation> <translation id="6137566720514957455">Abrir caixa de diálogo para a remoção de <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Confirmar download</translation> <translation id="6154006699632741460">Periférico não compatível</translation> <translation id="6156262341071374681">Expandir para ver todos os apps</translation> <translation id="615957422585914272">Mostrar teclado na tela</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 79d2decc..88ff916 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Abrir ao concluir</translation> <translation id="3726171378575546917">A app <ph name="UNAVAILABLE_APPS_ONE" />, a app <ph name="UNAVAILABLE_APPS_TWO" /> e mais <ph name="UNAVAILABLE_APPS_COUNT" /> apps não se encontram neste dispositivo.</translation> <translation id="3742055079367172538">Captura de ecrã efetuada</translation> -<translation id="3744282433224562605">Para desbloquear o Chromebook, introduza a palavra-passe</translation> <translation id="3771549900096082774">Modo de alto contraste</translation> <translation id="3773700760453577392">Um administrador não permitiu o início de sessão integrado para <ph name="USER_EMAIL" />. Todos os utilizadores têm de terminar sessão para continuar.</translation> <translation id="3779139509281456663">A ligar ao dispositivo <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Mostrar numa pasta</translation> <translation id="5176318573511391780">Gravar ecrã parcial</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> em combinação com <ph name="IN_PLACE_APP" /> para criar uma nova pasta.</translation> -<translation id="5199367439331364630">Para iniciar sessão no Chromebook, introduza a palavra-passe</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Mais 1 notificação}one{Mais # notificação(ões)}other{Mais # notificações}}</translation> <translation id="5207949376430453814">Realçar cursor do texto</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">O Assistente Google não está disponível em sessões de convidado.</translation> <translation id="6134259848159370930">Pesquise no dispositivo, nas apps, nas definições e na Web.</translation> <translation id="6137566720514957455">Abrir caixa de diálogo de remoção para <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Confirmar transferência</translation> <translation id="6154006699632741460">O periférico não é suportado</translation> <translation id="6156262341071374681">Expandir para ver todas as aplicações</translation> <translation id="615957422585914272">Mostrar teclado no ecrã</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index 47cc8f83..7028a7d 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">S-a comutat la modul laptop</translation> <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> se poate conecta în continuare mai târziu.</translation> <translation id="3321628682574733415">Codul pentru părinte este incorect</translation> +<translation id="3340475855009870209">Se scanează elementul <ph name="FILENAME" /> descărcat</translation> <translation id="3341303451326249809">Captură de ecran realizată</translation> <translation id="334252345105450327">Fă o captură de ecran</translation> <translation id="3351879221545518001">În prezent proiectezi ecranul.</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">Deschide după finalizare</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> și încă <ph name="UNAVAILABLE_APPS_COUNT" /> nu sunt disponibile pe acest dispozitiv.</translation> <translation id="3742055079367172538">Captură de ecran efectuată</translation> -<translation id="3744282433224562605">Pentru a debloca Chromebookul, introdu parola</translation> <translation id="3771549900096082774">Mod de contrast ridicat</translation> <translation id="3773700760453577392">Un administrator a interzis conectarea multiplă pentru <ph name="USER_EMAIL" />. Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation> <translation id="3779139509281456663">Se conectează <ph name="NAME" /></translation> @@ -627,7 +627,6 @@ <translation id="5170568018924773124">Afișează în dosar</translation> <translation id="5176318573511391780">Înregistrează ecranul parțial</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> a fost combinată cu <ph name="IN_PLACE_APP" /> pentru a crea un dosar nou.</translation> -<translation id="5199367439331364630">Pentru a te conecta la Chromebook, introdu parola</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Încă o notificare}few{Încă # notificări}other{Încă # de notificări}}</translation> <translation id="5207949376430453814">Evidențiază cursorul pentru text</translation> @@ -765,6 +764,7 @@ <translation id="612734058257491180">Asistentul Google nu este disponibil într-o sesiune pentru invitați.</translation> <translation id="6134259848159370930">Caută pe dispozitiv, în aplicații, în setări și pe web.</translation> <translation id="6137566720514957455">Deschide fereastra de dialog Elimină pentru <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Confirmă descărcarea</translation> <translation id="6154006699632741460">Dispozitivul periferic nu este acceptat</translation> <translation id="6156262341071374681">Extinde la toate aplicațiile</translation> <translation id="615957422585914272">Afișați tastatura pe ecran</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index 3a67070..7f664a6 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Открыть после скачивания</translation> <translation id="3726171378575546917">Приложения "<ph name="UNAVAILABLE_APPS_ONE" />", "<ph name="UNAVAILABLE_APPS_TWO" />" и ещё несколько сервисов (<ph name="UNAVAILABLE_APPS_COUNT" />) не установлены на этом устройстве.</translation> <translation id="3742055079367172538">Сделан скриншот</translation> -<translation id="3744282433224562605">Чтобы разблокировать Chromebook, введите пароль.</translation> <translation id="3771549900096082774">Режим высокой контрастности</translation> <translation id="3773700760453577392">Администратор отключил множественный вход для аккаунта <ph name="USER_EMAIL" />. Чтобы продолжить, все пользователи должны выйти из аккаунтов.</translation> <translation id="3779139509281456663">Подключение к устройству "<ph name="NAME" />"</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Показать в папке</translation> <translation id="5176318573511391780">Запись видео с части экрана</translation> <translation id="5198715732953550718">Для создания папки были объединены приложения "<ph name="MOVED_APP_NAME" />" и "<ph name="IN_PLACE_APP" />".</translation> -<translation id="5199367439331364630">Чтобы войти в аккаунт на устройстве Chromebook, введите пароль.</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{ещё 1 уведомление}one{ещё # уведомление}few{ещё # уведомления}many{ещё # уведомлений}other{ещё # уведомления}}</translation> <translation id="5207949376430453814">Выделять курсор при вводе текста</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">В рамках гостевого сеанса Google Ассистент недоступен.</translation> <translation id="6134259848159370930">Поиск на устройстве, в приложениях, настройках и Интернете…</translation> <translation id="6137566720514957455">Открыть диалоговое окно удаления аккаунта <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Подтвердите скачивание</translation> <translation id="6154006699632741460">Периферийное устройство не поддерживается</translation> <translation id="6156262341071374681">Просмотреть все приложения</translation> <translation id="615957422585914272">Показывать экранную клавиатуру</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index 2754202..a5ef2a8 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">සම්පූර්ණ විට විවෘත කරන්න</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" /> <ph name="UNAVAILABLE_APPS_TWO" /> සහ තව <ph name="UNAVAILABLE_APPS_COUNT" />ක් මෙම උපාංගයෙහි නැත.</translation> <translation id="3742055079367172538">තිර ඡායාව ගැනිණි</translation> -<translation id="3744282433224562605">ඔබගේ Chromebook අගුලු හැරීමට, මුරපදය ඇතුළු කරන්න</translation> <translation id="3771549900096082774">අධි අසමානතා ප්රකාරය</translation> <translation id="3773700760453577392">පරිපාලකයෙකු විසින් <ph name="USER_EMAIL" /> සඳහා බහු පුරනයට ඉඩ දී නොමැත. සියලු පරිශීලකයින් ඉදිරියට යෑමට වරනය විය යුතුයි.</translation> <translation id="3779139509281456663"><ph name="NAME" /> සම්බන්ධ වෙමින්</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">ෆෝල්ඩරයේ පෙන්වන්න</translation> <translation id="5176318573511391780">අර්ධ තිරය පටිගත කරන්න</translation> <translation id="5198715732953550718">නව ෆෝල්ඩරයක් සෑදීමට <ph name="IN_PLACE_APP" /> සමඟ <ph name="MOVED_APP_NAME" /> සංයුක්ත වේ.</translation> -<translation id="5199367439331364630">ඔබගේ Chromebook වෙත පිරීමට, මුරපදය ඇතුළු කරන්න</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{වෙනත් දැනුම්දීම් 1}one{වෙනත් දැනුම්දීම් #}other{වෙනත් දැනුම්දීම් #}}</translation> <translation id="5207949376430453814">පෙළ කාකපාදය උද්දීපනය කරන්න</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">ආගන්තුක සැසියකදී Google සහකරු නොලැබේ.</translation> <translation id="6134259848159370930">ඔබේ උපාංගය, යෙදුම්, සැකසීම් සහ වෙබය තුළ සොයන්න.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> සඳහා සංවාදය ඉවත් කරන්න විවෘත කරන්න</translation> +<translation id="6141988275892716286">බාගැනීම තහවුරු කරන්න</translation> <translation id="6154006699632741460">උපාංග සහාය නොදක්වයි</translation> <translation id="6156262341071374681">සියලු යෙදුම්වලට දිග හරින්න</translation> <translation id="615957422585914272">තිරය-මත යතුරුපුවරුව පෙන්වන්න</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 4473b2b..295c94a 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Po dokončení otvoriť</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> a ďalšie (<ph name="UNAVAILABLE_APPS_COUNT" />) nie sú v tomto zariadení.</translation> <translation id="3742055079367172538">Vytvorila sa snímka obrazovky</translation> -<translation id="3744282433224562605">Ak chcete Chromebook odomknúť, zadajte heslo</translation> <translation id="3771549900096082774">Režim s vysokým kontrastom</translation> <translation id="3773700760453577392">Správca zakázal viacnásobné prihlásenie pre používateľa <ph name="USER_EMAIL" />. Všetci používatelia sa musia odhlásiť a až potom môžu pokračovať.</translation> <translation id="3779139509281456663">Pripája sa <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Zobraziť v priečinku</translation> <translation id="5176318573511391780">Nahrať časť obrazovky</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> spolu s aplikáciou <ph name="IN_PLACE_APP" /> vytvorili nový priečinok.</translation> -<translation id="5199367439331364630">Ak sa chcete do Chromebooku prihlásiť, zadajte heslo</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 ďalšie upozornenie}few{# ďalšie upozornenia}many{# other notifications}other{# ďalších upozornení}}</translation> <translation id="5207949376430453814">Zvýrazniť textový kurzor</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Asistent Google nie je k dispozícii v relácii hosťa.</translation> <translation id="6134259848159370930">Vyhľadávajte v zariadení, aplikáciách, nastaveniach a na internete.</translation> <translation id="6137566720514957455">Otvoriť dialógové okno na odstránenie účtu <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Potvrdenie sťahovania</translation> <translation id="6154006699632741460">Periféria nie je podporovaná</translation> <translation id="6156262341071374681">Rozbaliť na všetky aplikácie</translation> <translation id="615957422585914272">Zobraziť klávesnicu na obrazovke</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index 98a5700..c3bf9592 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Odpri ob dokončanju</translation> <translation id="3726171378575546917">Aplikacij <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> in drugih (<ph name="UNAVAILABLE_APPS_COUNT" />) ni v tej napravi.</translation> <translation id="3742055079367172538">Posnetek zaslona je narejen</translation> -<translation id="3744282433224562605">Če želite odkleniti Chromebook, vnesite geslo.</translation> <translation id="3771549900096082774">Visokokontrastni način</translation> <translation id="3773700760453577392">Skrbnik je prepovedal prijavo z več računi za <ph name="USER_EMAIL" />. Če želite nadaljevati, morajo biti odjavljeni vsi uporabniki.</translation> <translation id="3779139509281456663">Povezovanje z napravo <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Prikaži v mapi</translation> <translation id="5176318573511391780">Snemanje delnega zaslona</translation> <translation id="5198715732953550718">Zaradi ustvarjanja nove mape je bila aplikacija <ph name="MOVED_APP_NAME" /> združena z aplikacijo <ph name="IN_PLACE_APP" />.</translation> -<translation id="5199367439331364630">Če se želite prijaviti v Chromebook, vnesite geslo.</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 drugo obvestilo}one{# drugo obvestilo}two{# drugi obvestili}few{# druga obvestila}other{# drugih obvestil}}</translation> <translation id="5207949376430453814">Označitev kazalke v besedilu</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Pomočnik Google ni na voljo v gostujoči seji.</translation> <translation id="6134259848159370930">Iščite v napravi, aplikacijah, nastavitvah in spletu.</translation> <translation id="6137566720514957455">Odpri pogovorno okno za odstranjevanje za <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Potrdi prenos</translation> <translation id="6154006699632741460">Dodatna oprema ni podprta</translation> <translation id="6156262341071374681">Razširitev na vse aplikacije</translation> <translation id="615957422585914272">Pokaži zaslonsko tipkovnico</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb index 2a5ccda..3b1e9b71 100644 --- a/ash/strings/ash_strings_sq.xtb +++ b/ash/strings/ash_strings_sq.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Hape kur të përfundojë</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> dhe <ph name="UNAVAILABLE_APPS_COUNT" /> të tjera nuk gjenden në këtë pajisje.</translation> <translation id="3742055079367172538">Pamja e ekranit u mor</translation> -<translation id="3744282433224562605">Për të shkyçur Chromebook-un tënd, fut fjalëkalimin</translation> <translation id="3771549900096082774">Modaliteti i kontrastit të lartë</translation> <translation id="3773700760453577392">Një administrator ka ndaluar identifikimin e shumëfishtë për <ph name="USER_EMAIL" />. Të gjithë përdoruesit duhet të dalin për të vazhduar.</translation> <translation id="3779139509281456663"><ph name="NAME" /> po lidhet</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Shfaq në dosje</translation> <translation id="5176318573511391780">Regjistro ekranin e pjesshëm</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> kombinuar me <ph name="IN_PLACE_APP" /> për të krijuar dosje të re.</translation> -<translation id="5199367439331364630">Për t'u identifikuar në Chromebook-un tënd, fut fjalëkalimin</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 njoftim tjetër}other{# njoftime të tjera}}</translation> <translation id="5207949376430453814">Thekso kursorin e tekstit</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">"Asistenti i Google" nuk ofrohet në një sesion për vizitorët.</translation> <translation id="6134259848159370930">Kërko në pajisjen tënde, aplikacione, cilësime dhe ueb.</translation> <translation id="6137566720514957455">Hap dialogun e heqjes për <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Konfirmo shkarkimin</translation> <translation id="6154006699632741460">Pajisja periferike nuk mbështetet</translation> <translation id="6156262341071374681">Zgjero te të gjitha aplikacionet</translation> <translation id="615957422585914272">Shfaq tastierën në ekran</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index beacd190..241a475 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Otvori kada bude završeno</translation> <translation id="3726171378575546917">Aplikacije <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> i još <ph name="UNAVAILABLE_APPS_COUNT" /> nisu na ovom uređaju.</translation> <translation id="3742055079367172538">Snimak ekrana je napravljen</translation> -<translation id="3744282433224562605">Da biste otključali Chromebook, unesite lozinku</translation> <translation id="3771549900096082774">Režim visokog kontrasta</translation> <translation id="3773700760453577392">Administrator je zabranio višestruko prijavljivanje za <ph name="USER_EMAIL" />. Svi korisnici moraju da se odjave da bismo nastavili sa sesijom.</translation> <translation id="3779139509281456663">Povezuje se sa uređajem <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Prikaži u direktorijumu</translation> <translation id="5176318573511391780">Snimi deo ekrana</translation> <translation id="5198715732953550718">Aplikacija <ph name="MOVED_APP_NAME" /> je kombinovana sa aplikacijom <ph name="IN_PLACE_APP" /> da bi se napravio novi direktorijum.</translation> -<translation id="5199367439331364630">Da biste se prijavili na Chromebook-u, unesite lozinku</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Još 1 obaveštenje}one{Još # obaveštenje}few{Još # obaveštenja}other{Još # obaveštenja}}</translation> <translation id="5207949376430453814">Istakni kursor za tekst</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google pomoćnik nije dostupan u sesiji gosta.</translation> <translation id="6134259848159370930">Pretražujte uređaj, aplikacije, podešavanja i veb.</translation> <translation id="6137566720514957455">Otvara nalog za uklanjanje za korisnika <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Potvrdite preuzimanje</translation> <translation id="6154006699632741460">Periferni uređaj nije podržan</translation> <translation id="6156262341071374681">Proširite na sve aplikacije</translation> <translation id="615957422585914272">Prikaži tastaturu na ekranu</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 7f89bfa..6eaf66c 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Отвори када буде завршено</translation> <translation id="3726171378575546917">Апликације <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> и још <ph name="UNAVAILABLE_APPS_COUNT" /> нису на овом уређају.</translation> <translation id="3742055079367172538">Снимак екрана је направљен</translation> -<translation id="3744282433224562605">Да бисте откључали Chromebook, унесите лозинку</translation> <translation id="3771549900096082774">Режим високог контраста</translation> <translation id="3773700760453577392">Администратор је забранио вишеструко пријављивање за <ph name="USER_EMAIL" />. Сви корисници морају да се одјаве да бисмо наставили са сесијом.</translation> <translation id="3779139509281456663">Повезује се са уређајем <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Прикажи у директоријуму</translation> <translation id="5176318573511391780">Сними део екрана</translation> <translation id="5198715732953550718">Апликација <ph name="MOVED_APP_NAME" /> је комбинована са апликацијом <ph name="IN_PLACE_APP" /> да би се направио нови директоријум.</translation> -<translation id="5199367439331364630">Да бисте се пријавили на Chromebook-у, унесите лозинку</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Још 1 обавештење}one{Још # обавештење}few{Још # обавештења}other{Још # обавештења}}</translation> <translation id="5207949376430453814">Истакни курсор за текст</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google помоћник није доступан у сесији госта.</translation> <translation id="6134259848159370930">Претражујте уређај, апликације, подешавања и веб.</translation> <translation id="6137566720514957455">Отвара налог за уклањање за корисника <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Потврдите преузимање</translation> <translation id="6154006699632741460">Периферни уређај није подржан</translation> <translation id="6156262341071374681">Проширите на све апликације</translation> <translation id="615957422585914272">Прикажи тастатуру на екрану</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index 5a73dde..802a02bb0 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Öppna när nedladdningen är klar</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> och <ph name="UNAVAILABLE_APPS_COUNT" /> till finns inte på enheten.</translation> <translation id="3742055079367172538">Skärmbilden har tagits</translation> -<translation id="3744282433224562605">Ange lösenordet om du vill låsa upp Chromebook</translation> <translation id="3771549900096082774">Högkontrastläge</translation> <translation id="3773700760453577392">En administratör har förbjudit multiinloggning för <ph name="USER_EMAIL" />. Alla användare måste logga ut för att fortsätta.</translation> <translation id="3779139509281456663">Ansluter <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Visa i mapp</translation> <translation id="5176318573511391780">Spela in en del av skärmen</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> kombinerades med <ph name="IN_PLACE_APP" /> för att skapa en ny mapp.</translation> -<translation id="5199367439331364630">Ange lösenordet om du vill logga in på Chromebook</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 avisering till}other{# aviseringar till}}</translation> <translation id="5207949376430453814">Markera textmarkören</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google-assistenten är inte tillgänglig i en gästsession.</translation> <translation id="6134259848159370930">Sök på enheten, i appar, inställningar och på webben.</translation> <translation id="6137566720514957455">Öppna dialogrutan för borttagning av <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Bekräfta nedladdning</translation> <translation id="6154006699632741460">Tillbehöret stöds inte</translation> <translation id="6156262341071374681">Utöka till alla appar</translation> <translation id="615957422585914272">Visa skärmtangentbordet</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index 8f9e9cf..a104df0 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Ifungue ikimaliza kupakuliwa</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> na zingine <ph name="UNAVAILABLE_APPS_COUNT" /> hazipo kwenye kifaa hiki.</translation> <translation id="3742055079367172538">Picha ya skrini imepigwa</translation> -<translation id="3744282433224562605">Ili ufungue Chromebook yako, weka nenosiri</translation> <translation id="3771549900096082774">Hali ya Juu ya Utofautishaji</translation> <translation id="3773700760453577392">Msimamizi ameondoa uwezo wa <ph name="USER_EMAIL" /> wa kuingia katika akaunti nyingi kwa wakati mmoja. Watumiaji wote lazima waondoke katika akaunti ili waendelee.</translation> <translation id="3779139509281456663">Inaunganisha <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Onyesha katika folda</translation> <translation id="5176318573511391780">Rekodi sehemu ya skrini</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> imewekwa pamoja na <ph name="IN_PLACE_APP" /> ili kufungua folda mpya.</translation> -<translation id="5199367439331364630">Ili uingie katika akaunti kwenye Chromebook yako, weka nenosiri</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Arifa nyingine moja}other{Arifa zingine #}}</translation> <translation id="5207949376430453814">Angazia kareti ya maandishi</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Programu ya Mratibu wa Google haipatikani katika kipindi cha mgeni.</translation> <translation id="6134259848159370930">Tafuta kwenye wavuti, programu, mipangilio na kifaa chako.</translation> <translation id="6137566720514957455">Fungua kidirisha cha kuondoa <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Thibitisha upakuaji</translation> <translation id="6154006699632741460">Kifaa ulichounganisha hakiwezi kutumika</translation> <translation id="6156262341071374681">Ziangalie programu zote</translation> <translation id="615957422585914272">Onyesha kibodi ya skrini</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index 17fdb9c..252b19c2 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">லேப்டாப் பயன்முறைக்கு மாற்றப்பட்டது</translation> <translation id="3308453408813785101">அப்போதும் <ph name="USER_EMAIL_ADDRESS" /> பின்னர் உள்நுழையலாம்.</translation> <translation id="3321628682574733415">தவறான பெற்றோர் அணுகல் குறியீடு</translation> +<translation id="3340475855009870209"><ph name="FILENAME" /> ஸ்கேன் செய்யப்படுகிறது</translation> <translation id="3341303451326249809">ஸ்கிரீன்ஷாட் எடுக்கப்பட்டது</translation> <translation id="334252345105450327">ஸ்கிரீன்ஷாட் எடுங்கள்</translation> <translation id="3351879221545518001">தற்போது திரையை அலைபரப்புகிறீர்கள்.</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">பதிவிறக்கியதும் திற</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ஆகியவையும் மேலும் <ph name="UNAVAILABLE_APPS_COUNT" /> ஆப்ஸும் இந்தச் சாதனத்தில் இல்லை.</translation> <translation id="3742055079367172538">ஸ்கிரீன்ஷாட் எடுக்கப்பட்டது</translation> -<translation id="3744282433224562605">Chromebookகை அன்லாக் செய்ய, கடவுச்சொல்லை டைப் செய்யவும்</translation> <translation id="3771549900096082774">அதிக ஒளி மாறுபாட்டுப் பயன்முறை</translation> <translation id="3773700760453577392"><ph name="USER_EMAIL" />க்கு, பல உள்நுழைவை நிர்வாகி அனுமதிக்கவில்லை. தொடர, எல்லாப் பயனர்களும் வெளியேற வேண்டும்.</translation> <translation id="3779139509281456663"><ph name="NAME" /> ஐ இணைக்கிறது</translation> @@ -627,7 +627,6 @@ <translation id="5170568018924773124">ஃபோல்டரில் காண்பி</translation> <translation id="5176318573511391780">திரையைப் பகுதியளவு ரெக்கார்டு செய்யும்</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> மற்றும் <ph name="IN_PLACE_APP" /> ஆப்ஸை ஒருங்கிணைத்து புதிய ஃபோல்டர் உருவாக்கப்பட்டது.</translation> -<translation id="5199367439331364630">Chromebookகில் உள்நுழைய, கடவுச்சொல்லை டைப் செய்யவும்</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{மேலும் ஒரு அறிவிப்பு}other{மேலும் # அறிவிப்புகள்}}</translation> <translation id="5207949376430453814">உரைச் சுட்டியைத் தனிப்படுத்து</translation> @@ -765,6 +764,7 @@ <translation id="612734058257491180">கெஸ்ட் அமர்வில் Google அசிஸ்டண்ட்டைப் பயன்படுத்த இயலாது.</translation> <translation id="6134259848159370930">உங்கள் சாதனம், ஆப்ஸ், இணையம் ஆகியவற்றில் தேடவும்.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> என்ற கணக்கை அகற்றுவதற்கான உரையாடலைத் திறக்கும்</translation> +<translation id="6141988275892716286">பதிவிறக்கத்தை உறுதிப்படுத்து</translation> <translation id="6154006699632741460">சாதனம் ஆதரிக்கப்படவில்லை</translation> <translation id="6156262341071374681">எல்லாப் பயன்பாடுகளையும் காட்டும் பட்டன்</translation> <translation id="615957422585914272">ஸ்கிரீன் கீபோர்டைக் காட்டு</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index 80ebb37..cee9fa5 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -417,7 +417,6 @@ <translation id="3713734891607377840">పూర్తయినప్పుడు తెరవండి</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, మరో<ph name="UNAVAILABLE_APPS_COUNT" /> యాప్లు ఈ పరికరంలో అందుబాటులో లేవు.</translation> <translation id="3742055079367172538">స్క్రీన్షాట్ తీసినప్పుడు</translation> -<translation id="3744282433224562605">మీ Chromebookను అన్లాక్ చేయడానికి, పాస్వర్డ్ను ఎంటర్ చేయండి</translation> <translation id="3771549900096082774">అధిక కాంట్రాస్ట్ మోడ్</translation> <translation id="3773700760453577392"><ph name="USER_EMAIL" /> కోసం బహుళ సైన్-ఇన్ అనుమతిని నిర్వాహకుడు తిరస్కరించారు. కొనసాగడానికి వినియోగదారులందరూ తప్పనిసరిగా సైన్ అవుట్ చేయాలి.</translation> @@ -629,7 +628,6 @@ <translation id="5170568018924773124">ఫోల్డర్లో చూపించు</translation> <translation id="5176318573511391780">పాక్షిక స్క్రీన్ను రికార్డ్ చేయండి</translation> <translation id="5198715732953550718">కొత్త ఫోల్డర్ను సృష్టించడం కోసం <ph name="MOVED_APP_NAME" /> అనేది <ph name="IN_PLACE_APP" />తో కలపబడింది.</translation> -<translation id="5199367439331364630">మీ Chromebookకు సైన్ ఇన్ చేయడానికి, పాస్వర్డ్ను ఎంటర్ చేయండి</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{మరో 1 నోటిఫికేషన్}other{మరో # నోటిఫికేషన్లు}}</translation> <translation id="5207949376430453814">వచన కర్సర్ గుర్తును హైలైట్ చేయి</translation> @@ -767,6 +765,7 @@ <translation id="612734058257491180">అతిథి సెషన్లో Google అసిస్టెంట్ పని చేయదు.</translation> <translation id="6134259848159370930">మీ పరికరం, యాప్లు, సెట్టింగ్లు, వెబ్ను వెతకండి.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> కోసం 'డైలాగ్ను తీసివేయి'ని తెరవండి</translation> +<translation id="6141988275892716286">డౌన్లోడ్ను నిర్ధారించండి</translation> <translation id="6154006699632741460">పెరిఫెరల్ సపోర్ట్ చేయదు</translation> <translation id="6156262341071374681">అన్ని యాప్ల కోసం విస్తరించండి</translation> <translation id="615957422585914272">స్క్రీన్పై కీబోర్డ్ను చూపు</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index b2d03afc..0695728 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -417,7 +417,6 @@ <translation id="3713734891607377840">เปิดเมื่อดาวน์โหลดเสร็จ</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> และอีก<ph name="UNAVAILABLE_APPS_COUNT" /> แอปไม่ได้อยู่ในอุปกรณ์</translation> <translation id="3742055079367172538">ภาพหน้าจอที่บันทึก</translation> -<translation id="3744282433224562605">ป้อนรหัสผ่านเพื่อปลดล็อก Chromebook</translation> <translation id="3771549900096082774">โหมดคอนทราสต์สูง</translation> <translation id="3773700760453577392">ผู้ดูแลระบบไม่อนุญาตให้ <ph name="USER_EMAIL" /> ลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี ผู้ใช้ทุกคนต้องออกจากระบบเพื่อดำเนินการต่อ</translation> <translation id="3779139509281456663">กำลังเชื่อมต่อกับ <ph name="NAME" /></translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">แสดงในโฟลเดอร์</translation> <translation id="5176318573511391780">บันทึกหน้าจอบางส่วน</translation> <translation id="5198715732953550718">รวม <ph name="MOVED_APP_NAME" /> กับ <ph name="IN_PLACE_APP" /> เพื่อสร้างโฟลเดอร์ใหม่แล้ว</translation> -<translation id="5199367439331364630">ป้อนรหัสผ่านเพื่อลงชื่อเข้าใช้ Chromebook</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{การแจ้งเตือนอื่น 1 รายการ}other{การแจ้งเตือนอื่น # รายการ}}</translation> <translation id="5207949376430453814">ไฮไลต์เครื่องหมาย Caret ของข้อความ</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">ใช้ Google Assistant ในเซสชันผู้เยี่ยมชมไม่ได้</translation> <translation id="6134259848159370930">ค้นหาอุปกรณ์ แอป การตั้งค่า และเว็บ</translation> <translation id="6137566720514957455">เปิดกล่องโต้ตอบการนำออกของ <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">ยืนยันการดาวน์โหลด</translation> <translation id="6154006699632741460">ไม่รองรับอุปกรณ์ต่อพ่วง</translation> <translation id="6156262341071374681">แสดงแอปทั้งหมด</translation> <translation id="615957422585914272">แสดงแป้นพิมพ์บนหน้าจอ</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index 025a8c1..57d74d8 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Tamamlandığında aç</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ve <ph name="UNAVAILABLE_APPS_COUNT" /> uygulama daha bu cihazda yok.</translation> <translation id="3742055079367172538">Ekran görüntüsü alındı</translation> -<translation id="3744282433224562605">Chromebook'unuzun kilidini açmak için şifreyi girin</translation> <translation id="3771549900096082774">Yüksek Kontrast Modu</translation> <translation id="3773700760453577392">Bir yönetici <ph name="USER_EMAIL" /> için çoklu oturum açmayı engellemiş. Tüm kullanıcılar devam etmek için çıkış yapmalıdır.</translation> <translation id="3779139509281456663"><ph name="NAME" /> bağlanıyor</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Klasörde göster</translation> <translation id="5176318573511391780">Kısmi ekranı kaydet</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> ile <ph name="IN_PLACE_APP" /> birleştirilerek yeni bir klasör oluşturuldu.</translation> -<translation id="5199367439331364630">Chromebook'unuzda oturum açmak için şifreyi girin</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 diğer bildirim}other{# diğer bildirim}}</translation> <translation id="5207949376430453814">Metin imlecini vurgula</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">Google Asistan, misafir oturumunda kullanılamaz.</translation> <translation id="6134259848159370930">Cihazınızda, uygulamalarda, ayarlarda ve web'de arama yapın.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> için kaldırma iletişim kutusunu aç</translation> +<translation id="6141988275892716286">İndirme işlemini onaylayın</translation> <translation id="6154006699632741460">Çevre birimi desteklenmiyor</translation> <translation id="6156262341071374681">Tüm uygulamalara genişlet</translation> <translation id="615957422585914272">Dokunmatik klavyeyi göster</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index a95d1b6f..8b05601 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Відкриється після завершення</translation> <translation id="3726171378575546917">На цьому пристрої не встановлено додатки <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> і ще <ph name="UNAVAILABLE_APPS_COUNT" />.</translation> <translation id="3742055079367172538">Знімок екрана зроблено</translation> -<translation id="3744282433224562605">Щоб розблокувати Chromebook, введіть пароль</translation> <translation id="3771549900096082774">Режим високого контрасту</translation> <translation id="3773700760453577392">Адміністратор заборонив паралельний вхід користувачеві <ph name="USER_EMAIL" />. Щоб продовжити, усі користувачі повинні вийти.</translation> <translation id="3779139509281456663">Підключення пристрою <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Показати в папці</translation> <translation id="5176318573511391780">Записувати частину екрана</translation> <translation id="5198715732953550718">Щоб створити нову папку, об'єднано додатки <ph name="MOVED_APP_NAME" /> і <ph name="IN_PLACE_APP" />.</translation> -<translation id="5199367439331364630">Щоб увійти в обліковий запис на Chromebook, введіть пароль</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 інше сповіщення}one{# інше сповіщення}few{# інші сповіщення}many{# інших сповіщень}other{# іншого сповіщення}}</translation> <translation id="5207949376430453814">Підсвічувати місце введення тексту</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Google Асистент недоступний під час сеансу в режимі "Гість".</translation> <translation id="6134259848159370930">Шукайте на пристрої, у додатках, налаштуваннях та Інтернеті.</translation> <translation id="6137566720514957455">Відкрити вікно видалення облікового запису <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Підтвердити завантаження</translation> <translation id="6154006699632741460">Периферійний пристрій не підтримується</translation> <translation id="6156262341071374681">Розгорнути всі додатки</translation> <translation id="615957422585914272">Показувати екранну клавіатуру</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index 1a3a7c6..2b8a8136 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">لیپ ٹاپ وضح میں سوئچ کیا</translation> <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> اب بھی بعد میں سائن ان کر سکتا ہے۔</translation> <translation id="3321628682574733415">والدین کا غلط کوڈ</translation> +<translation id="3340475855009870209">ڈاؤن لوڈ <ph name="FILENAME" /> کو اسکین کیا جا رہا ہے</translation> <translation id="3341303451326249809">اسکرین شاٹ کیپچر ہو گیا</translation> <translation id="334252345105450327">ایک اسکرین شاٹ لیں</translation> <translation id="3351879221545518001">آپ فی الحال اسکرین کاسٹ کر رہے ہیں۔</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">مکمل ہونے پر کھولیں</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />، <ph name="UNAVAILABLE_APPS_TWO" />، اور <ph name="UNAVAILABLE_APPS_COUNT" /> مزید اس آلہ پر موجود نہیں ہے۔</translation> <translation id="3742055079367172538">اسکرین شاٹ لی گئی</translation> -<translation id="3744282433224562605">اپنے Chromebook کو غیر مقفل کرنے کے لیے، پاس ورڈ درج کریں</translation> <translation id="3771549900096082774">اعلی تناسب امتزاج وضع</translation> <translation id="3773700760453577392">منتظم نے <ph name="USER_EMAIL" /> کیلئے متعدد سائن ان کی اجازت نہیں دی ہے۔ جاری رکھنے کیلئے تمام صارفین کا سائن آؤٹ کرنا لازمی ہے۔</translation> <translation id="3779139509281456663"><ph name="NAME" /> کو منسلک کیا جا رہا ہے</translation> @@ -627,7 +627,6 @@ <translation id="5170568018924773124">فولڈر میں دکھائیں</translation> <translation id="5176318573511391780">جزوی اسکرین کو ریکارڈ کریں</translation> <translation id="5198715732953550718">نیا فولڈر بنانے کے لیے <ph name="MOVED_APP_NAME" /> کو <ph name="IN_PLACE_APP" /> کے ساتھ جوڑ دیا گیا ہے۔</translation> -<translation id="5199367439331364630">اپنے Chromebook میں سائن ان کرنے کیلئے، پاس ورڈ درج کریں</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />، <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />، <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 دیگر اطلاع}other{# دیگر اطلاعات}}</translation> <translation id="5207949376430453814">متن کیرٹ کو نمایاں کریں</translation> @@ -765,6 +764,7 @@ <translation id="612734058257491180">Google اسسٹنٹ مہمان سیشن میں دستیاب نہیں ہے۔</translation> <translation id="6134259848159370930">اپنا آلہ، ایپس، ترتیبات اور ویب تلاش کریں۔</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> کے لئے اکاؤنٹ ہٹائیں کا ڈائیلاگ کھولیں</translation> +<translation id="6141988275892716286">ڈاؤن لوڈ کی توثیق کریں</translation> <translation id="6154006699632741460">پیریفرل تعاون یافتہ نہیں ہے</translation> <translation id="6156262341071374681">سبھی ایپس کے لیے پھیلائیں</translation> <translation id="615957422585914272">آن اسکرین کی بورڈ دکھائیں</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index 7329735b..962bf6a 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -417,7 +417,6 @@ <translation id="3713734891607377840">Yuklab olinganda ochish</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> va yana <ph name="UNAVAILABLE_APPS_COUNT" /> ta ilova bu qurilmada emas.</translation> <translation id="3742055079367172538">Ekran suratga olindi</translation> -<translation id="3744282433224562605">Chromebook qulfini ochish uchun parolni kiriting</translation> <translation id="3771549900096082774">Yuqori kontrastli rejim</translation> <translation id="3773700760453577392">Administrator <ph name="USER_EMAIL" /> hisobi uchun bir multi-kirish imkoniyatini o‘chirib qo‘ydi. Hisobga kirishingizdan avval barcha foydalanuvchilar hisobdan chiqishi kerak.</translation> <translation id="3779139509281456663"><ph name="NAME" /> ulanmoqda</translation> @@ -628,7 +627,6 @@ <translation id="5170568018924773124">&Jildda ko‘rsatish</translation> <translation id="5176318573511391780">Ekran qismini yozib olish</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> va <ph name="IN_PLACE_APP" /> ilovalari yangi jildga birlashtirildi.</translation> -<translation id="5199367439331364630">Chromebook hisobiga kirish uchun parolni kiriting</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{Yana 1 ta bildirishnoma}other{Yana # ta bildirishnoma}}</translation> <translation id="5207949376430453814">Matn kiritish joyi ajratib ko‘rsatilsin</translation> @@ -766,6 +764,7 @@ <translation id="612734058257491180">Google Assistent mehmon seansida ishlamaydi.</translation> <translation id="6134259848159370930">Qurilma, ilovalar, sozlamalar va internetdan qidirish.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> hisobini olib tashlash oynasini ochish</translation> +<translation id="6141988275892716286">Yuklanishni tasdiqlang</translation> <translation id="6154006699632741460">Tashqi qurilmalar ishlamaydi</translation> <translation id="6156262341071374681">Barcha ilovalarni ko‘rish</translation> <translation id="615957422585914272">Ekran klaviaturasini ko‘rsatish</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 406e923c..eeb42deb 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Mở khi hoàn tất</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, và <ph name="UNAVAILABLE_APPS_COUNT" /> ứng dụng khác không có trên thiết bị này.</translation> <translation id="3742055079367172538">Ảnh màn hình đã chụp</translation> -<translation id="3744282433224562605">Hãy nhập mật khẩu để mở khóa Chromebook của bạn</translation> <translation id="3771549900096082774">Chế độ tương phản cao</translation> <translation id="3773700760453577392">Quản trị viên không cho phép <ph name="USER_EMAIL" /> thực hiện đăng nhập nhiều tài khoản. Tất cả người dùng phải đăng xuất để tiếp tục.</translation> <translation id="3779139509281456663">Đang kết nối với <ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Hiển thị trong thư mục</translation> <translation id="5176318573511391780">Ghi một phần màn hình</translation> <translation id="5198715732953550718">Đã kết hợp <ph name="MOVED_APP_NAME" /> với <ph name="IN_PLACE_APP" /> để tạo thư mục mới.</translation> -<translation id="5199367439331364630">Hãy nhập mật khẩu để đăng nhập vào Chromebook của bạn</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 thông báo khác}other{# thông báo khác}}</translation> <translation id="5207949376430453814">Đánh dấu điểm chèn văn bản</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Bạn không thể dùng Trợ lý Google trong phiên khách.</translation> <translation id="6134259848159370930">Tìm kiếm trong thiết bị, ứng dụng, tùy chọn cài đặt và trên web.</translation> <translation id="6137566720514957455">Mở hộp thoại xóa tài khoản cho <ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Xác nhận tải xuống</translation> <translation id="6154006699632741460">Không hỗ trợ thiết bị ngoại vi</translation> <translation id="6156262341071374681">Mở rộng cho tất cả ứng dụng</translation> <translation id="615957422585914272">Hiện bàn phím ảo</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index 86643da..0e8c908c 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">下载完成后打开</translation> <translation id="3726171378575546917">无法在此设备上使用<ph name="UNAVAILABLE_APPS_ONE" />、<ph name="UNAVAILABLE_APPS_TWO" />以及另外 <ph name="UNAVAILABLE_APPS_COUNT" /> 个应用。</translation> <translation id="3742055079367172538">已完成屏幕截图</translation> -<translation id="3744282433224562605">若要解锁 Chromebook,请输入密码</translation> <translation id="3771549900096082774">高反差模式</translation> <translation id="3773700760453577392">管理员已禁止 <ph name="USER_EMAIL" /> 使用多帐号登录功能。所有用户都必须先退出帐号才能继续。</translation> <translation id="3779139509281456663">正在连接“<ph name="NAME" />”</translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">在文件夹中显示</translation> <translation id="5176318573511391780">录制部分屏幕</translation> <translation id="5198715732953550718">将“<ph name="MOVED_APP_NAME" />”和“<ph name="IN_PLACE_APP" />”移到一起创建了一个新文件夹。</translation> -<translation id="5199367439331364630">若要登录 Chromebook,请输入密码</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />,<ph name="NOTIFICATION_TITLE" />:<ph name="MESSAGE" />,<ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{另外 1 条通知}other{另外 # 条通知}}</translation> <translation id="5207949376430453814">突出显示文本插入符号</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">无法在访客会话中使用 Google 助理。</translation> <translation id="6134259848159370930">搜索您的设备、应用、设置和网站。</translation> <translation id="6137566720514957455">打开与 <ph name="USER_EMAIL_ADDRESS" /> 对应的“移除帐号”对话框</translation> +<translation id="6141988275892716286">确认下载</translation> <translation id="6154006699632741460">不支持外围设备</translation> <translation id="6156262341071374681">展开以显示所有应用</translation> <translation id="615957422585914272">显示屏幕键盘</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index ef0ca85..a278bdb 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">已切換至手提電腦模式</translation> <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> 稍後仍可登入。</translation> <translation id="3321628682574733415">家長存取碼錯誤</translation> +<translation id="3340475855009870209">正在掃描下載項目「<ph name="FILENAME" />」</translation> <translation id="3341303451326249809">擷取咗螢幕畫面</translation> <translation id="334252345105450327">擷取螢幕擷圖</translation> <translation id="3351879221545518001">您目前正在投放畫面。</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">下載完成後開啟</translation> <translation id="3726171378575546917">此裝置上未安裝「<ph name="UNAVAILABLE_APPS_ONE" />」、「<ph name="UNAVAILABLE_APPS_TWO" />」和另外 <ph name="UNAVAILABLE_APPS_COUNT" /> 個應用程式。</translation> <translation id="3742055079367172538">已拍攝螢幕擷圖</translation> -<translation id="3744282433224562605">如要解鎖 Chromebook,請輸入密碼</translation> <translation id="3771549900096082774">高對比模式</translation> <translation id="3773700760453577392">管理員已禁止 <ph name="USER_EMAIL" /> 的多重登入功能。所有使用者都必須登出,才能繼續操作。</translation> <translation id="3779139509281456663">正在連接「<ph name="NAME" />」</translation> @@ -626,7 +626,6 @@ <translation id="5170568018924773124">在資料夾中顯示</translation> <translation id="5176318573511391780">錄影部分螢幕</translation> <translation id="5198715732953550718">結合「<ph name="MOVED_APP_NAME" />」同「<ph name="IN_PLACE_APP" />」就可以建立新資料夾。</translation> -<translation id="5199367439331364630">如要登入 Chromebook,請輸入密碼</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />,<ph name="NOTIFICATION_TITLE" />:<ph name="MESSAGE" />,<ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{1 則其他通知}other{# 則其他通知}}</translation> <translation id="5207949376430453814">突顯文字插入符號</translation> @@ -764,6 +763,7 @@ <translation id="612734058257491180">「Google 助理」不適用於訪客工作階段。</translation> <translation id="6134259848159370930">搜尋您的裝置、應用程式、設定和網絡。</translation> <translation id="6137566720514957455">打開移除 <ph name="USER_EMAIL_ADDRESS" /> 嘅對話框</translation> +<translation id="6141988275892716286">確認下載</translation> <translation id="6154006699632741460">不支援周邊裝置</translation> <translation id="6156262341071374681">展開以顯示所有應用程式</translation> <translation id="615957422585914272">顯示螢幕小鍵盤</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 64bb7d7..d5d9504 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -338,6 +338,7 @@ <translation id="3307642347673023554">已切換為筆記型電腦模式</translation> <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> 日後仍可登入。</translation> <translation id="3321628682574733415">家長存取碼不正確</translation> +<translation id="3340475855009870209">正在掃描下載項目「<ph name="FILENAME" />」</translation> <translation id="3341303451326249809">已擷取螢幕截圖</translation> <translation id="334252345105450327">擷取螢幕畫面</translation> <translation id="3351879221545518001">你目前正在投放畫面。</translation> @@ -416,7 +417,6 @@ <translation id="3713734891607377840">下載完成後開啟</translation> <translation id="3726171378575546917">這部裝置未安裝「<ph name="UNAVAILABLE_APPS_ONE" />」、「<ph name="UNAVAILABLE_APPS_TWO" />」和另外 <ph name="UNAVAILABLE_APPS_COUNT" /> 個應用程式。</translation> <translation id="3742055079367172538">已拍攝螢幕截圖</translation> -<translation id="3744282433224562605">如要解鎖 Chromebook,請輸入密碼</translation> <translation id="3771549900096082774">高對比模式</translation> <translation id="3773700760453577392">管理員已禁止 <ph name="USER_EMAIL" /> 的多重登入功能。所有使用者都必須登出,才能繼續操作。</translation> <translation id="3779139509281456663">正在連結 <ph name="NAME" /></translation> @@ -627,7 +627,6 @@ <translation id="5170568018924773124">在資料夾中顯示</translation> <translation id="5176318573511391780">錄製部分螢幕畫面</translation> <translation id="5198715732953550718">已將「<ph name="MOVED_APP_NAME" />」與「<ph name="IN_PLACE_APP" />」合併,並建立新資料夾。</translation> -<translation id="5199367439331364630">如要登入 Chromebook,請輸入密碼</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />,<ph name="NOTIFICATION_TITLE" />:<ph name="MESSAGE" />,<ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{另外 1 則通知}other{另外 # 則通知}}</translation> <translation id="5207949376430453814">醒目顯示文字插入點</translation> @@ -765,6 +764,7 @@ <translation id="612734058257491180">Google 助理不支援訪客工作階段。</translation> <translation id="6134259848159370930">搜尋你的裝置、應用程式、設定和網路。</translation> <translation id="6137566720514957455">開啟移除 <ph name="USER_EMAIL_ADDRESS" /> 的對話方塊</translation> +<translation id="6141988275892716286">確認下載</translation> <translation id="6154006699632741460">不支援周邊裝置</translation> <translation id="6156262341071374681">展開並顯示所有應用程式</translation> <translation id="615957422585914272">顯示螢幕小鍵盤</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index d5972acd..9710ea2 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -416,7 +416,6 @@ <translation id="3713734891607377840">Vula lapho isiqedile</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, nangu-<ph name="UNAVAILABLE_APPS_COUNT" /> ngaphezulu awekho kule divayisi.</translation> <translation id="3742055079367172538">Kuthathwe isithombe-skrini</translation> -<translation id="3744282433224562605">Ukuze uvule i-Chromebook yakho, faka iphasiwedi</translation> <translation id="3771549900096082774">Imodi yokugqama okuphezulu</translation> <translation id="3773700760453577392">Umlawuli akazange avumele ukungena ngemvume okuningi kwe-<ph name="USER_EMAIL" />. Bonke abasebenzisi kumele baphume ngemvume ukuze baqhubeke.</translation> <translation id="3779139509281456663">Iyaxhuma ku-<ph name="NAME" /></translation> @@ -627,7 +626,6 @@ <translation id="5170568018924773124">Bonisa kufolda</translation> <translation id="5176318573511391780">Rekhoda ingxenye yesikrini</translation> <translation id="5198715732953550718"><ph name="MOVED_APP_NAME" /> kuhlanganiswe ne-<ph name="IN_PLACE_APP" /> ukudala ifolda entsha.</translation> -<translation id="5199367439331364630">Ukuze ungene ngemvume ku-Chromebook yakho, faka iphasiwedi</translation> <translation id="5206028654245650022"><ph name="APP_NAME" />, <ph name="NOTIFICATION_TITLE" />: <ph name="MESSAGE" />, <ph name="PHONE_NAME" /></translation> <translation id="5206057955438543357">{NUM_NOTIFICATIONS,plural, =1{esinye isaziso esi-1}one{ezinye izaziso ezi-#}other{ezinye izaziso ezi-#}}</translation> <translation id="5207949376430453814">Gqamisa ikharethi yombhalo</translation> @@ -765,6 +763,7 @@ <translation id="612734058257491180">Umsizi we-Google awutholakali kuseshini yesihambeli.</translation> <translation id="6134259848159370930">Sesha idivayisi yakho, izinhlelo zokusebenza, amasethingi, newebhu.</translation> <translation id="6137566720514957455">Vula okuthi susa ibhokisi le-<ph name="USER_EMAIL_ADDRESS" /></translation> +<translation id="6141988275892716286">Qinisekisa ukulanda</translation> <translation id="6154006699632741460">Umgcele awusekelwe</translation> <translation id="6156262341071374681">Nwebela kuzo zonke izinhlelo zokusebenza</translation> <translation id="615957422585914272">Bonisa kukhibhodi yesikrini</translation>
diff --git a/ash/system/message_center/ash_notification_view.cc b/ash/system/message_center/ash_notification_view.cc index feb9cc03..c26a4e6 100644 --- a/ash/system/message_center/ash_notification_view.cc +++ b/ash/system/message_center/ash_notification_view.cc
@@ -71,13 +71,14 @@ // action buttons. constexpr gfx::Insets kMainRightViewChildPadding(0, 14, 0, 0); -constexpr gfx::Insets kActionButtonsRowPadding(0, 22, 0, 4); +constexpr gfx::Insets kImageContainerPadding(12, 0, 0, 0); + +constexpr gfx::Insets kActionButtonsRowPadding(16, 22, 0, 4); constexpr int kActionsRowHorizontalSpacing = 8; constexpr int kContentRowHorizontalSpacing = 16; constexpr int kLeftContentVerticalSpacing = 4; constexpr int kTitleRowSpacing = 6; -constexpr int kHeaderRowSpacing = 4; // Bullet character. The divider symbol between the title and the timestamp. constexpr char16_t kTitleRowDivider[] = u"\u2022"; @@ -327,7 +328,8 @@ // consider making changes to this code when the bug is fixed. .SetMaximumWidth(GetExpandedMessageViewWidth())) .AddChild(CreateInlineSettingsBuilder()) - .AddChild(CreateImageContainerBuilder()); + .AddChild(CreateImageContainerBuilder().SetBorder( + views::CreateEmptyBorder(kImageContainerPadding))); ConfigureLabelStyle(message_view_in_expanded_state_, kMessageLabelSize, false); @@ -390,8 +392,12 @@ views::MaximumFlexSizeRule::kUnbounded)); static_cast<views::FlexLayout*>(header_row()->GetLayoutManager()) - ->SetDefault(views::kMarginsKey, gfx::Insets(0, 0, 0, kHeaderRowSpacing)) + ->SetDefault(views::kMarginsKey, gfx::Insets()) .SetInteriorMargin(gfx::Insets()); + header_row()->ConfigureLabelsStyle( + gfx::FontList({kGoogleSansFont}, gfx::Font::NORMAL, kHeaderViewLabelSize, + gfx::Font::Weight::NORMAL), + gfx::Insets(), true); if (shown_in_popup_ && !notification.group_child()) { layer()->SetBackgroundBlur(ColorProvider::kBackgroundBlurSigma); @@ -811,6 +817,12 @@ return gfx::Size(kIconViewSize, kIconViewSize); } +int AshNotificationView::GetLargeImageViewMaxWidth() const { + return message_center::kNotificationWidth - kNotificationViewPadding.width() - + kAppIconViewSize - kMainRightViewPadding.width() - + kMainRightViewChildPadding.width(); +} + void AshNotificationView::ToggleInlineSettings(const ui::Event& event) { if (!inline_settings_enabled()) return;
diff --git a/ash/system/message_center/ash_notification_view.h b/ash/system/message_center/ash_notification_view.h index fa0d5243..0c2b534 100644 --- a/ash/system/message_center/ash_notification_view.h +++ b/ash/system/message_center/ash_notification_view.h
@@ -90,6 +90,7 @@ views::Button::PressedCallback callback, const std::u16string& label) override; gfx::Size GetIconViewSize() const override; + int GetLargeImageViewMaxWidth() const override; void ToggleInlineSettings(const ui::Event& event) override; void ActionButtonPressed(size_t index, const ui::Event& event) override;
diff --git a/ash/webui/camera_app_ui/resources/js/animation.js b/ash/webui/camera_app_ui/resources/js/animation.js index 4f37519..509be57b 100644 --- a/ash/webui/camera_app_ui/resources/js/animation.js +++ b/ash/webui/camera_app_ui/resources/js/animation.js
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {assertInstanceof} from './assert.js'; import {AsyncJobQueue} from './async_job_queue.js'; -import {assertInstanceof} from './chrome_util.js'; /** * @type {!Map<!HTMLElement, !AsyncJobQueue>}
diff --git a/ash/webui/camera_app_ui/resources/js/assert.ts b/ash/webui/camera_app_ui/resources/js/assert.ts new file mode 100644 index 0000000..58fb931 --- /dev/null +++ b/ash/webui/camera_app_ui/resources/js/assert.ts
@@ -0,0 +1,104 @@ +// Copyright (c) 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * Verify |condition| is truthy and return |condition| if so. + * @param condition A condition to check for truthiness. Note that this + * may be used to test whether a value is defined or not, and we don't want + * to force a cast to Boolean. + * @param optMessage A message to show on failure. + * @return A non-null |condition|. + */ +export function assert( + condition: boolean, optMessage?: string): asserts condition { + if (!condition) { + let message = 'Assertion failed'; + if (optMessage) { + message = message + ': ' + optMessage; + } + throw new Error(message); + } +} + +/** + * Call this from places in the code that should never be reached. + * + * For example, handling all the values of enum with a switch() like this: + * + * function getValueFromEnum(enum) { + * switch (enum) { + * case ENUM_FIRST_OF_TWO: + * return first + * case ENUM_LAST_OF_TWO: + * return last; + * } + * assertNotReached(); + * return document; + * } + * + * This code should only be hit in the case of serious programmer error or + * unexpected input. + * + * @param optMessage A message to show when this is hit. + */ +export function assertNotReached(optMessage = 'Unreachable code hit'): never { + assert(false, optMessage); +} + +/** + * @param value The value to check. + * @param ctor A user-defined constructor. + * @param optMessage A message to show when this is hit. + */ +export function assertInstanceof<T>( + value: unknown, ctor: new (...args: unknown[]) => T, + optMessage?: string): T { + // We don't use assert immediately here so that we avoid constructing an error + // message if we don't have to. + if (!(value instanceof ctor)) { + assertNotReached( + optMessage || + 'Value ' + value + ' is not a[n] ' + (ctor.name || typeof ctor)); + } + return value; +} + +/** + * @param value The value to check. + * @param optMessage A message to show when this is hit. + */ +export function assertString(value: unknown, optMessage?: string): string { + // We don't use assert immediately here so that we avoid constructing an error + // message if we don't have to. + if (typeof value !== 'string') { + assertNotReached(optMessage || 'Value ' + value + ' is not a string'); + } + return value; +} + +/** + * @param value The value to check. + * @param optMessage A message to show when this is hit. + */ +export function assertNumber(value: unknown, optMessage?: string): number { + // We don't use assert immediately here so that we avoid constructing an error + // message if we don't have to. + if (typeof value !== 'number') { + assertNotReached(optMessage || 'Value ' + value + ' is not a number'); + } + return value; +} + +/** + * @param value The value to check. + * @param optMessage A message to show when this is hit. + */ +export function assertBoolean(value: unknown, optMessage?: string): boolean { + // We don't use assert immediately here so that we avoid constructing an error + // message if we don't have to. + if (typeof value !== 'boolean') { + assertNotReached(optMessage || 'Value ' + value + ' is not a boolean'); + } + return value; +}
diff --git a/ash/webui/camera_app_ui/resources/js/async_job_queue.js b/ash/webui/camera_app_ui/resources/js/async_job_queue.js index f34070c..2ccc2da7 100644 --- a/ash/webui/camera_app_ui/resources/js/async_job_queue.js +++ b/ash/webui/camera_app_ui/resources/js/async_job_queue.js
@@ -11,7 +11,8 @@ */ constructor() { /** - * @private {!Promise} + * @type {!Promise<unknown>} + * @private */ this.promise_ = Promise.resolve(); @@ -24,22 +25,25 @@ /** * Pushes the given job into queue. - * @param {function(): !Promise} job - * @return {!Promise} Resolved when the job is finished. + * @template T + * @param {function(): !Promise<T>} job + * @return {!Promise<T|null>} Resolved when the job is finished. */ push(job) { - this.promise_ = this.promise_.then(() => { + /** @type {!Promise<T|null>} */ + const promise = this.promise_.then(() => { if (this.clearing_) { - return; + return null; } return job(); }); - return this.promise_; + this.promise_ = promise; + return promise; } /** * Flushes the job queue. - * @return {!Promise} Resolved when all jobs in the queue are finished. + * @return {!Promise<void>} Resolved when all jobs in the queue are finished. */ async flush() { await this.promise_;
diff --git a/ash/webui/camera_app_ui/resources/js/barcode_chip.js b/ash/webui/camera_app_ui/resources/js/barcode_chip.js index fb4c19d..2a18044 100644 --- a/ash/webui/camera_app_ui/resources/js/barcode_chip.js +++ b/ash/webui/camera_app_ui/resources/js/barcode_chip.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert} from './chrome_util.js'; +import {assert} from './assert.js'; import * as dom from './dom.js'; import {reportError} from './error.js'; import {I18nString} from './i18n_string.js';
diff --git a/ash/webui/camera_app_ui/resources/js/chrome_util.js b/ash/webui/camera_app_ui/resources/js/chrome_util.js deleted file mode 100644 index 958ebcf9..0000000 --- a/ash/webui/camera_app_ui/resources/js/chrome_util.js +++ /dev/null
@@ -1,118 +0,0 @@ -// Copyright (c) 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// TODO(pihsun): The jsdoc for assert and assertNotReached is in a state that -// is recognizable by TypeScript but not by ESLint, disable ESLint checks for -// now before we migrate this file fully to TypeScript. -/* eslint-disable valid-jsdoc */ - -/** - * Verify |condition| is truthy and return |condition| if so. - * @template T - * @param {T} condition A condition to check for truthiness. Note that this - * may be used to test whether a value is defined or not, and we don't want - * to force a cast to Boolean. - * @param {string=} optMessage A message to show on failure. - * @return {asserts condition} A non-null |condition|. - */ -export function assert(condition, optMessage) { - if (!condition) { - let message = 'Assertion failed'; - if (optMessage) { - message = message + ': ' + optMessage; - } - throw new Error(message); - } -} - -/** - * Call this from places in the code that should never be reached. - * - * For example, handling all the values of enum with a switch() like this: - * - * function getValueFromEnum(enum) { - * switch (enum) { - * case ENUM_FIRST_OF_TWO: - * return first - * case ENUM_LAST_OF_TWO: - * return last; - * } - * assertNotReached(); - * return document; - * } - * - * This code should only be hit in the case of serious programmer error or - * unexpected input. - * - * @param {string=} optMessage A message to show when this is hit. - * @return {never} - */ -export function assertNotReached(optMessage) { - assert(false, optMessage || 'Unreachable code hit'); -} - -// Disables eslint check for closure compiler constructor type. -/* eslint-disable valid-jsdoc */ - -/** - * @param {*} value The value to check. - * @param {function(new: T, ...?)} type A user-defined constructor. - * @param {string=} optMessage A message to show when this is hit. - * @return {T} - * @template T - */ -export function assertInstanceof(value, type, optMessage) { - // We don't use assert immediately here so that we avoid constructing an error - // message if we don't have to. - if (!(value instanceof type)) { - assertNotReached( - optMessage || - 'Value ' + value + ' is not a[n] ' + (type.name || typeof type)); - } - return value; -} - -/* eslint-enable valid-jsdoc */ - -/** - * @param {*} value The value to check. - * @param {string=} optMessage A message to show when this is hit. - * @return {string} - */ -export function assertString(value, optMessage) { - // We don't use assert immediately here so that we avoid constructing an error - // message if we don't have to. - if (typeof value !== 'string') { - assertNotReached(optMessage || 'Value ' + value + ' is not a string'); - } - return /** @type {string} */ (value); -} - -/** - * @param {*} value The value to check. - * @param {string=} optMessage A message to show when this is hit. - * @return {number} - */ -export function assertNumber(value, optMessage) { - // We don't use assert immediately here so that we avoid constructing an error - // message if we don't have to. - if (typeof value !== 'number') { - assertNotReached(optMessage || 'Value ' + value + ' is not a number'); - } - return /** @type {number} */ (value); -} - -/** - * @param {*} value The value to check. - * @param {string=} optMessage A message to show when this is hit. - * @return {boolean} - */ -export function assertBoolean(value, optMessage) { - // We don't use assert immediately here so that we avoid constructing an error - // message if we don't have to. - if (typeof value !== 'boolean') { - assertNotReached(optMessage || 'Value ' + value + ' is not a boolean'); - } - return /** @type {boolean} */ (value); -}
diff --git a/ash/webui/camera_app_ui/resources/js/css.js b/ash/webui/camera_app_ui/resources/js/css.js index 0d2fd53..2ca0b0b 100644 --- a/ash/webui/camera_app_ui/resources/js/css.js +++ b/ash/webui/camera_app_ui/resources/js/css.js
@@ -5,7 +5,7 @@ import { assert, assertInstanceof, -} from './chrome_util.js'; +} from './assert.js'; /** * CSS rules.
diff --git a/ash/webui/camera_app_ui/resources/js/device/constraints_preferrer.js b/ash/webui/camera_app_ui/resources/js/device/constraints_preferrer.js index 56b3b61..6e0ff9f 100644 --- a/ash/webui/camera_app_ui/resources/js/device/constraints_preferrer.js +++ b/ash/webui/camera_app_ui/resources/js/device/constraints_preferrer.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert, assertNotReached} from '../chrome_util.js'; +import {assert, assertNotReached} from '../assert.js'; import * as dom from '../dom.js'; import * as localStorage from '../models/local_storage.js'; import * as state from '../state.js';
diff --git a/ash/webui/camera_app_ui/resources/js/device/stream_manager.js b/ash/webui/camera_app_ui/resources/js/device/stream_manager.js index c4f5e1d..c925acf0 100644 --- a/ash/webui/camera_app_ui/resources/js/device/stream_manager.js +++ b/ash/webui/camera_app_ui/resources/js/device/stream_manager.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert} from '../chrome_util.js'; +import {assert} from '../assert.js'; import {reportError} from '../error.js'; import {I18nString} from '../i18n_string.js'; import * as loadTimeData from '../models/load_time_data.js';
diff --git a/ash/webui/camera_app_ui/resources/js/dom.js b/ash/webui/camera_app_ui/resources/js/dom.js index 9c14967..7b66135 100644 --- a/ash/webui/camera_app_ui/resources/js/dom.js +++ b/ash/webui/camera_app_ui/resources/js/dom.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertInstanceof} from './chrome_util.js'; +import {assertInstanceof} from './assert.js'; // Disables eslint check for closure compiler constructor type. /* eslint-disable valid-jsdoc */
diff --git a/ash/webui/camera_app_ui/resources/js/error.js b/ash/webui/camera_app_ui/resources/js/error.ts similarity index 73% rename from ash/webui/camera_app_ui/resources/js/error.js rename to ash/webui/camera_app_ui/resources/js/error.ts index 37a88b3..71178d7 100644 --- a/ash/webui/camera_app_ui/resources/js/error.js +++ b/ash/webui/camera_app_ui/resources/js/error.ts
@@ -2,9 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// eslint-disable-next-line no-unused-vars import {AppWindow} from './app_window.js'; -import {assertInstanceof} from './chrome_util.js'; +import {assertInstanceof} from './assert.js'; import * as metrics from './metrics.js'; import { ErrorLevel, @@ -13,23 +12,20 @@ /** * Code location of stack frame. - * @typedef {{ - * fileName: string, - * funcName: string, - * lineNo: number, - * colNo : number, - * }} */ -export let StackFrame; +export interface StackFrame { + fileName: string; + funcName: string; + lineNo: number; + colNo: number; +} const PRODUCT_NAME = 'ChromeOS_CameraApp'; /** * Converts v8 CallSite object to StackFrame. - * @param {!CallSite} callsite - * @return {!StackFrame} */ -function toStackFrame(callsite) { +function toStackFrame(callsite: CallSite): StackFrame { // TODO(crbug.com/1072700): Handle native frame. let fileName = callsite.getFileName() || 'unknown'; if (fileName.startsWith(window.location.origin)) { @@ -46,10 +42,9 @@ /** * Gets stack frames from error. - * @param {!Error} error - * @return {?Array<!StackFrame>} return null if failed to get frames from error. + * @return return null if failed to get frames from error. */ -export function getStackFrames(error) { +export function getStackFrames(error: Error): StackFrame[]|null { const prevPrepareStackTrace = Error.prepareStackTrace; Error.prepareStackTrace = (error, stack) => { try { @@ -60,31 +55,29 @@ } }; - const /** (?Array<!StackFrame>|string) */ frames = error.stack; + // Using "as" since overriding prepareStackTrace changes what error.stack + // returns, but TypeScript will still consider frames a string even if we + // manually annotate the type. + const frames = error.stack as (StackFrame[] | string); Error.prepareStackTrace = prevPrepareStackTrace; if (typeof frames !== 'object') { return null; } - return /** @type {?Array<!StackFrame>} */ (frames); + return frames; } /** * Gets the description text for an error. - * @param {!Error} error - * @return {string} */ -function getErrorDescription(error) { +function getErrorDescription(error: Error): string { return `${error.name}: ${error.message}`; } /** * Gets formatted string stack from error. - * @param {!Error} error - * @param {?Array<!StackFrame>} frames - * @return {string} */ -function formatErrorStack(error, frames) { +function formatErrorStack(error: Error, frames: StackFrame[]|null): string { const errorDesc = getErrorDescription(error); return errorDesc + (frames || []) @@ -101,15 +94,12 @@ .join(''); } -/** - * @type {?AppWindow} - */ -const appWindow = window['appWindow']; +const appWindow: AppWindow|null = window['appWindow']; /** * Initializes error collecting functions. */ -export function initialize() { +export function initialize(): void { window.addEventListener('unhandledrejection', (e) => { reportError( ErrorType.UNCAUGHT_PROMISE, ErrorLevel.ERROR, @@ -120,18 +110,15 @@ /** * All triggered error will be hashed and saved in this set to prevent the same * error being triggered multiple times. - * @type {!Set<string>} */ -const triggeredErrorSet = new Set(); +const triggeredErrorSet = new Set<string>(); /** * Reports error either through test error callback in test run or to error * metrics in non test run. - * @param {!ErrorType} type - * @param {!ErrorLevel} level - * @param {!Error} error */ -export function reportError(type, level, error) { +export function reportError( + type: ErrorType, level: ErrorLevel, error: Error): void { // Uncaught promise is already logged in console. if (type !== ErrorType.UNCAUGHT_PROMISE) { if (level === ErrorLevel.ERROR) { @@ -145,8 +132,8 @@ const frames = getStackFrames(error); const errorName = error.name; const errorDesc = getErrorDescription(error); - const frame = (frames !== null && frames.length > 0) ? frames[0] : {}; - const {fileName = '', lineNo = 0, colNo = 0, funcName = ''} = frame; + const {fileName = '', lineNo = 0, colNo = 0, funcName = ''} = + (frames !== null && frames.length > 0) ? frames[0] : {}; const hash = [errorName, fileName, String(lineNo), String(colNo)].join(','); if (triggeredErrorSet.has(hash)) { @@ -180,7 +167,6 @@ return; } - /** @type {!chrome.crashReportPrivate.ErrorInfo} */ const params = { product: PRODUCT_NAME, url: self.location.href, @@ -190,5 +176,9 @@ columnNumber: colNo || 0, }; - chrome.crashReportPrivate.reportError(params, () => {}); + chrome.crashReportPrivate.reportError( + params, + () => { + // Do nothing after error reported. + }); }
diff --git a/ash/webui/camera_app_ui/resources/js/externs/chrome.js b/ash/webui/camera_app_ui/resources/js/externs/chrome.js deleted file mode 100644 index a743a59..0000000 --- a/ash/webui/camera_app_ui/resources/js/externs/chrome.js +++ /dev/null
@@ -1,33 +0,0 @@ -// 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. - -/* eslint-disable no-unused-vars, no-var */ - -/** - * It is available since we enabled and filled data in it while creating - * content::WebUIDataSource for CCA. - * @typedef {{ - * getBoolean: function(string): boolean, - * getString: function(string): string, - * getStringF: function(string, ...(string|number)): string, - * }} - */ -window.loadTimeData; - -/** - * It is available since we enabled IdleDetection in origin trials map of CCA. - * @typedef {{ - * addEventListener: function(string, function()), - * screenState: string, - * start: function(): !Promise<void>, - * }} - */ -let IdleDetector; - -/** - * @typedef {{ - * getDirectory: function(): !Promise<!FileSystemDirectoryHandle>, - * }} - */ -navigator.storage;
diff --git a/ash/webui/camera_app_ui/resources/js/externs/conformance_config.textproto b/ash/webui/camera_app_ui/resources/js/externs/conformance_config.textproto deleted file mode 100644 index 91c94b0..0000000 --- a/ash/webui/camera_app_ui/resources/js/externs/conformance_config.textproto +++ /dev/null
@@ -1,36 +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. - -# Reference: -# https://github.com/google/closure-compiler/wiki/JS-Conformance-Framework - -# These attributes are labeled with @implicitCast for Trusted Types. -# Change back to accept string only since we are not using Trusted Types. -# See go/tt-closure for more details. -requirement: { - type: RESTRICTED_PROPERTY_WRITE - error_message: "Property accepts only string." - value: "Element.prototype.outerHTML:string" - value: "HTMLAnchorElement.prototype.href:string" - value: "HTMLAreaElement.prototype.href:string" - value: "HTMLBaseElement.prototype.href:string" - value: "HTMLButtonElement.prototype.formAction:string" - value: "HTMLEmbedElement.prototype.src:string" - value: "HTMLFormElement.prototype.action:string" - value: "HTMLFrameElement.prototype.src:string" - value: "HTMLIFrameElement.prototype.src:string" - value: "HTMLIFrameElement.prototype.srcdoc:string" - value: "HTMLInputElement.prototype.formAction:string" - value: "HTMLInputElement.prototype.src:string" - value: "HTMLLinkElement.prototype.href:string" - value: "HTMLMediaElement.prototype.src:string" - value: "HTMLObjectElement.prototype.codeBase:string" - value: "HTMLObjectElement.prototype.data:string" - value: "HTMLScriptElement.prototype.src:string" - value: "HTMLScriptElement.prototype.text:string" - value: "HTMLSourceElement.prototype.src:string" - value: "HTMLTrackElement.prototype.src:string" - value: "Location.prototype.href:string" - value: "ShadowRoot.prototype.innerHTML:string" -}
diff --git a/ash/webui/camera_app_ui/resources/js/externs/svg.js b/ash/webui/camera_app_ui/resources/js/externs/svg.js deleted file mode 100644 index d5cc53a..0000000 --- a/ash/webui/camera_app_ui/resources/js/externs/svg.js +++ /dev/null
@@ -1,17 +0,0 @@ -// 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. - -/* eslint-disable no-undef, no-unused-vars, no-var, valid-jsdoc */ - -/** - * @constructor - * @extends {Element} - */ -function SVGElement() {} - -/** - * @constructor - * @extends {SVGElement} - */ -function SVGPolygonElement() {}
diff --git a/ash/webui/camera_app_ui/resources/js/externs/typescript.js b/ash/webui/camera_app_ui/resources/js/externs/typescript.js deleted file mode 100644 index 992747b2..0000000 --- a/ash/webui/camera_app_ui/resources/js/externs/typescript.js +++ /dev/null
@@ -1,20 +0,0 @@ -// 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. - -/* eslint-disable no-undef, no-unused-vars, no-var, valid-jsdoc */ - -/** - * @fileoverview Externs for TypeScript compatibility. - */ - -/** @typedef {NodeList} */ -var NodeListOf; - -/** @typedef {Event} */ -var BeforeUnloadEvent; - -const UniversalAnalytics = {}; - -/** @typedef {ga.Fields} */ -UniversalAnalytics.FieldsObject;
diff --git a/ash/webui/camera_app_ui/resources/js/externs/universal_analytics_api.js b/ash/webui/camera_app_ui/resources/js/externs/universal_analytics_api.js deleted file mode 100644 index febcbde..0000000 --- a/ash/webui/camera_app_ui/resources/js/externs/universal_analytics_api.js +++ /dev/null
@@ -1,517 +0,0 @@ -/* - * Copyright 2019 The Closure Compiler Authors. - * - * 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. - */ - -/* eslint-disable */ -/** - * @fileoverview Externs for the Universal Analytics API (analytics.js). - * - * @externs - */ - - -/** - * https://developers.google.com/analytics/devguides/collection/analyticsjs/command-queue-reference - * @param {string|function(!ga.Tracker)} commandOrReadyCallback - * @param {string|!ga.Fields=} field1 - * @param {string|?ga.Fields|function(!ga.Model)=} field2 - * @param {string|!ga.Fields=} field3 - * @param {number|string|!ga.Fields=} field4 - * @param {number|string|!ga.Fields=} field5 - * @param {!ga.Fields=} field6 - * @suppress {duplicate} Enables defining a stub for ga() until analytics.js is - * loaded. See - * https://developers.google.com/analytics/devguides/collection/analyticsjs/#alternative_async_tracking_snippet - * @const - */ -var ga = function( - commandOrReadyCallback, field1, field2, field3, field4, field5, field6) {}; - -/** - * https://developers.google.com/analytics/devguides/collection/analyticsjs/ga-object-methods-reference#getAll - * @return {!Array<!ga.Tracker>} - */ -ga.getAll = function() {}; - -/** - * https://developers.google.com/analytics/devguides/collection/analyticsjs/ga-object-methods-reference#getByName - * @param {string} name - * @return {!ga.Tracker|undefined} - */ -ga.getByName = function(name) {}; - -/** - * https://developers.google.com/analytics/devguides/collection/analyticsjs/ga-object-methods-reference#create - * @param {string} trackingId - * @param {string|!ga.Fields=} cookieDomainOrFields - * @param {string|!ga.Fields=} nameOrFields - * @param {!ga.Fields=} fields - * @return {!ga.Tracker} - */ -ga.create = function(trackingId, cookieDomainOrFields, nameOrFields, fields) {}; - -/** - * https://developers.google.com/analytics/devguides/collection/analyticsjs/ga-object-methods-reference#remove - * @param {string} name - */ -ga.remove = function(name) {}; - -/** - * https://developers.google.com/analytics/devguides/collection/analyticsjs/model-object-reference - * @interface - */ -ga.Model = class { - /** - * https://developers.google.com/analytics/devguides/collection/analyticsjs/model-object-reference#get - * @param {string} fieldName - * @return {?} - */ - get(fieldName) {} - - /** - * https://developers.google.com/analytics/devguides/collection/analyticsjs/model-object-reference#set - * @param {string|!ga.Fields} fieldNameOrObject - * @param {?boolean|number|string|function()} fieldValue - * @param {boolean=} temporary - */ - set(fieldNameOrObject, fieldValue, temporary) {} -}; - -/** - * https://developers.google.com/analytics/devguides/collection/analyticsjs/tracker-object-reference - * @interface - */ -ga.Tracker = class { - /** - * https://developers.google.com/analytics/devguides/collection/analyticsjs/tracker-object-reference#get - * @param {string} fieldName - * @return {?} - */ - get(fieldName) {} - - /** - * https://developers.google.com/analytics/devguides/collection/analyticsjs/tracker-object-reference#set - * @param {string|!ga.Fields} fieldNameOrObject - * @param {?boolean|number|string|function()|function(!ga.Model)} fieldValue - */ - set(fieldNameOrObject, fieldValue) {} - - /** - * https://developers.google.com/analytics/devguides/collection/analyticsjs/tracker-object-reference#send - * @param {string} hitType - * @param {string|!ga.Fields=} field1 - * @param {string|!ga.Fields=} field2 - * @param {number|string|!ga.Fields=} field3 - * @param {number|string|!ga.Fields=} field4 - * @param {!ga.Fields=} field5 - */ - send(hitType, field1, field2, field3, field4, field5) {} -}; - -/** - * https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference - * See cl/249045133's description for explanation how this class was generated. - * @record - */ -ga.Fields = class { - constructor() { - /** @type {?string|undefined} */ - this.action; - - /** @type {?string|undefined} */ - this.affiliation; - - /** @type {?boolean|undefined} */ - this.allowAdFeatures; - - /** @type {?boolean|undefined} */ - this.allowAnchor; - - /** @type {?boolean|undefined} */ - this.allowLinker; - - /** @type {?boolean|undefined} */ - this.alwaysSendReferrer; - - /** @type {?boolean|undefined} */ - this.anonymizeIp; - - /** @type {?string|undefined} */ - this.appId; - - /** @type {?string|undefined} */ - this.appInstallerId; - - /** @type {?string|undefined} */ - this.appName; - - /** @type {?string|undefined} */ - this.appVersion; - - /** @type {?string|undefined} */ - this.brand; - - /** @type {?string|undefined} */ - this.campaignContent; - - /** @type {?string|undefined} */ - this.campaignId; - - /** @type {?string|undefined} */ - this.campaignKeyword; - - /** @type {?string|undefined} */ - this.campaignMedium; - - /** @type {?string|undefined} */ - this.campaignName; - - /** @type {?string|undefined} */ - this.campaignSource; - - /** @type {?string|undefined} */ - this.category; - - /** @type {?string|undefined} */ - this.clientId; - - /** @type {?string|undefined} */ - this.contentGroup1; - - /** @type {?string|undefined} */ - this.contentGroup2; - - /** @type {?string|undefined} */ - this.contentGroup3; - - /** @type {?string|undefined} */ - this.contentGroup4; - - /** @type {?string|undefined} */ - this.contentGroup5; - - /** @type {?string|undefined} */ - this.cookieDomain; - - /** @type {?number|undefined} */ - this.cookieExpires; - - /** @type {?string|undefined} */ - this.cookieName; - - /** @type {?string|undefined} */ - this.coupon; - - /** @type {?string|undefined} */ - this.creative; - - /** @type {?string|undefined} */ - this.currencyCode; - - /** @type {?string|undefined} */ - this.dataSource; - - /** @type {?string|undefined} */ - this.dimension1; - - /** @type {?string|undefined} */ - this.dimension2; - - /** @type {?string|undefined} */ - this.dimension3; - - /** @type {?string|undefined} */ - this.dimension4; - - /** @type {?string|undefined} */ - this.dimension5; - - /** @type {?string|undefined} */ - this.dimension6; - - /** @type {?string|undefined} */ - this.dimension7; - - /** @type {?string|undefined} */ - this.dimension8; - - /** @type {?string|undefined} */ - this.dimension9; - - /** @type {?string|undefined} */ - this.dimension10; - - /** @type {?string|undefined} */ - this.dimension11; - - /** @type {?string|undefined} */ - this.dimension12; - - /** @type {?string|undefined} */ - this.dimension13; - - /** @type {?string|undefined} */ - this.dimension14; - - /** @type {?string|undefined} */ - this.dimension15; - - /** @type {?string|undefined} */ - this.dimension16; - - /** @type {?string|undefined} */ - this.dimension17; - - /** @type {?string|undefined} */ - this.dimension18; - - /** @type {?string|undefined} */ - this.dimension19; - - /** @type {?string|undefined} */ - this.dimension20; - - /** @type {?string|undefined} */ - this.encoding; - - /** @type {?string|undefined} */ - this.eventAction; - - /** @type {?string|undefined} */ - this.eventCategory; - - /** @type {?string|undefined} */ - this.eventLabel; - - /** @type {?number|undefined} */ - this.eventValue; - - /** @type {?string|undefined} */ - this.exDescription; - - /** @type {?boolean|undefined} */ - this.exFatal; - - /** @type {?string|undefined} */ - this.expId; - - /** @type {?string|undefined} */ - this.expVar; - - /** @type {?string|undefined} */ - this.flashVersion; - - /** @type {?boolean|undefined} */ - this.forceSSL; - - /** @type {?function()|undefined} */ - this.hitCallback; - - /** @type {?string|undefined} */ - this.hitType; - - /** @type {?string|undefined} */ - this.hostname; - - /** @type {?string|undefined} */ - this.id; - - /** @type {?boolean|undefined} */ - this.javaEnabled; - - /** @type {?string|undefined} */ - this.language; - - /** @type {?string|undefined} */ - this.legacyCookieDomain; - - /** @type {?boolean|undefined} */ - this.legacyHistoryImport; - - /** @type {?string|undefined} */ - this.linkerParam; - - /** @type {?string|undefined} */ - this.linkid; - - /** @type {?string|undefined} */ - this.list; - - /** @type {?string|undefined} */ - this.location; - - /** @type {?number|undefined} */ - this.metric1; - - /** @type {?number|undefined} */ - this.metric2; - - /** @type {?number|undefined} */ - this.metric3; - - /** @type {?number|undefined} */ - this.metric4; - - /** @type {?number|undefined} */ - this.metric5; - - /** @type {?number|undefined} */ - this.metric6; - - /** @type {?number|undefined} */ - this.metric7; - - /** @type {?number|undefined} */ - this.metric8; - - /** @type {?number|undefined} */ - this.metric9; - - /** @type {?number|undefined} */ - this.metric10; - - /** @type {?number|undefined} */ - this.metric11; - - /** @type {?number|undefined} */ - this.metric12; - - /** @type {?number|undefined} */ - this.metric13; - - /** @type {?number|undefined} */ - this.metric14; - - /** @type {?number|undefined} */ - this.metric15; - - /** @type {?number|undefined} */ - this.metric16; - - /** @type {?number|undefined} */ - this.metric17; - - /** @type {?number|undefined} */ - this.metric18; - - /** @type {?number|undefined} */ - this.metric19; - - /** @type {?number|undefined} */ - this.metric20; - - /** @type {?string|undefined} */ - this.name; - - /** @type {?boolean|undefined} */ - this.nonInteraction; - - /** @type {?string|undefined} */ - this.option; - - /** @type {?string|undefined} */ - this.page; - - /** @type {?number|string|undefined} */ - this.position; - - /** @type {?string|undefined} */ - this.price; - - /** @type {?number|undefined} */ - this.quantity; - - /** @type {?number|undefined} */ - this.queueTime; - - /** @type {?string|undefined} */ - this.referrer; - - /** @type {?string|undefined} */ - this.revenue; - - /** @type {?number|undefined} */ - this.sampleRate; - - /** @type {?string|undefined} */ - this.screenColors; - - /** @type {?string|undefined} */ - this.screenName; - - /** @type {?string|undefined} */ - this.screenResolution; - - /** @type {?string|undefined} */ - this.sessionControl; - - /** @type {?string|undefined} */ - this.shipping; - - /** @type {?number|undefined} */ - this.siteSpeedSampleRate; - - /** @type {?string|undefined} */ - this.socialAction; - - /** @type {?string|undefined} */ - this.socialNetwork; - - /** @type {?string|undefined} */ - this.socialTarget; - - /** @type {?number|undefined} */ - this.step; - - /** @type {?boolean|undefined} */ - this.storeGac; - - /** @type {?string|undefined} */ - this.tax; - - /** @type {?string|undefined} */ - this.timingCategory; - - /** @type {?string|undefined} */ - this.timingLabel; - - /** @type {?number|undefined} */ - this.timingValue; - - /** @type {?string|undefined} */ - this.timingVar; - - /** @type {?string|undefined} */ - this.title; - - /** @type {?string|undefined} */ - this.trackingId; - - /** @type {?string|undefined} */ - this.transport; - - /** @type {?boolean|undefined} */ - this.useBeacon; - - /** @type {?string|undefined} */ - this.userId; - - /** @type {?string|undefined} */ - this.variant; - - /** @type {?string|undefined} */ - this.viewportSize; - } -}; \ No newline at end of file
diff --git a/ash/webui/camera_app_ui/resources/js/externs/w3c_api.js b/ash/webui/camera_app_ui/resources/js/externs/w3c_api.js deleted file mode 100644 index fc3027c..0000000 --- a/ash/webui/camera_app_ui/resources/js/externs/w3c_api.js +++ /dev/null
@@ -1,272 +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. - -/* eslint-disable no-undef, no-unused-vars, no-var, valid-jsdoc */ - -// TODO(b/172879638): Remove this extern once we have -// https://github.com/google/closure-compiler/pull/3735 merged in Closure -// Compiler and Chromium. - -/** @type {string} */ -OffscreenCanvasRenderingContext2D.prototype.imageSmoothingQuality; - -// TODO(b/172879638): Upstream the externs of BarcodeDetector to Closure -// Compiler. - -/** - * @typedef {HTMLImageElement|HTMLVideoElement|HTMLCanvasElement|ImageBitmap| - * OffscreenCanvas} - */ -var CanvasImageSource; - -/** - * @typedef {!CanvasImageSource|!Blob|!ImageData} - * @see https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmapsource - */ -var ImageBitmapSource; - -/** - * @record - * @struct - */ -function BarcodeDetectorOptions() {} - -/** @type {!Array<string>} */ -BarcodeDetectorOptions.prototype.formats; - -/** - * @record - * @struct - */ -function DetectedBarcode() {} - -/** @type {!DOMRectReadOnly} */ -DetectedBarcode.prototype.boundingBox; - -/** @type {!Array<{x: number, y: number}>} */ -DetectedBarcode.prototype.cornerPoints; - -/** @type {string} */ -DetectedBarcode.prototype.format; - -/** @type {string} */ -DetectedBarcode.prototype.rawValue; - -/** - * @constructor - * @param {!BarcodeDetectorOptions=} barcodeDetectorOptions - * @see https://wicg.github.io/shape-detection-api/#barcode-detection-api - */ -function BarcodeDetector(barcodeDetectorOptions) {} - -/** - * @return {!Promise<!Array<string>>} - */ -BarcodeDetector.getSupportedFormats = function() {}; - -/** - * @param {!ImageBitmapSource} image - * @return {!Promise<!Array<!DetectedBarcode>>} - */ -BarcodeDetector.prototype.detect = function(image) {}; - -// TODO(b/172881094): Upstream the externs of PTZ fields to Closure Compiler. - -/** @type {!MediaSettingsRange} */ -MediaTrackCapabilities.prototype.pan; - -/** @type {!MediaSettingsRange} */ -MediaTrackCapabilities.prototype.tilt; - -/** @type {number} */ -MediaTrackSettings.prototype.pan; - -/** @type {number} */ -MediaTrackSettings.prototype.tilt; - -// TODO(b/172881094): Upstream the externs of pointer event to Closure Compiler. -// https://www.w3.org/TR/pointerevents2/#dom-globaleventhandlers-onpointerdown - -/** @type {?function (Event)} */ Element.prototype.onpointerdown; -/** @type {?function (Event)} */ Element.prototype.onpointerup; -/** @type {?function (Event)} */ Element.prototype.onpointerleave; - -/** - * @record - * @struct - */ -function OverconstrainedError() {} - -/** @type {string} */ -OverconstrainedError.prototype.constraint; - -/** @type {string} */ -OverconstrainedError.prototype.name; - -/** @type {string} */ -OverconstrainedError.prototype.message; - - -// CSS Typed OM Level 1: https://drafts.css-houdini.org/css-typed-om/ - -/** - * @constructor - */ -function StylePropertyMapReadOnly() {} - -/** - * @param {string} property - * @return {?CSSStyleValue} - */ -StylePropertyMapReadOnly.prototype.get = function(property) {}; - -/** - * @param {string} property - * @return {boolean} - */ -StylePropertyMapReadOnly.prototype.has = function(property) {}; - -/** - * @return {!StylePropertyMapReadOnly} - */ -Element.prototype.computedStyleMap = function() {}; - -// The base StylePropertyMap is defined in -// third_party/closure_compiler/externs/pending.js, but missing extend for -// StylePropertyMapReadOnly. - -/** - * @param {string} property - * @return {?CSSStyleValue} - */ -StylePropertyMap.prototype.get = function(property) {}; - -/** - * @param {string} property - * @return {boolean} - */ -StylePropertyMap.prototype.has = function(property) {}; - -/** - * @constructor - */ -function CSSStyleValue() {} - -/** - * @constructor - * @extends {CSSStyleValue} - */ -function CSSNumericValue() {} - -/** - * @param {string} cssText - * @return {!CSSNumericValue} - */ -CSSNumericValue.parse = function(cssText) {}; - -/** - * @param {string} unit - * @return {!CSSUnitValue} - */ -CSSNumericValue.prototype.to = function(unit) {}; - -/** - * @typedef {number|CSSNumericValue} - */ -let CSSNumberish; - -/** - * @typedef {Object} - */ -let CSSTransformComponent; - -/** - * @constructor - * @extends {CSSTransformComponent} - * @param {!CSSNumericValue} x - * @param {!CSSNumericValue} y - */ -function CSSTranslate(x, y) {} - -/** - * @constructor - * @extends {CSSTransformComponent} - * @param {!CSSNumericValue} angle - */ -function CSSRotate(angle) {} - -/** - * @type {!CSSNumericValue} - */ -CSSRotate.prototype.angle; - -/** - * @constructor - * @extends {CSSTransformComponent} - * @param {!CSSNumberish} x - * @param {!CSSNumberish} y - */ -function CSSScale(x, y) {} - -/** - * @constructor - * @extends {CSSStyleValue} - * @implements {Iterable<!CSSTransformComponent>} - * @param {!Array<!CSSTransformComponent>} transforms - */ -function CSSTransformValue(transforms) {} - -/** - * @constructor - * @extends {CSSNumericValue} - * @param {number} value - * @param {string} unit - */ -function CSSUnitValue(value, unit) {} - -/** - * @type {number} - */ -CSSUnitValue.prototype.value; - -/** - * @param {number} px - * @return {!CSSUnitValue} - */ -CSS.px = function(px) {}; - -/** - * @param {number} rad - * @return {!CSSUnitValue} - */ -CSS.rad = function(rad) {}; - -/** - * @param {number} deg - * @return {!CSSUnitValue} - */ -CSS.deg = function(deg) {}; - -/** - * @param {number} number - * @return {!CSSUnitValue} - */ -CSS.number = function(number) {}; - -// CSS Properties and Values API Level 1 -// https://www.w3.org/TR/css-properties-values-api-1/ -/** - * @typedef {{ - * name: string, - * syntax: ?string, - * inherits: boolean, - * initialValue: ?string, - * }} - */ -var PropertyDefinition; - -/** - * @param {PropertyDefinition} definition - */ -CSS.registerProperty = function(definition) {};
diff --git a/ash/webui/camera_app_ui/resources/js/face.js b/ash/webui/camera_app_ui/resources/js/face.js index dbc4858..6f79601 100644 --- a/ash/webui/camera_app_ui/resources/js/face.js +++ b/ash/webui/camera_app_ui/resources/js/face.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertInstanceof, assertNotReached} from './chrome_util.js'; +import {assertInstanceof, assertNotReached} from './assert.js'; import * as dom from './dom.js'; // eslint-disable-next-line no-unused-vars
diff --git a/ash/webui/camera_app_ui/resources/js/focus_ring.js b/ash/webui/camera_app_ui/resources/js/focus_ring.js index 0ee33e1..cbf37bf 100644 --- a/ash/webui/camera_app_ui/resources/js/focus_ring.js +++ b/ash/webui/camera_app_ui/resources/js/focus_ring.js
@@ -5,7 +5,7 @@ import { assert, assertInstanceof, -} from './chrome_util.js'; +} from './assert.js'; import {cssStyle} from './css.js'; import * as dom from './dom.js'; import {getStyleValueInPx} from './util.js';
diff --git a/ash/webui/camera_app_ui/resources/js/gallerybutton.js b/ash/webui/camera_app_ui/resources/js/gallerybutton.js index e668fd8..470d6de 100644 --- a/ash/webui/camera_app_ui/resources/js/gallerybutton.js +++ b/ash/webui/camera_app_ui/resources/js/gallerybutton.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert, assertInstanceof} from './chrome_util.js'; +import {assert, assertInstanceof} from './assert.js'; import * as dom from './dom.js'; import {reportError} from './error.js'; import * as filesystem from './models/file_system.js';
diff --git a/ash/webui/camera_app_ui/resources/js/geometry.js b/ash/webui/camera_app_ui/resources/js/geometry.js index 339d0d9..3b8a040 100644 --- a/ash/webui/camera_app_ui/resources/js/geometry.js +++ b/ash/webui/camera_app_ui/resources/js/geometry.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert} from './chrome_util.js'; +import {assert} from './assert.js'; /** * Size of Rectangle.
diff --git a/ash/webui/camera_app_ui/resources/js/h264.js b/ash/webui/camera_app_ui/resources/js/h264.js index 055c9de..c0d19132 100644 --- a/ash/webui/camera_app_ui/resources/js/h264.js +++ b/ash/webui/camera_app_ui/resources/js/h264.js
@@ -8,7 +8,7 @@ * media/video/h264_level_limits.cc. */ -import {assert, assertNotReached, assertString} from './chrome_util.js'; +import {assert, assertNotReached, assertString} from './assert.js'; import {Resolution} from './type.js'; // eslint-disable-line no-unused-vars /**
diff --git a/ash/webui/camera_app_ui/resources/js/js.gni b/ash/webui/camera_app_ui/resources/js/js.gni index ed8a1402c5..bd6f921 100644 --- a/ash/webui/camera_app_ui/resources/js/js.gni +++ b/ash/webui/camera_app_ui/resources/js/js.gni
@@ -5,9 +5,9 @@ compile_js_files = [ "animation.js", "app_window.js", + "assert.ts", "async_job_queue.js", "barcode_chip.js", - "chrome_util.js", "css.js", "device/camera3_device_info.js", "device/constraints_preferrer.js", @@ -15,7 +15,7 @@ "device/stream_constraints.js", "device/stream_manager.js", "dom.js", - "error.js", + "error.ts", "expert.js", "face.js", "flag.js", @@ -63,17 +63,17 @@ "timer.js", "toast.js", "tooltip.js", - "type.js", + "type.ts", "unload.js", "untrusted_ga_helper.js", "untrusted_helper_interfaces.js", "untrusted_script_loader.js", "untrusted_video_processor_helper.js", - "util.js", + "util.ts", "views/camera_intent.js", "views/camera.js", "views/camera/layout.js", - "views/camera/mode/index.js", + "views/camera/mode/index.ts", "views/camera/mode/mode_base.js", "views/camera/mode/photo.js", "views/camera/mode/portrait.js", @@ -102,11 +102,3 @@ no_compile_js_files = [ "lib/analytics.js" ] wasm_files = [ "lib/ffmpeg.wasm" ] - -externs_files = [ - "externs/chrome.js", - "externs/svg.js", - "externs/typescript.js", - "externs/universal_analytics_api.js", - "externs/w3c_api.js", -]
diff --git a/ash/webui/camera_app_ui/resources/js/main.js b/ash/webui/camera_app_ui/resources/js/main.js index 7d22a62..a21fd70 100644 --- a/ash/webui/camera_app_ui/resources/js/main.js +++ b/ash/webui/camera_app_ui/resources/js/main.js
@@ -6,7 +6,7 @@ AppWindow, // eslint-disable-line no-unused-vars getDefaultWindowSize, } from './app_window.js'; -import {assert, assertInstanceof} from './chrome_util.js'; +import {assert, assertInstanceof} from './assert.js'; import { PhotoConstraintsPreferrer, VideoConstraintsPreferrer, @@ -40,6 +40,7 @@ } from './type.js'; import {addUnloadCallback} from './unload.js'; import * as util from './util.js'; +import {checkEnumVariant} from './util.js'; import {Camera} from './views/camera.js'; import {CameraIntent} from './views/camera_intent.js'; import {Dialog} from './views/dialog.js'; @@ -396,27 +397,9 @@ const url = new URL(window.location.href); const params = url.searchParams; - // TODO(pihsun): Intent.create has almost same code for checking a string is - // an enum variant, extract them to a util function when we change TypeScript - // since the util function type is hard to be described in closure compiler - // due to lack of generic type bounds. - /** @type {?Facing} */ - const facing = (() => { - const facing = params.get('facing'); - if (facing === null || !Object.values(Facing).includes(facing)) { - return null; - } - return /** @type {!Facing} */ (facing); - })(); + const facing = checkEnumVariant(Facing, params.get('facing')); - /** @type {?Mode} */ - const mode = (() => { - const mode = params.get('mode'); - if (mode === null || !Object.values(Mode).includes(mode)) { - return null; - } - return /** @type {!Mode} */ (mode); - })(); + const mode = checkEnumVariant(Mode, params.get('mode')); /** @type {?Intent} */ const intent = (() => { @@ -486,28 +469,33 @@ appWindow.reportPerf({event, duration, perfInfo}); } }); - const states = Object.values(PerfEvent); - states.push(state.State.TAKING); - states.forEach((s) => { - state.addObserver(s, (val, extras) => { - let event = s; - if (s === state.State.TAKING) { - // 'taking' state indicates either taking photo or video. Skips for - // video-taking case since we only want to collect the metrics of - // photo-taking. - if (state.get(Mode.VIDEO)) { - return; - } - event = PerfEvent.PHOTO_TAKING; - } + state.addObserver(state.State.TAKING, (val, extras) => { + // 'taking' state indicates either taking photo or video. Skips for + // video-taking case since we only want to collect the metrics of + // photo-taking. + if (state.get(Mode.VIDEO)) { + return; + } + const event = PerfEvent.PHOTO_TAKING; + + if (val) { + perfLogger.start(event); + } else { + perfLogger.stop(event, extras); + } + }); + + const states = Object.values(PerfEvent); + for (const event of states) { + state.addObserver(event, (val, extras) => { if (val) { perfLogger.start(event); } else { perfLogger.stop(event, extras); } }); - }); + } instance = new App({perfLogger, intent, facing, mode}); await instance.start(
diff --git a/ash/webui/camera_app_ui/resources/js/metrics.ts b/ash/webui/camera_app_ui/resources/js/metrics.ts index cda41c1..a2623a2 100644 --- a/ash/webui/camera_app_ui/resources/js/metrics.ts +++ b/ash/webui/camera_app_ui/resources/js/metrics.ts
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert} from './chrome_util.js'; +import {assert} from './assert.js'; import {Intent} from './intent.js'; import * as Comlink from './lib/comlink.js'; import * as loadTimeData from './models/load_time_data.js';
diff --git a/ash/webui/camera_app_ui/resources/js/models/async_writer.js b/ash/webui/camera_app_ui/resources/js/models/async_writer.js index e1b0c7a..e91bfcbe 100644 --- a/ash/webui/camera_app_ui/resources/js/models/async_writer.js +++ b/ash/webui/camera_app_ui/resources/js/models/async_writer.js
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {assert} from '../assert.js'; import {AsyncJobQueue} from '../async_job_queue.js'; -import {assert} from '../chrome_util.js'; /** * Represents a set of operations of a file-like writable stream. The seek and
diff --git a/ash/webui/camera_app_ui/resources/js/models/barcode.js b/ash/webui/camera_app_ui/resources/js/models/barcode.js index 609613b..dbc00ae 100644 --- a/ash/webui/camera_app_ui/resources/js/models/barcode.js +++ b/ash/webui/camera_app_ui/resources/js/models/barcode.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertInstanceof} from '../chrome_util.js'; +import {assertInstanceof} from '../assert.js'; import * as Comlink from '../lib/comlink.js'; import {clearAsyncInterval, setAsyncInterval} from './async_interval.js';
diff --git a/ash/webui/camera_app_ui/resources/js/models/barcode_worker_interface.js b/ash/webui/camera_app_ui/resources/js/models/barcode_worker_interface.js index 48bf04e..9999194f 100644 --- a/ash/webui/camera_app_ui/resources/js/models/barcode_worker_interface.js +++ b/ash/webui/camera_app_ui/resources/js/models/barcode_worker_interface.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertNotReached} from '../chrome_util.js'; +import {assertNotReached} from '../assert.js'; /** * The interface for a barcode worker. All methods are marked as async since
diff --git a/ash/webui/camera_app_ui/resources/js/models/ffmpeg/video_processor.js b/ash/webui/camera_app_ui/resources/js/models/ffmpeg/video_processor.js index 53cb2083..92755e33 100644 --- a/ash/webui/camera_app_ui/resources/js/models/ffmpeg/video_processor.js +++ b/ash/webui/camera_app_ui/resources/js/models/ffmpeg/video_processor.js
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {assert, assertNotReached} from '../../assert.js'; import {AsyncJobQueue} from '../../async_job_queue.js'; -import {assert, assertNotReached} from '../../chrome_util.js'; import * as Comlink from '../../lib/comlink.js'; import runFFmpeg from '../../lib/ffmpeg.js'; import {WaitableEvent} from '../../waitable_event.js';
diff --git a/ash/webui/camera_app_ui/resources/js/models/file_namer.js b/ash/webui/camera_app_ui/resources/js/models/file_namer.js index a421b5a..d50bc20 100644 --- a/ash/webui/camera_app_ui/resources/js/models/file_namer.js +++ b/ash/webui/camera_app_ui/resources/js/models/file_namer.js
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {assertNotReached} from '../assert.js'; import { MimeType, VideoType, // eslint-disable-line no-unused-vars @@ -119,6 +120,7 @@ case MimeType.PDF: return 'pdf'; } + assertNotReached(`Unknown type ${type}`); })(); return DOCUMENT_PREFIX + timestampToDatetimeName(this.timestamp_) + '.' + ext;
diff --git a/ash/webui/camera_app_ui/resources/js/models/file_system.js b/ash/webui/camera_app_ui/resources/js/models/file_system.js index 551e7ff7..e2a40ed1 100644 --- a/ash/webui/camera_app_ui/resources/js/models/file_system.js +++ b/ash/webui/camera_app_ui/resources/js/models/file_system.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert} from '../chrome_util.js'; +import {assert} from '../assert.js'; // eslint-disable-next-line no-unused-vars import {VideoType} from '../type.js'; import {WaitableEvent} from '../waitable_event.js';
diff --git a/ash/webui/camera_app_ui/resources/js/models/file_system_access_entry.js b/ash/webui/camera_app_ui/resources/js/models/file_system_access_entry.js index d2e7afc2..71740f9 100644 --- a/ash/webui/camera_app_ui/resources/js/models/file_system_access_entry.js +++ b/ash/webui/camera_app_ui/resources/js/models/file_system_access_entry.js
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {assert, assertNotReached} from '../assert.js'; import {AsyncJobQueue} from '../async_job_queue.js'; -import {assert, assertNotReached} from '../chrome_util.js'; import {AsyncWriter} from './async_writer.js';
diff --git a/ash/webui/camera_app_ui/resources/js/models/local_storage.js b/ash/webui/camera_app_ui/resources/js/models/local_storage.js index 18fe6480..f02772a 100644 --- a/ash/webui/camera_app_ui/resources/js/models/local_storage.js +++ b/ash/webui/camera_app_ui/resources/js/models/local_storage.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertBoolean, assertInstanceof, assertString} from '../chrome_util.js'; +import {assertBoolean, assertInstanceof, assertString} from '../assert.js'; /** * @param {string} key
diff --git a/ash/webui/camera_app_ui/resources/js/models/result_saver.js b/ash/webui/camera_app_ui/resources/js/models/result_saver.js index 53283de..cafea23 100644 --- a/ash/webui/camera_app_ui/resources/js/models/result_saver.js +++ b/ash/webui/camera_app_ui/resources/js/models/result_saver.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertNotReached} from '../chrome_util.js'; +import {assertNotReached} from '../assert.js'; // eslint-disable-next-line no-unused-vars import {VideoSaver} from './video_saver.js';
diff --git a/ash/webui/camera_app_ui/resources/js/models/video_processor_interface.js b/ash/webui/camera_app_ui/resources/js/models/video_processor_interface.js index 2f2cec0b..568de9c5 100644 --- a/ash/webui/camera_app_ui/resources/js/models/video_processor_interface.js +++ b/ash/webui/camera_app_ui/resources/js/models/video_processor_interface.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertNotReached} from '../chrome_util.js'; +import {assertNotReached} from '../assert.js'; /** * The interface for a video processor. All methods are marked as async since
diff --git a/ash/webui/camera_app_ui/resources/js/mojo/chrome_helper.ts b/ash/webui/camera_app_ui/resources/js/mojo/chrome_helper.ts index 2c1ca18..62b9d8c 100644 --- a/ash/webui/camera_app_ui/resources/js/mojo/chrome_helper.ts +++ b/ash/webui/camera_app_ui/resources/js/mojo/chrome_helper.ts
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert, assertNotReached} from '../chrome_util.js'; +import {assert, assertNotReached} from '../assert.js'; import {reportError} from '../error.js'; import {Point} from '../geometry.js'; import {
diff --git a/ash/webui/camera_app_ui/resources/js/mojo/device_operator.js b/ash/webui/camera_app_ui/resources/js/mojo/device_operator.js index 02fde48..91a4578 100644 --- a/ash/webui/camera_app_ui/resources/js/mojo/device_operator.js +++ b/ash/webui/camera_app_ui/resources/js/mojo/device_operator.js
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {assert, assertNotReached} from '../assert.js'; import {AsyncJobQueue} from '../async_job_queue.js'; -import {assert, assertNotReached} from '../chrome_util.js'; import {reportError} from '../error.js'; import {Point} from '../geometry.js'; import { @@ -17,7 +17,6 @@ } from '../type.js'; import {WaitableEvent} from '../waitable_event.js'; - import { AndroidInfoSupportedHardwareLevel, CameraAppDeviceProvider, @@ -682,10 +681,7 @@ /** * Creates a new instance of DeviceOperator if it is not set. Returns the * exist instance. - * TODO(b/172340451): Use force casting rather than template for the type - * checking of Proxy after switching to TypeScript. - * @return {!Promise<?T>} The singleton instance. - * @template T + * @return {!Promise<!DeviceOperator>} The singleton instance. */ static async getInstance() { await readyEvent.wait(); @@ -706,7 +702,7 @@ return target[property]; }, }; - return /** @type {!T} */ (new Proxy(instance, deviceOperatorWrapper)); + return new Proxy(instance, deviceOperatorWrapper); } /**
diff --git a/ash/webui/camera_app_ui/resources/js/nav.js b/ash/webui/camera_app_ui/resources/js/nav.js index 75311d18..32d543c 100644 --- a/ash/webui/camera_app_ui/resources/js/nav.js +++ b/ash/webui/camera_app_ui/resources/js/nav.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertInstanceof} from './chrome_util.js'; +import {assertInstanceof} from './assert.js'; import * as dom from './dom.js'; import {toggleExpertMode} from './expert.js'; import * as state from './state.js';
diff --git a/ash/webui/camera_app_ui/resources/js/state.js b/ash/webui/camera_app_ui/resources/js/state.js index b04124f..a85ce1a3 100644 --- a/ash/webui/camera_app_ui/resources/js/state.js +++ b/ash/webui/camera_app_ui/resources/js/state.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert} from './chrome_util.js'; +import {assert} from './assert.js'; import { Mode, PerfEvent,
diff --git a/ash/webui/camera_app_ui/resources/js/test_bridge.js b/ash/webui/camera_app_ui/resources/js/test_bridge.js index 3a070c3c..45cc7d7 100644 --- a/ash/webui/camera_app_ui/resources/js/test_bridge.js +++ b/ash/webui/camera_app_ui/resources/js/test_bridge.js
@@ -13,7 +13,7 @@ */ import {AppWindow} from './app_window.js'; -import {assert} from './chrome_util.js'; +import {assert} from './assert.js'; import * as Comlink from './lib/comlink.js'; /**
diff --git a/ash/webui/camera_app_ui/resources/js/timer.js b/ash/webui/camera_app_ui/resources/js/timer.js index 3423dd7..27a4899 100644 --- a/ash/webui/camera_app_ui/resources/js/timer.js +++ b/ash/webui/camera_app_ui/resources/js/timer.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert} from './chrome_util.js'; +import {assert} from './assert.js'; /** * A one-shot timer that is more powerful than setTimeout().
diff --git a/ash/webui/camera_app_ui/resources/js/type.js b/ash/webui/camera_app_ui/resources/js/type.js deleted file mode 100644 index 74019be7..0000000 --- a/ash/webui/camera_app_ui/resources/js/type.js +++ /dev/null
@@ -1,394 +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. - -/** - * Photo or video resolution. - */ -export class Resolution { - /** - * @param {number} width - * @param {number} height - */ - constructor(width, height) { - /** - * @type {number} - * @const - */ - this.width = width; - - /** - * @type {number} - * @const - */ - this.height = height; - } - - /** - * @return {number} Total pixel number. - */ - get area() { - return this.width * this.height; - } - - /** - * Aspect ratio calculates from width divided by height. - * @return {number} - */ - get aspectRatio() { - // Approxitate to 4 decimal places to prevent precision error during - // comparing. - return parseFloat((this.width / this.height).toFixed(4)); - } - - /** - * Compares width/height of resolutions, see if they are equal or not. - * @param {!Resolution} resolution Resolution to be compared with. - * @return {boolean} Whether width/height of resolutions are equal. - */ - equals(resolution) { - return this.width === resolution.width && this.height === resolution.height; - } - - /** - * Compares aspect ratio of resolutions, see if they are equal or not. - * @param {!Resolution} resolution Resolution to be compared with. - * @return {boolean} Whether aspect ratio of resolutions are equal. - */ - aspectRatioEquals(resolution) { - return this.width * resolution.height === this.height * resolution.width; - } - - /** - * Create Resolution object from string. - * @param {string} s - * @return {!Resolution} - */ - static fromString(s) { - const [width, height] = s.split('x').map((x) => Number(x)); - return new Resolution(width, height); - } - - /** - * @override - */ - toString() { - return `${this.width}x${this.height}`; - } -} - -/** - * Types of common mime types. - * @enum {string} - */ -export const MimeType = { - GIF: 'image/gif', - JPEG: 'image/jpeg', - MP4: 'video/mp4', - PDF: 'application/pdf', -}; - -/** - * Capture modes. - * @enum {string} - */ -export const Mode = { - PHOTO: 'photo', - VIDEO: 'video', - SQUARE: 'square', - PORTRAIT: 'portrait', - SCAN: 'scan', -}; - -/** - * Camera facings. - * @enum {string} - */ -export const Facing = { - USER: 'user', - ENVIRONMENT: 'environment', - EXTERNAL: 'external', - // VIRTUAL_{facing} is for labeling video device for configuring extra stream - // from corresponding {facing} video device. - VIRTUAL_USER: 'virtual_user', - VIRTUAL_ENV: 'virtual_environment', - VIRTUAL_EXT: 'virtual_external', - NOT_SET: '(not set)', -}; - -/** - * @enum {string} - */ -export const ViewName = { - CAMERA: 'view-camera', - CROP_DOCUMENT: 'view-crop-document', - DOCUMENT_MODE_DIALOG: 'view-document-mode-dialog', - EXPERT_SETTINGS: 'view-expert-settings', - FLASH: 'view-flash', - GRID_SETTINGS: 'view-grid-settings', - MESSAGE_DIALOG: 'view-message-dialog', - PHOTO_RESOLUTION_SETTINGS: 'view-photo-resolution-settings', - PTZ_PANEL: 'view-ptz-panel', - RESOLUTION_SETTINGS: 'view-resolution-settings', - REVIEW: 'view-review', - SETTINGS: 'view-settings', - SPLASH: 'view-splash', - TIMER_SETTINGS: 'view-timer-settings', - VIDEO_RESOLUTION_SETTINGS: 'view-video-resolution-settings', - WARNING: 'view-warning', -}; - -/** - * @enum {string} - */ -export const VideoType = { - MP4: 'mp4', - GIF: 'gif', -}; - -/** - * @enum {number} - */ -export const Rotation = { - ANGLE_0: 0, - ANGLE_90: 90, - ANGLE_180: 180, - ANGLE_270: 270, -}; - - -// The types here are used only in jsdoc and are required to be explicitly -// exported in order to be referenced by closure compiler. -// TODO(inker): Exports/Imports these jsdoc only types by closure compiler -// comment syntax. The implementation of syntax is tracked here: -// https://github.com/google/closure-compiler/issues/3041 - -/** - * @typedef {{ - * width: number, - * height: number, - * maxFps: number, - * }} - */ -export let VideoConfig; - -/** - * @typedef {{ - * minFps: number, - * maxFps: number, - * }} - */ -export let FpsRange; - -/** - * A list of resolutions. - * @typedef {!Array<!Resolution>} - */ -export let ResolutionList; - -/** - * Map of all available resolution to its maximal supported capture fps. The key - * of the map is the resolution and the corresponding value is the maximal - * capture fps under that resolution. - * @typedef {!Object<(!Resolution|string), number>} - */ -export let MaxFpsInfo; - -/** - * List of supported capture fps ranges. - * @typedef {!Array<!FpsRange>} - */ -export let FpsRangeList; - -/** - * Type for performance event. - * @enum {string} - */ -export const PerfEvent = { - CAMERA_SWITCHING: 'camera-switching', - GIF_CAPTURE_POST_PROCESSING: 'gif-capture-post-processing', - LAUNCHING_FROM_LAUNCH_APP_COLD: 'launching-from-launch-app-cold', - LAUNCHING_FROM_LAUNCH_APP_WARM: 'launching-from-launch-app-warm', - LAUNCHING_FROM_WINDOW_CREATION: 'launching-from-window-creation', - MODE_SWITCHING: 'mode-switching', - PHOTO_CAPTURE_POST_PROCESSING: 'photo-capture-post-processing', - PHOTO_CAPTURE_SHUTTER: 'photo-capture-shutter', - PHOTO_TAKING: 'photo-taking', - PORTRAIT_MODE_CAPTURE_POST_PROCESSING: - 'portrait-mode-capture-post-processing', - VIDEO_CAPTURE_POST_PROCESSING: 'video-capture-post-processing', -}; - -/** - * @typedef {{ - * blob: !Blob, - * resolution: !Resolution, - * }} - */ -export let ImageBlob; - -/** - * @typedef {{ - * hasError?: boolean, - * resolution?: !Resolution, - * facing?: !Facing, - * }} - */ -export let PerfInformation; - -/** - * @typedef {{ - * event: !PerfEvent, - * duration: number, - * perfInfo?: !PerfInformation, - * }} - */ -export let PerfEntry; - -/** - * Error reported in testing run. - * @typedef {{ - * type: !ErrorType, - * level: !ErrorLevel, - * stack: string, - * time: number, - * name: string, - * }} - */ -export let ErrorInfo; - -/** - * Types of error used in ERROR metrics. - * @enum {string} - */ -export const ErrorType = { - BROKEN_THUMBNAIL: 'broken-thumbnail', - DEVICE_INFO_UPDATE_FAILURE: 'device-info-update-failure', - DEVICE_NOT_EXIST: 'device-not-exist', - EMPTY_FILE: 'empty-file', - FILE_SYSTEM_FAILURE: 'file-system-failure', - FRAME_ROTATION_NOT_DISABLED: 'frame-rotation-not-disabled', - HANDLE_CAMERA_RESULT_FAILURE: 'handle-camera-result-failure', - IDLE_DETECTOR_FAILURE: 'idle-detector-failure', - INVALID_REVIEW_UI_STATE: 'invalid-review-ui-state', - METADATA_MAPPING_FAILURE: 'metadata-mapping-failure', - MULTIPLE_STREAMS_FAILURE: 'multiple-streams-failure', - NO_AVAILABLE_LEVEL: 'no-available-level', - PERF_METRICS_FAILURE: 'perf-metrics-failure', - PRELOAD_IMAGE_FAILURE: 'preload-image-failure', - SET_FPS_RANGE_FAILURE: 'set-fps-range-failure', - START_CAMERA_FAILURE: 'start-camera-failure', - START_CAPTURE_FAILURE: 'start-capture-failure', - STOP_CAPTURE_FAILURE: 'stop-capture-failure', - UNCAUGHT_PROMISE: 'uncaught-promise', - UNKNOWN_FACING: 'unknown-facing', - UNSAFE_INTEGER: 'unsafe-integer', - UNSUPPORTED_PROTOCOL: 'unsupported-protocol', -}; - -/** - * Error level used in ERROR metrics. - * @enum {string} - */ -export const ErrorLevel = { - WARNING: 'WARNING', - ERROR: 'ERROR', -}; - -/** - * Throws when a method is not implemented. - */ -export class NotImplementedError extends Error { - /** - * @param {string=} message - * @public - */ - constructor(message = 'Method is not implemented') { - super(message); - this.name = this.constructor.name; - } -} - -/** - * Throws when an action is canceled. - */ -export class CanceledError extends Error { - /** - * @param {string=} message - * @public - */ - constructor(message = 'The action is canceled') { - super(message); - this.name = this.constructor.name; - } -} - -/** - * Throws when an element fails to load a source. - */ -export class LoadError extends Error { - /** - * @param {string=} message - * @public - */ - constructor(message = 'Source failed to load') { - super(message); - this.name = this.constructor.name; - } -} - -/** - * Throws when an media element fails to play. - */ -export class PlayError extends Error { - /** - * @param {string=} message - * @public - */ - constructor(message = 'Media element failed to play') { - super(message); - this.name = this.constructor.name; - } -} - -/** - * Throws when an media element play a malformed file. - */ -export class PlayMalformedError extends Error { - /** - * @param {string=} message - * @public - */ - constructor(message = 'Media element failed to play a malformed file') { - super(message); - this.name = this.constructor.name; - } -} - -/** - * Throws when the data to generate thumbnail is totally empty. - */ -export class EmptyThumbnailError extends Error { - /** - * @param {string=} message - * @public - */ - constructor(message = 'The thumbnail is empty') { - super(message); - this.name = this.constructor.name; - } -} - -/** - * Throws when the recording is ended with no chunk returned. - */ -export class NoChunkError extends Error { - /** - * @param {string=} message - * @public - */ - constructor(message = 'No chunk is received during recording session') { - super(message); - this.name = this.constructor.name; - } -}
diff --git a/ash/webui/camera_app_ui/resources/js/type.ts b/ash/webui/camera_app_ui/resources/js/type.ts new file mode 100644 index 0000000..c6977ff --- /dev/null +++ b/ash/webui/camera_app_ui/resources/js/type.ts
@@ -0,0 +1,303 @@ +// 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. + +/** + * Photo or video resolution. + */ +export class Resolution { + constructor(readonly width: number, readonly height: number) {} + + /** + * @return Total pixel number. + */ + get area(): number { + return this.width * this.height; + } + + /** + * Aspect ratio calculates from width divided by height. + */ + get aspectRatio(): number { + // Approximate to 4 decimal places to prevent precision error during + // comparing. + return parseFloat((this.width / this.height).toFixed(4)); + } + + /** + * Compares width/height of resolutions, see if they are equal or not. + * @param resolution Resolution to be compared with. + * @return Whether width/height of resolutions are equal. + */ + equals(resolution: Resolution): boolean { + return this.width === resolution.width && this.height === resolution.height; + } + + /** + * Compares aspect ratio of resolutions, see if they are equal or not. + * @param resolution Resolution to be compared with. + * @return Whether aspect ratio of resolutions are equal. + */ + aspectRatioEquals(resolution: Resolution): boolean { + return this.width * resolution.height === this.height * resolution.width; + } + + /** + * Create Resolution object from string. + */ + static fromString(s: string): Resolution { + const [width, height] = s.split('x').map((x) => Number(x)); + return new Resolution(width, height); + } + + toString(): string { + return `${this.width}x${this.height}`; + } +} + +/** + * Types of common mime types. + */ +export enum MimeType { + GIF = 'image/gif', + JPEG = 'image/jpeg', + MP4 = 'video/mp4', + PDF = 'application/pdf', +} + +/** + * Capture modes. + */ +export enum Mode { + PHOTO = 'photo', + VIDEO = 'video', + SQUARE = 'square', + PORTRAIT = 'portrait', + SCAN = 'scan', +} + +/** + * Camera facings. + */ +export enum Facing { + USER = 'user', + ENVIRONMENT = 'environment', + EXTERNAL = 'external', + // VIRTUAL_{facing} is for labeling video device for configuring extra stream + // from corresponding {facing} video device. + VIRTUAL_USER = 'virtual_user', + VIRTUAL_ENV = 'virtual_environment', + VIRTUAL_EXT = 'virtual_external', + NOT_SET = '(not set)', +} + +export enum ViewName { + CAMERA = 'view-camera', + CROP_DOCUMENT = 'view-crop-document', + DOCUMENT_MODE_DIALOG = 'view-document-mode-dialog', + EXPERT_SETTINGS = 'view-expert-settings', + FLASH = 'view-flash', + GRID_SETTINGS = 'view-grid-settings', + MESSAGE_DIALOG = 'view-message-dialog', + PHOTO_RESOLUTION_SETTINGS = 'view-photo-resolution-settings', + PTZ_PANEL = 'view-ptz-panel', + RESOLUTION_SETTINGS = 'view-resolution-settings', + REVIEW = 'view-review', + SETTINGS = 'view-settings', + SPLASH = 'view-splash', + TIMER_SETTINGS = 'view-timer-settings', + VIDEO_RESOLUTION_SETTINGS = 'view-video-resolution-settings', + WARNING = 'view-warning', +} + +export enum VideoType { + MP4 = 'mp4', + GIF = 'gif', +} + +export enum Rotation { + ANGLE_0 = 0, + ANGLE_90 = 90, + ANGLE_180 = 180, + ANGLE_270 = 270, +} + +export interface VideoConfig { + width: number; + height: number; + maxFps: number; +} + +export interface FpsRange { + minFps: number; + maxFps: number; +} + +/** + * A list of resolutions. + */ +export type ResolutionList = Resolution[]; + +/** + * Map of all available resolution to its maximal supported capture fps. The key + * of the map is the resolution and the corresponding value is the maximal + * capture fps under that resolution. + */ +export type MaxFpsInfo = Record<string, number>; + +/** + * List of supported capture fps ranges. + */ +export type FpsRangeList = FpsRange[]; + +/** + * Type for performance event. + */ +export enum PerfEvent { + CAMERA_SWITCHING = 'camera-switching', + GIF_CAPTURE_POST_PROCESSING = 'gif-capture-post-processing', + LAUNCHING_FROM_LAUNCH_APP_COLD = 'launching-from-launch-app-cold', + LAUNCHING_FROM_LAUNCH_APP_WARM = 'launching-from-launch-app-warm', + LAUNCHING_FROM_WINDOW_CREATION = 'launching-from-window-creation', + MODE_SWITCHING = 'mode-switching', + PHOTO_CAPTURE_POST_PROCESSING = 'photo-capture-post-processing', + PHOTO_CAPTURE_SHUTTER = 'photo-capture-shutter', + PHOTO_TAKING = 'photo-taking', + PORTRAIT_MODE_CAPTURE_POST_PROCESSING = + 'portrait-mode-capture-post-processing', + VIDEO_CAPTURE_POST_PROCESSING = 'video-capture-post-processing', +} + +export interface ImageBlob { + blob: Blob; + resolution: Resolution; +} + +export interface PerfInformation { + hasError?: boolean; + resolution?: Resolution; + facing?: Facing; +} + +export interface PerfEntry { + event: PerfEvent; + duration: number; + perfInfo?: PerfInformation; +} + +/** + * Error reported in testing run. + */ +export interface ErrorInfo { + type: ErrorType; + level: ErrorLevel; + stack: string; + time: number; + name: string; +} + +/** + * Types of error used in ERROR metrics. + */ +export enum ErrorType { + BROKEN_THUMBNAIL = 'broken-thumbnail', + DEVICE_INFO_UPDATE_FAILURE = 'device-info-update-failure', + DEVICE_NOT_EXIST = 'device-not-exist', + EMPTY_FILE = 'empty-file', + FILE_SYSTEM_FAILURE = 'file-system-failure', + FRAME_ROTATION_NOT_DISABLED = 'frame-rotation-not-disabled', + HANDLE_CAMERA_RESULT_FAILURE = 'handle-camera-result-failure', + IDLE_DETECTOR_FAILURE = 'idle-detector-failure', + INVALID_REVIEW_UI_STATE = 'invalid-review-ui-state', + METADATA_MAPPING_FAILURE = 'metadata-mapping-failure', + MULTIPLE_STREAMS_FAILURE = 'multiple-streams-failure', + NO_AVAILABLE_LEVEL = 'no-available-level', + PERF_METRICS_FAILURE = 'perf-metrics-failure', + PRELOAD_IMAGE_FAILURE = 'preload-image-failure', + SET_FPS_RANGE_FAILURE = 'set-fps-range-failure', + START_CAMERA_FAILURE = 'start-camera-failure', + START_CAPTURE_FAILURE = 'start-capture-failure', + STOP_CAPTURE_FAILURE = 'stop-capture-failure', + UNCAUGHT_PROMISE = 'uncaught-promise', + UNKNOWN_FACING = 'unknown-facing', + UNSAFE_INTEGER = 'unsafe-integer', + UNSUPPORTED_PROTOCOL = 'unsupported-protocol', +} + +/** + * Error level used in ERROR metrics. + */ +export enum ErrorLevel { + WARNING = 'WARNING', + ERROR = 'ERROR', +} + +/** + * Throws when a method is not implemented. + */ +export class NotImplementedError extends Error { + constructor(message = 'Method is not implemented') { + super(message); + this.name = this.constructor.name; + } +} + +/** + * Throws when an action is canceled. + */ +export class CanceledError extends Error { + constructor(message = 'The action is canceled') { + super(message); + this.name = this.constructor.name; + } +} + +/** + * Throws when an element fails to load a source. + */ +export class LoadError extends Error { + constructor(message = 'Source failed to load') { + super(message); + this.name = this.constructor.name; + } +} + +/** + * Throws when an media element fails to play. + */ +export class PlayError extends Error { + constructor(message = 'Media element failed to play') { + super(message); + this.name = this.constructor.name; + } +} + +/** + * Throws when an media element play a malformed file. + */ +export class PlayMalformedError extends Error { + constructor(message = 'Media element failed to play a malformed file') { + super(message); + this.name = this.constructor.name; + } +} + +/** + * Throws when the data to generate thumbnail is totally empty. + */ +export class EmptyThumbnailError extends Error { + constructor(message = 'The thumbnail is empty') { + super(message); + this.name = this.constructor.name; + } +} + +/** + * Throws when the recording is ended with no chunk returned. + */ +export class NoChunkError extends Error { + constructor(message = 'No chunk is received during recording session') { + super(message); + this.name = this.constructor.name; + } +}
diff --git a/ash/webui/camera_app_ui/resources/js/util.js b/ash/webui/camera_app_ui/resources/js/util.ts similarity index 69% rename from ash/webui/camera_app_ui/resources/js/util.js rename to ash/webui/camera_app_ui/resources/js/util.ts index d0213dc6..ccf3cd7 100644 --- a/ash/webui/camera_app_ui/resources/js/util.js +++ b/ash/webui/camera_app_ui/resources/js/util.ts
@@ -3,26 +3,24 @@ // found in the LICENSE file. import * as animate from './animation.js'; -import {assertInstanceof} from './chrome_util.js'; +import {assert, assertInstanceof} from './assert.js'; import * as dom from './dom.js'; -// eslint-disable-next-line no-unused-vars import {I18nString} from './i18n_string.js'; import * as Comlink from './lib/comlink.js'; import * as loadTimeData from './models/load_time_data.js'; import * as state from './state.js'; import * as tooltip from './tooltip.js'; -import { - Facing, -} from './type.js'; +import {Facing} from './type.js'; import {WaitableEvent} from './waitable_event.js'; /** * Creates a canvas element for 2D drawing. - * @param {{width: number, height: number}} params Width/Height of the canvas. - * @return {{canvas: !HTMLCanvasElement, ctx: !CanvasRenderingContext2D}} - * Returns canvas element and the context for 2D drawing. + * @param params Width/Height of the canvas. + * @return Returns canvas element and the context for 2D drawing. */ -export function newDrawingCanvas({width, height}) { +export function newDrawingCanvas( + {width, height}: {width: number, height: number}): + {canvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D} { const canvas = dom.create('canvas', HTMLCanvasElement); canvas.width = width; canvas.height = height; @@ -31,11 +29,7 @@ return {canvas, ctx}; } -/** - * @param {!ImageBitmap} bitmap - * @return {!Promise<!Blob>} - */ -export function bitmapToJpegBlob(bitmap) { +export function bitmapToJpegBlob(bitmap: ImageBitmap): Promise<Blob> { const {canvas, ctx} = newDrawingCanvas({width: bitmap.width, height: bitmap.height}); ctx.drawImage(bitmap, 0, 0); @@ -52,10 +46,10 @@ /** * Returns a shortcut string, such as Ctrl-Alt-A. - * @param {!KeyboardEvent} event Keyboard event. - * @return {string} Shortcut identifier. + * @param event Keyboard event. + * @return Shortcut identifier. */ -export function getShortcutIdentifier(event) { +export function getShortcutIdentifier(event: KeyboardEvent): string { let identifier = (event.ctrlKey ? 'Ctrl-' : '') + (event.altKey ? 'Alt-' : '') + (event.shiftKey ? 'Shift-' : '') + (event.metaKey ? 'Meta-' : ''); @@ -90,17 +84,16 @@ /** * Opens help. */ -export function openHelp() { +export function openHelp(): void { window.open( 'https://support.google.com/chromebook/?p=camera_usage_on_chromebook'); } /** * Sets up i18n messages on DOM subtree by i18n attributes. - * @param {!Element|!DocumentFragment} rootElement Root of DOM subtree to be set - * up with. + * @param rootElement Root of DOM subtree to be set up with. */ -export function setupI18nElements(rootElement) { +export function setupI18nElements(rootElement: Element|DocumentFragment): void { const getElements = (attr) => dom.getAllFrom(rootElement, '[' + attr + ']', HTMLElement); const getMessage = (element, attr) => @@ -127,11 +120,8 @@ /** * Reads blob into Image. - * @param {!Blob} blob - * @return {!Promise<!HTMLImageElement>} - * @throws {!Error} */ -export function blobToImage(blob) { +export function blobToImage(blob: Blob): Promise<HTMLImageElement> { return new Promise((resolve, reject) => { const img = new Image(); img.onload = () => resolve(img); @@ -142,29 +132,30 @@ /** * Gets default facing according to device mode. - * @return {!Facing} */ -export function getDefaultFacing() { +export function getDefaultFacing(): Facing { return state.get(state.State.TABLET) ? Facing.ENVIRONMENT : Facing.USER; } /** * Toggle checked value of element. - * @param {!HTMLInputElement} element - * @param {boolean} checked */ -export function toggleChecked(element, checked) { +export function toggleChecked( + element: HTMLInputElement, checked: boolean): void { element.checked = checked; element.dispatchEvent(new Event('change')); } /** * Binds on/off of specified state with different aria label on an element. - * @param {{element: !Element, state: !state.State, onLabel: !I18nString, - * offLabel: !I18nString}} params */ export function bindElementAriaLabelWithState( - {element, state: s, onLabel, offLabel}) { + {element, state: s, onLabel, offLabel}: { + element: Element, + state: state.State, + onLabel: I18nString, + offLabel: I18nString, + }): void { const update = (value) => { const label = value ? onLabel : offLabel; element.setAttribute('i18n-label', label); @@ -176,9 +167,8 @@ /** * Sets inkdrop effect on button or label in setting menu. - * @param {!HTMLElement} el */ -export function setInkdropEffect(el) { +export function setInkdropEffect(el: HTMLElement): void { const tpl = instantiateTemplate('#inkdrop-template'); el.appendChild(tpl); el.addEventListener('click', (e) => { @@ -199,10 +189,8 @@ /** * Instantiates template with the target selector. - * @param {string} selector - * @return {!DocumentFragment} */ -export function instantiateTemplate(selector) { +export function instantiateTemplate(selector: string): DocumentFragment { const tpl = dom.get(selector, HTMLTemplateElement); const doc = assertInstanceof( document.importNode(tpl.content, true), DocumentFragment); @@ -213,10 +201,10 @@ /** * Creates JS module by given |scriptUrl| under untrusted context with given * origin and returns its proxy. - * @param {string} scriptUrl The URL of the script to load. - * @return {!Promise<!Object>} + * @param scriptUrl The URL of the script to load. */ -export async function createUntrustedJSModule(scriptUrl) { +export async function createUntrustedJSModule(scriptUrl: string): + Promise<unknown> { const untrustedPageReady = new WaitableEvent(); const iFrame = dom.create('iframe', HTMLIFrameElement); iFrame.addEventListener('load', () => untrustedPageReady.signal()); @@ -235,20 +223,17 @@ /** * Sleeps for a specified time. - * @param {number} ms Milliseconds to sleep. - * @return {!Promise} + * @param ms Milliseconds to sleep. */ -export function sleep(ms) { +export function sleep(ms: number): Promise<void> { return new Promise((resolve) => setTimeout(resolve, ms)); } /** * Gets value in px of a property in a StylePropertyMapReadOnly - * @param {(!StylePropertyMapReadOnly|!StylePropertyMap)} style - * @param {string} prop - * @return {number} */ -export function getStyleValueInPx(style, prop) { +export function getStyleValueInPx( + style: (StylePropertyMapReadOnly|StylePropertyMap), prop: string): number { return assertInstanceof(style.get(prop), CSSNumericValue).to('px').value; } @@ -257,25 +242,15 @@ * before calling the first callback. */ export class DelayInterval { + private intervalId: number|null = null; + private readonly delayTimeoutId: number; /** - * @param {function(): void} callback - * @param {number} delayMs Delay milliseconds at start. - * @param {number} intervalMs Interval in milliseconds. - * @public + * @param delayMs Delay milliseconds at start. + * @param intervalMs Interval in milliseconds. */ - constructor(callback, delayMs, intervalMs) { - /** - * @type {?number} - * @private - */ - this.intervalId_ = null; - - /** - * @type {number} - * @private - */ - this.delayTimeoutId_ = setTimeout(() => { - this.intervalId_ = setInterval(() => { + constructor(callback: () => void, delayMs: number, intervalMs: number) { + this.delayTimeoutId = setTimeout(() => { + this.intervalId = setInterval(() => { callback(); }, intervalMs); callback(); @@ -285,21 +260,19 @@ /** * Stop the interval. */ - stop() { - if (this.intervalId_ === null) { - clearTimeout(this.delayTimeoutId_); + stop(): void { + if (this.intervalId === null) { + clearTimeout(this.delayTimeoutId); } else { - clearInterval(this.intervalId_); + clearInterval(this.intervalId); } } } /** * Share file with share API. - * @param {!File} file - * @return {!Promise} */ -export async function share(file) { +export async function share(file: File): Promise<void> { const shareData = {files: [file]}; try { if (!navigator.canShare(shareData)) { @@ -312,3 +285,28 @@ // message. } } + +/** + * Check if a string value is a variant of an enum. + * @param value value to be checked + * @return the value if it's an enum variant, null otherwise + */ +export function checkEnumVariant<T extends string>( + enumType: {[key: string]: T}, value: string|null): T|null { + if (value === null || !Object.values<string>(enumType).includes(value)) { + return null; + } + return value as T; +} + +/** + * Asserts that a string value is a variant of an enum. + * @param value value to be checked + * @return the value if it's an enum variant, throws assertion error otherwise. + */ +export function assertEnumVariant<T extends string>( + enumType: {[key: string]: T}, value: string): T { + const ret = checkEnumVariant(enumType, value); + assert(ret !== null); + return ret; +}
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera.js b/ash/webui/camera_app_ui/resources/js/views/camera.js index 5d89a65..52b33dd 100644 --- a/ash/webui/camera_app_ui/resources/js/views/camera.js +++ b/ash/webui/camera_app_ui/resources/js/views/camera.js
@@ -6,7 +6,7 @@ import { assert, assertInstanceof, -} from '../chrome_util.js'; +} from '../assert.js'; import { PhotoConstraintsPreferrer, // eslint-disable-line no-unused-vars VideoConstraintsPreferrer, // eslint-disable-line no-unused-vars @@ -1039,7 +1039,7 @@ photoRs = await deviceOperator.getPhotoResolutions(deviceId); } else { resolCandidates = this.modes_.getFakeResolutionCandidates(mode, deviceId); - photoRs = resolCandidates; + photoRs = resolCandidates.map((c) => c.resolution); } const maxResolution = photoRs.reduce((maxR, r) => r.area > maxR.area ? r : maxR);
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera/document_corner_overlay.js b/ash/webui/camera_app_ui/resources/js/views/camera/document_corner_overlay.js index c83529c..15f12316 100644 --- a/ash/webui/camera_app_ui/resources/js/views/camera/document_corner_overlay.js +++ b/ash/webui/camera_app_ui/resources/js/views/camera/document_corner_overlay.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert, assertInstanceof, assertString} from '../../chrome_util.js'; +import {assert, assertInstanceof, assertString} from '../../assert.js'; import * as dom from '../../dom.js'; import { Point,
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera/mode/index.js b/ash/webui/camera_app_ui/resources/js/views/camera/mode/index.js deleted file mode 100644 index ae5ddea..0000000 --- a/ash/webui/camera_app_ui/resources/js/views/camera/mode/index.js +++ /dev/null
@@ -1,640 +0,0 @@ -// Copyright (c) 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import { - assert, - assertInstanceof, - assertNotReached, -} from '../../../chrome_util.js'; -import { - CaptureCandidate, // eslint-disable-line no-unused-vars - ConstraintsPreferrer, // eslint-disable-line no-unused-vars - PhotoConstraintsPreferrer, // eslint-disable-line no-unused-vars - VideoConstraintsPreferrer, // eslint-disable-line no-unused-vars -} from '../../../device/constraints_preferrer.js'; -// eslint-disable-next-line no-unused-vars -import {StreamConstraints} from '../../../device/stream_constraints.js'; -import * as dom from '../../../dom.js'; -// eslint-disable-next-line no-unused-vars -import {DeviceOperator} from '../../../mojo/device_operator.js'; -import {CaptureIntent} from '../../../mojo/type.js'; -import * as state from '../../../state.js'; -import { - Facing, // eslint-disable-line no-unused-vars - Mode, - Resolution, // eslint-disable-line no-unused-vars -} from '../../../type.js'; - -import { - ModeBase, // eslint-disable-line no-unused-vars - ModeFactory, // eslint-disable-line no-unused-vars -} from './mode_base.js'; -import { - PhotoFactory, - PhotoHandler, // eslint-disable-line no-unused-vars -} from './photo.js'; -import {PortraitFactory} from './portrait.js'; -import { - ScanFactory, - ScanHandler, // eslint-disable-line no-unused-vars -} from './scan.js'; -import {SquareFactory} from './square.js'; -import { - VideoFactory, - VideoHandler, // eslint-disable-line no-unused-vars -} from './video.js'; - -export {PhotoHandler, PhotoResult} from './photo.js'; -export {getDefaultScanCorners, ScanHandler} from './scan.js'; -export {setAvc1Parameters, Video, VideoHandler, VideoResult} from './video.js'; - -/** - * Callback to trigger mode switching. - * return {!Promise} - * @typedef {function(): !Promise} - */ -export let DoSwitchMode; - -/* eslint-disable no-unused-vars */ - -/** - * Parameters for capture settings. - * @typedef {{ - * mode: !Mode, - * constraints: !StreamConstraints, - * captureResolution: !Resolution, - * videoSnapshotResolution: !Resolution, - * }} - */ -let CaptureParams; - -/** - * The abstract interface for the mode configuration. - * @interface - */ -class ModeConfig { - /** - * @param {string} deviceId - * @return {!Promise<boolean>} Resolves to boolean indicating whether the mode - * is supported by video device with specified device id. - * @abstract - */ - async isSupported(deviceId) { - assertNotReached(); - } - - /** - * @param {!Resolution} captureResolution - * @param {!Resolution} previewResolution - * @return {boolean} - * @abstract - */ - isSupportPTZ(captureResolution, previewResolution) { - assertNotReached(); - } - - /** - * Makes video capture device prepared for capturing in this mode. - * @param {!StreamConstraints} constraints Constraints for preview - * stream. - * @param {!Resolution} captureResolution - * @return {!Promise} - * @abstract - */ - async prepareDevice(constraints, captureResolution) { - assertNotReached(); - } - - /** - * Get general stream constraints of this mode for fake cameras. - * @param {?string} deviceId - * @return {!Array<!StreamConstraints>} - * @abstract - */ - getConstraintsForFakeCamera(deviceId) { - assertNotReached(); - } - - /* eslint-disable getter-return */ - - /** - * Gets factory to create capture object for this mode. - * @return {!ModeFactory} - * @abstract - */ - getCaptureFactory() { - assertNotReached(); - } - - /** - * HALv3 constraints preferrer for this mode. - * @return {!ConstraintsPreferrer} - * @abstract - */ - get constraintsPreferrer() { - return assertNotReached(); - } - - /** - * Mode to be fallbacked to when fail to configure this mode. - * @return {!Mode} - * @abstract - */ - get fallbackMode() { - return assertNotReached(); - } - - /* eslint-enable getter-return */ -} - -/* eslint-enable no-unused-vars */ - -/** - * Mode controller managing capture sequence of different camera mode. - */ -export class Modes { - /** - * @param {!Mode} defaultMode Default mode to be switched to. - * @param {!PhotoConstraintsPreferrer} photoPreferrer - * @param {!VideoConstraintsPreferrer} videoPreferrer - * @param {!DoSwitchMode} doSwitchMode - * @param {!PhotoHandler} photoHandler - * @param {!VideoHandler} videoHandler - * @param {!ScanHandler} scanHandler - */ - constructor( - defaultMode, photoPreferrer, videoPreferrer, doSwitchMode, photoHandler, - videoHandler, scanHandler) { - /** - * @type {!DoSwitchMode} - * @private - */ - this.doSwitchMode_ = doSwitchMode; - - /** - * Capture controller of current camera mode. - * @type {?ModeBase} - */ - this.current = null; - - /** - * @type {!HTMLElement} - * @private - */ - this.modesGroup_ = dom.get('#modes-group', HTMLElement); - - /** - * Parameters to create mode capture controller. - * @type {?CaptureParams} - * @private - */ - this.captureParams_ = null; - - /** - * Returns a set of general constraints for fake cameras. - * @param {boolean} videoMode Is getting constraints for video mode. - * @param {string} deviceId Id of video device. - * @return {!Array<!StreamConstraints>} Result of - * constraints-candidates. - */ - const getConstraintsForFakeCamera = function(videoMode, deviceId) { - const frameRate = {min: 20, ideal: 30}; - return [ - { - deviceId, - audio: videoMode, - video: { - aspectRatio: {ideal: videoMode ? 1.7777777778 : 1.3333333333}, - width: {min: 1280}, - frameRate, - }, - }, - { - deviceId, - audio: videoMode, - video: { - width: {min: 640}, - frameRate, - }, - }, - ]; - }; - - // Workaround for b/184089334 on PTZ camera to use preview frame as photo - // result. - const checkSupportPTZForPhotoMode = - (captureResolution, previewResolution) => - captureResolution.equals(previewResolution); - - /** - * @param {!StreamConstraints} constraints - * @param {!Resolution} resolution - * @param {CaptureIntent} captureIntent - * @return {!Promise} - */ - const prepareDeviceForPhoto = - async (constraints, resolution, captureIntent) => { - const deviceOperator = await DeviceOperator.getInstance(); - if (deviceOperator === null) { - return; - } - const deviceId = constraints.deviceId; - await deviceOperator.setCaptureIntent(deviceId, captureIntent); - await deviceOperator.setStillCaptureResolution(deviceId, resolution); - }; - - /** - * Mode classname and related functions and attributes. - * @type {!Object<!Mode, !ModeConfig>} - * @private - */ - this.allModes_ = { - [Mode.VIDEO]: { - getCaptureFactory: () => { - const params = this.getCaptureParams(); - return new VideoFactory( - params.constraints, params.captureResolution, - params.videoSnapshotResolution, videoHandler); - }, - isSupported: async () => true, - isSupportPTZ: () => true, - prepareDevice: async (constraints, resolution) => { - const deviceOperator = await DeviceOperator.getInstance(); - if (deviceOperator === null) { - return; - } - const deviceId = constraints.deviceId; - await deviceOperator.setCaptureIntent( - deviceId, CaptureIntent.VIDEO_RECORD); - if (await deviceOperator.isBlobVideoSnapshotEnabled(deviceId)) { - await deviceOperator.setStillCaptureResolution( - deviceId, this.getCaptureParams().videoSnapshotResolution); - } - - let /** number */ minFrameRate = 0; - let /** number */ maxFrameRate = 0; - if (constraints.video && constraints.video.frameRate) { - const frameRate = constraints.video.frameRate; - if (frameRate.exact) { - minFrameRate = frameRate.exact; - maxFrameRate = frameRate.exact; - } else if (frameRate.min && frameRate.max) { - minFrameRate = frameRate.min; - maxFrameRate = frameRate.max; - } - // TODO(wtlee): To set the fps range to the default value, we should - // remove the frameRate from constraints instead of using incomplete - // range. - } - await deviceOperator.setFpsRange( - deviceId, minFrameRate, maxFrameRate); - }, - constraintsPreferrer: videoPreferrer, - getConstraintsForFakeCamera: - getConstraintsForFakeCamera.bind(this, true), - fallbackMode: Mode.PHOTO, - }, - [Mode.PHOTO]: { - getCaptureFactory: () => { - const params = this.getCaptureParams(); - return new PhotoFactory( - params.constraints, params.captureResolution, photoHandler); - }, - isSupported: async () => true, - isSupportPTZ: checkSupportPTZForPhotoMode, - prepareDevice: async (constraints, resolution) => prepareDeviceForPhoto( - constraints, resolution, CaptureIntent.STILL_CAPTURE), - constraintsPreferrer: photoPreferrer, - getConstraintsForFakeCamera: - getConstraintsForFakeCamera.bind(this, false), - fallbackMode: Mode.SQUARE, - }, - [Mode.SQUARE]: { - getCaptureFactory: () => { - const params = this.getCaptureParams(); - return new SquareFactory( - params.constraints, params.captureResolution, photoHandler); - }, - isSupported: async () => true, - isSupportPTZ: checkSupportPTZForPhotoMode, - prepareDevice: async (constraints, resolution) => prepareDeviceForPhoto( - constraints, resolution, CaptureIntent.STILL_CAPTURE), - constraintsPreferrer: photoPreferrer, - getConstraintsForFakeCamera: - getConstraintsForFakeCamera.bind(this, false), - fallbackMode: Mode.PHOTO, - }, - [Mode.PORTRAIT]: { - getCaptureFactory: () => { - const params = this.getCaptureParams(); - return new PortraitFactory( - params.constraints, params.captureResolution, photoHandler); - }, - isSupported: async (deviceId) => { - if (deviceId === null) { - return false; - } - const deviceOperator = await DeviceOperator.getInstance(); - if (deviceOperator === null) { - return false; - } - return await deviceOperator.isPortraitModeSupported(deviceId); - }, - isSupportPTZ: checkSupportPTZForPhotoMode, - prepareDevice: async (constraints, resolution) => prepareDeviceForPhoto( - constraints, resolution, CaptureIntent.STILL_CAPTURE), - constraintsPreferrer: photoPreferrer, - getConstraintsForFakeCamera: - getConstraintsForFakeCamera.bind(this, false), - fallbackMode: Mode.PHOTO, - }, - [Mode.SCAN]: { - getCaptureFactory: () => { - const params = this.getCaptureParams(); - return new ScanFactory( - params.constraints, params.captureResolution, scanHandler); - }, - isSupported: async () => state.get(state.State.SHOW_SCAN_MODE), - isSupportPTZ: checkSupportPTZForPhotoMode, - prepareDevice: async (constraints, resolution) => prepareDeviceForPhoto( - constraints, resolution, CaptureIntent.DOCUMENT), - constraintsPreferrer: photoPreferrer, - getConstraintsForFakeCamera: - getConstraintsForFakeCamera.bind(this, false), - fallbackMode: Mode.PHOTO, - }, - }; - - dom.getAll('.mode-item>input', HTMLInputElement).forEach((element) => { - element.addEventListener('click', (event) => { - if (!state.get(state.State.STREAMING) || - state.get(state.State.TAKING)) { - event.preventDefault(); - } - }); - element.addEventListener('change', async (event) => { - if (element.checked) { - const mode = /** @type {!Mode} */ (element.dataset['mode']); - this.updateModeUI_(mode); - state.set(state.State.MODE_SWITCHING, true); - const isSuccess = await this.doSwitchMode_(); - state.set(state.State.MODE_SWITCHING, false, {hasError: !isSuccess}); - } - }); - }); - - [state.State.EXPERT, state.State.SAVE_METADATA].forEach( - (/** !state.State */ s) => { - state.addObserver(s, () => { - this.updateSaveMetadata_(); - }); - }); - - // Set default mode when app started. - this.updateModeUI_(defaultMode); - } - - /** - * @return {!Array<!Mode>} - * @private - */ - get allModeNames_() { - return Object.keys(this.allModes_); - } - - /** - * @return {!CaptureParams} - * @private - */ - getCaptureParams() { - assert(this.captureParams_ !== null); - return this.captureParams_; - } - - /** - * Updates state of mode related UI to the target mode. - * @param {!Mode} mode Mode to be toggled. - * @private - */ - updateModeUI_(mode) { - this.allModeNames_.forEach((m) => state.set(m, m === mode)); - const element = - dom.get(`.mode-item>input[data-mode=${mode}]`, HTMLInputElement); - element.checked = true; - const wrapper = assertInstanceof(element.parentElement, HTMLDivElement); - const scrollLeft = wrapper.offsetLeft - - (this.modesGroup_.offsetWidth - wrapper.offsetWidth) / 2; - this.modesGroup_.scrollTo({ - left: scrollLeft, - top: 0, - behavior: 'smooth', - }); - } - - /** - * Gets all mode candidates. Desired trying sequence of candidate modes is - * reflected in the order of the returned array. - * @return {!Array<!Mode>} Mode candidates to be tried out. - */ - getModeCandidates() { - const tried = {}; - const /** !Array<!Mode> */ results = []; - let mode = this.allModeNames_.find(state.get); - assert(mode !== undefined); - while (!tried[mode]) { - tried[mode] = true; - results.push(mode); - mode = this.allModes_[mode].fallbackMode; - } - return results; - } - - /** - * Gets all available capture resolution and its corresponding preview - * constraints for the given |mode| and |deviceId|. - * @param {!Mode} mode - * @param {string} deviceId - * @return {!Array<!CaptureCandidate>} - */ - getResolutionCandidates(mode, deviceId) { - return this.allModes_[mode].constraintsPreferrer.getSortedCandidates( - deviceId); - } - - /** - * Gets a general set of resolution candidates given by |mode| and |deviceId| - * for fake cameras. - * @param {!Mode} mode - * @param {string} deviceId - * @return {!Array<!CaptureCandidate>} - */ - getFakeResolutionCandidates(mode, deviceId) { - const previewCandidates = - this.allModes_[mode].getConstraintsForFakeCamera(deviceId); - return [{resolution: null, previewCandidates}]; - } - - /** - * Gets factory to create mode capture object. - * @param {!Mode} mode - * @return {!ModeFactory} - */ - getModeFactory(mode) { - return this.allModes_[mode].getCaptureFactory(); - } - - /** - * @param {!Mode} mode - * @param {!StreamConstraints} constraints Constraints for preview - * stream. - * @param {!Resolution} captureResolution - * @param {!Resolution} videoSnapshotResolution - */ - setCaptureParams( - mode, constraints, captureResolution, videoSnapshotResolution) { - this.captureParams_ = - {mode, constraints, captureResolution, videoSnapshotResolution}; - } - - /** - * Makes video capture device prepared for capturing in this mode. - * @return {!Promise} - */ - async prepareDevice() { - if (state.get(state.State.USE_FAKE_CAMERA)) { - return; - } - const {mode, captureResolution, constraints} = this.getCaptureParams(); - return this.allModes_[mode].prepareDevice( - constraints, assertInstanceof(captureResolution, Resolution)); - } - - /** - * Gets supported modes for video device of given device id. - * @param {string} deviceId Device id of the video device. - * @return {!Promise<!Array<!Mode>>} All supported mode for - * the video device. - */ - async getSupportedModes(deviceId) { - const /** !Array<!Mode> */ supportedModes = []; - for (const mode of this.allModeNames_) { - const obj = this.allModes_[mode]; - if (await obj.isSupported(deviceId)) { - supportedModes.push(mode); - } - } - return supportedModes; - } - - /** - * @param {!Mode} mode - * @param {!Resolution} captureResolution - * @param {!Resolution} previewResolution - * @return {boolean} - */ - isSupportPTZ(mode, captureResolution, previewResolution) { - return this.allModes_[mode].isSupportPTZ( - captureResolution, previewResolution); - } - - /** - * Updates mode selection UI according to given device id. - * @param {string} deviceId - * @return {!Promise} - */ - async updateModeSelectionUI(deviceId) { - const supportedModes = await this.getSupportedModes(deviceId); - const items = dom.getAll('div.mode-item', HTMLDivElement); - let first = null; - let last = null; - items.forEach((el) => { - const radio = dom.getFrom(el, 'input[type=radio]', HTMLInputElement); - const supported = - supportedModes.includes(/** @type {!Mode} */ (radio.dataset['mode'])); - el.classList.toggle('hide', !supported); - if (supported) { - if (first === null) { - first = el; - } - last = el; - } - }); - items.forEach((el) => { - el.classList.toggle('first', el === first); - el.classList.toggle('last', el === last); - }); - } - - /** - * Creates and updates current mode object. - * @param {!ModeFactory} factory The factory ready for producing mode capture - * object. - * @param {!MediaStream} stream Stream of the new switching mode. - * @param {!Facing} facing Camera facing of the current mode. - * @param {?string} deviceId Device id of currently working video device. - * @return {!Promise} - */ - async updateMode(factory, stream, facing, deviceId) { - if (this.current !== null) { - await this.current.clear(); - await this.disableSaveMetadata_(); - } - const {mode, captureResolution} = this.getCaptureParams(); - this.updateModeUI_(mode); - this.current = factory.produce(); - if (deviceId && captureResolution) { - this.allModes_[mode].constraintsPreferrer.updateValues( - deviceId, stream, facing, captureResolution); - } - await this.updateSaveMetadata_(); - } - - /** - * Clears everything when mode is not needed anymore. - * @return {!Promise} - */ - async clear() { - if (this.current !== null) { - await this.current.clear(); - await this.disableSaveMetadata_(); - } - this.captureParams_ = null; - this.current = null; - } - - /** - * Checks whether to save image metadata or not. - * @return {!Promise} Promise for the operation. - * @private - */ - async updateSaveMetadata_() { - if (state.get(state.State.EXPERT) && state.get(state.State.SAVE_METADATA)) { - await this.enableSaveMetadata_(); - } else { - await this.disableSaveMetadata_(); - } - } - - /** - * Enables save metadata of subsequent photos in the current mode. - * @return {!Promise} Promise for the operation. - * @private - */ - async enableSaveMetadata_() { - if (this.current !== null) { - await this.current.addMetadataObserver(); - } - } - - /** - * Disables save metadata of subsequent photos in the current mode. - * @return {!Promise} Promise for the operation. - * @private - */ - async disableSaveMetadata_() { - if (this.current !== null) { - await this.current.removeMetadataObserver(); - } - } -}
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera/mode/index.ts b/ash/webui/camera_app_ui/resources/js/views/camera/mode/index.ts new file mode 100644 index 0000000..e637f78 --- /dev/null +++ b/ash/webui/camera_app_ui/resources/js/views/camera/mode/index.ts
@@ -0,0 +1,545 @@ +// Copyright (c) 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import { + assert, + assertInstanceof, +} from '../../../assert.js'; +import { + CaptureCandidate, + ConstraintsPreferrer, + PhotoConstraintsPreferrer, + VideoConstraintsPreferrer, +} from '../../../device/constraints_preferrer.js'; +import {StreamConstraints} from '../../../device/stream_constraints.js'; +import * as dom from '../../../dom.js'; +import {DeviceOperator} from '../../../mojo/device_operator.js'; +import {CaptureIntent} from '../../../mojo/type.js'; +import * as state from '../../../state.js'; +import { + Facing, + Mode, + Resolution, +} from '../../../type.js'; +import {assertEnumVariant} from '../../../util.js'; + +import { + ModeBase, + ModeFactory, +} from './mode_base.js'; +import { + PhotoFactory, + PhotoHandler, +} from './photo.js'; +import {PortraitFactory} from './portrait.js'; +import { + ScanFactory, + ScanHandler, +} from './scan.js'; +import {SquareFactory} from './square.js'; +import { + VideoFactory, + VideoHandler, +} from './video.js'; + +export {PhotoHandler, PhotoResult} from './photo.js'; +export {getDefaultScanCorners, ScanHandler} from './scan.js'; +export {setAvc1Parameters, Video, VideoHandler, VideoResult} from './video.js'; + +/** + * Callback to trigger mode switching. Should return whether mode switching + * succeed. + */ +export type DoSwitchMode = () => Promise<boolean>; + +/** + * Parameters for capture settings. + */ +interface CaptureParams { + mode: Mode; + constraints: StreamConstraints; + captureResolution: Resolution; + videoSnapshotResolution: Resolution; +} + +/** + * The abstract interface for the mode configuration. + */ +interface ModeConfig { + /** + * @return Resolves to boolean indicating whether the mode is supported by + * video device with specified device id. + */ + isSupported(deviceId: string): Promise<boolean>; + + isSupportPTZ(captureResolution: Resolution, previewResolution: Resolution): + boolean; + + /** + * Makes video capture device prepared for capturing in this mode. + * @param constraints Constraints for preview stream. + */ + prepareDevice(constraints: StreamConstraints, captureResolution: Resolution): + Promise<void>; + + /** + * Get general stream constraints of this mode for fake cameras. + */ + getConstraintsForFakeCamera(deviceId: string|null): StreamConstraints[]; + + /** + * Gets factory to create capture object for this mode. + */ + getCaptureFactory(): ModeFactory; + + /** + * HALv3 constraints preferrer for this mode. + */ + readonly constraintsPreferrer: ConstraintsPreferrer; + + /** + * Mode to be fallbacked to when fail to configure this mode. + */ + readonly fallbackMode: Mode; +} + +/** + * Mode controller managing capture sequence of different camera mode. + */ +export class Modes { + /** + * Capture controller of current camera mode. + */ + current: ModeBase|null = null; + private readonly modesGroup = dom.get('#modes-group', HTMLElement); + /** + * Parameters to create mode capture controller. + */ + private captureParams: CaptureParams|null = null; + /** + * Mode classname and related functions and attributes. + */ + private readonly allModes: {[mode in Mode]: ModeConfig}; + /** + * @param defaultMode Default mode to be switched to. + */ + constructor( + defaultMode: Mode, + photoPreferrer: PhotoConstraintsPreferrer, + videoPreferrer: VideoConstraintsPreferrer, + private readonly doSwitchMode: DoSwitchMode, + photoHandler: PhotoHandler, + videoHandler: VideoHandler, + scanHandler: ScanHandler, + ) { + /** + * Returns a set of general constraints for fake cameras. + * @param videoMode Is getting constraints for video mode. + * @param deviceId Id of video device. + * @return Result of constraints-candidates. + */ + const getConstraintsForFakeCamera = function( + videoMode: boolean, deviceId: string): StreamConstraints[] { + const frameRate = {min: 20, ideal: 30}; + return [ + { + deviceId, + audio: videoMode, + video: { + aspectRatio: {ideal: videoMode ? 1.7777777778 : 1.3333333333}, + width: {min: 1280}, + frameRate, + }, + }, + { + deviceId, + audio: videoMode, + video: { + width: {min: 640}, + frameRate, + }, + }, + ]; + }; + + // Workaround for b/184089334 on PTZ camera to use preview frame as photo + // result. + const checkSupportPTZForPhotoMode = + (captureResolution, previewResolution) => + captureResolution.equals(previewResolution); + + // clang-format format this wrong if we use async (...) => {...} (missing a + // space after async). Using async function instead to get around this. + // TODO(pihsun): style guide recommends using function xxx() instead of + // lambda anyway, change other location too. + async function prepareDeviceForPhoto( + constraints: StreamConstraints, resolution: Resolution, + captureIntent: CaptureIntent): Promise<void> { + const deviceOperator = await DeviceOperator.getInstance(); + if (deviceOperator === null) { + return; + } + const deviceId = constraints.deviceId; + await deviceOperator.setCaptureIntent(deviceId, captureIntent); + await deviceOperator.setStillCaptureResolution(deviceId, resolution); + } + + this.allModes = { + [Mode.VIDEO]: { + getCaptureFactory: () => { + const params = this.getCaptureParams(); + return new VideoFactory( + params.constraints, params.captureResolution, + params.videoSnapshotResolution, videoHandler); + }, + isSupported: async () => true, + isSupportPTZ: () => true, + prepareDevice: async (constraints) => { + const deviceOperator = await DeviceOperator.getInstance(); + if (deviceOperator === null) { + return; + } + const deviceId = constraints.deviceId; + await deviceOperator.setCaptureIntent( + deviceId, CaptureIntent.VIDEO_RECORD); + if (await deviceOperator.isBlobVideoSnapshotEnabled(deviceId)) { + await deviceOperator.setStillCaptureResolution( + deviceId, this.getCaptureParams().videoSnapshotResolution); + } + + let minFrameRate = 0; + let maxFrameRate = 0; + if (constraints.video && constraints.video.frameRate) { + const frameRate = constraints.video.frameRate; + if (typeof frameRate === 'number') { + minFrameRate = frameRate; + maxFrameRate = frameRate; + } else if (frameRate.exact) { + minFrameRate = frameRate.exact; + maxFrameRate = frameRate.exact; + } else if (frameRate.min && frameRate.max) { + minFrameRate = frameRate.min; + maxFrameRate = frameRate.max; + } + // TODO(wtlee): To set the fps range to the default value, we should + // remove the frameRate from constraints instead of using incomplete + // range. + } + await deviceOperator.setFpsRange( + deviceId, minFrameRate, maxFrameRate); + }, + constraintsPreferrer: videoPreferrer, + getConstraintsForFakeCamera: + getConstraintsForFakeCamera.bind(this, true), + fallbackMode: Mode.PHOTO, + }, + [Mode.PHOTO]: { + getCaptureFactory: () => { + const params = this.getCaptureParams(); + return new PhotoFactory( + params.constraints, params.captureResolution, photoHandler); + }, + isSupported: async () => true, + isSupportPTZ: checkSupportPTZForPhotoMode, + prepareDevice: async (constraints, resolution) => prepareDeviceForPhoto( + constraints, resolution, CaptureIntent.STILL_CAPTURE), + constraintsPreferrer: photoPreferrer, + getConstraintsForFakeCamera: + getConstraintsForFakeCamera.bind(this, false), + fallbackMode: Mode.SQUARE, + }, + [Mode.SQUARE]: { + getCaptureFactory: () => { + const params = this.getCaptureParams(); + return new SquareFactory( + params.constraints, params.captureResolution, photoHandler); + }, + isSupported: async () => true, + isSupportPTZ: checkSupportPTZForPhotoMode, + prepareDevice: async (constraints, resolution) => prepareDeviceForPhoto( + constraints, resolution, CaptureIntent.STILL_CAPTURE), + constraintsPreferrer: photoPreferrer, + getConstraintsForFakeCamera: + getConstraintsForFakeCamera.bind(this, false), + fallbackMode: Mode.PHOTO, + }, + [Mode.PORTRAIT]: { + getCaptureFactory: () => { + const params = this.getCaptureParams(); + return new PortraitFactory( + params.constraints, params.captureResolution, photoHandler); + }, + isSupported: async (deviceId) => { + if (deviceId === null) { + return false; + } + const deviceOperator = await DeviceOperator.getInstance(); + if (deviceOperator === null) { + return false; + } + return await deviceOperator.isPortraitModeSupported(deviceId); + }, + isSupportPTZ: checkSupportPTZForPhotoMode, + prepareDevice: async (constraints, resolution) => prepareDeviceForPhoto( + constraints, resolution, CaptureIntent.STILL_CAPTURE), + constraintsPreferrer: photoPreferrer, + getConstraintsForFakeCamera: + getConstraintsForFakeCamera.bind(this, false), + fallbackMode: Mode.PHOTO, + }, + [Mode.SCAN]: { + getCaptureFactory: () => { + const params = this.getCaptureParams(); + return new ScanFactory( + params.constraints, params.captureResolution, scanHandler); + }, + isSupported: async () => state.get(state.State.SHOW_SCAN_MODE), + isSupportPTZ: checkSupportPTZForPhotoMode, + prepareDevice: async (constraints, resolution) => prepareDeviceForPhoto( + constraints, resolution, CaptureIntent.DOCUMENT), + constraintsPreferrer: photoPreferrer, + getConstraintsForFakeCamera: + getConstraintsForFakeCamera.bind(this, false), + fallbackMode: Mode.PHOTO, + }, + }; + + dom.getAll('.mode-item>input', HTMLInputElement).forEach((element) => { + element.addEventListener('click', (event) => { + if (!state.get(state.State.STREAMING) || + state.get(state.State.TAKING)) { + event.preventDefault(); + } + }); + element.addEventListener('change', async () => { + if (element.checked) { + const mode = assertEnumVariant(Mode, element.dataset['mode']); + this.updateModeUI(mode); + state.set(state.State.MODE_SWITCHING, true); + const isSuccess = await this.doSwitchMode(); + state.set(state.State.MODE_SWITCHING, false, {hasError: !isSuccess}); + } + }); + }); + + [state.State.EXPERT, state.State.SAVE_METADATA].forEach((s) => { + state.addObserver(s, () => { + this.updateSaveMetadata(); + }); + }); + + // Set default mode when app started. + this.updateModeUI(defaultMode); + } + + private get allModeNames(): Mode[] { + return Object.values(Mode); + } + + private getCaptureParams(): CaptureParams { + assert(this.captureParams !== null); + return this.captureParams; + } + + /** + * Updates state of mode related UI to the target mode. + */ + private updateModeUI(mode: Mode) { + this.allModeNames.forEach((m) => state.set(m, m === mode)); + const element = + dom.get(`.mode-item>input[data-mode=${mode}]`, HTMLInputElement); + element.checked = true; + const wrapper = assertInstanceof(element.parentElement, HTMLDivElement); + const scrollLeft = wrapper.offsetLeft - + (this.modesGroup.offsetWidth - wrapper.offsetWidth) / 2; + this.modesGroup.scrollTo({ + left: scrollLeft, + top: 0, + behavior: 'smooth', + }); + } + + /** + * Gets all mode candidates. Desired trying sequence of candidate modes is + * reflected in the order of the returned array. + */ + getModeCandidates(): Mode[] { + const tried = {}; + const results: Mode[] = []; + let mode = this.allModeNames.find((mode) => state.get(mode)); + assert(mode !== undefined); + while (!tried[mode]) { + tried[mode] = true; + results.push(mode); + mode = this.allModes[mode].fallbackMode; + } + return results; + } + + /** + * Gets all available capture resolution and its corresponding preview + * constraints for the given |mode| and |deviceId|. + */ + getResolutionCandidates(mode: Mode, deviceId: string): CaptureCandidate[] { + return this.allModes[mode].constraintsPreferrer.getSortedCandidates( + deviceId); + } + + /** + * Gets a general set of resolution candidates given by |mode| and |deviceId| + * for fake cameras. + */ + getFakeResolutionCandidates(mode: Mode, deviceId: string): + CaptureCandidate[] { + const previewCandidates = + this.allModes[mode].getConstraintsForFakeCamera(deviceId); + return [{resolution: null, previewCandidates}]; + } + + /** + * Gets factory to create mode capture object. + */ + getModeFactory(mode: Mode): ModeFactory { + return this.allModes[mode].getCaptureFactory(); + } + + /** + * @param constraints Constraints for preview stream. + */ + setCaptureParams( + mode: Mode, constraints: StreamConstraints, captureResolution: Resolution, + videoSnapshotResolution: Resolution): void { + this.captureParams = + {mode, constraints, captureResolution, videoSnapshotResolution}; + } + + /** + * Makes video capture device prepared for capturing in this mode. + */ + async prepareDevice(): Promise<void> { + if (state.get(state.State.USE_FAKE_CAMERA)) { + return; + } + const {mode, captureResolution, constraints} = this.getCaptureParams(); + return this.allModes[mode].prepareDevice( + constraints, assertInstanceof(captureResolution, Resolution)); + } + + /** + * Gets supported modes for video device of given device id. + * @param deviceId Device id of the video device. + * @return All supported mode for the video device. + */ + async getSupportedModes(deviceId: string): Promise<Mode[]> { + const supportedModes: Mode[] = []; + for (const mode of this.allModeNames) { + const obj = this.allModes[mode]; + if (await obj.isSupported(deviceId)) { + supportedModes.push(mode); + } + } + return supportedModes; + } + + isSupportPTZ( + mode: Mode, captureResolution: Resolution, + previewResolution: Resolution): boolean { + return this.allModes[mode].isSupportPTZ( + captureResolution, previewResolution); + } + + /** + * Updates mode selection UI according to given device id. + */ + async updateModeSelectionUI(deviceId: string): Promise<void> { + const supportedModes = await this.getSupportedModes(deviceId); + const items = dom.getAll('div.mode-item', HTMLDivElement); + let first = null; + let last = null; + items.forEach((el) => { + const radio = dom.getFrom(el, 'input[type=radio]', HTMLInputElement); + const supported = + (supportedModes as string[]).includes(radio.dataset['mode']); + el.classList.toggle('hide', !supported); + if (supported) { + if (first === null) { + first = el; + } + last = el; + } + }); + items.forEach((el) => { + el.classList.toggle('first', el === first); + el.classList.toggle('last', el === last); + }); + } + + /** + * Creates and updates current mode object. + * @param factory The factory ready for producing mode capture object. + * @param stream Stream of the new switching mode. + * @param facing Camera facing of the current mode. + * @param deviceId Device id of currently working video device. + */ + async updateMode( + factory: ModeFactory, stream: MediaStream, facing: Facing, + deviceId: string|null): Promise<void> { + if (this.current !== null) { + await this.current.clear(); + await this.disableSaveMetadata(); + } + const {mode, captureResolution} = this.getCaptureParams(); + this.updateModeUI(mode); + this.current = factory.produce(); + if (deviceId && captureResolution) { + this.allModes[mode].constraintsPreferrer.updateValues( + deviceId, stream, facing, captureResolution); + } + await this.updateSaveMetadata(); + } + + /** + * Clears everything when mode is not needed anymore. + */ + async clear(): Promise<void> { + if (this.current !== null) { + await this.current.clear(); + await this.disableSaveMetadata(); + } + this.captureParams = null; + this.current = null; + } + + /** + * Checks whether to save image metadata or not. + * @return Promise for the operation. + */ + private async updateSaveMetadata(): Promise<void> { + if (state.get(state.State.EXPERT) && state.get(state.State.SAVE_METADATA)) { + await this.enableSaveMetadata(); + } else { + await this.disableSaveMetadata(); + } + } + + /** + * Enables save metadata of subsequent photos in the current mode. + * @return Promise for the operation. + */ + private async enableSaveMetadata(): Promise<void> { + if (this.current !== null) { + await this.current.addMetadataObserver(); + } + } + + /** + * Disables save metadata of subsequent photos in the current mode. + * @return Promise for the operation. + */ + private async disableSaveMetadata(): Promise<void> { + if (this.current !== null) { + await this.current.removeMetadataObserver(); + } + } +}
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera/mode/mode_base.js b/ash/webui/camera_app_ui/resources/js/views/camera/mode/mode_base.js index 8b4903f..7460343e 100644 --- a/ash/webui/camera_app_ui/resources/js/views/camera/mode/mode_base.js +++ b/ash/webui/camera_app_ui/resources/js/views/camera/mode/mode_base.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertInstanceof, assertNotReached} from '../../../chrome_util.js'; +import {assertInstanceof, assertNotReached} from '../../../assert.js'; // eslint-disable-next-line no-unused-vars import {StreamConstraints} from '../../../device/stream_constraints.js'; import * as error from '../../../error.js';
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera/mode/photo.js b/ash/webui/camera_app_ui/resources/js/views/camera/mode/photo.js index a222744..19bb83f 100644 --- a/ash/webui/camera_app_ui/resources/js/views/camera/mode/photo.js +++ b/ash/webui/camera_app_ui/resources/js/views/camera/mode/photo.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertNotReached} from '../../../chrome_util.js'; +import {assertNotReached} from '../../../assert.js'; // eslint-disable-next-line no-unused-vars import {StreamConstraints} from '../../../device/stream_constraints.js'; import {I18nString} from '../../../i18n_string.js';
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera/mode/record_time.js b/ash/webui/camera_app_ui/resources/js/views/camera/mode/record_time.js index 3a4598d..2096a02 100644 --- a/ash/webui/camera_app_ui/resources/js/views/camera/mode/record_time.js +++ b/ash/webui/camera_app_ui/resources/js/views/camera/mode/record_time.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertNotReached} from '../../../chrome_util.js'; +import {assertNotReached} from '../../../assert.js'; import * as dom from '../../../dom.js'; import {I18nString} from '../../../i18n_string.js'; import * as loadTimeData from '../../../models/load_time_data.js';
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera/mode/scan.js b/ash/webui/camera_app_ui/resources/js/views/camera/mode/scan.js index 3bfbaed4..a534825e 100644 --- a/ash/webui/camera_app_ui/resources/js/views/camera/mode/scan.js +++ b/ash/webui/camera_app_ui/resources/js/views/camera/mode/scan.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertNotReached} from '../../../chrome_util.js'; +import {assertNotReached} from '../../../assert.js'; // eslint-disable-next-line no-unused-vars import {StreamConstraints} from '../../../device/stream_constraints.js'; import {Point} from '../../../geometry.js';
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera/mode/video.js b/ash/webui/camera_app_ui/resources/js/views/camera/mode/video.js index 9345655..0d5bdd45 100644 --- a/ash/webui/camera_app_ui/resources/js/views/camera/mode/video.js +++ b/ash/webui/camera_app_ui/resources/js/views/camera/mode/video.js
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {AsyncJobQueue} from '../../../async_job_queue.js'; import { assert, assertInstanceof, assertNotReached, -} from '../../../chrome_util.js'; +} from '../../../assert.js'; +import {AsyncJobQueue} from '../../../async_job_queue.js'; // eslint-disable-next-line no-unused-vars import {StreamConstraints} from '../../../device/stream_constraints.js'; import {
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera/preview.js b/ash/webui/camera_app_ui/resources/js/views/camera/preview.js index 70ca31c..9a2ed9c 100644 --- a/ash/webui/camera_app_ui/resources/js/views/camera/preview.js +++ b/ash/webui/camera_app_ui/resources/js/views/camera/preview.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert, assertInstanceof} from '../../chrome_util.js'; +import {assert, assertInstanceof} from '../../assert.js'; import { StreamConstraints, // eslint-disable-line no-unused-vars toMediaStreamConstraints,
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera/scan_options.js b/ash/webui/camera_app_ui/resources/js/views/camera/scan_options.js index f99cfba..1b087ab 100644 --- a/ash/webui/camera_app_ui/resources/js/views/camera/scan_options.js +++ b/ash/webui/camera_app_ui/resources/js/views/camera/scan_options.js
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {assert, assertInstanceof} from '../../assert.js'; import * as barcodeChip from '../../barcode_chip.js'; -import {assert, assertInstanceof} from '../../chrome_util.js'; // eslint-disable-next-line no-unused-vars import {DeviceInfoUpdater} from '../../device/device_info_updater.js'; import * as dom from '../../dom.js';
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera/video_encoder_options.js b/ash/webui/camera_app_ui/resources/js/views/camera/video_encoder_options.js index fae1060..df9ca17 100644 --- a/ash/webui/camera_app_ui/resources/js/views/camera/video_encoder_options.js +++ b/ash/webui/camera_app_ui/resources/js/views/camera/video_encoder_options.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert, assertInstanceof, assertNumber} from '../../chrome_util.js'; +import {assert, assertInstanceof, assertNumber} from '../../assert.js'; import * as dom from '../../dom.js'; import {reportError} from '../../error.js'; import * as h264 from '../../h264.js';
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera_intent.js b/ash/webui/camera_app_ui/resources/js/views/camera_intent.js index 6421c55a..537d97f1 100644 --- a/ash/webui/camera_app_ui/resources/js/views/camera_intent.js +++ b/ash/webui/camera_app_ui/resources/js/views/camera_intent.js
@@ -3,7 +3,7 @@ // found in the LICENSE file. // eslint-disable-next-line no-unused-vars -import {assertNotReached} from '../chrome_util.js'; +import {assertNotReached} from '../assert.js'; import { PhotoConstraintsPreferrer, // eslint-disable-line no-unused-vars VideoConstraintsPreferrer, // eslint-disable-line no-unused-vars
diff --git a/ash/webui/camera_app_ui/resources/js/views/crop_document.js b/ash/webui/camera_app_ui/resources/js/views/crop_document.js index eab8acd..a3d730eb 100644 --- a/ash/webui/camera_app_ui/resources/js/views/crop_document.js +++ b/ash/webui/camera_app_ui/resources/js/views/crop_document.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert, assertInstanceof} from '../chrome_util.js'; +import {assert, assertInstanceof} from '../assert.js'; import * as dom from '../dom.js'; import {Box, Line, Point, Size, Vector, vectorFromPoints} from '../geometry.js'; import {I18nString} from '../i18n_string.js';
diff --git a/ash/webui/camera_app_ui/resources/js/views/dialog.js b/ash/webui/camera_app_ui/resources/js/views/dialog.js index 1432f43..5456109 100644 --- a/ash/webui/camera_app_ui/resources/js/views/dialog.js +++ b/ash/webui/camera_app_ui/resources/js/views/dialog.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertString} from '../chrome_util.js'; +import {assertString} from '../assert.js'; import * as dom from '../dom.js'; import {ViewName} from '../type.js'; // eslint-disable-line no-unused-vars
diff --git a/ash/webui/camera_app_ui/resources/js/views/ptz_panel.js b/ash/webui/camera_app_ui/resources/js/views/ptz_panel.js index 3447d21..4925142 100644 --- a/ash/webui/camera_app_ui/resources/js/views/ptz_panel.js +++ b/ash/webui/camera_app_ui/resources/js/views/ptz_panel.js
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {assertInstanceof} from '../assert.js'; import {AsyncJobQueue} from '../async_job_queue.js'; -import {assertInstanceof} from '../chrome_util.js'; import * as dom from '../dom.js'; import * as focusRing from '../focus_ring.js'; import * as metrics from '../metrics.js';
diff --git a/ash/webui/camera_app_ui/resources/js/views/review.ts b/ash/webui/camera_app_ui/resources/js/views/review.ts index 537b59bf..c23be84 100644 --- a/ash/webui/camera_app_ui/resources/js/views/review.ts +++ b/ash/webui/camera_app_ui/resources/js/views/review.ts
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertInstanceof} from '../chrome_util.js'; +import {assertInstanceof} from '../assert.js'; import * as dom from '../dom.js'; import {I18nString} from '../i18n_string.js'; import * as nav from '../nav.js';
diff --git a/ash/webui/camera_app_ui/resources/js/views/view.js b/ash/webui/camera_app_ui/resources/js/views/view.js index e745c1d..a64159d2 100644 --- a/ash/webui/camera_app_ui/resources/js/views/view.js +++ b/ash/webui/camera_app_ui/resources/js/views/view.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertInstanceof} from '../chrome_util.js'; +import {assertInstanceof} from '../assert.js'; import * as dom from '../dom.js'; import {ViewName} from '../type.js'; // eslint-disable-line no-unused-vars import {WaitableEvent} from '../waitable_event.js';
diff --git a/ash/webui/camera_app_ui/resources/js/views/warning.js b/ash/webui/camera_app_ui/resources/js/views/warning.js index fe6b8fd..0662c28 100644 --- a/ash/webui/camera_app_ui/resources/js/views/warning.js +++ b/ash/webui/camera_app_ui/resources/js/views/warning.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert, assertString} from '../chrome_util.js'; +import {assert, assertString} from '../assert.js'; import * as dom from '../dom.js'; import {I18nString} from '../i18n_string.js'; import * as loadTimeData from '../models/load_time_data.js';
diff --git a/ash/webui/camera_app_ui/resources/js/window_controller.js b/ash/webui/camera_app_ui/resources/js/window_controller.js index 6dcf4d3..0388282 100644 --- a/ash/webui/camera_app_ui/resources/js/window_controller.js +++ b/ash/webui/camera_app_ui/resources/js/window_controller.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertInstanceof} from './chrome_util.js'; +import {assertInstanceof} from './assert.js'; import { WindowStateControllerRemote, WindowStateMonitorCallbackRouter,
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb index f3f72ac..ae16dac5 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Multistroom-video-opname</translation> <translation id="5057360777601936059">Jou kamera is tans nie beskikbaar nie. Kyk asseblief of die kamera behoorlik gekoppel is.</translation> -<translation id="5152121255775685072">Gaan na galery toe</translation> <translation id="5163387177077603948">Beweeg tans na regs</translation> <translation id="520537883758714667">Dokumentskandering is nou beskikbaar</translation> <translation id="5266635337630551423">Dokument se hoek links bo</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb index 5a0acf9..7a7a9c6 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">ባለ-ብዙ ዥረት ቪዲዮ ቀረፃ</translation> <translation id="5057360777601936059">የእርስዎ ካሜራ በአሁኑ ጊዜ አይገኝም። ካሜራው በትክክል ተገናኝቶ ከሆነ እባክዎ ይፈትሹ።</translation> -<translation id="5152121255775685072">ወደ ማዕከለ-ሥዕላት ሂድ</translation> <translation id="5163387177077603948">ወደ ቀኝ አቅጣጫ በመንቀሳቀስ ላይ</translation> <translation id="520537883758714667">የሰነድ ቅኝት አሁን ይገኛል</translation> <translation id="5266635337630551423">የሰነድ ከላይ-ግራ ጥግ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb index 41eece4..c501e5196 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">البث المتعدّد لتسجيل الفيديو</translation> <translation id="5057360777601936059">الكاميرا غير مُتاحة حاليًا. يُرجى التحقُّق من اتصال الكاميرا بشكلٍ صحيح.</translation> -<translation id="5152121255775685072">الانتقال إلى المعرض</translation> <translation id="5163387177077603948">جارٍ نقل زاوية المستند في اتجاه اليمين</translation> <translation id="520537883758714667">تتوفّر الآن ميزة مسح المستندات ضوئيًا.</translation> <translation id="5266635337630551423">الزاوية العلوية اليسرى للمستند</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb index e3a0c9a..1903c279 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">একাধিক ষ্ট্ৰীমৰ ভিডিঅ’ ৰেকৰ্ডিং</translation> <translation id="5057360777601936059">আপোনাৰ কেমেৰা বৰ্তমান উপলব্ধ নহয়। অনুগ্ৰহ কৰি কেমেৰাটো সঠিক ধৰণে সংযুক্ত হৈ আছেনে নাই পৰীক্ষা কৰক।</translation> -<translation id="5152121255775685072">গেলাৰীলৈ যাওক</translation> <translation id="5163387177077603948">সোঁফাললৈ গতি কৰি আছে</translation> <translation id="520537883758714667">এতিয়া নথি স্কেন কৰাৰ সুবিধাটো উপলব্ধ</translation> <translation id="5266635337630551423">নথিৰ একেবাৰে ওপৰৰ বাওঁফালৰ চুক</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb index 4dc18aa..baa10faa 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb
@@ -77,7 +77,6 @@ <translation id="491895758387112773">Çox-yayımlı video çəkilişi</translation> <translation id="5057360777601936059">Kamera hazırda əlçatan deyil. Kameranın düzgün qoşulub-qoşulmadığını yoxlayın.</translation> -<translation id="5152121255775685072">Qalereyaya daxil olun</translation> <translation id="5163387177077603948">Sağ tərəfə daşınır</translation> <translation id="520537883758714667">Sənəd skanlama əlçatan deyil</translation> <translation id="5266635337630551423">Sənədin yuxarı sol küncü</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb index 2c25aac..a299082 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Відэазапіс некалькіх плыней</translation> <translation id="5057360777601936059">Камера недаступная. Праверце правільнасць яе падключэння.</translation> -<translation id="5152121255775685072">Перайсці ў галерэю</translation> <translation id="5163387177077603948">Перамяшчаецца ўправа</translation> <translation id="520537883758714667">Функцыя сканіравання дакументаў даступная</translation> <translation id="5266635337630551423">Левы верхні вугал дакумента</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb index 06a2ff2b..3fd17020 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Записва се видеоклип за много потоци</translation> <translation id="5057360777601936059">Понастоящем няма достъп до камерата ви. Моля, проверете дали камерата е свързана правилно.</translation> -<translation id="5152121255775685072">Към галерията</translation> <translation id="5163387177077603948">Премества се надясно</translation> <translation id="520537883758714667">Функцията за сканиране на документи вече е налице</translation> <translation id="5266635337630551423">Горен ляв ъгъл на документа</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb index 2e21ec4b..a53ed3f7 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">মাল্টি-স্ট্রিম ভিডিও রেকর্ডিং</translation> <translation id="5057360777601936059">আপনার ক্যামেরা বর্তমানে উপলভ্য নেই। ক্যামেরা ঠিকভাবে কানেক্ট করা আছে কিনা দেখুন।</translation> -<translation id="5152121255775685072">গ্যালারিতে যান</translation> <translation id="5163387177077603948">ডানদিকে সরানো হচ্ছে</translation> <translation id="520537883758714667">এখন ডকুমেন্ট স্ক্যান করা উপলভ্য</translation> <translation id="5266635337630551423">উপরে-বাঁদিকের কোণার ডকুমেন্ট</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb index ecb5effc..8730ba9 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Snimanje videozapisa s više prijenosa</translation> <translation id="5057360777601936059">Kamera je trenutno nedostupna. Provjerite je li kamera pravilno povezana.</translation> -<translation id="5152121255775685072">Idi u galeriju</translation> <translation id="5163387177077603948">Pomjeranje udesno</translation> <translation id="520537883758714667">Skeniranje dokumenta je sada dostupno</translation> <translation id="5266635337630551423">Gornji lijevi ugao dokumenta</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb index 28a6fce..181b4243 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Grava vídeos de diversos canals</translation> <translation id="5057360777601936059">La càmera no està disponible en aquest moment. Comprova que estigui ben connectada.</translation> -<translation id="5152121255775685072">Ves a la galeria</translation> <translation id="5163387177077603948">S'està movent cap a la dreta</translation> <translation id="520537883758714667">L'escaneig de documents ja està disponible</translation> <translation id="5266635337630551423">Extrem superior esquerre del document</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb index c5258ee..a69442a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Nahrávání videa z více streamů</translation> <translation id="5057360777601936059">Fotoaparát momentálně není dostupný. Zkontrolujte, zda je fotoaparát správně připojen.</translation> -<translation id="5152121255775685072">Přejít do galerie</translation> <translation id="5163387177077603948">Pohyb doprava</translation> <translation id="520537883758714667">Nově je k dispozici skenování dokumentů</translation> <translation id="5266635337630551423">Levý horní roh dokumentu</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb index aa3cc00..5222c66 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Videooptagelse med flere streams</translation> <translation id="5057360777601936059">Dit kamera er ikke tilgængeligt lige nu. Tjek, om kameraet er tilsluttet korrekt.</translation> -<translation id="5152121255775685072">Gå til galleri</translation> <translation id="5163387177077603948">Flyttes mod højre</translation> <translation id="520537883758714667">Det er nu muligt at scanne dokumenter</translation> <translation id="5266635337630551423">Dokumentets øverste venstre hjørne</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb index 8ec8e86..05d5be75 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Multistream-Videoaufzeichnung</translation> <translation id="5057360777601936059">Ihre Kamera ist zurzeit nicht verfügbar. Bitte überprüfen Sie, ob die Kamera richtig verbunden ist.</translation> -<translation id="5152121255775685072">Zur Galerie</translation> <translation id="5163387177077603948">Wird nach rechts verschoben</translation> <translation id="520537883758714667">Scannen von Dokumenten jetzt verfügbar</translation> <translation id="5266635337630551423">Linke obere Ecke des Dokuments</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_el.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_el.xtb index 4526cdf..db0170a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_el.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_el.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Εγγραφή βίντεο πολλαπλής ροής</translation> <translation id="5057360777601936059">Η κάμερά σας δεν είναι διαθέσιμη προς το παρόν. Ελέγξτε εάν η κάμερα έχει συνδεθεί σωστά.</translation> -<translation id="5152121255775685072">Μετάβαση στο gallery</translation> <translation id="5163387177077603948">Μετακινείται με κατεύθυνση προς τα δεξιά</translation> <translation id="520537883758714667">Η σάρωση εγγράφων είναι πλέον διαθέσιμη</translation> <translation id="5266635337630551423">Επάνω αριστερή γωνία του εγγράφου</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb index f7065ec1..03a1a98 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Multistream video recording</translation> <translation id="5057360777601936059">Your camera is currently unavailable. Please check if the camera is properly connected.</translation> -<translation id="5152121255775685072">Go to gallery</translation> <translation id="5163387177077603948">Moving in right direction</translation> <translation id="520537883758714667">Document scanning now available</translation> <translation id="5266635337630551423">Document top-left corner</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb index f1dff09..e57107d 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb
@@ -10,6 +10,7 @@ <translation id="1430915738399379752">Imprimir</translation> <translation id="1467231725790366244">La cámara <ph name="CAMERA" /> está desconectada.</translation> <translation id="1473110567575736769">Temporizador de 3 segundos</translation> +<translation id="148783771699678004">Se está moviendo hacia la esquina superior derecha</translation> <translation id="1545749641540134597">Escanear código QR</translation> <translation id="1560052704389894104">GIF</translation> <translation id="1588438908519853928">Normal</translation> @@ -54,6 +55,7 @@ <translation id="3448774564454087943">No se guardó el video porque es demasiado breve.</translation> <translation id="346539236881580388">Repetir</translation> <translation id="3517926952904427380">No es posible cambiar al modo vertical para tomar fotos.</translation> +<translation id="3566302376254083266">Se está moviendo hacia la esquina superior izquierda</translation> <translation id="3569311554794739032">¿Confirmas que quieres quitar <ph name="FILE" />?</translation> <translation id="3573890771273113519">Cambiar al modo de escaneo</translation> <translation id="3583444040776960729">Esquina inferior izquierda del documento</translation> @@ -72,14 +74,16 @@ <translation id="4570032796877367747">Cámara frontal</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">No se puede guardar el archivo</translation> +<translation id="4695379108709712600">Se está moviendo hacia la parte superior</translation> <translation id="4890010094662541459">3 × 3</translation> <translation id="491895758387112773">Crear transmisión múltiple de grabación de video</translation> <translation id="5057360777601936059">La cámara no está disponible en este momento. Asegúrate de que esté conectada de forma correcta.</translation> -<translation id="5152121255775685072">Ir a la galería</translation> +<translation id="5163387177077603948">Se está moviendo hacia la derecha</translation> <translation id="520537883758714667">La función para escanear documentos ya está disponible.</translation> <translation id="5266635337630551423">Esquina superior izquierda del documento</translation> <translation id="5317780077021120954">Guardar</translation> +<translation id="5320594929574852403">Se está moviendo hacia la izquierda</translation> <translation id="5444515100983837161">Coloca todos los bordes del documento dentro del cuadro. El escaneado funciona mejor si el documento tiene un color diferente al del fondo.</translation> <translation id="5671277269877808209">Cuadrado</translation> <translation id="5746169159649715125">Guardar como PDF</translation> @@ -102,6 +106,7 @@ <translation id="667999046851023355">Documento</translation> <translation id="6681668084120808868">Tomar foto</translation> <translation id="6778482348691154169">No se puede tomar la foto</translation> +<translation id="6888362557094394345">Se está moviendo hacia la parte inferior</translation> <translation id="695140971690006676">Restablecer todos los valores</translation> <translation id="6965382102122355670">Aceptar</translation> <translation id="698156982839284926">3 segundos</translation> @@ -116,12 +121,14 @@ <translation id="7557677699350329807">Cambiar a la siguiente cámara</translation> <translation id="7607002721634913082">Detenido</translation> <translation id="7608223098072244877">4 por 4</translation> +<translation id="761421184377987513">Se está moviendo hacia la esquina inferior izquierda</translation> <translation id="7649070708921625228">Ayuda</translation> <translation id="7658239707568436148">Cancelar</translation> <translation id="7670511624014457267">60 FPS</translation> <translation id="7671804233658741790">Esquina inferior derecha del documento</translation> <translation id="7726641833034062494">Grabar video en modo normal</translation> <translation id="7748344063862150053">Esquina superior derecha del documento</translation> +<translation id="7933675232020478311">Se está moviendo hacia la esquina inferior derecha</translation> <translation id="7983668134180549431">Se detectó texto.</translation> <translation id="8067883171444229417">Reproducir video</translation> <translation id="8120146556401698679">Desplazamiento inclinación ampliación</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb index 938089c..d5be46cd 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Grabación de vídeo con varias emisiones</translation> <translation id="5057360777601936059">Tu cámara no está disponible en este momento. Comprueba si está conectada correctamente.</translation> -<translation id="5152121255775685072">Ir a la galería</translation> <translation id="5163387177077603948">Moviendo hacia la derecha</translation> <translation id="520537883758714667">La función para escanear documentos ya está disponible</translation> <translation id="5266635337630551423">Esquina superior izquierda del documento</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb index 402f7cc..5eba3f4 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Mitmevooline videosalvestus</translation> <translation id="5057360777601936059">Teie kaamera pole praegu saadaval. Kontrollige, kas kaamera on korralikult ühendatud.</translation> -<translation id="5152121255775685072">Ava galerii</translation> <translation id="5163387177077603948">Liigub paremale</translation> <translation id="520537883758714667">Dokumendiskannimine on nüüd saadaval</translation> <translation id="5266635337630551423">Dokumendi vasak ülanurk</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb index 7b7d619..cb4f0d48 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Bideo anitzeko grabaketa</translation> <translation id="5057360777601936059">Kamera ez dago erabilgarri une honetan. Egiaztatu kamera ongi konektatuta dagoela.</translation> -<translation id="5152121255775685072">Joan galeriara</translation> <translation id="5163387177077603948">Eskuinera mugitzen ari da</translation> <translation id="520537883758714667">Dokumentuak eskaneatzeko eginbidea eskuragarri dago</translation> <translation id="5266635337630551423">Dokumentuaren goiko ezkerraldeko ertza</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb index 48a1baf..72607a29f 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">ضبط ویدیوی چندجریانی</translation> <translation id="5057360777601936059">درحالحاضر دوربینتان دردسترس نیست. مطمئن شوید دوربین درست وصل شده باشد.</translation> -<translation id="5152121255775685072">رفتن به گالری</translation> <translation id="5163387177077603948">درحال انتقال بهسمت راست</translation> <translation id="520537883758714667">اسکن سند اکنون دردسترس است</translation> <translation id="5266635337630551423">گوشه بالا سمت چپ سند</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb index c8ba61e..b053c379 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Striimaa videotallenne useaan paikkaan</translation> <translation id="5057360777601936059">Kamerasi ei ole käytettävissä tällä hetkellä. Tarkista, onko kamera yhdistetty oikein.</translation> -<translation id="5152121255775685072">Siirry galleriaan</translation> <translation id="5163387177077603948">Siirretään oikealle</translation> <translation id="520537883758714667">Dokumenttien skannaus on nyt saatavilla</translation> <translation id="5266635337630551423">Dokumentin vasen yläkulma</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb index 86cb3438c..0172b53 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Pag-record ng multistream video</translation> <translation id="5057360777601936059">Kasalukuyang hindi available ang iyong camera. Pakitingnan kung maayos na nakakonekta ang camera.</translation> -<translation id="5152121255775685072">Pumunta sa gallery</translation> <translation id="5163387177077603948">Gumagalaw pakanan</translation> <translation id="520537883758714667">Available na ang pag-scan ng dokumento</translation> <translation id="5266635337630551423">Kaliwang sulok sa itaas ng dokumento</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb index 74440da..5d6d5c2 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Enregistrement vidéo à flux multiples</translation> <translation id="5057360777601936059">Votre appareil photo n'est pas accessible pour le moment. Veuillez vérifier si l'appareil photo est connecté correctement.</translation> -<translation id="5152121255775685072">Accéder à la galerie</translation> <translation id="5163387177077603948">Déplacement vers la droite</translation> <translation id="520537883758714667">Numérisation de documents désormais disponible</translation> <translation id="5266635337630551423">Coin supérieur gauche du document</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fr.xtb index 2b265ea..d8a5d7a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fr.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Enregistrement vidéo sur plusieurs flux</translation> <translation id="5057360777601936059">Votre appareil photo est actuellement indisponible. Vérifiez qu'il est bien connecté.</translation> -<translation id="5152121255775685072">Accéder à la galerie</translation> <translation id="5163387177077603948">Déplacement vers la droite</translation> <translation id="520537883758714667">Numérisation de documents désormais disponible</translation> <translation id="5266635337630551423">Angle supérieur gauche du document</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_gl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_gl.xtb index c3ade7a..3e8159c 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_gl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_gl.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Gravación de múltiples emisións de vídeo</translation> <translation id="5057360777601936059">A cámara non está dispoñible nestes momentos. Comproba se está conectada correctamente.</translation> -<translation id="5152121255775685072">Ir á galería</translation> <translation id="5163387177077603948">Desprazándose cara á dereita</translation> <translation id="520537883758714667">O escaneado de documentos xa está dispoñible</translation> <translation id="5266635337630551423">Esquina superior esquerda do documento</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb index 77e407d5..ba4e832a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">મલ્ટિ-સ્ટ્રીમ સુવિધા વડે વીડિયો રેકોર્ડિંગ કરવું</translation> <translation id="5057360777601936059">તમારો કૅમેરા હાલમાં ઉપલબ્ધ નથી. કૃપા કરીને તપાસો કે કૅમેરા યોગ્ય રીતે કનેક્ટ થયેલો છે.</translation> -<translation id="5152121255775685072">ગૅલરી પર જાઓ</translation> <translation id="5163387177077603948">જમણી દિશામાં ખસેડી રહ્યાં છીએ</translation> <translation id="520537883758714667">દસ્તાવેજ સ્કૅન કરવાની સુવિધા હવે ઉપલબ્ધ છે</translation> <translation id="5266635337630551423">દસ્તાવેજનો સૌથી ઉપરનો ડાબો ખૂણો</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hi.xtb index cb46ded..2c46255 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hi.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hi.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">मल्टीस्ट्रीम वीडियो रिकॉर्डिंग</translation> <translation id="5057360777601936059">फ़िलहाल आपका कैमरा उपलब्ध नहीं है. कृपया देखें कि कैमरा ठीक तरह से कनेक्ट है या नहीं.</translation> -<translation id="5152121255775685072">गैलरी में जाएं</translation> <translation id="5163387177077603948">दाईं ओर जा रहा है</translation> <translation id="520537883758714667">दस्तावेज़ को स्कैन करने की सुविधा अब उपलब्ध है</translation> <translation id="5266635337630551423">दस्तावेज़ का सबसे ऊपर वाला बायां कोना</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb index fb80611..880af07 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Emitiraj videosnimku na više kanala</translation> <translation id="5057360777601936059">Vaš fotoaparat trenutačno nije dostupan. Provjerite je li fotoaparat pravilno povezan.</translation> -<translation id="5152121255775685072">Otvori galeriju</translation> <translation id="5163387177077603948">Kreće se udesno</translation> <translation id="520537883758714667">Sad je dostupno skeniranje dokumenata</translation> <translation id="5266635337630551423">Gornji lijevi kut dokumenta</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb index da17958..d8222ac 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Multi-stream videó rögzítése</translation> <translation id="5057360777601936059">A kamera jelenleg nem használható. Ellenőrizze, hogy a kamera megfelelően van-e csatlakoztatva.</translation> -<translation id="5152121255775685072">Ugrás a galériába</translation> <translation id="5163387177077603948">Mozgatás jobb oldali irányba</translation> <translation id="520537883758714667">A dokumentumbeolvasás már használható</translation> <translation id="5266635337630551423">Dokumentum bal felső sarka</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb index 1667656..b790079 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Բազմահոսքային տեսագրում</translation> <translation id="5057360777601936059">Ձեր տեսախցիկն այս պահին հասանելի չէ: Ստուգեք՝ արդյոք տեսախցիկը ճիշտ է միացված:</translation> -<translation id="5152121255775685072">Անցնել ցուցասրահ</translation> <translation id="5163387177077603948">Տեղափոխվում է աջ</translation> <translation id="520537883758714667">Փաստաթղթերի սկանավորումն արդեն հասանելի է</translation> <translation id="5266635337630551423">Փաստաթղթի վերևի ձախ անկյուն</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb index 8830c7f..e6b4c4c2 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Multi-streaming perekaman video</translation> <translation id="5057360777601936059">Kamera tidak tersedia untuk saat ini. Periksa apakah kamera terhubung dengan benar.</translation> -<translation id="5152121255775685072">Buka galeri</translation> <translation id="5163387177077603948">Berpindah ke arah kanan</translation> <translation id="520537883758714667">Pemindaian dokumen kini tersedia</translation> <translation id="5266635337630551423">Pojok kiri atas dokumen</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb index 2c96b80..7a314de4 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Myndupptaka af mörgum straumum í einu</translation> <translation id="5057360777601936059">Ekki er hægt að nota myndavélina eins og er. Athugaðu hvort myndavélin er rétt tengd.</translation> -<translation id="5152121255775685072">Opna safn</translation> <translation id="5163387177077603948">Færist til hægri</translation> <translation id="520537883758714667">Nú er skjalaskönnun í boði</translation> <translation id="5266635337630551423">Efra, vinstra horn skjals</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb index 7a0c71c3..81038a3d 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Registrazione video multistream</translation> <translation id="5057360777601936059">La tua fotocamera non è attualmente disponibile. Controlla se la fotocamera è collegata correttamente.</translation> -<translation id="5152121255775685072">Vai alla galleria</translation> <translation id="5163387177077603948">Spostamento a destra</translation> <translation id="520537883758714667">Ora è disponibile la scansione di documenti</translation> <translation id="5266635337630551423">Angolo superiore sinistro del documento</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb index 64e3db4..2b4b2c2 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">הקלטת סרטון במולטי-סטרימינג</translation> <translation id="5057360777601936059">המצלמה אינה זמינה כרגע. יש לבדוק אם המצלמה מחוברת כראוי.</translation> -<translation id="5152121255775685072">למעבר אל הגלריה</translation> <translation id="5163387177077603948">מתבצעת תזוזה לימין</translation> <translation id="520537883758714667">התכונה 'סריקת מסמכים' זמינה עכשיו</translation> <translation id="5266635337630551423">הפינה הימנית העליונה במסמך</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb index 119350c..ffd1e65 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">マルチストリーム動画の録画</translation> <translation id="5057360777601936059">カメラを使用できません。 カメラが正しく接続されているかご確認ください。</translation> -<translation id="5152121255775685072">ギャラリーに移動</translation> <translation id="5163387177077603948">右側に移動しています</translation> <translation id="520537883758714667">ドキュメント スキャンをご利用いただけるようになりました</translation> <translation id="5266635337630551423">ドキュメントの左上の角</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb index 765be6d..b3431aa 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">მრავალნაკადოვანი ვიდეოჩაწერა</translation> <translation id="5057360777601936059">თქვენი კამერა ამჟამად მიუწვდომელია. შეამოწმეთ, რომ კამერა სწორად არის დაკავშირებული.</translation> -<translation id="5152121255775685072">გალერეაზე გადასვლა</translation> <translation id="5163387177077603948">გადატანა ხდება მარჯვენა მიმართულებით</translation> <translation id="520537883758714667">ამიერიდან ხელმისაწვდომია დოკუმენტების სკანირების ფუნქცია</translation> <translation id="5266635337630551423">დოკუმენტის ზედა მარცხენა კუთხე</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb index 8350f38..e0fe8172 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Көп ағынды бейне жазу</translation> <translation id="5057360777601936059">Камераңыз әзірге қолжетімді емес. Камераның дұрыс жалғанғанын тексеріңіз.</translation> -<translation id="5152121255775685072">Галереяға өту</translation> <translation id="5163387177077603948">Оңға қарай жылжыту</translation> <translation id="520537883758714667">Енді кұжатты сканерлеуге болады.</translation> <translation id="5266635337630551423">Құжаттың жоғарғы сол жақ бұрышы</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb index f5063c1..b29caf6 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">ផ្សាយការថតវីដេអូទៅបណ្ដាញច្រើន</translation> <translation id="5057360777601936059">កាមេរ៉ារបស់អ្នកមិនអាចប្រើបានទេនៅពេលនេះ។ សូមពិនិត្យមើលថាតើកាមេរ៉ាត្រូវបានភ្ជាប់ត្រឹមត្រូវឬអត់។</translation> -<translation id="5152121255775685072">ចូលទៅកាន់សាលរូបភាព</translation> <translation id="5163387177077603948">កំពុងផ្លាស់ទីក្នុងទិសដៅខាងស្ដាំ</translation> <translation id="520537883758714667">ឥឡូវនេះ មានមុខងារស្កេនឯកសារហើយ</translation> <translation id="5266635337630551423">ជ្រុងខាងលើផ្នែកខាងឆ្វេងនៃឯកសារ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_kn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_kn.xtb index 5891cbb3..2450977 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_kn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_kn.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">ಮಲ್ಟಿಸ್ಟ್ರೀಮ್ ವೀಡಿಯೊ ರೆಕಾರ್ಡಿಂಗ್</translation> <translation id="5057360777601936059">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಪ್ರಸ್ತುತ ಲಭ್ಯವಿಲ್ಲ. ಕ್ಯಾಮರಾ ಸರಿಯಾಗಿ ಸಂಪರ್ಕಗೊಂಡಿದೆಯೇ ಎಂಬುದನ್ನು ಪರೀಕ್ಷಿಸಿ.</translation> -<translation id="5152121255775685072">ಗ್ಯಾಲರಿಗೆ ಹೋಗಿ</translation> <translation id="5163387177077603948">ಬಲ ದಿಕ್ಕಿನಲ್ಲಿ ಚಲಿಸುತ್ತಿದೆ</translation> <translation id="520537883758714667">ಡಾಕ್ಯುಮೆಂಟ್ ಸ್ಕ್ಯಾನಿಂಗ್ ಈಗ ಲಭ್ಯವಿದೆ</translation> <translation id="5266635337630551423">ಡಾಕ್ಯುಮೆಂಟ್ ಮೇಲಿನ ಎಡ ಮೂಲೆ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb index a87b1f7..321fa218 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">멀티스트림 동영상 녹화</translation> <translation id="5057360777601936059">현재 카메라를 사용할 수 없습니다. 카메라가 제대로 연결되어 있는지 확인하세요.</translation> -<translation id="5152121255775685072">갤러리로 이동</translation> <translation id="5163387177077603948">오른쪽으로 이동</translation> <translation id="520537883758714667">이제 문서를 스캔할 수 있습니다.</translation> <translation id="5266635337630551423">문서 왼쪽 상단</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb index 33c70d2..81ddff9 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Бир нече агымдагы видеону жаздыруу</translation> <translation id="5057360777601936059">Камераңыз учурда жеткиликсиз. Камера туура туташканын текшериңиз.</translation> -<translation id="5152121255775685072">Галереяга өтүү</translation> <translation id="5163387177077603948">Оң жакка жылууда</translation> <translation id="520537883758714667">Документти скандоо эми жеткиликтүү</translation> <translation id="5266635337630551423">Документтин жогорку сол бурчу</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_lo.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_lo.xtb index 81ab8ce..faa02b0 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_lo.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_lo.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">ການບັນທຶກວິດີໂອແບບຫຼາຍສະຕຣີມ</translation> <translation id="5057360777601936059">ກ້ອງຖ່າຍຮູບຂອງທ່ານບໍ່ສາມາດໃຊ້ໄດ້ໃນຂະນະນີ້. ກະລຸນາກວດເບິ່ງວ່າໄດ້ເຊື່ອມຕໍ່ກ້ອງຖ່າຍຮູບຢ່າງຖືກຕ້ອງຫຼືບໍ່.</translation> -<translation id="5152121255775685072">ໄປທີ່ຄັງຮູບພາບ</translation> <translation id="5163387177077603948">ກຳລັງຍ້າຍໄປທາງຂວາ</translation> <translation id="520537883758714667">ຕອນນີ້ສາມາດສະແກນເອກະສານໄດ້ແລ້ວ</translation> <translation id="5266635337630551423">ມຸມຊ້າຍເທິງຂອງເອກະສານ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb index 9805d2fa..efa8b84b 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Vaizdo įrašo įrašymą išskaidyti į kelis srautus</translation> <translation id="5057360777601936059">Fotoaparatas šiuo metu nepasiekiamas. Patikrinkite, ar fotoaparatas tinkamai prijungtas.</translation> -<translation id="5152121255775685072">Eiti į galeriją</translation> <translation id="5163387177077603948">Perkeliama dešinėn</translation> <translation id="520537883758714667">Dabar galima nuskaityti dokumentus</translation> <translation id="5266635337630551423">Viršutinis kairysis dokumento kampas</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_lv.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_lv.xtb index 496157e..215d034a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_lv.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_lv.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Straumēt video ierakstu vairākos kanālos</translation> <translation id="5057360777601936059">Kamera šobrīd nav pieejama. Lūdzu, pārbaudiet, vai kamera ir pareizi pievienota.</translation> -<translation id="5152121255775685072">Pāriet uz galeriju</translation> <translation id="5163387177077603948">Pārvietojas pa labi</translation> <translation id="520537883758714667">Tagad ir pieejama dokumentu skenēšana</translation> <translation id="5266635337630551423">Dokumenta augšējais kreisais stūris</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb index 4ab41ee..eb7776d 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Видеоснимање за мултипреноси</translation> <translation id="5057360777601936059">Камерата е недостапна во моментов. Проверете дали камерата е правилно поврзана.</translation> -<translation id="5152121255775685072">Оди во галеријата</translation> <translation id="5163387177077603948">Се преместува надесно</translation> <translation id="520537883758714667">Отсега е достапно скенирање документи</translation> <translation id="5266635337630551423">Горен лев агол на документот</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb index 42f442f..a7e4dec 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">മൾട്ടിസ്ട്രീം വീഡിയോ റെക്കോർഡിംഗ്</translation> <translation id="5057360777601936059">നിങ്ങളുടെ ക്യാമറ നിലവിൽ ലഭ്യമല്ല. ക്യാമറ ശരിയായി കണക്റ്റ് ചെയ്തിട്ടുണ്ടോയെന്ന് പരിശോധിക്കുക.</translation> -<translation id="5152121255775685072">ഗാലറിയിലേക്ക് പോവുക</translation> <translation id="5163387177077603948">വലത് ദിശയിൽ നീങ്ങുന്നു</translation> <translation id="520537883758714667">ഡോക്യുമെന്റ് സ്കാൻ ചെയ്യൽ ഇപ്പോൾ ലഭ്യമാണ്</translation> <translation id="5266635337630551423">ഡോക്യുമെന്റിന്റെ മുകൾ ഭാഗത്തെ ഇടത് മൂല</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb index adfb337..51098bbc 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Олон дамжуулалттай видео бичлэг</translation> <translation id="5057360777601936059">Tаны камер одоогоор боломжгүй байна. Камераа зөв залгасан эсэхээ шалгана уу.</translation> -<translation id="5152121255775685072">Галлерей руу очих</translation> <translation id="5163387177077603948">Баруун тийш зөөж байна</translation> <translation id="520537883758714667">Одоо документ скан хийх боломжтой боллоо</translation> <translation id="5266635337630551423">Документын зүүн дээд булан</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mr.xtb index d9151734..e75f7702 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mr.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">मल्टिस्ट्रीम व्हिडिओ रेकॉर्डिंग</translation> <translation id="5057360777601936059">तुमचा कॅमेरा सध्या उपलब्ध नाही. कॅमेरा योग्य प्रकारे कनेक्ट केला आहे का ते तपासा.</translation> -<translation id="5152121255775685072">गॅलरीवर जा</translation> <translation id="5163387177077603948">उजव्या दिशेने हलत आहे</translation> <translation id="520537883758714667">दस्तऐवज स्कॅन करणे आता उपलब्ध आहे</translation> <translation id="5266635337630551423">दस्तऐवजाचा सर्वात वरील डावीकडील कोपरा</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb index c860d591..f426e02 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Rakaman video berbilang strim</translation> <translation id="5057360777601936059">Kamera anda tidak tersedia pada masa ini. Sila periksa sama ada kamera telah disambungkan dengan betul.</translation> -<translation id="5152121255775685072">Pergi ke galeri</translation> <translation id="5163387177077603948">Bergerak ke arah kanan</translation> <translation id="520537883758714667">Kini pengimbasan dokumen tersedia</translation> <translation id="5266635337630551423">Penjuru kiri sebelah atas dokumen</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb index 2b9b734..3ee0afc 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">ဗီဒီယိုရိုက်ကူးမှုကို စနစ်အမျိုးမျိုးတွင် ထုတ်လွှင့်ခြင်း</translation> <translation id="5057360777601936059">သင့်ကင်မရာကို လောလောဆယ်မရနိုင်ပါ။ ကင်မရာကို စနစ်တကျ ချိတ်ဆက်ထားခြင်းရှိမရှိ စစ်ပါ။</translation> -<translation id="5152121255775685072">ပြခန်းသို့ သွားရန်</translation> <translation id="5163387177077603948">ဦးတည်ချက်အမှန်အတိုင်း ရွေ့နေသည်</translation> <translation id="520537883758714667">မှတ်တမ်းဖိုင်ကို ယခု စကင်ဖတ်နိုင်ပါပြီ</translation> <translation id="5266635337630551423">မှတ်တမ်း၏ ဘယ်ဘက်ထောင့်ထိပ်</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb index b7c087b..74c5c3a0 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">मल्टिस्ट्रिम भिडियो रेकर्डिङ</translation> <translation id="5057360777601936059">तपाईंको क्यामेरा हाल उपलब्ध छैन। कृपया क्यामेरा राम्ररी जडान गरिएको छ कि छैन भनी जाँच गर्नुहोस्।</translation> -<translation id="5152121255775685072">ग्यालेरीमा जानुहोस्</translation> <translation id="5163387177077603948">दायाँतिर सारिँदै छ</translation> <translation id="520537883758714667">तपाईं अब डकुमेन्ट स्क्यान गर्न सक्नुहुन्छ</translation> <translation id="5266635337630551423">कागजातको सिरानको बायाँ कुना</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb index aec11013..0b14fca 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Multistream-video opnemen</translation> <translation id="5057360777601936059">Je camera is momenteel niet beschikbaar. Controleer of de camera correct is aangesloten.</translation> -<translation id="5152121255775685072">Naar galerij</translation> <translation id="5163387177077603948">Beweegt naar rechts</translation> <translation id="520537883758714667">Documenten scannen is nu beschikbaar</translation> <translation id="5266635337630551423">Linkerbovenhoek van document</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb index 62a9e6d..a269d319 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb
@@ -10,6 +10,7 @@ <translation id="1430915738399379752">Skriv ut</translation> <translation id="1467231725790366244"><ph name="CAMERA" /> er koblet fra.</translation> <translation id="1473110567575736769">Tre sekunders nedtelling</translation> +<translation id="148783771699678004">Beveger seg oppover mot høyre</translation> <translation id="1545749641540134597">Skann en QR-kode</translation> <translation id="1560052704389894104">GIF</translation> <translation id="1588438908519853928">Normal</translation> @@ -54,6 +55,7 @@ <translation id="3448774564454087943">Videoen blir ikke lagret, siden den er for kort</translation> <translation id="346539236881580388">Ta på nytt</translation> <translation id="3517926952904427380">Kunne ikke ta bilde i stående format</translation> +<translation id="3566302376254083266">Beveger seg oppover mot venstre</translation> <translation id="3569311554794739032">Er du sikker på at du vil fjerne <ph name="FILE" />?</translation> <translation id="3573890771273113519">Bytt til skannemodus</translation> <translation id="3583444040776960729">Dokumentets nedre venstre hjørne</translation> @@ -72,14 +74,16 @@ <translation id="4570032796877367747">Fremre kamera</translation> <translation id="4628948037717959914">Bilde</translation> <translation id="4649291346448517080">Kan ikke lagre filen</translation> +<translation id="4695379108709712600">Beveger seg oppover</translation> <translation id="4890010094662541459">3 x 3</translation> <translation id="491895758387112773">Videoopptak med flere strømmer</translation> <translation id="5057360777601936059">Kameraet er ikke tilgjengelig akkurat nå. Sjekk om kameraet er koblet til riktig.</translation> -<translation id="5152121255775685072">Gå til galleriet</translation> +<translation id="5163387177077603948">Beveger seg mot høyre</translation> <translation id="520537883758714667">Dokumentskanning er nå tilgjengelig</translation> <translation id="5266635337630551423">Dokumentets øvre venstre hjørne</translation> <translation id="5317780077021120954">Lagre</translation> +<translation id="5320594929574852403">Beveger seg mot venstre</translation> <translation id="5444515100983837161">Plassér alle hjørnene av dokumentet innenfor rammen. Skanning fungerer best hvis dokumentet og bakgrunnen har ulik farge.</translation> <translation id="5671277269877808209">Kvadrat</translation> <translation id="5746169159649715125">Lagre som PDF</translation> @@ -102,6 +106,7 @@ <translation id="667999046851023355">Dokument</translation> <translation id="6681668084120808868">Ta et bilde</translation> <translation id="6778482348691154169">Kan ikke ta bilde</translation> +<translation id="6888362557094394345">Beveger seg nedover</translation> <translation id="695140971690006676">Tilbakestill alle</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 sekunder</translation> @@ -116,12 +121,14 @@ <translation id="7557677699350329807">Bytt til neste kamera</translation> <translation id="7607002721634913082">Satt på pause</translation> <translation id="7608223098072244877">4 ganger 4</translation> +<translation id="761421184377987513">Beveger seg nedover mot venstre</translation> <translation id="7649070708921625228">Hjelp</translation> <translation id="7658239707568436148">Avbryt</translation> <translation id="7670511624014457267">60 bilder per sekund</translation> <translation id="7671804233658741790">Dokumentets nedre høyre hjørne</translation> <translation id="7726641833034062494">Ta opp normal video</translation> <translation id="7748344063862150053">Dokumentets øvre høyre hjørne</translation> +<translation id="7933675232020478311">Beveger seg nedover mot høyre</translation> <translation id="7983668134180549431">Oppdaget tekst.</translation> <translation id="8067883171444229417">Spill av videoen</translation> <translation id="8120146556401698679">Panorering, vipping, zooming</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_or.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_or.xtb index 839e079..c496a72 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_or.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_or.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">ମଲ୍ଟିଷ୍ଟ୍ରିମ୍ ଭିଡିଓ ରେକର୍ଡିଂ</translation> <translation id="5057360777601936059">ସମ୍ପ୍ରତି, ଆପଣଙ୍କର କ୍ୟାମେରା ଉପଲବ୍ଧ ନାହିଁ। କ୍ୟାମେରା ଠିକ୍ ଭାବରେ ସଂଯୁକ୍ତ ଅଛି କି ନାହିଁ ଦୟାକରି ଯାଞ୍ଚ କରନ୍ତୁ।</translation> -<translation id="5152121255775685072">ଗ୍ୟାଲେରୀକୁ ଯାଆନ୍ତୁ</translation> <translation id="5163387177077603948">ଡାହାଣ ପଟକୁ ମୁଭ ହେଉଛି</translation> <translation id="520537883758714667">ଡକ୍ୟୁମେଣ୍ଟ ସ୍କାନ୍ କରିବା ସୁବିଧା ବର୍ତ୍ତମାନ ଉପଲବ୍ଧ ଅଛି</translation> <translation id="5266635337630551423">ଡକ୍ୟୁମେଣ୍ଟର ଶୀର୍ଷ-ବାମ ପଟ କୋଣ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb index 6dda654..0cbe106 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">ਮਲਟੀਸਟ੍ਰੀਮ ਵੀਡੀਓ ਰਿਕਾਰਡਿੰਗ</translation> <translation id="5057360777601936059">ਤੁਹਾਡਾ ਕੈਮਰਾ ਇਸ ਵੇਲੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਕੈਮਰੇ ਦੇ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਕਨੈਕਟ ਹੋਣ ਦੀ ਜਾਂਚ ਕਰੋ।</translation> -<translation id="5152121255775685072">ਗੈਲਰੀ 'ਤੇ ਜਾਓ</translation> <translation id="5163387177077603948">ਇਹ ਸੱਜੇ ਪਾਸੇ ਵੱਲ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="520537883758714667">ਦਸਤਾਵੇਜ਼ ਸਕੈਨਿੰਗ ਵਿਸ਼ੇਸ਼ਤਾ ਹੁਣ ਉਪਲਬਧ ਹੈ</translation> <translation id="5266635337630551423">ਦਸਤਾਵੇਜ਼ ਦਾ ਉੱਪਰਲਾ-ਖੱਬਾ ਕੋਨਾ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb index 9bc0d5e..aa607595d 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Nagrywanie kilku strumieni wideo</translation> <translation id="5057360777601936059">Aparat jest obecnie niedostępny. Sprawdź, czy jest prawidłowo podłączony.</translation> -<translation id="5152121255775685072">Otwórz galerię</translation> <translation id="5163387177077603948">Przesuwam w prawo</translation> <translation id="520537883758714667">Skanowanie dokumentów jest teraz dostępne</translation> <translation id="5266635337630551423">Lewy górny róg dokumentu</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb index 63d5638..5e96c6cc 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Fazer multistreaming da gravação de vídeo</translation> <translation id="5057360777601936059">Sua câmera está indisponível no momento. Verifique se ela está conectada corretamente.</translation> -<translation id="5152121255775685072">Ir para a galeria</translation> <translation id="5163387177077603948">Movendo para a direita</translation> <translation id="520537883758714667">A digitalização de documentos está disponível</translation> <translation id="5266635337630551423">Canto superior esquerdo do documento</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb index 5f44f0e..12026b6 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Gravação de vídeo multistream</translation> <translation id="5057360777601936059">De momento, a câmara não está disponível. Verifique se a câmara está ligada corretamente.</translation> -<translation id="5152121255775685072">Ir para a galeria</translation> <translation id="5163387177077603948">A mover para a direita</translation> <translation id="520537883758714667">A digitalização de documentos já está disponível</translation> <translation id="5266635337630551423">Canto superior esquerdo do documento</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb index 50418f8..2664d979 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Înregistrare video pentru streamuri multiple</translation> <translation id="5057360777601936059">Camera foto este indisponibilă. Verifică dacă ai conectat corect camera foto.</translation> -<translation id="5152121255775685072">Accesează galeria</translation> <translation id="5163387177077603948">Se deplasează în direcția corespunzătoare</translation> <translation id="520537883758714667">Scanarea documentelor este acum disponibilă</translation> <translation id="5266635337630551423">Colțul din stânga sus al documentului</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb index 8c8686a6..6483573e 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Многопотоковая видеозапись</translation> <translation id="5057360777601936059">Камера недоступна. Проверьте, правильно ли подключена камера.</translation> -<translation id="5152121255775685072">Перейти в галерею</translation> <translation id="5163387177077603948">Перемещение вправо</translation> <translation id="520537883758714667">Доступно сканирование документов.</translation> <translation id="5266635337630551423">Левый верхний угол документа</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_si.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_si.xtb index 41986e73..381f29a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_si.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_si.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">බහුප්රවාහ වීඩියෝ පටිගත කිරීම</translation> <translation id="5057360777601936059">ඔබේ කැමරාව දැනට නොලැබේ. කැමරාව නිසියාකාරව සම්බන්ධ වී ඇති දැයි පරීක්ෂා කරන්න.</translation> -<translation id="5152121255775685072">ගැලරියට යන්න</translation> <translation id="5163387177077603948">දකුණු දිශාවට ගෙන යමින්</translation> <translation id="520537883758714667">ලේඛන ස්කෑන් කිරීම දැන් ලබා ගත හැකිය</translation> <translation id="5266635337630551423">ලේඛනය ඉහළ වම් කෙළවර</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb index 06d0133..2467067 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Streamovať záznam videa vo viacerých platformách</translation> <translation id="5057360777601936059">Fotoaparát je momentálne nedostupný. Skontrolujte, či je správne pripojený.</translation> -<translation id="5152121255775685072">Prejsť do galérie</translation> <translation id="5163387177077603948">Presúvate doprava</translation> <translation id="520537883758714667">Skenovanie dokumentov je teraz k dispozícii</translation> <translation id="5266635337630551423">Ľavý horný roh dokumentu</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb index 70b65f9..e8cb537 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Večtokovno snemanje videoposnetkov</translation> <translation id="5057360777601936059">Fotoaparat trenutno ni na voljo. Preverite, ali je fotoaparat ustrezno povezan.</translation> -<translation id="5152121255775685072">V galerijo</translation> <translation id="5163387177077603948">Premikanje proti desni</translation> <translation id="520537883758714667">Optično branje dokumentov je zdaj na voljo</translation> <translation id="5266635337630551423">Zgornji levi kot dokumenta</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sq.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sq.xtb index 0c18479..6241f857 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sq.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sq.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Regjistrim videoje me disa transmetime</translation> <translation id="5057360777601936059">Kamera jote nuk ofrohet aktualisht. Kontrollo nëse kamera është lidhur si duhet.</translation> -<translation id="5152121255775685072">Shko te galeria</translation> <translation id="5163387177077603948">Po zhvendoset djathtas</translation> <translation id="520537883758714667">Skanimi i dokumenteve ofrohet tani</translation> <translation id="5266635337630551423">Këndi lart majtas i dokumentit</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb index f986d1a..70ac304 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Snimanje videa sa više strimova</translation> <translation id="5057360777601936059">Kamera trenutno nije dostupna. Proverite da li je kamera ispravno povezana.</translation> -<translation id="5152121255775685072">Idi u galeriju</translation> <translation id="5163387177077603948">Kreće se udesno</translation> <translation id="520537883758714667">Sada je dostupno skeniranje dokumenata</translation> <translation id="5266635337630551423">Gornji levi ugao dokumenta</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb index 317cd4c..9b3c14d 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Снимање видеа са више стримова</translation> <translation id="5057360777601936059">Камера тренутно није доступна. Проверите да ли је камера исправно повезана.</translation> -<translation id="5152121255775685072">Иди у галерију</translation> <translation id="5163387177077603948">Креће се удесно</translation> <translation id="520537883758714667">Сада је доступно скенирање докумената</translation> <translation id="5266635337630551423">Горњи леви угао документа</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sv.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sv.xtb index 1d81ba1..b57fad3 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sv.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sv.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Multistream-videoinspelning</translation> <translation id="5057360777601936059">Kameran är inte tillgänglig. Kontrollera kameraanslutningen.</translation> -<translation id="5152121255775685072">Besök galleriet</translation> <translation id="5163387177077603948">Flyttas åt höger</translation> <translation id="520537883758714667">Dokumentskanning är nu tillgängligt</translation> <translation id="5266635337630551423">Övre vänstra hörnet på dokumentet</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb index 26c37130..f915dd7 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Kurekodi video nyingi zinazotiririshwa</translation> <translation id="5057360777601936059">Kamera yako haipatikani kwa sasa. Tafadhali hakikisha kuwa umeunganisha kamera vizuri.</translation> -<translation id="5152121255775685072">Nenda kwenye matunzio</translation> <translation id="5163387177077603948">Inasogezwa upande wa kulia</translation> <translation id="520537883758714667">Kipengele cha kuchanganua hati sasa kinapatikana</translation> <translation id="5266635337630551423">Pembe ya juu kushoto ya hati</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ta.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ta.xtb index 9adfe80..8202315 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ta.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ta.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">மல்டிஸ்ட்ரீம் வீடியோ ரெக்கார்டிங்</translation> <translation id="5057360777601936059">உங்கள் கேமரா தற்போது கிடைக்கவில்லை. கேமரா சரியாக இணைக்கப்பட்டுள்ளதா எனப் பார்க்கவும்.</translation> -<translation id="5152121255775685072">கேலரிக்குச் செல்</translation> <translation id="5163387177077603948">வலதுபுறம் நகர்கிறது</translation> <translation id="520537883758714667">இப்போது ஆவணத்தை ஸ்கேன் செய்யலாம்</translation> <translation id="5266635337630551423">ஆவணத்தின் மேல் இடது மூலை</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb index f0deb297..6931f271 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">మల్టీస్ట్రీమ్ వీడియో రికార్డింగ్</translation> <translation id="5057360777601936059">మీ కెమెరా ప్రస్తుతం అందుబాటులో లేదు. కెమెరా సరిగ్గా కనెక్ట్ అయ్యిందో లేదో, దయచేసి సరిచూడండి.</translation> -<translation id="5152121255775685072">గ్యాలరీకి వెళ్లు</translation> <translation id="5163387177077603948">కుడి వైపునకు కదులుతోంది</translation> <translation id="520537883758714667">డాక్యుమెంట్ స్కానింగ్ ఇప్పుడు అందుబాటులో ఉంది</translation> <translation id="5266635337630551423">డాక్యుమెంట్ ఎగువ ఎడమ మూలన</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_th.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_th.xtb index 8764acc..4004bfd 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_th.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_th.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">การบันทึกวิดีโอแบบหลายสตรีม</translation> <translation id="5057360777601936059">ขณะนี้กล้องไม่พร้อมใช้งาน โปรดตรวจสอบว่ากล้องเชื่อมต่ออย่างถูกต้อง</translation> -<translation id="5152121255775685072">ไปที่แกลเลอรี</translation> <translation id="5163387177077603948">ย้ายไปทางด้านขวา</translation> <translation id="520537883758714667">การสแกนเอกสารพร้อมใช้งานแล้ว</translation> <translation id="5266635337630551423">มุมซ้ายบนของเอกสาร</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb index 837e52c..51cf1fc 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Çoklu akış video kaydı</translation> <translation id="5057360777601936059">Kameranız şu anda kullanılamıyor. Lütfen kameranın düzgün bir şekilde bağlanıp bağlanmadığını kontrol edin.</translation> -<translation id="5152121255775685072">Galeriye git</translation> <translation id="5163387177077603948">Sağa doğru hareket ediyor</translation> <translation id="520537883758714667">Doküman tarama artık kullanılabilir</translation> <translation id="5266635337630551423">Dokümanın sol üst köşesi</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb index 79feaae4..8c660148 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Багатопотоковий відеозапис</translation> <translation id="5057360777601936059">Камера зараз недоступна. Перевірте, чи правильно її під’єднано.</translation> -<translation id="5152121255775685072">Перейти в галерею</translation> <translation id="5163387177077603948">Переміщення вправо</translation> <translation id="520537883758714667">Тепер доступне сканування документів</translation> <translation id="5266635337630551423">Верхній лівий кут документа</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb index 88333ed..2143490 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">ملٹی اسٹریم ویڈیو ریکارڈنگ</translation> <translation id="5057360777601936059">آپ کا کیمرا فی الحال دستیاب نہیں ہے۔ چیک کریں کہ کیمرا ٹھیک سے منسلک ہے۔</translation> -<translation id="5152121255775685072">گیلری میں جائیں</translation> <translation id="5163387177077603948">صحیح سمت میں جا رہا ہے</translation> <translation id="520537883758714667">دستاویز کو اسکین کرنے کی خصوصیت اب دستیاب ہے</translation> <translation id="5266635337630551423">دستاویز کا اوپری بایاں کونا</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb index 90d5291..c46b0e848 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Multistrim video yozib olinishi</translation> <translation id="5057360777601936059">Kamera hozirda ishlamayapti. Kamera bexato ulanganini tekshiring.</translation> -<translation id="5152121255775685072">Galereyani ochish</translation> <translation id="5163387177077603948">Oʻngga surish</translation> <translation id="520537883758714667">Endi hujjatlarni skanerlash mumkin</translation> <translation id="5266635337630551423">Hujjatning yuqori chap burchagi</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb index ba744f1..a3884f5 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Quay video phát trực tuyến đa luồng</translation> <translation id="5057360777601936059">Máy ảnh của bạn hiện chưa sẵn sàng. Vui lòng kiểm tra xem máy ảnh có được kết nối đúng cách không.</translation> -<translation id="5152121255775685072">Truy cập thư viện</translation> <translation id="5163387177077603948">Đang di chuyển theo hướng sang phải</translation> <translation id="520537883758714667">Tính năng quét tài liệu hiện có sẵn</translation> <translation id="5266635337630551423">Góc trên cùng bên trái của tài liệu</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb index ff60525..4e3ea02 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">录制多个视频流</translation> <translation id="5057360777601936059">您的摄像头目前不可用。 请检查此摄像头是否连接正确。</translation> -<translation id="5152121255775685072">打开图库</translation> <translation id="5163387177077603948">正在向右移动</translation> <translation id="520537883758714667">文件扫描功能现已推出</translation> <translation id="5266635337630551423">文件左上角</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb index dbee4e574..732dcb051 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">以多流功能錄製影片</translation> <translation id="5057360777601936059">您的相機目前無法使用。 請檢查相機是否正確連接。</translation> -<translation id="5152121255775685072">前往相片集</translation> <translation id="5163387177077603948">向右移</translation> <translation id="520537883758714667">文件掃瞄功能現已推出</translation> <translation id="5266635337630551423">文件左上角</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb index dc46ff1..480124d 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">錄製多串流視訊</translation> <translation id="5057360777601936059">目前無法使用相機。 請檢查相機是否已正確連接。</translation> -<translation id="5152121255775685072">前往圖片庫</translation> <translation id="5163387177077603948">向右移動</translation> <translation id="520537883758714667">文件掃描功能現已推出</translation> <translation id="5266635337630551423">文件左上角</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zu.xtb index 32e7b72..4550c00 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zu.xtb
@@ -79,7 +79,6 @@ <translation id="491895758387112773">Ukurekhoda ividiyo kokusakaza okuningi</translation> <translation id="5057360777601936059">Ikhamera yakho manje ayitholakali. Hlola uma ngabe ikhamera ixhumeke kahle yini.</translation> -<translation id="5152121255775685072">Hamba kugalari</translation> <translation id="5163387177077603948">Ihambela ngasohlangothini lwesokudla</translation> <translation id="520537883758714667">Ukuskena idokhumenti manje sekuyatholakala</translation> <translation id="5266635337630551423">Idokhumenti ekhoneni eliphezulu kwesobunxele</translation>
diff --git a/ash/webui/camera_app_ui/resources/tsconfig_base.json b/ash/webui/camera_app_ui/resources/tsconfig_base.json index 1c6b8131..ab28dbb 100644 --- a/ash/webui/camera_app_ui/resources/tsconfig_base.json +++ b/ash/webui/camera_app_ui/resources/tsconfig_base.json
@@ -12,7 +12,6 @@ "w3c-image-capture" ], "strict": false, - "noImplicitReturns": false, "noUnusedLocals": false, "noUnusedParameters": false },
diff --git a/ash/webui/camera_app_ui/resources/utils/cca.py b/ash/webui/camera_app_ui/resources/utils/cca.py index 19a005b..eae6a86 100755 --- a/ash/webui/camera_app_ui/resources/utils/cca.py +++ b/ash/webui/camera_app_ui/resources/utils/cca.py
@@ -60,8 +60,8 @@ def gen_files_are_hard_links(gen_dir): cca_root = os.getcwd() - util_js = os.path.join(cca_root, 'js/util.js') - util_js_in_gen = os.path.join(gen_dir, 'js/util.js') + util_js = os.path.join(cca_root, 'js/util.ts') + util_js_in_gen = os.path.join(gen_dir, 'js/util.ts') return os.stat(util_js).st_ino == os.stat(util_js_in_gen).st_ino
diff --git a/ash/webui/shimless_rma/mojom/shimless_rma.mojom b/ash/webui/shimless_rma/mojom/shimless_rma.mojom index 8357108..dafcd5e6 100644 --- a/ash/webui/shimless_rma/mojom/shimless_rma.mojom +++ b/ash/webui/shimless_rma/mojom/shimless_rma.mojom
@@ -167,6 +167,12 @@ // Logs could not be retrieved. kCannotGetLog = 38, + + // RMA daemon initialization failed. + kDaemonInitializationFailed = 39, + + // Update RO firmware failed. + kUpdateRoFirmwareFailed = 40, }; // TODO(gavindodd): This is copied from
diff --git a/ash/webui/shimless_rma/mojom/shimless_rma_mojom_traits.cc b/ash/webui/shimless_rma/mojom/shimless_rma_mojom_traits.cc index 8a521b1..440cf096 100644 --- a/ash/webui/shimless_rma/mojom/shimless_rma_mojom_traits.cc +++ b/ash/webui/shimless_rma/mojom/shimless_rma_mojom_traits.cc
@@ -189,6 +189,10 @@ return MojomRmadErrorCode::kCannotCancelRma; case ProtoRmadErrorCode::RMAD_ERROR_CANNOT_GET_LOG: return MojomRmadErrorCode::kCannotGetLog; + case ProtoRmadErrorCode::RMAD_ERROR_DAEMON_INITIALIZATION_FAILED: + return MojomRmadErrorCode::kDaemonInitializationFailed; + case ProtoRmadErrorCode::RMAD_ERROR_UPDATE_RO_FIRMWARE_FAILED: + return MojomRmadErrorCode::kUpdateRoFirmwareFailed; case ProtoRmadErrorCode::RMAD_ERROR_NOT_SET: default: @@ -325,6 +329,12 @@ case MojomRmadErrorCode::kCannotGetLog: *out = ProtoRmadErrorCode::RMAD_ERROR_CANNOT_GET_LOG; return true; + case MojomRmadErrorCode::kDaemonInitializationFailed: + *out = ProtoRmadErrorCode::RMAD_ERROR_DAEMON_INITIALIZATION_FAILED; + return true; + case MojomRmadErrorCode::kUpdateRoFirmwareFailed: + *out = ProtoRmadErrorCode::RMAD_ERROR_UPDATE_RO_FIRMWARE_FAILED; + return true; case MojomRmadErrorCode::kNotSet: NOTREACHED();
diff --git a/ash/webui/shimless_rma/mojom/shimless_rma_mojom_traits_unittest.cc b/ash/webui/shimless_rma/mojom/shimless_rma_mojom_traits_unittest.cc index becb686d..a6046ca 100644 --- a/ash/webui/shimless_rma/mojom/shimless_rma_mojom_traits_unittest.cc +++ b/ash/webui/shimless_rma/mojom/shimless_rma_mojom_traits_unittest.cc
@@ -184,7 +184,11 @@ {mojom::RmadErrorCode::kCannotCancelRma, rmad::RmadErrorCode::RMAD_ERROR_CANNOT_CANCEL_RMA}, {mojom::RmadErrorCode::kCannotGetLog, - rmad::RmadErrorCode::RMAD_ERROR_CANNOT_GET_LOG}}); + rmad::RmadErrorCode::RMAD_ERROR_CANNOT_GET_LOG}, + {mojom::RmadErrorCode::kDaemonInitializationFailed, + rmad::RmadErrorCode::RMAD_ERROR_DAEMON_INITIALIZATION_FAILED}, + {mojom::RmadErrorCode::kUpdateRoFirmwareFailed, + rmad::RmadErrorCode::RMAD_ERROR_UPDATE_RO_FIRMWARE_FAILED}}); TestProtoToMojo(enums); TestMojoToProto(enums);
diff --git a/ash/webui/shimless_rma/resources/shimless_rma.js b/ash/webui/shimless_rma/resources/shimless_rma.js index f2b156a6..f949362 100644 --- a/ash/webui/shimless_rma/resources/shimless_rma.js +++ b/ash/webui/shimless_rma/resources/shimless_rma.js
@@ -185,7 +185,7 @@ [State.kRestock]: { componentIs: 'wrapup-restock-page', requiresReloadWhenShown: false, - buttonNext: ButtonState.DISABLED, + buttonNext: ButtonState.HIDDEN, buttonCancel: ButtonState.HIDDEN, buttonBack: ButtonState.HIDDEN, },
diff --git a/ash/webui/shimless_rma/resources/splash_screen.html b/ash/webui/shimless_rma/resources/splash_screen.html index 2536521..652fb9a 100644 --- a/ash/webui/shimless_rma/resources/splash_screen.html +++ b/ash/webui/shimless_rma/resources/splash_screen.html
@@ -13,10 +13,13 @@ <base-page orientation="column"> <div slot="header"> - <h1>[[i18n('shimlessSplashTitle')]]</h1> <div class="busy-icon"> <paper-spinner-lite id="busyIcon" active></paper-spinner-lite> </div> + <br> <!-- div is not enough to make a new line after the spinner. --> + <div class="splash-title"> + <h1>[[i18n('shimlessSplashTitle')]]</h1> + </div> <div class="loading-message"> <div>[[i18n('shimlessSplashRemembering')]]</div> <div>[[i18n('shimlessSplashLoading')]]</div>
diff --git a/ash/webui/shimless_rma/resources/wrapup_restock_page.html b/ash/webui/shimless_rma/resources/wrapup_restock_page.html index a3b7fbcf..35cfbd3 100644 --- a/ash/webui/shimless_rma/resources/wrapup_restock_page.html +++ b/ash/webui/shimless_rma/resources/wrapup_restock_page.html
@@ -9,12 +9,14 @@ <div slot="header"> <h1>[[i18n('restockTitleText')]]</h1> <div>[[i18n('restockInstructionsText')]]</div> + <cr-button id="continue" on-click="onNextButtonClick"> + [[i18n('restockContinueButtonText')]] + </cr-button> <cr-button id="shutdown" on-click="onShutdownButtonClicked_"> [[i18n('restockShutdownButtonText')]] </cr-button> </div> <div slot="body"> - <!-- TODO(gavindodd): Replace with real image --> - <iron-icon icon="shimless:shimless-placeholder"></iron-icon> + <iron-icon icon="shimless:repair-start"></iron-icon> </div> </base-page>
diff --git a/ash/webui/shimless_rma/shimless_rma.cc b/ash/webui/shimless_rma/shimless_rma.cc index 5ee6649..e44b3689 100644 --- a/ash/webui/shimless_rma/shimless_rma.cc +++ b/ash/webui/shimless_rma/shimless_rma.cc
@@ -225,6 +225,7 @@ {"restockTitleText", IDS_SHIMLESS_RMA_RESTOCK_PAGE_TITLE}, {"restockInstructionsText", IDS_SHIMLESS_RMA_RESTOCK_INSTRUCTIONS}, {"restockShutdownButtonText", IDS_SHIMLESS_RMA_RESTOCK_SHUTDOWN_BUTTON}, + {"restockContinueButtonText", IDS_SHIMLESS_RMA_RESTOCK_CONTINUE_BUTTON}, // Manual enable wp page {"manuallyEnableWpTitleText", IDS_SHIMLESS_RMA_MANUALLY_ENABLE_WP_TITLE}, {"manuallyEnableWpInstructionsText",
diff --git a/ash/wm/desks/templates/desks_templates_dialog_controller.cc b/ash/wm/desks/templates/desks_templates_dialog_controller.cc index a4ed569..e6d5787 100644 --- a/ash/wm/desks/templates/desks_templates_dialog_controller.cc +++ b/ash/wm/desks/templates/desks_templates_dialog_controller.cc
@@ -4,9 +4,15 @@ #include "ash/wm/desks/templates/desks_templates_dialog_controller.h" +#include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" +#include "ash/wm/desks/templates/desks_templates_grid_view.h" #include "ash/wm/desks/templates/desks_templates_icon_container.h" +#include "ash/wm/desks/templates/desks_templates_item_view.h" +#include "ash/wm/overview/overview_controller.h" +#include "ash/wm/overview/overview_grid.h" #include "base/bind.h" +#include "ui/aura/env.h" #include "ui/aura/window.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_header_macros.h" @@ -198,6 +204,22 @@ void DesksTemplatesDialogController::OnWidgetDestroying(views::Widget* widget) { DCHECK_EQ(dialog_widget_, widget); + for (auto& overview_grid : + Shell::Get()->overview_controller()->overview_session()->grid_list()) { + views::Widget* templates_grid_widget = + overview_grid->desks_templates_grid_widget(); + if (templates_grid_widget) { + auto* templates_grid_view = static_cast<DesksTemplatesGridView*>( + templates_grid_widget->GetContentsView()); + for (DesksTemplatesItemView* template_item : + templates_grid_view->grid_items()) { + // Update the button visibility when a dialog is closed. + template_item->UpdateHoverButtonsVisibility( + aura::Env::GetInstance()->last_mouse_location(), + /*is_touch=*/false); + } + } + } dialog_widget_observation_.Reset(); dialog_widget_ = nullptr; }
diff --git a/ash/wm/desks/templates/desks_templates_unittest.cc b/ash/wm/desks/templates/desks_templates_unittest.cc index 4fc91e2..e86271d 100644 --- a/ash/wm/desks/templates/desks_templates_unittest.cc +++ b/ash/wm/desks/templates/desks_templates_unittest.cc
@@ -34,6 +34,7 @@ #include "ash/wm/overview/overview_test_base.h" #include "ash/wm/overview/overview_test_util.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h" +#include "ash/wm/window_util.h" #include "base/callback_helpers.h" #include "base/guid.h" #include "base/strings/string_number_conversions.h" @@ -1454,4 +1455,33 @@ EXPECT_EQ(active_color, get_border_color()); } +// Tests that if we save a template (and get dropped into the templates grid), +// delete all the templates (and the templates grid gets hidden), the windows in +// overview get activated and restored when selected. +TEST_F(DesksTemplatesTest, WindowActivatableAfterSaveAndDeleteTemplate) { + // Create a test window. + auto test_window = CreateAppWindow(); + + // Open overview and save a template. + OpenOverviewAndSaveTemplate(Shell::Get()->GetPrimaryRootWindow()); + std::vector<DeskTemplate*> entries = GetAllEntries(); + ASSERT_EQ(1ul, entries.size()); + + // Delete the one and only template, which should hide the templates grid but + // remain in overview. + DeleteTemplate(entries[0]->uuid(), /*expected_current_item_count=*/1); + ASSERT_TRUE(InOverviewSession()); + + // Click on the `test_window` to activate it. + auto* event_generator = GetEventGenerator(); + event_generator->MoveMouseToCenterOf(test_window.get()); + event_generator->ClickLeftButton(); + + // Verify that we exit the overview session. + EXPECT_FALSE(InOverviewSession()); + + // Check that the window is active. + EXPECT_EQ(test_window.get(), window_util::GetActiveWindow()); +} + } // namespace ash
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc index dd7cc2b..d5a8951b 100644 --- a/ash/wm/overview/overview_grid.cc +++ b/ash/wm/overview/overview_grid.cc
@@ -1726,6 +1726,12 @@ } desks_templates_grid_widget_->Hide(); + + // Activate the overview focus window to match the behavior of entering + // overview mode in the beginning. Otherwise there are cases where some + // overview windows are not able to be focused and activated. + wm::ActivateWindow(overview_session_->GetOverviewFocusWindow()); + desks_bar_view_->UpdateButtonsForDesksTemplatesGrid(); desks_bar_view_->OnDesksTemplatesGridHidden(); }
diff --git a/base/allocator/partition_allocator/starscan/pcscan_internal.cc b/base/allocator/partition_allocator/starscan/pcscan_internal.cc index e15b89a..c5bb7dd 100644 --- a/base/allocator/partition_allocator/starscan/pcscan_internal.cc +++ b/base/allocator/partition_allocator/starscan/pcscan_internal.cc
@@ -92,6 +92,22 @@ struct [[maybe_unused]] ReentrantScannerGuard final{}; #endif // defined(PA_HAS_ALLOCATION_GUARD) +// Scope that disables MTE checks. Only used inside scanning to avoid the race: +// a slot tag is changed by the mutator, while the scanner sees an old value. +struct DisableMTEScope final { + DisableMTEScope() { + memory::ChangeMemoryTaggingModeForCurrentThread( + memory::TagViolationReportingMode::kDisabled); + } + ~DisableMTEScope() { + memory::ChangeMemoryTaggingModeForCurrentThread(parent_tagging_mode); + } + + private: + memory::TagViolationReportingMode parent_tagging_mode = + memory::GetMemoryTaggingModeForCurrentThread(); +}; + #if PA_STARSCAN_USE_CARD_TABLE // Bytemap that represent regions (cards) that contain quarantined objects. // A single PCScan cycle consists of the following steps: @@ -766,6 +782,7 @@ } const PCScanTask& task_; + DisableMTEScope disable_mte_; size_t quarantine_size_ = 0; };
diff --git a/base/allocator/partition_allocator/starscan/scan_loop.h b/base/allocator/partition_allocator/starscan/scan_loop.h index 17d7ea4..906aeae1 100644 --- a/base/allocator/partition_allocator/starscan/scan_loop.h +++ b/base/allocator/partition_allocator/starscan/scan_loop.h
@@ -51,7 +51,9 @@ ScanLoop(const ScanLoop&) = delete; ScanLoop& operator=(const ScanLoop&) = delete; - // Scan input range. Assumes the range is properly aligned. + // Scan input range. Assumes the range is properly aligned. Please note that + // the function doesn't remask the input range and assumes MTE is disabled + // when function is called. void Run(uintptr_t* begin, uintptr_t* end); private: @@ -95,7 +97,7 @@ const uintptr_t base = derived().CageBase(); #endif for (; begin < end; ++begin) { - const uintptr_t maybe_ptr = *(memory::RemaskPtr(begin)); + const uintptr_t maybe_ptr = *begin; #if defined(PA_HAS_64_BITS_POINTERS) if (LIKELY((maybe_ptr & mask) != base)) continue; @@ -193,7 +195,7 @@ uintptr_t* payload = begin; for (; payload < (end - kWordsInVector); payload += kWordsInVector) { const uint64x2_t maybe_ptrs = - vld1q_u64(reinterpret_cast<uint64_t*>(memory::RemaskPtr(payload))); + vld1q_u64(reinterpret_cast<uint64_t*>(payload)); const uint64x2_t vand = vandq_u64(maybe_ptrs, cage_mask); const uint64x2_t vcmp = vceqq_u64(vand, vbase); const uint32_t max = vmaxvq_u32(vreinterpretq_u32_u64(vcmp));
diff --git a/base/files/file_util.cc b/base/files/file_util.cc index 929423c..a54cecc9 100644 --- a/base/files/file_util.cc +++ b/base/files/file_util.cc
@@ -31,7 +31,6 @@ namespace base { -#if !defined(OS_NACL_NONSFI) #if !defined(OS_WIN) OnceCallback<void(const FilePath&)> GetDeleteFileCallback() { return BindOnce(IgnoreResult(&DeleteFile)); @@ -179,7 +178,6 @@ return true; } -#endif // !defined(OS_NACL_NONSFI) bool ReadStreamToString(FILE* stream, std::string* contents) { return ReadStreamToStringWithMaxSize( @@ -202,7 +200,6 @@ // chunk size if available. constexpr int64_t kDefaultChunkSize = 1 << 16; int64_t chunk_size = kDefaultChunkSize - 1; -#if !defined(OS_NACL_NONSFI) ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); #if defined(OS_WIN) BY_HANDLE_FILE_INFORMATION file_info = {}; @@ -229,9 +226,6 @@ // We need to attempt to read at EOF for feof flag to be set so here we // use |chunk_size| + 1. chunk_size = std::min<uint64_t>(chunk_size, max_size) + 1; -#else // !defined(OS_NACL_NONSFI) - chunk_size = kDefaultChunkSize; -#endif // !defined(OS_NACL_NONSFI) size_t bytes_read_this_pass; size_t bytes_read_so_far = 0; bool read_status = true; @@ -285,7 +279,6 @@ return ReadStreamToStringWithMaxSize(file_stream.get(), max_size, contents); } -#if !defined(OS_NACL_NONSFI) bool IsDirectoryEmpty(const FilePath& dir_path) { FileEnumerator files(dir_path, false, FileEnumerator::FILES | FileEnumerator::DIRECTORIES); @@ -340,7 +333,6 @@ return file.SetTimes(last_accessed, last_modified); } -#endif // !defined(OS_NACL_NONSFI) bool CloseFile(FILE* file) { if (file == nullptr) @@ -348,7 +340,6 @@ return fclose(file) == 0; } -#if !defined(OS_NACL_NONSFI) bool TruncateFile(FILE* file) { if (file == nullptr) return false; @@ -440,6 +431,4 @@ } // namespace internal -#endif // !defined(OS_NACL_NONSFI) - } // namespace base
diff --git a/base/files/file_util_posix.cc b/base/files/file_util_posix.cc index 8d3d921..372463b 100644 --- a/base/files/file_util_posix.cc +++ b/base/files/file_util_posix.cc
@@ -76,7 +76,6 @@ namespace { -#if !defined(OS_NACL_NONSFI) // Helper for VerifyPathControlledByUser. bool VerifySpecificPathControlledByUser(const FilePath& path, uid_t owner_uid, @@ -314,7 +313,6 @@ } return success; } -#endif // !defined(OS_NACL_NONSFI) #if !defined(OS_APPLE) // Appends |mode_char| to |mode| before the optional character set encoding; see @@ -331,7 +329,6 @@ } // namespace -#if !defined(OS_NACL_NONSFI) FilePath MakeAbsoluteFilePath(const FilePath& input) { ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); char full_path[PATH_MAX]; @@ -370,7 +367,6 @@ bool recursive) { return DoCopyDirectory(from_path, to_path, recursive, true); } -#endif // !defined(OS_NACL_NONSFI) bool CreatePipe(ScopedFD* read_fd, ScopedFD* write_fd, bool non_blocking) { int fds[2]; @@ -418,15 +414,11 @@ } bool SetCloseOnExec(int fd) { -#if defined(OS_NACL_NONSFI) - const int flags = 0; -#else const int flags = fcntl(fd, F_GETFD); if (flags == -1) return false; if (flags & FD_CLOEXEC) return true; -#endif // defined(OS_NACL_NONSFI) if (HANDLE_EINTR(fcntl(fd, F_SETFD, flags | FD_CLOEXEC)) == -1) return false; return true; @@ -442,19 +434,15 @@ return access(path.value().c_str(), F_OK) == 0; } -#if !defined(OS_NACL_NONSFI) bool PathIsReadable(const FilePath& path) { ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); return access(path.value().c_str(), R_OK) == 0; } -#endif // !defined(OS_NACL_NONSFI) -#if !defined(OS_NACL_NONSFI) bool PathIsWritable(const FilePath& path) { ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); return access(path.value().c_str(), W_OK) == 0; } -#endif // !defined(OS_NACL_NONSFI) bool DirectoryExists(const FilePath& path) { ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); @@ -476,8 +464,6 @@ return total_read == bytes; } -#if !defined(OS_NACL_NONSFI) - ScopedFD CreateAndOpenFdForTemporaryFileInDir(const FilePath& directory, FilePath* path) { ScopedBlockingCall scoped_blocking_call( @@ -814,7 +800,6 @@ results->FromStat(file_info); return true; } -#endif // !defined(OS_NACL_NONSFI) FILE* OpenFile(const FilePath& filename, const char* mode) { // 'e' is unconditionally added below, so be sure there is not one already @@ -983,8 +968,6 @@ return true; } -#if !defined(OS_NACL_NONSFI) - bool AppendToFile(const FilePath& filename, span<const uint8_t> data) { ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); bool ret = true; @@ -1290,8 +1273,6 @@ } // namespace internal -#endif // !defined(OS_NACL_NONSFI) - #if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_AIX) BASE_EXPORT bool IsPathExecutable(const FilePath& path) { bool result = false;
diff --git a/base/files/file_util_unittest.cc b/base/files/file_util_unittest.cc index 95655c4..68117262 100644 --- a/base/files/file_util_unittest.cc +++ b/base/files/file_util_unittest.cc
@@ -4093,7 +4093,6 @@ } #endif -#if !defined(OS_NACL_NONSFI) TEST_F(FileUtilTest, GetUniquePathNumberNoFile) { // This file does not exist. const FilePath some_file = temp_dir_.GetPath().Append(FPL("SomeFile.txt")); @@ -4206,8 +4205,6 @@ PreReadFile(inexistent_file, /*is_executable=*/false).succeeded()); } -#endif // !defined(OS_NACL_NONSFI) - // Test that temp files obtained racily are all unique (no interference between // threads). Mimics file operations in DoLaunchChildTestProcess() to rule out // thread-safety issues @ https://crbug.com/826408#c17.
diff --git a/base/posix/unix_domain_socket.cc b/base/posix/unix_domain_socket.cc index fd8aa044..94ef57e 100644 --- a/base/posix/unix_domain_socket.cc +++ b/base/posix/unix_domain_socket.cc
@@ -6,9 +6,8 @@ #include <errno.h> #include <sys/socket.h> -#if !defined(OS_NACL_NONSFI) +#include <sys/uio.h> #include <sys/un.h> -#endif #include <unistd.h> #include <vector> @@ -20,15 +19,10 @@ #include "base/posix/eintr_wrapper.h" #include "build/build_config.h" -#if !defined(OS_NACL_NONSFI) -#include <sys/uio.h> -#endif - namespace base { const size_t UnixDomainSocket::kMaxFileDescriptors = 16; -#if !defined(OS_NACL_NONSFI) bool CreateSocketPair(ScopedFD* one, ScopedFD* two) { int raw_socks[2]; #if defined(OS_APPLE) @@ -64,7 +58,6 @@ return true; #endif // OS_APPLE } -#endif // !defined(OS_NACL_NONSFI) // static bool UnixDomainSocket::SendMsg(int fd, @@ -147,11 +140,11 @@ const size_t kControlBufferSize = CMSG_SPACE(sizeof(int) * kMaxFileDescriptors) -#if !defined(OS_NACL_NONSFI) && !defined(OS_APPLE) - // The PNaCl toolchain for Non-SFI binary build and macOS do not support - // ucred. macOS supports xucred, but this structure is insufficient. +#if !defined(OS_APPLE) + // macOS does not support ucred. + // macOS supports xucred, but this structure is insufficient. + CMSG_SPACE(sizeof(struct ucred)) -#endif // !defined(OS_NACL_NONSFI) && !defined(OS_APPLE) +#endif // !defined(OS_APPLE) ; char control_buffer[kControlBufferSize]; msg.msg_control = control_buffer; @@ -175,16 +168,15 @@ wire_fds = reinterpret_cast<int*>(CMSG_DATA(cmsg)); wire_fds_len = payload_len / sizeof(int); } -#if !defined(OS_NACL_NONSFI) && !defined(OS_APPLE) - // The PNaCl toolchain for Non-SFI binary build and macOS do not support - // SCM_CREDENTIALS. +#if !defined(OS_APPLE) + // macOS does not support SCM_CREDENTIALS. if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_CREDENTIALS) { DCHECK_EQ(payload_len, sizeof(struct ucred)); DCHECK_EQ(pid, -1); pid = reinterpret_cast<struct ucred*>(CMSG_DATA(cmsg))->pid; } -#endif // !defined(OS_NACL_NONSFI) && !defined(OS_APPLE) +#endif // !defined(OS_APPLE) } } @@ -225,7 +217,6 @@ return r; } -#if !defined(OS_NACL_NONSFI) // static ssize_t UnixDomainSocket::SendRecvMsg(int fd, uint8_t* reply, @@ -283,6 +274,5 @@ return reply_len; } -#endif // !defined(OS_NACL_NONSFI) } // namespace base
diff --git a/base/posix/unix_domain_socket.h b/base/posix/unix_domain_socket.h index 18c8cc31..47deb91 100644 --- a/base/posix/unix_domain_socket.h +++ b/base/posix/unix_domain_socket.h
@@ -19,24 +19,20 @@ class Pickle; -#if !defined(OS_NACL_NONSFI) // Creates a connected pair of UNIX-domain SOCK_SEQPACKET sockets, and passes // ownership of the newly allocated file descriptors to |one| and |two|. // Returns true on success. bool BASE_EXPORT CreateSocketPair(ScopedFD* one, ScopedFD* two); -#endif class BASE_EXPORT UnixDomainSocket { public: // Maximum number of file descriptors that can be read by RecvMsg(). static const size_t kMaxFileDescriptors; -#if !defined(OS_NACL_NONSFI) // Use to enable receiving process IDs in RecvMsgWithPid. Should be called on // the receiving socket (i.e., the socket passed to RecvMsgWithPid). Returns // true if successful. static bool EnableReceiveProcessId(int fd); -#endif // !defined(OS_NACL_NONSFI) // Use sendmsg to write the given msg and include a vector of file // descriptors. Returns true if successful. @@ -62,7 +58,6 @@ std::vector<ScopedFD>* fds, ProcessId* pid); -#if !defined(OS_NACL_NONSFI) // Perform a sendmsg/recvmsg pair. // 1. This process creates a UNIX SEQPACKET socketpair. Using // connection-oriented sockets (SEQPACKET or STREAM) is critical here, @@ -95,7 +90,6 @@ int recvmsg_flags, int* result_fd, const Pickle& request); -#endif // !defined(OS_NACL_NONSFI) private: // Similar to RecvMsg, but allows to specify |flags| for recvmsg(2).
diff --git a/base/process/kill_posix.cc b/base/process/kill_posix.cc index c2e7d253..912b8ed 100644 --- a/base/process/kill_posix.cc +++ b/base/process/kill_posix.cc
@@ -90,7 +90,6 @@ return GetTerminationStatusImpl(handle, true /* can_block */, exit_code); } -#if !defined(OS_NACL_NONSFI) bool WaitForProcessesToExit(const FilePath::StringType& executable_name, TimeDelta wait, const ProcessFilter* filter) { @@ -174,6 +173,5 @@ #endif // defined(OS_LINUX) || defined(OS_CHROMEOS) #endif // !defined(OS_APPLE) -#endif // !defined(OS_NACL_NONSFI) } // namespace base
diff --git a/base/process/launch.h b/base/process/launch.h index 4cf753a5..7695b64 100644 --- a/base/process/launch.h +++ b/base/process/launch.h
@@ -417,7 +417,7 @@ // binary. This should not be called in production/released code. BASE_EXPORT LaunchOptions LaunchOptionsForTest(); -#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_NACL_NONSFI) +#if defined(OS_LINUX) || defined(OS_CHROMEOS) // A wrapper for clone with fork-like behavior, meaning that it returns the // child's pid in the parent and 0 in the child. |flags|, |ptid|, and |ctid| are // as in the clone system call (the CLONE_VM flag is not supported).
diff --git a/base/process/launch_posix.cc b/base/process/launch_posix.cc index 86fb840..08f3004 100644 --- a/base/process/launch_posix.cc +++ b/base/process/launch_posix.cc
@@ -68,8 +68,6 @@ namespace base { -#if !defined(OS_NACL_NONSFI) - namespace { // Get the process's "environment" (i.e. the thing that setenv/getenv @@ -672,10 +670,7 @@ exit_code); } -#endif // !defined(OS_NACL_NONSFI) - -#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_NACL_NONSFI) || \ - defined(OS_AIX) +#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_AIX) namespace { // This function runs on the stack specified on the clone call. It uses longjmp @@ -750,6 +745,6 @@ return 0; } -#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_NACL_NONSFI) +#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_AIX) } // namespace base
diff --git a/base/process/process_posix.cc b/base/process/process_posix.cc index c228d97..cab8dfd8 100644 --- a/base/process/process_posix.cc +++ b/base/process/process_posix.cc
@@ -33,8 +33,6 @@ namespace { -#if !defined(OS_NACL_NONSFI) - bool WaitpidWithTimeout(base::ProcessHandle handle, int* status, base::TimeDelta wait) { @@ -226,7 +224,6 @@ } return exited; } -#endif // !defined(OS_NACL_NONSFI) } // namespace @@ -310,7 +307,6 @@ // end up w/ a zombie when it does finally exit. } -#if !defined(OS_NACL_NONSFI) bool Process::Terminate(int exit_code, bool wait) const { // exit_code isn't supportable. DCHECK(IsValid()); @@ -331,7 +327,6 @@ return did_terminate; } -#endif // !defined(OS_NACL_NONSFI) bool Process::WaitForExit(int* exit_code) const { return WaitForExitWithTimeout(TimeDelta::Max(), exit_code);
diff --git a/base/test/launcher/test_launcher_nacl_nonsfi.cc b/base/test/launcher/test_launcher_nacl_nonsfi.cc deleted file mode 100644 index c4a0de5..0000000 --- a/base/test/launcher/test_launcher_nacl_nonsfi.cc +++ /dev/null
@@ -1,171 +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 <inttypes.h> -#include <stdio.h> - -#include <string> - -#include "base/command_line.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/logging.h" -#include "base/message_loop/message_pump_type.h" -#include "base/path_service.h" -#include "base/process/launch.h" -#include "base/strings/string_piece.h" -#include "base/strings/string_tokenizer.h" -#include "base/strings/string_util.h" -#include "base/system/sys_info.h" -#include "base/task/single_thread_task_executor.h" -#include "base/test/launcher/test_launcher.h" -#include "base/test/launcher/unit_test_launcher.h" -#include "base/test/test_switches.h" -#include "base/test/test_timeouts.h" -#include "build/build_config.h" - -#if defined(OS_POSIX) -#include "base/files/file_descriptor_watcher_posix.h" -#endif - -namespace base { - -namespace { - -const char kHelpFlag[] = "help"; - -void PrintUsage() { - fprintf(stdout, - "Runs tests using the gtest framework, each batch of tests being\n" - "run in their own process. Supported command-line flags:\n" - "\n" - " Common flags:\n" - " --gtest_filter=...\n" - " Runs a subset of tests (see --gtest_help for more info).\n" - "\n" - " --help\n" - " Shows this message.\n" - "\n" - " Other flags:\n" - " --test-launcher-retry-limit=N\n" - " Sets the limit of test retries on failures to N.\n" - "\n" - " --test-launcher-summary-output=PATH\n" - " Saves a JSON machine-readable summary of the run.\n" - "\n" - " --test-launcher-print-test-stdio=auto|always|never\n" - " Controls when full test output is printed.\n" - " auto means to print it when the test failed.\n" - "\n" - " --test-launcher-total-shards=N\n" - " Sets the total number of shards to N.\n" - "\n" - " --test-launcher-shard-index=N\n" - " Sets the shard index to run to N (from 0 to TOTAL - 1).\n"); - fflush(stdout); -} - -class NonSfiUnitTestPlatformDelegate : public base::UnitTestPlatformDelegate { - public: - NonSfiUnitTestPlatformDelegate() = default; - - bool Init(const std::string& test_binary) { - base::FilePath dir_exe; - if (!PathService::Get(base::DIR_EXE, &dir_exe)) { - LOG(ERROR) << "Failed to get directory of the current executable."; - return false; - } - - test_path_ = dir_exe.AppendASCII(test_binary); - return true; - } - - private: - bool CreateResultsFile(const base::FilePath& temp_dir, - base::FilePath* path) override { - if (!base::CreateTemporaryDirInDir(temp_dir, base::FilePath::StringType(), - path)) - return false; - *path = path->AppendASCII("test_results.xml"); - return true; - } - - bool CreateTemporaryFile(const base::FilePath& temp_dir, - base::FilePath* path) override { - return false; - } - - bool GetTests(std::vector<base::TestIdentifier>* output) override { - base::FilePath output_file; - if (!base::CreateTemporaryFile(&output_file)) { - LOG(ERROR) << "Failed to create a temp file."; - return false; - } - - base::CommandLine cmd_line(test_path_); - cmd_line.AppendSwitchPath(switches::kTestLauncherListTests, output_file); - - base::LaunchOptions launch_options; - launch_options.wait = true; - - if (!base::LaunchProcess(cmd_line, launch_options).IsValid()) - return false; - - return base::ReadTestNamesFromFile(output_file, output); - } - - std::string GetWrapperForChildGTestProcess() override { - return std::string(); - } - - base::CommandLine GetCommandLineForChildGTestProcess( - const std::vector<std::string>& test_names, - const base::FilePath& output_file, - const base::FilePath& flag_file) override { - base::CommandLine cmd_line(test_path_); - cmd_line.AppendSwitchPath( - switches::kTestLauncherOutput, output_file); - cmd_line.AppendSwitchASCII( - base::kGTestFilterFlag, base::JoinString(test_names, ":")); - return cmd_line; - } - - base::FilePath test_path_; -}; - -} // namespace - -int TestLauncherNonSfiMain(const std::string& test_binary) { - if (base::CommandLine::ForCurrentProcess()->HasSwitch(kHelpFlag)) { - PrintUsage(); - return 0; - } - - base::TimeTicks start_time(base::TimeTicks::Now()); - - TestTimeouts::Initialize(); - - base::SingleThreadTaskExecutor executor(base::MessagePumpType::IO); -#if defined(OS_POSIX) - FileDescriptorWatcher file_descriptor_watcher(executor.task_runner()); -#endif - - NonSfiUnitTestPlatformDelegate platform_delegate; - if (!platform_delegate.Init(test_binary)) { - fprintf(stderr, "Failed to initialize test launcher.\n"); - fflush(stderr); - return 1; - } - - base::UnitTestLauncherDelegate delegate(&platform_delegate, 10, true); - base::TestLauncher launcher(&delegate, base::SysInfo::NumberOfProcessors()); - bool success = launcher.Run(); - - fprintf(stdout, "Tests took %" PRId64 " seconds.\n", - (base::TimeTicks::Now() - start_time).InSeconds()); - fflush(stdout); - return success ? 0 : 1; -} - -} // namespace base
diff --git a/base/test/launcher/test_launcher_nacl_nonsfi.h b/base/test/launcher/test_launcher_nacl_nonsfi.h deleted file mode 100644 index 6cb3785..0000000 --- a/base/test/launcher/test_launcher_nacl_nonsfi.h +++ /dev/null
@@ -1,17 +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 BASE_TEST_LAUNCHER_TEST_LAUNCHER_NACL_NONSFI_H_ -#define BASE_TEST_LAUNCHER_TEST_LAUNCHER_NACL_NONSFI_H_ - -#include <string> - -namespace base { - -// Launches the NaCl Non-SFI test binary |test_binary|. -int TestLauncherNonSfiMain(const std::string& test_binary); - -} // namespace base - -#endif // BASE_TEST_LAUNCHER_TEST_LAUNCHER_NACL_NONSFI_H_
diff --git a/build/android/resource_sizes.gni b/build/android/resource_sizes.gni index 2c91749c..5bc430a 100644 --- a/build/android/resource_sizes.gni +++ b/build/android/resource_sizes.gni
@@ -32,10 +32,7 @@ "@WrappedPath(.)", ] - data = [ - "//.vpython", - "//.vpython3", - ] + data = [] if (defined(invoker.trichrome_chrome_path)) { data += [ invoker.trichrome_chrome_path,
diff --git a/build/config/android/BUILD.gn b/build/config/android/BUILD.gn index 1f2c2e5c..cc609d3 100644 --- a/build/config/android/BUILD.gn +++ b/build/config/android/BUILD.gn
@@ -50,6 +50,8 @@ if (current_cpu == "arm64") { if (arm_control_flow_integrity == "standard") { cflags += [ "-mbranch-protection=standard" ] + } else if (arm_control_flow_integrity == "pac") { + cflags += [ "-mbranch-protection=pac-ret" ] } }
diff --git a/build/config/arm.gni b/build/config/arm.gni index 0185dd73..fa6522a0 100644 --- a/build/config/arm.gni +++ b/build/config/arm.gni
@@ -125,12 +125,13 @@ arm_use_neon = true declare_args() { # Enables the new Armv8 branch protection features. Valid strings are: - # - "standard": Enables both Pointer Authentication Code (featured in - # Armv8.3) and Branch Target Identification (Armv8.5). + # - "pac": Enables Pointer Authentication Code (PAC, featured in Armv8.3) + # - "standard": Enables both PAC and Branch Target Identification (Armv8.5). # - "none": No branch protection. arm_control_flow_integrity = "none" } assert(arm_control_flow_integrity == "none" || - arm_control_flow_integrity == "standard", + arm_control_flow_integrity == "standard" || + arm_control_flow_integrity == "pac", "Invalid branch protection option") }
diff --git a/build/config/fuchsia/BUILD.gn b/build/config/fuchsia/BUILD.gn index d503ab05..c4cc1b7d 100644 --- a/build/config/fuchsia/BUILD.gn +++ b/build/config/fuchsia/BUILD.gn
@@ -33,7 +33,6 @@ # Files required to run on Fuchsia on isolated swarming clients. group("deployment_resources") { data = [ - "//.vpython", "//build/fuchsia/", "//build/util/lib/", "//third_party/fuchsia-sdk/sdk/.build-id/",
diff --git a/build/config/ios/ios_test_runner_wrapper.gni b/build/config/ios/ios_test_runner_wrapper.gni index accbfda2..cffa647 100644 --- a/build/config/ios/ios_test_runner_wrapper.gni +++ b/build/config/ios/ios_test_runner_wrapper.gni
@@ -135,7 +135,6 @@ data += invoker.data } data += [ - "//.vpython", "//ios/build/bots/scripts/", # Variations test utilities used by variations_runner script.
diff --git a/build/config/linux/BUILD.gn b/build/config/linux/BUILD.gn index 8e42cf9..2137ed8 100644 --- a/build/config/linux/BUILD.gn +++ b/build/config/linux/BUILD.gn
@@ -22,6 +22,9 @@ if (arm_control_flow_integrity == "standard") { cflags += [ "-mbranch-protection=standard" ] asmflags += [ "-mbranch-protection=standard" ] + } else if (arm_control_flow_integrity == "pac") { + cflags += [ "-mbranch-protection=pac-ret" ] + asmflags += [ "-mbranch-protection=pac-ret" ] } } }
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 919a528c..2551a4a 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -7.20211208.1.1 +7.20211209.0.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index 919a528c..2551a4a 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -7.20211208.1.1 +7.20211209.0.1
diff --git a/build/lacros/test_runner.py b/build/lacros/test_runner.py index f8fd0041..fd5a1ab 100755 --- a/build/lacros/test_runner.py +++ b/build/lacros/test_runner.py
@@ -438,9 +438,22 @@ ash_process_has_started = False total_tries = 3 num_tries = 0 + + # Create a log file if the user wanted to have one. + log = None + if args.ash_logging_path: + log = open(args.ash_logging_path, 'a') + while not ash_process_has_started and num_tries < total_tries: num_tries += 1 - ash_process = subprocess.Popen(ash_cmd, env=ash_env) + if log is None: + ash_process = subprocess.Popen(ash_cmd, env=ash_env) + else: + ash_process = subprocess.Popen(ash_cmd, + env=ash_env, + stdout=log, + stderr=log) + ash_process_has_started = _WaitForAshChromeToStart( tmp_xdg_dir_name, lacros_mojo_socket_file, enable_mojo_crosapi, ash_ready_file) @@ -583,6 +596,12 @@ help='The same as --ash-chrome-path. But this will override ' '--ash-chrome-path or --ash-chrome-version if any of these ' 'arguments exist.') + test_parser.add_argument( + '--ash-logging-path', + type=str, + help='File & path to ash-chrome logging output while running Lacros ' + 'browser tests. If not provided, no output will be generated.') + args = arg_parser.parse_known_args() return args[0].func(args[0], args[1])
diff --git a/cc/BUILD.gn b/cc/BUILD.gn index f795eb8..60572d95 100644 --- a/cc/BUILD.gn +++ b/cc/BUILD.gn
@@ -484,6 +484,8 @@ "test/fake_compositor_frame_reporting_controller.h", "test/fake_content_layer_client.cc", "test/fake_content_layer_client.h", + "test/fake_frame_info.cc", + "test/fake_frame_info.h", "test/fake_impl_task_runner_provider.h", "test/fake_layer_tree_frame_sink.cc", "test/fake_layer_tree_frame_sink.h",
diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc index e3f6fb42..b6ea0646 100644 --- a/cc/metrics/compositor_frame_reporter.cc +++ b/cc/metrics/compositor_frame_reporter.cc
@@ -1422,8 +1422,30 @@ FrameInfo info; info.final_state = final_state; info.smooth_thread = smooth_thread_; + info.scroll_thread = scrolling_thread_; info.has_missing_content = has_missing_content_; + if (frame_skip_reason_.has_value() && + frame_skip_reason() == FrameSkippedReason::kNoDamage) { + // If the frame was explicitly skipped because of 'no damage', then that + // means this frame contains the response ('no damage') from the + // main-thread. + info.main_thread_response = FrameInfo::MainThreadResponse::kIncluded; + } else if (partial_update_dependents_.size() > 0) { + // Only a frame containing a response from the main-thread can have + // dependent reporters. + info.main_thread_response = FrameInfo::MainThreadResponse::kIncluded; + } else if (begin_main_frame_start_.is_null() || + (frame_skip_reason_.has_value() && + frame_skip_reason() == FrameSkippedReason::kWaitingOnMain)) { + // If 'begin main frame' never started, or if it started, but it + // had to be skipped because it was waiting on the main-thread, + // then the main-thread update is missing from this reporter. + info.main_thread_response = FrameInfo::MainThreadResponse::kMissing; + } else { + info.main_thread_response = FrameInfo::MainThreadResponse::kIncluded; + } + if (!stage_history_.empty()) { const auto& stage = stage_history_.back(); if (stage.stage_type == StageType::kTotalLatency) { @@ -1433,8 +1455,6 @@ } } - info.scroll_thread = scrolling_thread_; - return info; }
diff --git a/cc/metrics/compositor_frame_reporting_controller_unittest.cc b/cc/metrics/compositor_frame_reporting_controller_unittest.cc index e0c8522..01d9953 100644 --- a/cc/metrics/compositor_frame_reporting_controller_unittest.cc +++ b/cc/metrics/compositor_frame_reporting_controller_unittest.cc
@@ -1848,12 +1848,12 @@ reporting_controller_.DidPresentCompositorFrame(1u, details); // Starts a new frame and submit it prior to commit - reporting_controller_.WillCommit(); - reporting_controller_.DidCommit(); + SimulateCommit(nullptr); const auto previous_id = current_id_; SimulateBeginMainFrame(); + DCHECK_NE(previous_id, current_id_); reporting_controller_.OnFinishImplFrame(current_id_); // Starts a new frame and submit it prior to its commit, but the older frame @@ -1862,13 +1862,11 @@ reporting_controller_.DidActivate(); reporting_controller_.DidSubmitCompositorFrame( - 1u, current_id_, previous_id, {}, /*has_missing_content=*/false); + 2u, current_id_, previous_id, {}, /*has_missing_content=*/false); details.presentation_feedback.timestamp = AdvanceNowByMs(10); - reporting_controller_.DidPresentCompositorFrame(1u, details); + reporting_controller_.DidPresentCompositorFrame(2u, details); - reporting_controller_.WillCommit(); - reporting_controller_.DidCommit(); - + SimulateCommit(nullptr); SimulatePresentCompositorFrame(); // There are two frames with partial updates
diff --git a/cc/metrics/dropped_frame_counter.cc b/cc/metrics/dropped_frame_counter.cc index 3ec53116..f3f8b593 100644 --- a/cc/metrics/dropped_frame_counter.cc +++ b/cc/metrics/dropped_frame_counter.cc
@@ -6,9 +6,9 @@ #include <algorithm> #include <cmath> +#include <iterator> #include "base/bind.h" -#include "base/logging.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_macros.h" #include "base/trace_event/trace_event.h" @@ -65,6 +65,27 @@ return current_index; } +double SlidingWindowHistogram::GetPercentDroppedFrameVariance() const { + double sum = 0; + size_t bin_count = sizeof(histogram_bins_) / sizeof(uint32_t); + for (size_t i = 0; i < bin_count; ++i) { + sum += histogram_bins_[i] * i; + } + double average = sum / total_count_; + sum = 0; // Sum is reset to be used for variance calculation + + for (size_t i = 0; i < bin_count; ++i) { + sum += histogram_bins_[i] * (i - average) * (i - average); + // histogram_bins_[i] is the number of PDFs which were in the range of + // [i,i+1) so i is used as the actual value which is repeated for + // histogram_bins_[i] times. + } + + if (total_count_ <= 1) + return 0; + return sum / (total_count_ - 1); +} + std::vector<double> SlidingWindowHistogram::GetPercentDroppedFrameBuckets() const { if (total_count_ == 0) @@ -273,6 +294,13 @@ static_cast<double>(total_smoothness_dropped_) * 100 / total_frames; smoothness_data.worst_smoothness = sliding_window_max_percent_dropped_; smoothness_data.percentile_95 = sliding_window_95pct_percent_dropped; + smoothness_data.median_smoothness = SlidingWindowMedianPercentDropped(); + + uint32_t default_variance = + static_cast<uint32_t>(SlidingWindowPercentDroppedVariance()); + DCHECK_GE(default_variance, 0u); + DCHECK_LE(default_variance, 5000u); + smoothness_data.variance = default_variance; std::vector<double> sliding_window_buckets = sliding_window_histogram_.GetPercentDroppedFrameBuckets();
diff --git a/cc/metrics/dropped_frame_counter.h b/cc/metrics/dropped_frame_counter.h index 1995b798..0b1e32b 100644 --- a/cc/metrics/dropped_frame_counter.h +++ b/cc/metrics/dropped_frame_counter.h
@@ -36,6 +36,7 @@ public: void AddPercentDroppedFrame(double percent_dropped_frame, size_t count = 1); uint32_t GetPercentDroppedFramePercentile(double percentile) const; + double GetPercentDroppedFrameVariance() const; std::vector<double> GetPercentDroppedFrameBuckets() const; void Clear(); std::ostream& Dump(std::ostream& stream) const; @@ -122,6 +123,14 @@ return sliding_window_histogram_.GetPercentDroppedFramePercentile(0.95); } + uint32_t SlidingWindowMedianPercentDropped() const { + return sliding_window_histogram_.GetPercentDroppedFramePercentile(0.5); + } + + double SlidingWindowPercentDroppedVariance() const { + return sliding_window_histogram_.GetPercentDroppedFrameVariance(); + } + const SlidingWindowHistogram* GetSlidingWindowHistogram() const { return &sliding_window_histogram_; }
diff --git a/cc/metrics/dropped_frame_counter_unittest.cc b/cc/metrics/dropped_frame_counter_unittest.cc index 98c2fada..c0cd00b 100644 --- a/cc/metrics/dropped_frame_counter_unittest.cc +++ b/cc/metrics/dropped_frame_counter_unittest.cc
@@ -14,6 +14,7 @@ #include "build/chromeos_buildflags.h" #include "cc/animation/animation_host.h" #include "cc/test/fake_content_layer_client.h" +#include "cc/test/fake_frame_info.h" #include "cc/test/fake_picture_layer.h" #include "cc/test/layer_tree_test.h" @@ -21,9 +22,9 @@ namespace { FrameInfo CreateStubFrameInfo(bool is_dropped) { - return {is_dropped ? FrameInfo::FrameFinalState::kDropped - : FrameInfo::FrameFinalState::kPresentedAll, - FrameInfo::SmoothThread::kSmoothBoth}; + return CreateFakeFrameInfo(is_dropped + ? FrameInfo::FrameFinalState::kDropped + : FrameInfo::FrameFinalState::kPresentedAll); } class DroppedFrameCounterTestBase : public LayerTreeTest { @@ -310,8 +311,17 @@ viz::BeginFrameArgs args_ = SimulateBeginFrameArgs(); dropped_frame_counter_.OnBeginFrame(args_, /*is_scroll_active=*/false); dropped_frame_counter_.OnBeginFrame(args_, /*is_scroll_active=*/false); - dropped_frame_counter_.OnEndFrame(args_, CreateStubFrameInfo(main_dropped)); - dropped_frame_counter_.OnEndFrame(args_, CreateStubFrameInfo(impl_dropped)); + + // End the 'main thread' arm of the fork. + auto main_info = CreateStubFrameInfo(main_dropped); + main_info.main_thread_response = FrameInfo::MainThreadResponse::kIncluded; + dropped_frame_counter_.OnEndFrame(args_, main_info); + + // End the 'compositor thread' arm of the fork. + auto impl_info = CreateStubFrameInfo(impl_dropped); + impl_info.main_thread_response = FrameInfo::MainThreadResponse::kMissing; + dropped_frame_counter_.OnEndFrame(args_, impl_info); + sequence_number_++; frame_time_ += interval_; } @@ -349,6 +359,14 @@ return dropped_frame_counter_.SlidingWindow95PercentilePercentDropped(); } + double PercentDroppedFrameMedian() { + return dropped_frame_counter_.SlidingWindowMedianPercentDropped(); + } + + double PercentDroppedFrameVariance() { + return dropped_frame_counter_.SlidingWindowPercentDroppedVariance(); + } + double GetTotalFramesInWindow() { return base::Seconds(1) / interval_; } void SetInterval(base::TimeDelta interval) { interval_ = interval; } @@ -412,7 +430,9 @@ // Which means a max of 67 dropped frames. EXPECT_EQ(std::round(MaxPercentDroppedFrame()), 67); EXPECT_EQ(PercentDroppedFrame95Percentile(), 67); // all values are in the - // 67th bucket, and as a result 95th percentile is also 67. + // 65th-67th bucket, and as a result 95th percentile is also 67. + EXPECT_EQ(PercentDroppedFrameMedian(), 65); + EXPECT_LE(PercentDroppedFrameVariance(), 1); } TEST_F(DroppedFrameCounterTest, SimplePattern2) { @@ -423,14 +443,18 @@ EXPECT_FLOAT_EQ(MaxPercentDroppedFrame(), expected_percent_dropped_frame); EXPECT_EQ(PercentDroppedFrame95Percentile(), 20); // all values are in the // 20th bucket, and as a result 95th percentile is also 20. + EXPECT_EQ(PercentDroppedFrameMedian(), 20); + EXPECT_LE(PercentDroppedFrameVariance(), 1); } TEST_F(DroppedFrameCounterTest, IncompleteWindow) { - // There are only 5 frames submitted and both Max and 95pct should report - // zero. + // There are only 5 frames submitted, so Max, 95pct, median and variance + // should report zero. SimulateFrameSequence({false, false, false, false, true}, 1); EXPECT_EQ(MaxPercentDroppedFrame(), 0.0); EXPECT_EQ(PercentDroppedFrame95Percentile(), 0); + EXPECT_EQ(PercentDroppedFrameMedian(), 0); + EXPECT_LE(PercentDroppedFrameVariance(), 1); } TEST_F(DroppedFrameCounterTest, MaxPercentDroppedChanges) { @@ -442,6 +466,8 @@ EXPECT_EQ(MaxPercentDroppedFrame(), expected_percent_dropped_frame1); EXPECT_FLOAT_EQ(PercentDroppedFrame95Percentile(), 20); // There is only one // element in the histogram and that is 20. + EXPECT_EQ(PercentDroppedFrameMedian(), 20); + EXPECT_LE(PercentDroppedFrameVariance(), 1); // 30 new frames are added that have 18 dropped frames. // and the 30 frame before that had 6 dropped frames.
diff --git a/cc/metrics/frame_info.cc b/cc/metrics/frame_info.cc index 7c9703c7..5334f7a 100644 --- a/cc/metrics/frame_info.cc +++ b/cc/metrics/frame_info.cc
@@ -6,6 +6,8 @@ #include <algorithm> +#include "build/build_config.h" + namespace cc { namespace { @@ -20,6 +22,21 @@ thread == FrameInfo::SmoothThread::kSmoothBoth; } +bool ValidateFinalStateIsForMainThread(FrameInfo::FrameFinalState state) { + switch (state) { + case FrameInfo::FrameFinalState::kPresentedPartialOldMain: + case FrameInfo::FrameFinalState::kPresentedPartialNewMain: + // Frames that contain main-thread update cannot have a 'partial update' + // state. + return false; + + case FrameInfo::FrameFinalState::kPresentedAll: + case FrameInfo::FrameFinalState::kNoUpdateDesired: + case FrameInfo::FrameFinalState::kDropped: + return true; + } +} + } // namespace bool FrameInfo::IsDroppedAffectingSmoothness() const { @@ -28,42 +45,67 @@ if (smooth_thread == SmoothThread::kSmoothNone) return false; - switch (final_state) { - case FrameFinalState::kDropped: - return true; - - case FrameFinalState::kPresentedAll: - case FrameFinalState::kPresentedPartialNewMain: - // If the frame includes new main-thread update, even if it's for an - // earlier begin-frame, then do not count it as a dropped frame affecting - // smoothness. - return false; - - case FrameFinalState::kPresentedPartialOldMain: - // Partial-update frames without new updates from the main-thread affect - // smoothness if the main-thread is expected to be smooth. - return smooth_thread == SmoothThread::kSmoothBoth || - smooth_thread == SmoothThread::kSmoothMain; - - case FrameFinalState::kNoUpdateDesired: - return false; + if (IsMainSmooth(smooth_thread) && WasMainUpdateDropped()) { + return true; } + + if (IsCompositorSmooth(smooth_thread) && WasCompositorUpdateDropped()) { + return true; + } + + return false; } -void FrameInfo::MergeWith(const FrameInfo& info) { +void FrameInfo::MergeWith(const FrameInfo& other) { +#if defined(OS_ANDROID) + // TODO(1278168): on android-webview, multiple frames can be submitted against + // the same BeginFrameArgs. This can trip the DCHECK()s in this function. + if (was_merged) + return; +#endif + DCHECK(!was_merged); + DCHECK(!other.was_merged); + DCHECK(Validate()); + DCHECK(other.Validate()); + + if (main_thread_response == MainThreadResponse::kIncluded) { + // |this| includes the main-thread updates. Therefore: + // - |other| must not also include main-thread updates. + // - |this| must have a valid final-state. + DCHECK_EQ(MainThreadResponse::kMissing, other.main_thread_response); + DCHECK(ValidateFinalStateIsForMainThread(final_state)); + + main_update_was_dropped = final_state == FrameFinalState::kDropped; + compositor_update_was_dropped = + other.final_state == FrameFinalState::kDropped; + } else { + // |this| does not include main-thread updates. Therefore: + // - |other| must include main-thread updates. + // - |other| must have a valid final-state. + DCHECK_EQ(MainThreadResponse::kIncluded, other.main_thread_response); + DCHECK(ValidateFinalStateIsForMainThread(other.final_state)); + + main_update_was_dropped = other.final_state == FrameFinalState::kDropped; + compositor_update_was_dropped = final_state == FrameFinalState::kDropped; + } + + was_merged = true; + main_thread_response = MainThreadResponse::kIncluded; + // The |scroll_thread| information cannot change once the frame starts. So // it should not need to be updated during merge. - DCHECK_EQ(scroll_thread, info.scroll_thread); + DCHECK_EQ(scroll_thread, other.scroll_thread); - if (info.has_missing_content) + if (other.has_missing_content) has_missing_content = true; - if (info.final_state == FrameFinalState::kDropped) + + if (other.final_state == FrameFinalState::kDropped) final_state = FrameFinalState::kDropped; const bool is_compositor_smooth = IsCompositorSmooth(smooth_thread) || - IsCompositorSmooth(info.smooth_thread); + IsCompositorSmooth(other.smooth_thread); const bool is_main_smooth = - IsMainSmooth(smooth_thread) || IsMainSmooth(info.smooth_thread); + IsMainSmooth(smooth_thread) || IsMainSmooth(other.smooth_thread); if (is_compositor_smooth && is_main_smooth) { smooth_thread = SmoothThread::kSmoothBoth; } else if (is_compositor_smooth) { @@ -74,7 +116,51 @@ smooth_thread = SmoothThread::kSmoothNone; } - total_latency = std::max(total_latency, info.total_latency); + total_latency = std::max(total_latency, other.total_latency); + + // Validate the state after the merge. + DCHECK(Validate()); +} + +bool FrameInfo::Validate() const { + // If |scroll_thread| is set, then the |smooth_thread| must include that + // thread. + if (scroll_thread == SmoothEffectDrivingThread::kCompositor) { + DCHECK(IsCompositorSmooth(smooth_thread)); + } else if (scroll_thread == SmoothEffectDrivingThread::kMain) { + DCHECK(IsMainSmooth(smooth_thread)); + } + + return true; +} + +bool FrameInfo::WasCompositorUpdateDropped() const { + if (was_merged) + return compositor_update_was_dropped; + return final_state == FrameFinalState::kDropped; +} + +bool FrameInfo::WasMainUpdateDropped() const { + if (was_merged) + return main_update_was_dropped; + + switch (final_state) { + case FrameFinalState::kDropped: + case FrameFinalState::kPresentedPartialOldMain: + return true; + + case FrameFinalState::kPresentedPartialNewMain: + // Although this frame dropped the main-thread updates for this particular + // frame, it did include new main-thread update. So do not treat this as a + // dropped frame. + return false; + + case FrameFinalState::kNoUpdateDesired: + case FrameFinalState::kPresentedAll: + return false; + } + + return false; } } // namespace cc
diff --git a/cc/metrics/frame_info.h b/cc/metrics/frame_info.h index 36721c86..db93d10 100644 --- a/cc/metrics/frame_info.h +++ b/cc/metrics/frame_info.h
@@ -45,6 +45,12 @@ }; SmoothThread smooth_thread = SmoothThread::kSmoothNone; + enum class MainThreadResponse { + kIncluded, + kMissing, + }; + MainThreadResponse main_thread_response = MainThreadResponse::kIncluded; + enum class SmoothEffectDrivingThread { kMain, kCompositor, kUnknown }; SmoothEffectDrivingThread scroll_thread = SmoothEffectDrivingThread::kUnknown; @@ -57,6 +63,16 @@ bool IsDroppedAffectingSmoothness() const; void MergeWith(const FrameInfo& info); + + bool Validate() const; + + bool WasCompositorUpdateDropped() const; + bool WasMainUpdateDropped() const; + + private: + bool was_merged = false; + bool compositor_update_was_dropped = false; + bool main_update_was_dropped = false; }; } // namespace cc
diff --git a/cc/metrics/frame_sorter.cc b/cc/metrics/frame_sorter.cc index f14d4c84..a74d723 100644 --- a/cc/metrics/frame_sorter.cc +++ b/cc/metrics/frame_sorter.cc
@@ -64,6 +64,7 @@ while (pending_frames_.size() > kPendingFramesMaxSize) { const auto& first = pending_frames_.front(); frame_states_.erase(first.frame_id); + frame_infos_.erase(first.frame_id); pending_frames_.pop_front(); } } @@ -98,6 +99,7 @@ if (frame_state.should_ignore()) { // The associated frame in pending_frames_ was already removed in Reset(). frame_states_.erase(args.frame_id); + frame_infos_.erase(args.frame_id); return; }
diff --git a/cc/metrics/frame_sorter_unittest.cc b/cc/metrics/frame_sorter_unittest.cc index bbe7ece..0672e6f 100644 --- a/cc/metrics/frame_sorter_unittest.cc +++ b/cc/metrics/frame_sorter_unittest.cc
@@ -11,6 +11,7 @@ #include "base/bind.h" #include "base/strings/string_number_conversions.h" #include "cc/metrics/frame_info.h" +#include "cc/test/fake_frame_info.h" #include "testing/gtest/include/gtest/gtest.h" namespace cc { @@ -51,6 +52,9 @@ // "R": Reset the frame sorter. // Method expects the start of frames to be in order starting with 1. void SimulateQueries(std::vector<std::string> queries) { + // Keeps track of how many times a frame is terminated. + std::map<int, int> end_counters; + for (auto& query : queries) { int id; base::StringToInt(query.substr(1), &id); @@ -63,13 +67,35 @@ frame_sorter_.AddNewFrame(args_[id]); break; case 'D': { - FrameInfo info = {FrameInfo::FrameFinalState::kDropped, - FrameInfo::SmoothThread::kSmoothBoth}; + ++end_counters[id]; + FrameInfo info = + CreateFakeFrameInfo(FrameInfo::FrameFinalState::kDropped); + if (end_counters[id] == 1) { + // For the first response to the frame, mark it as not including + // update from the main-thread. + info.main_thread_response = FrameInfo::MainThreadResponse::kMissing; + } else { + DCHECK_EQ(2, end_counters[id]); + info.main_thread_response = + FrameInfo::MainThreadResponse::kIncluded; + } frame_sorter_.AddFrameResult(args_[id], info); break; } case 'P': { - frame_sorter_.AddFrameResult(args_[id], {}); + ++end_counters[id]; + FrameInfo info = + CreateFakeFrameInfo(FrameInfo::FrameFinalState::kPresentedAll); + if (end_counters[id] == 1) { + // For the first response to the frame, mark it as not including + // update from the main-thread. + info.main_thread_response = FrameInfo::MainThreadResponse::kMissing; + } else { + DCHECK_EQ(2, end_counters[id]); + info.main_thread_response = + FrameInfo::MainThreadResponse::kIncluded; + } + frame_sorter_.AddFrameResult(args_[id], info); break; } case 'I':
diff --git a/cc/test/fake_frame_info.cc b/cc/test/fake_frame_info.cc new file mode 100644 index 0000000..9640323 --- /dev/null +++ b/cc/test/fake_frame_info.cc
@@ -0,0 +1,16 @@ +// 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 "cc/test/fake_frame_info.h" + +namespace cc { + +FrameInfo CreateFakeFrameInfo(FrameInfo::FrameFinalState state) { + FrameInfo info; + info.final_state = state; + info.smooth_thread = FrameInfo::SmoothThread::kSmoothBoth; + return info; +} + +} // namespace cc
diff --git a/cc/test/fake_frame_info.h b/cc/test/fake_frame_info.h new file mode 100644 index 0000000..86ff412 --- /dev/null +++ b/cc/test/fake_frame_info.h
@@ -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. + +#ifndef CC_TEST_FAKE_FRAME_INFO_H_ +#define CC_TEST_FAKE_FRAME_INFO_H_ + +#include "cc/metrics/frame_info.h" + +namespace cc { + +// Creates and returns a FrameInfo instance with the desired |state|. +FrameInfo CreateFakeFrameInfo(FrameInfo::FrameFinalState state); + +} // namespace cc + +#endif // CC_TEST_FAKE_FRAME_INFO_H_
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 44cebdcb7..7bb7d0d 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -50,6 +50,7 @@ #include "cc/resources/ui_resource_bitmap.h" #include "cc/resources/ui_resource_manager.h" #include "cc/test/animation_test_common.h" +#include "cc/test/fake_frame_info.h" #include "cc/test/fake_impl_task_runner_provider.h" #include "cc/test/fake_layer_tree_frame_sink.h" #include "cc/test/fake_layer_tree_host_impl.h" @@ -14048,9 +14049,8 @@ BEGINFRAME_FROM_HERE, 1u /*source_id*/, 2u /*sequence_number*/, now, deadline, interval, viz::BeginFrameArgs::NORMAL); - dropped_frame_counter->OnEndFrame(args, - {FrameInfo::FrameFinalState::kDropped, - FrameInfo::SmoothThread::kSmoothBoth}); + dropped_frame_counter->OnEndFrame( + args, CreateFakeFrameInfo(FrameInfo::FrameFinalState::kDropped)); // FCP not received, so the total_smoothness_dropped_ won't increase. EXPECT_EQ(dropped_frame_counter->total_smoothness_dropped(), 0u); @@ -14058,9 +14058,8 @@ begin_frame_metrics.should_measure_smoothness = true; host_impl_->ReadyToCommit(args, &begin_frame_metrics); dropped_frame_counter->SetTimeFcpReceivedForTesting(args.frame_time); - dropped_frame_counter->OnEndFrame(args, - {FrameInfo::FrameFinalState::kDropped, - FrameInfo::SmoothThread::kSmoothBoth}); + dropped_frame_counter->OnEndFrame( + args, CreateFakeFrameInfo(FrameInfo::FrameFinalState::kDropped)); EXPECT_EQ(dropped_frame_counter->total_smoothness_dropped(), 1u); total_frame_counter->set_total_frames_for_testing(1u);
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc index dcdf461..42dadea3 100644 --- a/cc/trees/layer_tree_host_unittest.cc +++ b/cc/trees/layer_tree_host_unittest.cc
@@ -39,6 +39,7 @@ #include "cc/paint/image_animation_count.h" #include "cc/resources/ui_resource_manager.h" #include "cc/test/fake_content_layer_client.h" +#include "cc/test/fake_frame_info.h" #include "cc/test/fake_layer_tree_host_client.h" #include "cc/test/fake_paint_image_generator.h" #include "cc/test/fake_painted_scrollbar_layer.h" @@ -118,6 +119,12 @@ return node->subtree_has_copy_request; } +FrameInfo CreateFakeImplDroppedFrameInfo() { + auto info = CreateFakeFrameInfo(FrameInfo::FrameFinalState::kDropped); + info.main_thread_response = FrameInfo::MainThreadResponse::kMissing; + return info; +} + using LayerTreeHostTest = LayerTreeTest; class LayerTreeHostTestHasImplThreadTest : public LayerTreeHostTest { @@ -9950,8 +9957,7 @@ // Mark every frame as a dropped frame affecting smoothness. host_impl->dropped_frame_counter()->OnEndFrame( - last_args_, {FrameInfo::FrameFinalState::kDropped, - FrameInfo::SmoothThread::kSmoothBoth}); + last_args_, CreateFakeImplDroppedFrameInfo()); host_impl->SetNeedsRedraw(); --frames_counter_; } @@ -10003,10 +10009,11 @@ return; } - // Mark every frame as a dropped frame affecting smoothness. + // Mark every frame as a dropped frame affecting smoothness. This happens + // entirely on the compositor thread, so mark it as not including + // main-thread update. host_impl->dropped_frame_counter()->OnEndFrame( - last_args_, {FrameInfo::FrameFinalState::kDropped, - FrameInfo::SmoothThread::kSmoothBoth}); + last_args_, CreateFakeImplDroppedFrameInfo()); host_impl->SetNeedsRedraw(); --frames_counter_; }
diff --git a/chrome/VERSION b/chrome/VERSION index 3ae6dfc2..e8432c4 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=98 MINOR=0 -BUILD=4756 +BUILD=4757 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index fbdfe26..d869fe7 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -2920,7 +2920,6 @@ "enable_lint", "enforce_resource_overlays_in_tests", "shared_libraries", - "use_vpython3", ]) testonly = true
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index cfa404a0..f9934ad 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -309,7 +309,6 @@ "java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/RelatedSearchesControl.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMediator.java", - "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabSheetContent.java", "java/src/org/chromium/chrome/browser/compositor/layouts/EmptyOverviewModeObserver.java", "java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java",
diff --git a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_el.xtb b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_el.xtb index 557b81c..0242332 100644 --- a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_el.xtb +++ b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_el.xtb
@@ -4,5 +4,8 @@ <translation id="1938981467853765413">Στείλτε τα σχόλιά σας</translation> <translation id="360207483134687714">Συμβάλλετε στη βελτίωση της εμπειρίας VR στο Chrome</translation> <translation id="3789841737615482174">Εγκατάσταση</translation> +<translation id="4088809042407767679">Ενημέρωση Υπηρεσιών Google VR;</translation> +<translation id="4648883053543509795">Εγκατάσταση Υπηρεσιών Google VR;</translation> <translation id="473775607612524610">Ενημέρωση</translation> +<translation id="5010116926836661047">Προβολή περιεχομένου εικονικής πραγματικότητας</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_es-419.xtb b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_es-419.xtb index e2cda718..fa1c8b7 100644 --- a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_es-419.xtb +++ b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_es-419.xtb
@@ -4,5 +4,8 @@ <translation id="1938981467853765413">Hacer comentarios</translation> <translation id="360207483134687714">Ayuda a mejorar la experiencia de RV en Chrome</translation> <translation id="3789841737615482174">Instalar</translation> +<translation id="4088809042407767679">¿Quieres actualizar Servicios de RV de Google?</translation> +<translation id="4648883053543509795">¿Quieres instalar Servicios de RV de Google?</translation> <translation id="473775607612524610">Actualizar</translation> +<translation id="5010116926836661047">Ve contenido de realidad virtual</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_ne.xtb b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_ne.xtb index 8daf29d8..d0df4ee 100644 --- a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_ne.xtb +++ b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_ne.xtb
@@ -4,5 +4,8 @@ <translation id="1938981467853765413">प्रतिक्रिया दिनुहोस्</translation> <translation id="360207483134687714">Chrome मा VR अनुभवलाई सुधार गर्न मद्दत गर्नुहोस्</translation> <translation id="3789841737615482174">स्थापना गर्नुहोस्</translation> +<translation id="4088809042407767679">Google का VR सेवाहरू अपडेट गर्ने हो?</translation> +<translation id="4648883053543509795">Google का VR सेवाहरू इन्स्टल गर्नुहोस्?</translation> <translation id="473775607612524610">अपडेट गर्नुहोस्</translation> +<translation id="5010116926836661047">भर्चुअल रियालिटीसम्बन्धी सामग्री हेर्नुहोस्</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_nl.xtb b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_nl.xtb index 70a93a3..e61f2f22 100644 --- a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_nl.xtb +++ b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_nl.xtb
@@ -4,5 +4,8 @@ <translation id="1938981467853765413">Feedback geven</translation> <translation id="360207483134687714">Help bij het verbeteren van de VR-functionaliteit in Chrome</translation> <translation id="3789841737615482174">Installeren</translation> +<translation id="4088809042407767679">VR-services van Google updaten?</translation> +<translation id="4648883053543509795">VR-services van Google installeren?</translation> <translation id="473775607612524610">Updaten</translation> +<translation id="5010116926836661047">Virtual reality-content bekijken</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_pt-BR.xtb b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_pt-BR.xtb index 2f9c7d34..b8d20c7 100644 --- a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_pt-BR.xtb +++ b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_pt-BR.xtb
@@ -4,5 +4,8 @@ <translation id="1938981467853765413">Enviar feedback</translation> <translation id="360207483134687714">Ajude a melhorar a experiência de realidade virtual no Chrome</translation> <translation id="3789841737615482174">Instalar</translation> +<translation id="4088809042407767679">Atualizar os Serviços de RV do Google?</translation> +<translation id="4648883053543509795">Instalar Serviços de RV do Google?</translation> <translation id="473775607612524610">Atualizar</translation> +<translation id="5010116926836661047">Ver conteúdo de realidade virtual</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_ro.xtb b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_ro.xtb index 1147e292..d86eef2 100644 --- a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_ro.xtb +++ b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_ro.xtb
@@ -4,5 +4,8 @@ <translation id="1938981467853765413">Trimite feedback</translation> <translation id="360207483134687714">Ajută la îmbunătățirea experienței RV în Chrome</translation> <translation id="3789841737615482174">Instalează</translation> +<translation id="4088809042407767679">Actualizezi Serviciile RV de la Google?</translation> +<translation id="4648883053543509795">Instalezi Serviciile RV de la Google?</translation> <translation id="473775607612524610">Actualizează</translation> +<translation id="5010116926836661047">Vezi conținutul în realitatea virtuală</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_ta.xtb b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_ta.xtb index 897e162..e4df5ef7 100644 --- a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_ta.xtb +++ b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_ta.xtb
@@ -4,5 +4,8 @@ <translation id="1938981467853765413">கருத்துத் தெரிவி</translation> <translation id="360207483134687714">Chrome இல் VR அனுபவத்தை மேம்படுத்த உதவவும்</translation> <translation id="3789841737615482174">நிறுவுக</translation> +<translation id="4088809042407767679">Google VR சேவைகளைப் புதுப்பிக்கவா?</translation> +<translation id="4648883053543509795">Google VR சேவைகளை நிறுவ வேண்டுமா?</translation> <translation id="473775607612524610">புதுப்பி</translation> +<translation id="5010116926836661047">விர்ச்சுவல் ரியாலிட்டி உள்ளடக்கத்தைப் பார்க்கலாம்</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/context_menu_header.xml b/chrome/android/java/res/layout/context_menu_header.xml index 2044d28..dcfef31a 100644 --- a/chrome/android/java/res/layout/context_menu_header.xml +++ b/chrome/android/java/res/layout/context_menu_header.xml
@@ -16,6 +16,7 @@ android:paddingEnd="@dimen/context_menu_list_lateral_padding"> <FrameLayout + android:id="@+id/menu_header_image_container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp">
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java index a7340d09..042d0d17 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java
@@ -487,7 +487,8 @@ if (bookmarkItem.getId().getType() == BookmarkType.READING_LIST && !bookmarkItem.isFolder()) { - openReadingListInCustomTab(context, bookmarkItem.getUrl().getSpec(), isIncognito); + openReadingListItem(context, bookmarkItem.getUrl().getSpec(), openBookmarkComponentName, + isIncognito); model.setReadStatusForReadingList(bookmarkItem.getUrl(), true); } else { openUrl(context, bookmarkItem.getUrl().getSpec(), openBookmarkComponentName); @@ -561,6 +562,15 @@ IntentHandler.startActivityForTrustedIntent(intent); } + private static void openReadingListItem( + Context context, String url, ComponentName componentName, boolean isOffTheRecord) { + if (ReadingListFeatures.shouldUseCustomTab()) { + openReadingListInCustomTab(context, url, isOffTheRecord); + } else { + openUrl(context, url, componentName); + } + } + private static void openReadingListInCustomTab( Context context, String url, boolean isOffTheRecord) { CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ReadingListFeatures.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ReadingListFeatures.java index d23584b..ee384f0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ReadingListFeatures.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/ReadingListFeatures.java
@@ -18,6 +18,7 @@ * Default: {@code false}</li> * <li>{@code session_length}: int (seconds); duration Chrome needs to spend in background before it * discards the "last bookmark location". Default: {@link #DEFAULT_SESSION_LENGTH_SECONDS}</li> + * <li>{@code use_cct}: boolean; open Reading list items in CCT. Default: {@code true}</li> * <li>{@code use_root_bookmark_as_default}: boolean; use the root folder rather than "Mobile * bookmarks" as the default bookmark folder. Default: {@code false}</li> * <li>{@code read_later_min_version}: boolean; see {@link BookmarkFeatures#VERSION}.</li> @@ -40,6 +41,14 @@ <= VERSION; } + /** Returns whether Reading list items should open in a custom tab. */ + public static boolean shouldUseCustomTab() { + // Default value is `true`. + if (!isReadingListEnabled()) return true; + return ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean( + ChromeFeatureList.READ_LATER, "use_cct", true); + } + /** Returns whether the root folder should be used as the default location. */ public static boolean shouldUseRootFolderAsDefaultForReadLater() { return isReadingListEnabled()
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java index f451b0f..d1b5f762 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java
@@ -62,7 +62,6 @@ private final ActivityTabProvider mTabProvider; private final Supplier<TabCreator> mTabCreator; private final BottomSheetController mBottomSheetController; - private final EphemeralTabMetrics mMetrics = new EphemeralTabMetrics(); private final boolean mCanPromoteToNewTab; private EphemeralTabMediator mMediator; @@ -75,7 +74,6 @@ private GURL mUrl; private int mCurrentMaxViewHeight; private boolean mPeeked; - private boolean mViewed; // Moved up from peek state by user private boolean mFullyOpened; /** @@ -132,8 +130,8 @@ float topControlsHeight = mContext.getResources().getDimensionPixelSize(R.dimen.toolbar_height_no_shadow) / mWindow.getDisplay().getDipScale(); - mMediator = new EphemeralTabMediator(mBottomSheetController, - new FaviconLoader(mContext), mMetrics, (int) topControlsHeight); + mMediator = new EphemeralTabMediator( + mBottomSheetController, new FaviconLoader(mContext), (int) topControlsHeight); } if (mWebContents == null) { assert mSheetContent == null; @@ -148,26 +146,16 @@ } @Override - public void onSheetOpened(@StateChangeReason int reason) { - if (!mViewed) { - mMetrics.recordMetricsForViewed(); - mViewed = true; - } - } - - @Override public void onSheetStateChanged(int newState, int reason) { if (mSheetContent == null) return; switch (newState) { case SheetState.PEEK: if (!mPeeked) { - mMetrics.recordMetricsForPeeked(); mPeeked = true; } break; case SheetState.FULL: if (!mFullyOpened) { - mMetrics.recordMetricsForOpened(); mFullyOpened = true; } break; @@ -191,7 +179,6 @@ } mPeeked = false; - mViewed = false; mFullyOpened = false; mMediator.requestShowContent(url, title); @@ -246,7 +233,6 @@ mSheetContent, /* animate= */ true, StateChangeReason.PROMOTE_TAB); mTabCreator.get().createNewTab(new LoadUrlParams(mUrl.getSpec(), PageTransition.LINK), TabLaunchType.FROM_LINK, mTabProvider.get()); - mMetrics.recordOpenInNewTab(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMediator.java index ce0b407..d213035b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMediator.java
@@ -35,7 +35,6 @@ private final BottomSheetController mBottomSheetController; private final EphemeralTabCoordinator.FaviconLoader mFaviconLoader; - private final EphemeralTabMetrics mMetrics; private final int mTopControlsHeightDp; private WebContents mWebContents; @@ -48,11 +47,9 @@ * Constructor. */ public EphemeralTabMediator(BottomSheetController bottomSheetController, - EphemeralTabCoordinator.FaviconLoader faviconLoader, EphemeralTabMetrics metrics, - int topControlsHeightDp) { + EphemeralTabCoordinator.FaviconLoader faviconLoader, int topControlsHeightDp) { mBottomSheetController = bottomSheetController; mFaviconLoader = faviconLoader; - mMetrics = metrics; mTopControlsHeightDp = topControlsHeightDp; } @@ -100,7 +97,6 @@ @Override public void didStartNavigation(NavigationHandle navigation) { - mMetrics.recordNavigateLink(); if (navigation.isInPrimaryMainFrame() && !navigation.isSameDocument()) { GURL url = navigation.getUrl(); if (url.equals(mCurrentUrl)) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java deleted file mode 100644 index d0beb5863..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java +++ /dev/null
@@ -1,117 +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. - -package org.chromium.chrome.browser.compositor.bottombar.ephemeraltab; - -import org.chromium.base.TimeUtils; -import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.metrics.RecordUserAction; - -/** - * Metrics util class for ephemeral tab. - */ -public class EphemeralTabMetrics { - /** Remembers whether the panel was opened to the peeking state. */ - private boolean mDidRecordFirstPeek; - - /** The timestamp when the panel entered the peeking state for the first time. */ - private long mPanelPeekedNanoseconds; - - /** Remembers whether the panel was opened fully. */ - private boolean mDidRecordFirstOpen; - - /** The timestamp when the panel entered the opened state for the first time. */ - private long mPanelOpenedNanoseconds; - - /** Whether the panel is in any visible state. */ - private boolean mIsVisible; - - /** Whether the panel was opened beyond peeking state. */ - private boolean mIsViewed; - - /** Records metrics for the peeked panel state. */ - public void recordMetricsForPeeked() { - mIsVisible = true; - startPeekTimer(); - // Could be returning to Peek from Open. - finishOpenTimer(); - } - - /** Records metrics when the panel has gone beyond peek state. */ - public void recordMetricsForViewed() { - mIsViewed = true; - finishPeekTimer(); - } - - /** Records metrics when the panel has been fully opened. */ - public void recordMetricsForOpened() { - mIsVisible = true; - startOpenTimer(); - finishPeekTimer(); - } - - /** Records metrics when the panel has been closed. */ - private void recordMetricsForClosed() { - if (!mIsVisible) return; - - finishPeekTimer(); - finishOpenTimer(); - RecordHistogram.recordBooleanHistogram("EphemeralTab.CtrPeek", mIsViewed); - RecordHistogram.recordBooleanHistogram("EphemeralTab.Ctr", mDidRecordFirstOpen); - reset(); - } - - /** Records a user action that promotes the ephemeral tab to a full tab. */ - public void recordOpenInNewTab() { - recordMetricsForClosed(); - RecordUserAction.record("EphemeralTab.OpenInNewTab"); - } - - /** Records a user action that navigates to a new link on the ephemeral tab. */ - public void recordNavigateLink() { - RecordUserAction.record("EphemeralTab.NavigateLink"); - } - - /** Resets all internal state including metrics and timers. */ - private void reset() { - mDidRecordFirstPeek = false; - mPanelPeekedNanoseconds = 0; - mDidRecordFirstOpen = false; - mPanelOpenedNanoseconds = 0; - mIsVisible = false; - mIsViewed = false; - } - - /** Starts timing the peek state if it's not already been started. */ - private void startPeekTimer() { - if (mPanelPeekedNanoseconds == 0) mPanelPeekedNanoseconds = System.nanoTime(); - } - - /** Finishes timing metrics for the first peek state, unless that has already been done. */ - private void finishPeekTimer() { - if (!mDidRecordFirstPeek && mPanelPeekedNanoseconds != 0) { - mDidRecordFirstPeek = true; - long durationPeeking = (System.nanoTime() - mPanelPeekedNanoseconds) - / TimeUtils.NANOSECONDS_PER_MILLISECOND; - RecordHistogram.recordMediumTimesHistogram( - "EphemeralTab.DurationPeeked", durationPeeking); - } - } - - /** Starts timing the open state if it's not already been started. */ - private void startOpenTimer() { - if (mPanelOpenedNanoseconds == 0) mPanelOpenedNanoseconds = System.nanoTime(); - } - - /** Finishes timing metrics for the first open state, unless that has already been done. */ - private void finishOpenTimer() { - if (!mDidRecordFirstOpen && mPanelOpenedNanoseconds != 0) { - mDidRecordFirstOpen = true; - long durationOpened = (System.nanoTime() - mPanelOpenedNanoseconds) - / TimeUtils.NANOSECONDS_PER_MILLISECOND; - RecordHistogram.recordMediumTimesHistogram( - "EphemeralTab.DurationOpened", durationOpened); - } - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderCoordinator.java index aa1ed62..4afb017 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderCoordinator.java
@@ -8,6 +8,7 @@ import android.text.SpannableString; import android.text.TextUtils; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.ChromeAutocompleteSchemeClassifier; import org.chromium.chrome.browser.performance_hints.PerformanceHintsObserver.PerformanceClass; import org.chromium.chrome.browser.profiles.Profile; @@ -29,6 +30,8 @@ } private PropertyModel buildModel(String title, CharSequence url) { + boolean hideHeaderImage = + ChromeFeatureList.isEnabled(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE); return new PropertyModel.Builder(ContextMenuHeaderProperties.ALL_KEYS) .with(ContextMenuHeaderProperties.TITLE, title) .with(ContextMenuHeaderProperties.TITLE_MAX_LINES, TextUtils.isEmpty(url) ? 2 : 1) @@ -38,6 +41,7 @@ PerformanceClass.PERFORMANCE_UNKNOWN) .with(ContextMenuHeaderProperties.IMAGE, null) .with(ContextMenuHeaderProperties.CIRCLE_BG_VISIBLE, false) + .with(ContextMenuHeaderProperties.HIDE_HEADER_IMAGE, hideHeaderImage) .build(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderMediator.java index cb41d4a..47ce1aa 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderMediator.java
@@ -48,19 +48,23 @@ mModel = model; mModel.set(ContextMenuHeaderProperties.TITLE_AND_URL_CLICK_LISTENER, this); - if (params.isImage()) { - final Resources res = mContext.getResources(); - final int imageMaxSize = - res.getDimensionPixelSize(R.dimen.context_menu_header_image_max_size); - nativeDelegate.retrieveImageForContextMenu( - imageMaxSize, imageMaxSize, this::onImageThumbnailRetrieved); - } else if (!params.isImage() && !params.isVideo()) { - LargeIconBridge iconBridge = new LargeIconBridge(profile); - iconBridge.getLargeIconForUrl(mPlainUrl, - context.getResources().getDimensionPixelSize(R.dimen.default_favicon_min_size), - this::onFaviconAvailable); - } else if (params.isVideo()) { - setVideoIcon(); + // Skip setting up the image header if context menu is in pop up style. + if (!model.get(ContextMenuHeaderProperties.HIDE_HEADER_IMAGE)) { + if (params.isImage()) { + final Resources res = mContext.getResources(); + final int imageMaxSize = + res.getDimensionPixelSize(R.dimen.context_menu_header_image_max_size); + nativeDelegate.retrieveImageForContextMenu( + imageMaxSize, imageMaxSize, this::onImageThumbnailRetrieved); + } else if (!params.isImage() && !params.isVideo()) { + LargeIconBridge iconBridge = new LargeIconBridge(profile); + iconBridge.getLargeIconForUrl(mPlainUrl, + context.getResources().getDimensionPixelSize( + R.dimen.default_favicon_min_size), + this::onFaviconAvailable); + } else if (params.isVideo()) { + setVideoIcon(); + } } if (PerformanceHintsObserver.isContextMenuPerformanceInfoEnabled() && params.isAnchor()) { mModel.set(ContextMenuHeaderProperties.URL_PERFORMANCE_CLASS, performanceClass);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderProperties.java index 6647869..2f3c0d4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderProperties.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderProperties.java
@@ -25,7 +25,10 @@ new PropertyModel.WritableBooleanPropertyKey(); public static final WritableIntPropertyKey URL_PERFORMANCE_CLASS = new WritableIntPropertyKey(); + public static final PropertyModel.WritableBooleanPropertyKey HIDE_HEADER_IMAGE = + new PropertyModel.WritableBooleanPropertyKey(); + public static final PropertyKey[] ALL_KEYS = {TITLE, TITLE_MAX_LINES, URL, TITLE_AND_URL_CLICK_LISTENER, URL_MAX_LINES, IMAGE, CIRCLE_BG_VISIBLE, - URL_PERFORMANCE_CLASS}; + URL_PERFORMANCE_CLASS, HIDE_HEADER_IMAGE}; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderViewBinder.java index 88b5785..38d7b05 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderViewBinder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderViewBinder.java
@@ -68,6 +68,11 @@ .setVisibility(performanceClass == PerformanceClass.PERFORMANCE_FAST ? View.VISIBLE : View.GONE); + } else if (propertyKey == ContextMenuHeaderProperties.HIDE_HEADER_IMAGE) { + final boolean hideHeaderImage = + model.get(ContextMenuHeaderProperties.HIDE_HEADER_IMAGE); + view.findViewById(R.id.menu_header_image_container) + .setVisibility(hideHeaderImage ? View.GONE : View.VISIBLE); } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java index 1091857..3b80383 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java
@@ -97,12 +97,14 @@ /* package */ class PartialCustomTabHandleStrategy extends GestureDetector.SimpleOnGestureListener implements CustomTabToolbar.HandleStrategy { + private static final int CLOSE_DISTANCE = 300; private GestureDetector mGestureDetector; private float mLastPosY; private float mLastDownPosY; private float mMostRecentYDistance; private float mInitialY; private boolean mSeenFirstMoveOrDown; + private Runnable mCloseHandler; public PartialCustomTabHandleStrategy(Context context) { mGestureDetector = new GestureDetector(context, this, ThreadUtils.getUiThreadHandler()); @@ -153,6 +155,10 @@ if (y - mLastPosY != 0) { mMostRecentYDistance = y - mLastPosY; } + if (mStatus == HeightStatus.INITIAL_HEIGHT + && y - mInitialY > CLOSE_DISTANCE) { + mCloseHandler.run(); + } } mLastPosY = y; return true; @@ -172,6 +178,11 @@ } @Override + public void setCloseClickHandler(Runnable handler) { + mCloseHandler = handler; + } + + @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // Always intercept scroll events. return true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java index c1ef788e..cee80e7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
@@ -166,6 +166,13 @@ * @return whether the event is consumed.. */ boolean onTouchEvent(MotionEvent event); + + /** + * Set a handler to close the current tab. + * + * @param handler The handler for closing the current tab. + */ + void setCloseClickHandler(Runnable handler); } private HandleStrategy mHandleStrategy; @@ -352,6 +359,7 @@ public void setHandleStrategy(HandleStrategy strategy) { mHandleStrategy = strategy; + mHandleStrategy.setCloseClickHandler(mCloseButton::callOnClick); } private void updateButtonsTint() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java index bf2b272..29d1d47b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java
@@ -10,7 +10,9 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.Callback; +import org.chromium.chrome.browser.night_mode.AutoDarkFeedbackSource; import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.url.GURL; import java.util.ArrayList; import java.util.List; @@ -43,7 +45,8 @@ @VisibleForTesting @Override - protected List<FeedbackSource> buildSynchronousFeedbackSources(InitParams initParams) { + protected List<FeedbackSource> buildSynchronousFeedbackSources( + Activity activity, InitParams initParams) { List<FeedbackSource> sources = new ArrayList<>(); // This is the list of all synchronous sources of feedback. Please add new synchronous @@ -57,6 +60,8 @@ sources.add(new IMEFeedbackSource()); sources.add(new PermissionFeedbackSource()); sources.add(new FeedbackContextFeedbackSource(initParams.feedbackContext)); + sources.add( + new AutoDarkFeedbackSource(initParams.profile, activity, new GURL(initParams.url))); return sources; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feedback/FeedFeedbackCollector.java b/chrome/android/java/src/org/chromium/chrome/browser/feedback/FeedFeedbackCollector.java index faf80ccc..2401046 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/feedback/FeedFeedbackCollector.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/feedback/FeedFeedbackCollector.java
@@ -45,7 +45,8 @@ @VisibleForTesting @Override - protected List<FeedbackSource> buildSynchronousFeedbackSources(InitParams initParams) { + protected List<FeedbackSource> buildSynchronousFeedbackSources( + Activity activity, InitParams initParams) { List<FeedbackSource> sources = new ArrayList<>(); // Since Interest feed feedback goes to a different destiation, we don't include other PSD
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java index 189bf60..c2f3b39 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.tabmodel; +import androidx.annotation.Nullable; + import org.chromium.base.ObserverList; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.tab.Tab; @@ -35,9 +37,14 @@ private final TabModelFilterFactory mTabModelFilterFactory; private int mActiveModelIndex; + private final ObserverList<TabModelSelectorObserver> mObservers = new ObserverList<>(); private final ObserverList<IncognitoTabModelObserver> mIncognitoObservers = new ObserverList<>(); + + @Nullable + private IncognitoReauthDialogDelegate mIncognitoReauthDialogDelegate; + private boolean mTabStateInitialized; private boolean mStartIncognito; private boolean mReparentingInProgress; @@ -129,6 +136,11 @@ for (TabModelSelectorObserver listener : mObservers) { listener.onTabModelSelected(newModel, previousModel); } + + // This should be invoked after all the other observers have been notified. + if (mIncognitoReauthDialogDelegate != null) { + mIncognitoReauthDialogDelegate.onAfterTabModelSelected(newModel, previousModel); + } } @Override @@ -358,4 +370,10 @@ observer.didBecomeEmpty(); } } + + @Override + public void setIncognitoReauthDialogDelegate( + IncognitoReauthDialogDelegate incognitoReauthDialogDelegate) { + mIncognitoReauthDialogDelegate = incognitoReauthDialogDelegate; + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java index 84a2aee..fd45e505 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java
@@ -1259,6 +1259,38 @@ } @Test + @SmallTest + @Features.EnableFeatures( + {ChromeFeatureList.BOOKMARK_BOTTOM_SHEET, ChromeFeatureList.READ_LATER + "<Study"}) + @CommandLineFlags. + Add({"force-fieldtrials=Study/Group", "force-fieldtrial-params=Study.Group:use_cct/false"}) + public void + testReadingListOpenInRegularTab() throws Exception { + addReadingListBookmark(TEST_PAGE_TITLE_GOOGLE, mTestUrlA); + BookmarkPromoHeader.forcePromoStateForTests(SyncPromoState.NO_PROMO); + openBookmarkManager(); + CriteriaHelper.pollUiThread(() -> mBookmarkModel.getReadingListItem(mTestUrlA) != null); + + // Open the "Reading list" folder. + TestThreadUtils.runOnUiThreadBlocking( + () -> mManager.openFolder(mBookmarkModel.getRootFolderId())); + onView(withText("Reading list")).perform(click()); + RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); + View readingListRow = mItemsContainer.findViewHolderForAdapterPosition(1).itemView; + Assert.assertEquals("The 2nd view should be reading list.", BookmarkType.READING_LIST, + getIdByPosition(1).getType()); + TestThreadUtils.runOnUiThreadBlocking(() -> TouchCommon.singleClickView(readingListRow)); + + ChromeTabbedActivity activity = waitForTabbedActivity(); + CriteriaHelper.pollUiThread(() -> { + Tab activityTab = activity.getActivityTab(); + Criteria.checkThat(activityTab, Matchers.notNullValue()); + Criteria.checkThat(activityTab.getUrl(), Matchers.notNullValue()); + Criteria.checkThat(activityTab.getUrl(), Matchers.is(mTestUrlA)); + }); + } + + @Test @MediumTest public void testMoveUpMenuItem() throws Exception { addBookmark(TEST_PAGE_TITLE_GOOGLE, mTestUrlA);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderViewTest.java index 8d23759..fce1b538 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderViewTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderViewTest.java
@@ -46,6 +46,7 @@ private View mTitleAndUrl; private ImageView mImage; private View mCircleBg; + private View mImageContainer; private View mPerformanceInfo; private PropertyModel mModel; private PropertyModelChangeProcessor mMCP; @@ -66,6 +67,7 @@ mTitleAndUrl = mHeaderView.findViewById(R.id.title_and_url); mImage = mHeaderView.findViewById(R.id.menu_header_image); mCircleBg = mHeaderView.findViewById(R.id.circle_background); + mImageContainer = mHeaderView.findViewById(R.id.menu_header_image_container); mPerformanceInfo = mHeaderView.findViewById(R.id.menu_header_performance_info); mModel = new PropertyModel.Builder(ContextMenuHeaderProperties.ALL_KEYS) .with(ContextMenuHeaderProperties.TITLE, "") @@ -188,6 +190,11 @@ () -> mModel.set(ContextMenuHeaderProperties.IMAGE, bitmap)); assertThat("Incorrect thumbnail bitmap.", ((BitmapDrawable) mImage.getDrawable()).getBitmap(), equalTo(bitmap)); + + TestThreadUtils.runOnUiThreadBlocking( + () -> mModel.set(ContextMenuHeaderProperties.HIDE_HEADER_IMAGE, true)); + assertThat("Image container should be hidden.", mImageContainer.getVisibility(), + equalTo(View.GONE)); } @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java index 17403ea..a5ec82fd 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
@@ -110,9 +110,37 @@ @LargeTest @Feature({"RenderTest"}) public void testContextMenuViewWithLink() throws IOException { + doTestContextMenuViewWithLink("context_menu_with_link", /*hideHeaderImage=*/false); + } + + @Test + @LargeTest + @Feature({"RenderTest"}) + public void testContextMenuViewWithLink_HideHeaderImage() throws IOException { + doTestContextMenuViewWithLink("context_menu_with_link_popup", /*hideHeaderImage=*/true); + } + + @Test + @LargeTest + @Feature({"RenderTest"}) + public void testContextMenuViewWithImageLink() throws IOException { + doTestContextMenuViewWithImageLink( + "context_menu_with_image_link", /*hideHeaderImage=*/false); + } + + @Test + @LargeTest + @Feature({"RenderTest"}) + public void testContextMenuViewWithImageLink_HideHeaderImage() throws IOException { + doTestContextMenuViewWithImageLink( + "context_menu_with_image_link_popup", /*hideHeaderImage=*/true); + } + + private void doTestContextMenuViewWithLink(String id, boolean hideHeaderImage) + throws IOException { TestThreadUtils.runOnUiThreadBlocking(() -> { - mListItems.add( - new ListItem(ListItemType.HEADER, getHeaderModel("", "www.google.com", false))); + mListItems.add(new ListItem(ListItemType.HEADER, + getHeaderModel("", "www.google.com", false, hideHeaderImage))); mListItems.add(new ListItem(ListItemType.DIVIDER, new PropertyModel())); mListItems.add(( new ListItem(ListItemType.CONTEXT_MENU_ITEM, getItemModel("Open in new tab")))); @@ -123,16 +151,14 @@ mListItems.add((new ListItem(ListItemType.CONTEXT_MENU_ITEM_WITH_ICON_BUTTON, getShareItemModel("Share link")))); }); - mRenderTestRule.render(mFrame, "context_menu_with_link"); + mRenderTestRule.render(mFrame, id); } - @Test - @LargeTest - @Feature({"RenderTest"}) - public void testContextMenuViewWithImageLink() throws IOException { + private void doTestContextMenuViewWithImageLink(String id, boolean hideHeaderImage) + throws IOException { TestThreadUtils.runOnUiThreadBlocking(() -> { - mListItems.add(new ListItem( - ListItemType.HEADER, getHeaderModel("Capybara", "www.google.com", true))); + mListItems.add(new ListItem(ListItemType.HEADER, + getHeaderModel("Capybara", "www.google.com", true, hideHeaderImage))); mListItems.add(new ListItem(ListItemType.DIVIDER, new PropertyModel())); mListItems.add(( new ListItem(ListItemType.CONTEXT_MENU_ITEM, getItemModel("Open in new tab")))); @@ -150,12 +176,13 @@ mListItems.add((new ListItem(ListItemType.CONTEXT_MENU_ITEM_WITH_ICON_BUTTON, getShareItemModel("Share image")))); }); - mRenderTestRule.render(mFrame, "context_menu_with_image_link"); + mRenderTestRule.render(mFrame, id); } - private PropertyModel getHeaderModel(String title, CharSequence url, boolean hasImage) { + private PropertyModel getHeaderModel( + String title, CharSequence url, boolean hasImageThumbnail, boolean hideHeaderImage) { Bitmap image; - if (hasImage) { + if (hasImageThumbnail) { image = BitmapFactory.decodeFile( UrlUtils.getIsolatedTestFilePath("chrome/test/data/android/capybara.jpg")); } else { @@ -172,7 +199,8 @@ .with(ContextMenuHeaderProperties.URL, url) .with(ContextMenuHeaderProperties.URL_MAX_LINES, 1) .with(ContextMenuHeaderProperties.IMAGE, image) - .with(ContextMenuHeaderProperties.CIRCLE_BG_VISIBLE, !hasImage) + .with(ContextMenuHeaderProperties.CIRCLE_BG_VISIBLE, !hasImageThumbnail) + .with(ContextMenuHeaderProperties.HIDE_HEADER_IMAGE, hideHeaderImage) .build(); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java index 5b7b4986..1d83086 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java
@@ -60,6 +60,7 @@ */ @RunWith(BaseRobolectricTestRunner.class) @Config(shadows = ShadowContextMenuDialog.class) +@Features.DisableFeatures(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE) public class ContextMenuCoordinatorTest { /** * Shadow class used to capture the inputs for {@link
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderMediatorTest.java index 9198870b..5c0c00d 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderMediatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderMediatorTest.java
@@ -6,20 +6,30 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Activity; +import android.graphics.Bitmap; +import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; +import org.chromium.base.Callback; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.JniMocker; import org.chromium.blink_public.common.ContextMenuDataMediaType; @@ -29,6 +39,8 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.test.util.browser.Features; import org.chromium.components.embedder_support.contextmenu.ContextMenuParams; +import org.chromium.components.favicon.LargeIconBridge; +import org.chromium.components.favicon.LargeIconBridgeJni; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.url.GURL; import org.chromium.url.JUnitTestGURLs; @@ -44,24 +56,35 @@ public JniMocker mocker = new JniMocker(); @Mock - PerformanceHintsObserver.Natives mNativeMock; + PerformanceHintsObserver.Natives mMockPerformanceHintsObserverJni; + @Mock + LargeIconBridge.Natives mMockLargeIconBridgeJni; @Mock ContextMenuNativeDelegate mNativeDelegate; private Activity mActivity; private final Profile mProfile = Mockito.mock(Profile.class); + @Captor + ArgumentCaptor<Callback<Bitmap>> mRetrieveImageCallbackCaptor; + @Captor + ArgumentCaptor<LargeIconBridge.LargeIconCallback> mLargeIconCallbackCaptor; + @Before public void setUpTest() { mActivity = Robolectric.setupActivity(Activity.class); MockitoAnnotations.initMocks(this); - mocker.mock(PerformanceHintsObserverJni.TEST_HOOKS, mNativeMock); + mocker.mock(PerformanceHintsObserverJni.TEST_HOOKS, mMockPerformanceHintsObserverJni); + mocker.mock(LargeIconBridgeJni.TEST_HOOKS, mMockLargeIconBridgeJni); + + when(mMockLargeIconBridgeJni.init()).thenReturn(1L); } @Test public void testPerformanceInfoEnabled() { final GURL url = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1); - when(mNativeMock.isContextMenuPerformanceInfoEnabled()).thenReturn(true); + when(mMockPerformanceHintsObserverJni.isContextMenuPerformanceInfoEnabled()) + .thenReturn(true); PropertyModel model = new PropertyModel.Builder(ContextMenuHeaderProperties.ALL_KEYS) .with(ContextMenuHeaderProperties.URL_PERFORMANCE_CLASS, PerformanceClass.PERFORMANCE_UNKNOWN) @@ -78,7 +101,8 @@ @Test public void testPerformanceInfoDisabled() { final GURL url = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1); - when(mNativeMock.isContextMenuPerformanceInfoEnabled()).thenReturn(false); + when(mMockPerformanceHintsObserverJni.isContextMenuPerformanceInfoEnabled()) + .thenReturn(false); PropertyModel model = new PropertyModel.Builder(ContextMenuHeaderProperties.ALL_KEYS) .with(ContextMenuHeaderProperties.URL_PERFORMANCE_CLASS, PerformanceClass.PERFORMANCE_UNKNOWN) @@ -95,7 +119,8 @@ @Test public void testNoPerformanceInfoOnNonAnchor() { final GURL url = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL); - when(mNativeMock.isContextMenuPerformanceInfoEnabled()).thenReturn(true); + when(mMockPerformanceHintsObserverJni.isContextMenuPerformanceInfoEnabled()) + .thenReturn(true); PropertyModel model = new PropertyModel.Builder(ContextMenuHeaderProperties.ALL_KEYS) .with(ContextMenuHeaderProperties.URL_PERFORMANCE_CLASS, PerformanceClass.PERFORMANCE_UNKNOWN) @@ -108,4 +133,82 @@ assertThat(model.get(ContextMenuHeaderProperties.URL_PERFORMANCE_CLASS), equalTo(PerformanceClass.PERFORMANCE_UNKNOWN)); } + + @Test + public void testHeaderImage_Image() { + PropertyModel model = + new PropertyModel.Builder(ContextMenuHeaderProperties.ALL_KEYS).build(); + final GURL url = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL); + final ContextMenuParams params = + new ContextMenuParams(0, ContextMenuDataMediaType.IMAGE, url, GURL.emptyGURL(), "", + GURL.emptyGURL(), GURL.emptyGURL(), "", null, false, 0, 0, 0, false); + final ContextMenuHeaderMediator mediator = new ContextMenuHeaderMediator(mActivity, model, + PerformanceClass.PERFORMANCE_FAST, params, mProfile, mNativeDelegate); + + verify(mNativeDelegate) + .retrieveImageForContextMenu( + anyInt(), anyInt(), mRetrieveImageCallbackCaptor.capture()); + verify(mMockLargeIconBridgeJni, times(0)) + .getLargeIconForURL(anyLong(), any(), any(), anyInt(), any()); + + Assert.assertNotNull( + "Retrieve image callback is null.", mRetrieveImageCallbackCaptor.getValue()); + Assert.assertNull("Header image should be null before thumbnail callback triggers.", + model.get(ContextMenuHeaderProperties.IMAGE)); + + Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); + mRetrieveImageCallbackCaptor.getValue().onResult(bitmap); + Assert.assertNotNull("Thumbnail should be set for model in retrieve image callback.", + model.get(ContextMenuHeaderProperties.IMAGE)); + Assert.assertFalse("Circle background should be invisible for thumbnail.", + model.get(ContextMenuHeaderProperties.CIRCLE_BG_VISIBLE)); + } + + @Test + public void testHeaderImage_Video() { + PropertyModel model = + new PropertyModel.Builder(ContextMenuHeaderProperties.ALL_KEYS).build(); + final ContextMenuParams params = new ContextMenuParams(0, ContextMenuDataMediaType.VIDEO, + GURL.emptyGURL(), GURL.emptyGURL(), "", GURL.emptyGURL(), GURL.emptyGURL(), "", + null, false, 0, 0, 0, false); + final ContextMenuHeaderMediator mediator = new ContextMenuHeaderMediator(mActivity, model, + PerformanceClass.PERFORMANCE_FAST, params, mProfile, mNativeDelegate); + + verify(mNativeDelegate, times(0)).retrieveImageForContextMenu(anyInt(), anyInt(), any()); + verify(mMockLargeIconBridgeJni, times(0)) + .getLargeIconForURL(anyLong(), any(), any(), anyInt(), any()); + + Assert.assertNotNull("Header image should be set for videos directly.", + model.get(ContextMenuHeaderProperties.IMAGE)); + Assert.assertTrue("Circle background should be visible for video.", + model.get(ContextMenuHeaderProperties.CIRCLE_BG_VISIBLE)); + } + + @Test + public void testHeaderImage_Link() { + PropertyModel model = + new PropertyModel.Builder(ContextMenuHeaderProperties.ALL_KEYS).build(); + final GURL linkUrl = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1); + final ContextMenuParams params = new ContextMenuParams(0, ContextMenuDataMediaType.FILE, + GURL.emptyGURL(), linkUrl, JUnitTestGURLs.URL_1, GURL.emptyGURL(), GURL.emptyGURL(), + "", null, false, 0, 0, 0, false); + final ContextMenuHeaderMediator mediator = new ContextMenuHeaderMediator(mActivity, model, + PerformanceClass.PERFORMANCE_FAST, params, mProfile, mNativeDelegate); + + verify(mNativeDelegate, times(0)).retrieveImageForContextMenu(anyInt(), anyInt(), any()); + verify(mMockLargeIconBridgeJni) + .getLargeIconForURL( + anyLong(), any(), any(), anyInt(), mLargeIconCallbackCaptor.capture()); + + Assert.assertNotNull("LargeIconCallback is null.", mLargeIconCallbackCaptor.getValue()); + Assert.assertNull("Image should not be set for links before LarIconCallback triggers.", + model.get(ContextMenuHeaderProperties.IMAGE)); + + Bitmap bitmap = Bitmap.createBitmap(1, 2, Bitmap.Config.ARGB_8888); + mLargeIconCallbackCaptor.getValue().onLargeIconAvailable(bitmap, 0, false, 0); + Assert.assertNotNull("Header image should be set after LargeIconCallback.", + model.get(ContextMenuHeaderProperties.IMAGE)); + Assert.assertTrue("Circle background should be visible for links.", + model.get(ContextMenuHeaderProperties.CIRCLE_BG_VISIBLE)); + } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategyTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategyTest.java index 1f04c124..a527fa9 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategyTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategyTest.java
@@ -389,6 +389,34 @@ assertEquals(DEVICE_HEIGHT / 2, mAttributeResults.get(length2 - 1).height); } + @Test + public void moveDownToDismiss() { + PartialCustomTabHeightStrategy strategy = new PartialCustomTabHeightStrategy(mActivity, 500, + mMultiWindowModeStateDispatcher, mOnResizedCallback, mActivityLifecycleDispatcher); + + verifyWindowFlagsSet(); + + assertEquals(1, mAttributeResults.size()); + assertEquals(DEVICE_HEIGHT / 2, mAttributeResults.get(0).height); + + // Pass null because we have a mock Activity and we don't depend on the GestureDetector + // inside as we test MotionEvents directly. + PartialCustomTabHeightStrategy.PartialCustomTabHandleStrategy handleStrategy = + strategy.new PartialCustomTabHandleStrategy(null); + final boolean[] closed = {false}; + handleStrategy.setCloseClickHandler(() -> closed[0] = true); + + // action down + handleStrategy.onTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), + SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, DEVICE_WIDTH / 2, 1500, 0)); + // action move, the distance on y axis should be larger than + // PartialCustomTabHandleStrategy.CLOSE_DISTANCE. + handleStrategy.onTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), + SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE, DEVICE_WIDTH / 2, 1850, 0)); + + assertTrue("Close click handler should be called.", closed[0]); + } + private void verifyWindowFlagsSet() { verify(mWindow).addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); verify(mWindow).clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollectorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollectorTest.java index 91d1b07..d885cfe1 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollectorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollectorTest.java
@@ -246,7 +246,7 @@ // ChromeFeedbackCollector implementation. @Override protected List<FeedbackSource> buildSynchronousFeedbackSources( - ChromeFeedbackCollector.InitParams initParams) { + Activity activity, ChromeFeedbackCollector.InitParams initParams) { return new ArrayList<>(); } @@ -303,7 +303,7 @@ DESCRIPTION, null, null, (result) -> callback.onResult(result)) { @Override protected List<FeedbackSource> buildSynchronousFeedbackSources( - ChromeFeedbackCollector.InitParams initParams) { + Activity activity, ChromeFeedbackCollector.InitParams initParams) { return ChromeFeedbackCollectorTest.buildSynchronousFeedbackSources(); } }; @@ -332,7 +332,7 @@ (result) -> callback.onResult(result)) { @Override protected List<FeedbackSource> buildSynchronousFeedbackSources( - ChromeFeedbackCollector.InitParams initParams) { + Activity activity, ChromeFeedbackCollector.InitParams initParams) { ArrayList<FeedbackSource> list = new ArrayList<>( ChromeFeedbackCollectorTest.buildSynchronousFeedbackSources()); list.add(new FeedbackContextFeedbackSource(FEEDBACK_CONTEXT)); @@ -404,7 +404,7 @@ @Override protected List<FeedbackSource> buildSynchronousFeedbackSources( - ChromeFeedbackCollector.InitParams initParams) { + Activity activity, ChromeFeedbackCollector.InitParams initParams) { return ChromeFeedbackCollectorTest.buildSynchronousFeedbackSources(); } };
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index d142839..82a7de3 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-98.0.4751.0_rc-r1-merged.afdo.bz2 +chromeos-chrome-amd64-98.0.4754.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd index 0de03b4..180e4cf7 100644 --- a/chrome/app/chromium_strings.grd +++ b/chrome/app/chromium_strings.grd
@@ -582,6 +582,9 @@ <message name="IDS_DEFAULT_BROWSER_INFOBAR_TEXT" desc="Text to show in an infobar when Chromium is not the current default browser."> Chromium isn't your default browser </message> + <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE" desc="The title of the notification asking if the user wants to enable Enhanced Safe Browsing"> + Also turn on in Chromium? + </message> <if expr="is_win"> <!-- Try Chrome Toast Dialog --> <message name="IDS_TRY_TOAST_HEADING" desc="Top line of the try-chrome-again dialog">
diff --git a/chrome/app/chromium_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1 b/chrome/app/chromium_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1 new file mode 100644 index 0000000..72c8b86 --- /dev/null +++ b/chrome/app/chromium_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1
@@ -0,0 +1 @@ +9b3d5b4cf2774e7e115290f23cdb1bb025c35787 \ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 12c65c8..0b9ca67 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -6696,6 +6696,40 @@ Turn on </message> + <!-- Tailored Security Prompt for Consented Desktop users --> + <message name="IDS_TAILORED_SECURITY_DISPLAY_SOURCE" desc="The name of the source showing the notification"> + Safe Browsing + </message> + <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION" desc="The text of the notification asking if the user wants to enable Enhanced Safe Browsing"> + With Enhanced Safe Browsing, you’ll get Chrome’s strongest security + </message> + <if expr="use_titlecase"> + <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_ACCEPT" desc="The text on the 'accept' button asking if the user wants to enable Enhanced Safe Browsing"> + Turn On + </message> + </if> + <if expr="not use_titlecase"> + <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_ACCEPT" desc="The text on the 'accept' button asking if the user wants to enable Enhanced Safe Browsing"> + Turn on + </message> + </if> + <message name="IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TITLE" desc="The title of the notification telling the user that Enhanced Safe Browsing was disabled"> + Enhanced Safe Browsing is off + </message> + <message name="IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_DESCRIPTION" desc="The text of the notification telling the user that Enhanced Safe Browsing was disabled"> + You’re getting standard protection + </message> + <if expr="use_titlecase"> + <message name="IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_ON" desc="The text on the 'turn on' button asking if the user wants to re-enable Enhanced Safe Browsing"> + Turn Back On + </message> + </if> + <if expr="not use_titlecase"> + <message name="IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_ON" desc="The text on the 'turn on' button asking if the user wants to re-enable Enhanced Safe Browsing"> + Turn back on + </message> + </if> + <!-- Password Manager --> <if expr="use_titlecase"> <message name="IDS_PASSWORD_MANAGER_CANCEL_BUTTON" desc="Label for the 'dismiss' button in the Manage Password bubble/Update Password infobar. These UIs ask the user if they wish to perform some action with saved passwords, e.g. updating or deleting them; the button dismisses the UI without taking the suggested action."> @@ -9308,7 +9342,7 @@ <message name="IDS_TRANSLATE_BUBBLE_TRANSLATED_TITLE" desc="Title text for the translate bubble label when the page has been translated from one language to another"> Translated </message> - <message name="IDS_TRANSLATE_BUBBLE_COULD_NOT_TRANSLATE_TITLE" desc="Title text for the translate bubble label when the page could not be translated."> + <message name="IDS_TRANSLATE_BUBBLE_COULD_NOT_TRANSLATE_TITLE" desc="Title text for the translate bubble label when the page could not be translated. This is also announced to the screenreader."> This page could not be translated </message> <message name="IDS_TRANSLATE_BUBBLE_SOURCE_LANG_COMBOBOX_ACCNAME" desc="Accessible name for the source language selection combobox.">
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_DESCRIPTION.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..f923e8a --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +9459d234db9b98018f613d5df8f35a941cba206b \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TITLE.png.sha1 new file mode 100644 index 0000000..f923e8a --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TITLE.png.sha1
@@ -0,0 +1 @@ +9459d234db9b98018f613d5df8f35a941cba206b \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_ON.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_ON.png.sha1 new file mode 100644 index 0000000..f923e8a --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_ON.png.sha1
@@ -0,0 +1 @@ +9459d234db9b98018f613d5df8f35a941cba206b \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_ACCEPT.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_ACCEPT.png.sha1 new file mode 100644 index 0000000..72c8b86 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_ACCEPT.png.sha1
@@ -0,0 +1 @@ +9b3d5b4cf2774e7e115290f23cdb1bb025c35787 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..72c8b86 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +9b3d5b4cf2774e7e115290f23cdb1bb025c35787 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_DISPLAY_SOURCE.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_DISPLAY_SOURCE.png.sha1 new file mode 100644 index 0000000..47736f22 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_DISPLAY_SOURCE.png.sha1
@@ -0,0 +1 @@ +6d027737bbe5ce5b90232a6ad55886822b58e59d \ No newline at end of file
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd index cbe96ae..fa39071 100644 --- a/chrome/app/google_chrome_strings.grd +++ b/chrome/app/google_chrome_strings.grd
@@ -588,6 +588,9 @@ <message name="IDS_DEFAULT_BROWSER_INFOBAR_TEXT" desc="Text to show in an infobar when Google Chrome is not the current default browser."> Google Chrome isn't your default browser </message> + <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE" desc="The title of the notification asking if the user wants to enable Enhanced Safe Browsing"> + Also turn on in Chrome? + </message> <if expr="is_win"> <!-- Try Chrome Toast Dialog --> <message name="IDS_TRY_TOAST_HEADING" desc="Top line of the try-chrome-again dialog">
diff --git a/chrome/app/google_chrome_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1 new file mode 100644 index 0000000..72c8b86 --- /dev/null +++ b/chrome/app/google_chrome_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1
@@ -0,0 +1 @@ +9b3d5b4cf2774e7e115290f23cdb1bb025c35787 \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 9c62fcd9..2fa96202 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -534,6 +534,7 @@ <translation id="1549275686094429035">ARC-geaktiveer</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> wil toegang tot <ph name="VOLUME_NAME" /> hê. Dit sal dalk jou lêers wysig of uitvee.</translation> <translation id="1552301827267621511">Die "<ph name="EXTENSION_NAME" />"-uitbreiding het soektog verander om <ph name="SEARCH_PROVIDER_DOMAIN" /> te gebruik</translation> +<translation id="1552752544932680961">Bestuur uitbreiding</translation> <translation id="1553538517812678578">onbeperk</translation> <translation id="1555130319947370107">Blou</translation> <translation id="1556537182262721003">Kon nie uitbreidinggids na profiel skuif nie.</translation> @@ -2794,7 +2795,6 @@ <translation id="3842552989725514455">Serif-lettertipe</translation> <translation id="3843464315703645664">Intern toegelaat</translation> <translation id="3844888638014364087">Emosiekoon is ingevoeg</translation> -<translation id="384513009320852920">Maak seker dat jou Bluetooth-toestel in saambindmodus en naby is. <ph name="BEGIN_LINK_LEARN_MORE" />Kom meer te wete<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Kry nutsgoed om webwerwe, Android-programme en meer te ontwikkel. <ph name="DOWNLOAD_SIZE" /> se data sal afgelaai word as jy Linux installeer.</translation> <translation id="3847319713229060696">Help om sekuriteit op die web vir almal beter te maak</translation> <translation id="3848547754896969219">Maak in &Incognito-venster oop</translation> @@ -4303,7 +4303,6 @@ <translation id="5485102783864353244">Voeg program by</translation> <translation id="5485754497697573575">Stel alle oortjies terug</translation> <translation id="5486261815000869482">Bevestig wagwoord</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> deel tans jou skerm met <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simuleer blaaierherbegin</translation> <translation id="5487460042548760727">Hernoem profiel na <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Vee data uit</translation> @@ -4365,6 +4364,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> wil</translation> <translation id="5534304873398226603">Gooi foto of video weg</translation> <translation id="5535941515421698170">Verwyder ook jou bestaande data van hierdie toestel af</translation> +<translation id="5537725057119320332">Saai uit</translation> <translation id="5539221284352502426">Die wagwoord wat jy ingevoer het, is deur die bediener afgekeur. Die moontlike redes sluit in: Die wagwoord is te kort. Die wagwoord moet syfers of simbole insluit. Die wagwoord moet van vorige wagwoorde verskil.</translation> <translation id="5541694225089836610">Jou administrateur het hierdie handeling gedeaktiveer</translation> <translation id="5542132724887566711">Profiel</translation> @@ -4596,6 +4596,7 @@ <translation id="5787146423283493983">Sleutelooreenkoms</translation> <translation id="5787420647064736989">Toestelnaam</translation> <translation id="5788367137662787332">Jammer, ten minste een deel van die toestel <ph name="DEVICE_LABEL" /> kon nie gekoppel word nie.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Suksesvol</translation> <translation id="5790651917470750848">Poortaanstuur bestaan reeds</translation> <translation id="5792728279623964091">Tik asseblief op jou aan/af-skakelaar</translation> @@ -4827,10 +4828,8 @@ <ph name="BEGIN_PARAGRAPH2" />Jy kan ligging afskakel deur die hoofligginginstelling op jou toestel af te skakel. Jy kan ook die gebruik van Wi-Fi, selnetwerke en sensors vir ligging in ligginginstellings afskakel.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Verlaat volskerm</translation> <translation id="6042308850641462728">Meer</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> deel tans 'n Chrome-oortjie met <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Kon nie opstelling ontleed nie</translation> <translation id="6043994281159824495">Meld nou af</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> deel tans 'n Chrome-oortjie en oudio met <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Primêre TrackPoint-knoppie</translation> <translation id="6047632800149092791">Sinkronisering werk nie. Probeer afmeld en weer aanmeld.</translation> <translation id="6049797270917061226">Hierdie lêer kan dit vir aanvallers moontlik maak om jou persoonlike inligting te steel.</translation> @@ -7326,7 +7325,6 @@ <translation id="8655295600908251630">Kanaal</translation> <translation id="8655972064210167941">Kon nie aanmeld nie omdat jou wagwoord nie geverifieer kon word nie. Kontak jou administrateur of probeer weer.</translation> <translation id="8657393004602556571">Wil jy die terugvoer weggooi?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> deel tans jou skerm en oudio met <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Maak skakel in incognito-venster oop</translation> <translation id="8662671328352114214">Sluit by <ph name="TYPE" />-netwerk aan</translation> <translation id="8662733268723715832">Dit neem langer as verwag. Jy kan dit oorslaan of wag totdat dit klaar is.</translation> @@ -7621,7 +7619,6 @@ <translation id="8941173171815156065">Herroep die toestemming "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Netscape Internasionale Opstap</translation> <translation id="8944099748578356325">Gebruik die battery vinniger (tans <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> deel tans 'n venster met <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Ikoongrootte</translation> <translation id="8946359700442089734">Ontfoutingkenmerke is nie heeltemal op hierdie <ph name="IDS_SHORT_PRODUCT_NAME" />-toestel geaktiveer nie.</translation> <translation id="894763922177556086">Goed</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 187755a..e97d53d5 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -532,6 +532,7 @@ <translation id="1549275686094429035">ARC ነቅቷል</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> <ph name="VOLUME_NAME" />ን ሊደርስበት ይፈልጋል። የእርስዎን ፋይሎች ሊያሻሽል ወይም ሊሰርዝ ይችላል።</translation> <translation id="1552301827267621511">የ«<ph name="EXTENSION_NAME" />» ቅጥያ ፍለጋ <ph name="SEARCH_PROVIDER_DOMAIN" />ን እንዲጠቀም ቀይሮታል</translation> +<translation id="1552752544932680961">ቅጥያ አቀናብር</translation> <translation id="1553538517812678578">ገደብ የለሽ</translation> <translation id="1555130319947370107">ሰማያዊ</translation> <translation id="1556537182262721003">የቅጥያ ማውጫን ወደ መገለጫ መውሰድ አልተቻለም።</translation> @@ -2788,7 +2789,6 @@ <translation id="3842552989725514455">ባለጭረት ቅርጸ-ቁምፊ</translation> <translation id="3843464315703645664">በውስጥ በተፈቀደ ዝርዝር ውስጥ ገብቷል</translation> <translation id="3844888638014364087">ስሜት ገላጭ ምስል ገብቷል</translation> -<translation id="384513009320852920">የብሉቱዝ መሣሪያዎ በማጣመር ሁነታ ላይ እና በአቅራቢያ መሆኑን ያረጋግጡ። <ph name="BEGIN_LINK_LEARN_MORE" />የበለጠ ለመረዳት<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">ድር ጣቢያዎችን፣ የAndroid መተግበሪያዎችን እና ተጨማሪ ነገሮችን ለመገንባት የሚሆኑ መሣሪያዎችን ያግኙ። Linuxን መጫን <ph name="DOWNLOAD_SIZE" /> ውሂብን ያወርዳል።</translation> <translation id="3847319713229060696">ድር ላይ ለሁሉም ሰው ደህንነት እንዲሻሻል ያግዙ</translation> <translation id="3848547754896969219">በ&ማንነት የማያሳውቅ መስኮት ውስጥ ክፈት</translation> @@ -4294,7 +4294,6 @@ <translation id="5485102783864353244">መተግበሪያ አክል</translation> <translation id="5485754497697573575">ሁሉንም ትሮች አስመልስ</translation> <translation id="5486261815000869482">የይለፍ ቃል ያረጋግጡ</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> ማያ ገጽዎን ለ<ph name="TAB_NAME" /> እያጋራ ነው።</translation> <translation id="5486561344817861625">የአሳሽ ዳግም መጀመር አስመስለህ ስራ</translation> <translation id="5487460042548760727">የመገለጫውን ስም ወደ <ph name="PROFILE_NAME" /> ይቀይሩ</translation> <translation id="5487521232677179737">ውሂብን አጽዳ</translation> @@ -4356,6 +4355,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> የሚከተሉትን ማድረግ ይፈልጋል፦</translation> <translation id="5534304873398226603">ፎቶን ወይም ቪዲዮን ጣል</translation> <translation id="5535941515421698170">እንዲሁም ነባር ውሂብዎን ከዚህ መሣሪያ ያስወግዱ</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">ያስገቡት ይለፍ ቃል አገልጋዩ አልተቀበለውም። ሊሆኑ የሚችሉ ምክንያቶች እነዚህን ያካትታሉ፦ የይለፍ ቃሉ በጣም አጭር ነው። የይለፍ ቃሉ ቁጥሮችን ወይም ምልክቶችን ማካተት አለበት። የይለፍ ቃሉ ከቀዳሚ ይለፍ ቃላት የተለየ መሆን አለበት።</translation> <translation id="5541694225089836610">እርምጃ በእርስዎ አስተዳዳሪ ተሰናክሏል</translation> <translation id="5542132724887566711">መገለጫ</translation> @@ -4586,6 +4586,7 @@ <translation id="5787146423283493983">ቁልፍ ስምምነት</translation> <translation id="5787420647064736989">የመሣሪያ ስም</translation> <translation id="5788367137662787332">ይቅርታ፣ በመሣሪያ <ph name="DEVICE_LABEL" /> ላይ ያለ ቢያንስ አንድ ክፍልፍል ሊፈናጠጥ አልቻለም።</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">ተሳክቷል</translation> <translation id="5790651917470750848">ወደብ ማስተላለፍ አስቀድሞ አለ</translation> <translation id="5792728279623964091">እባክዎ የእርስዎን የኃይል አዝራር መታ ያድርጉ</translation> @@ -4817,10 +4818,8 @@ <ph name="BEGIN_PARAGRAPH2" />በዚህ መሣሪያ ላይ ዋናውን የአካባቢ ቅንብርን በማጥፋት አካባቢን ማጥፋት ይችላሉ። እንዲሁም በአካባቢ ቅንብሮች ውስጥ Wi-Fiን፣ የተንቀሳቃሽ ስልክ አውታረ መረቦችን እና ዳሳሾችን መጠቀም ለአካባቢ ማጥፋት ይችላሉ።<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">ከሙሉ ማያ ገጽ ውጣ</translation> <translation id="6042308850641462728">ተጨማሪ</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> አንድ የChrome ትር ለ<ph name="TAB_NAME" /> እያጋራ ነው።</translation> <translation id="604388835206766544">ውቅረትን መተንተን አልተሳካም</translation> <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="6049797270917061226">ይህ ፋይል አጥቂዎች የግል መረጃዎን እንዲሰርቁ ሊፈቅድ ይችላል።</translation> @@ -7322,7 +7321,6 @@ <translation id="8655295600908251630">ሰርጥ</translation> <translation id="8655972064210167941">የእርስዎ የይለፍ ቃል ትክክለኛነቱ ሊረጋገጥ ስላልቻለ መግባት አልተሳካም። እባክዎ የእርስዎን አስተዳዳሪ ያነጋግሩ ወይም እንደገና ይሞክሩ።</translation> <translation id="8657393004602556571">ግብረመልሱን ማስወገድ ይፈልጋሉ?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> የእርስዎን ማያ ገጽ እና ኦዲዮ ለ<ph name="TAB_NAME" /> እያጋራ ነው።</translation> <translation id="8661290697478713397">አገናኙን ማን&ነትን በማያሳውቅ መስኮት ክፈት</translation> <translation id="8662671328352114214">የ<ph name="TYPE" /> አውታረ መረብን ይቀላቀሉ</translation> <translation id="8662733268723715832">ይህ ከተጠበቀው በላይ ጊዜ እየወሰደ ነው፣ መዝለል ወይም እስኪያልቅ ድረስ መጠበቅ ይችላሉ።</translation> @@ -7618,7 +7616,6 @@ <translation id="8941173171815156065">ፈቃድ «<ph name="PERMISSION" />»ን ሻር</translation> <translation id="894360074127026135">የNetscape ዓለምአቀፍ አወቃቀር</translation> <translation id="8944099748578356325">ባትሪዎን በበለጠ ፍጥነት ይጠቀሙ (በአሁኑ ጊዜ <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> አንድ መስኮት ለ<ph name="TAB_NAME" /> እያጋራ ነው።</translation> <translation id="8945274638472141382">የአዶ መጠን</translation> <translation id="8946359700442089734">የማረም ባህሪያት በዚህ የ<ph name="IDS_SHORT_PRODUCT_NAME" /> መሣሪያ ላይ ሙሉ ለሙሉ አልነቁም።</translation> <translation id="894763922177556086">ጥሩ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 935d5472..8ff07eb 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -535,6 +535,7 @@ <translation id="1549275686094429035">تم تفعيل "وقت تشغيل التطبيقات في Chrome"</translation> <translation id="1549788673239553762">يريد <ph name="APP_NAME" /> الوصول إلى <ph name="VOLUME_NAME" />. قد يعدّل أو يحذف ملفاتك.</translation> <translation id="1552301827267621511">غيرت الإضافة "<ph name="EXTENSION_NAME" />" البحث لاستخدام <ph name="SEARCH_PROVIDER_DOMAIN" />.</translation> +<translation id="1552752544932680961">إدارة الإضافة</translation> <translation id="1553538517812678578">غير محدودة</translation> <translation id="1555130319947370107">أزرق</translation> <translation id="1556537182262721003">تعذر نقل دليل الإضافة إلى الملف الشخصي.</translation> @@ -2785,7 +2786,6 @@ <translation id="3842552989725514455">خط Serif</translation> <translation id="3843464315703645664">القائمة المسموح بها داخليًا</translation> <translation id="3844888638014364087">تمّ إدراج رمز تعبيري</translation> -<translation id="384513009320852920">يُرجى التأكّد من أنّ جهازك الذي يتضمّن بلوتوث في وضع الإقران وأنّه في مكان مجاور. <ph name="BEGIN_LINK_LEARN_MORE" />مزيد من المعلومات<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">يمكنك الحصول على أدوات لتطوير المواقع الإلكترونية وتطبيقات Android والمزيد. سيؤدي تثبيت نظام التشغيل Linux إلى تنزيل <ph name="DOWNLOAD_SIZE" /> من البيانات.</translation> <translation id="3847319713229060696">المساعدة في تحسين الأمان على الإنترنت من أجل الجميع</translation> <translation id="3848547754896969219">فتح في نافذة &التصفُّح المتخفي</translation> @@ -4290,7 +4290,6 @@ <translation id="5485102783864353244">إضافة تطبيق</translation> <translation id="5485754497697573575">استعادة جميع علامات التبويب</translation> <translation id="5486261815000869482">تأكيد كلمة المرور</translation> -<translation id="5486275809415469523">يشارك <ph name="APP_NAME" /> شاشتك مع <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">محاكاة إعادة تشغيل المتصفح</translation> <translation id="5487460042548760727">إعادة تسمية الملف التعريفي إلى <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">محو البيانات</translation> @@ -4352,6 +4351,7 @@ <translation id="5533001281916885985">يريد <ph name="SITE_NAME" /></translation> <translation id="5534304873398226603">إلغاء صورة أو فيديو</translation> <translation id="5535941515421698170">إزالة البيانات الحالية من هذا الجهاز أيضًا</translation> +<translation id="5537725057119320332">إرسال</translation> <translation id="5539221284352502426">رفض الخادم كلمة المرور التي أدخلتَها. وتتضمن الأسباب المحتملة ما يلي: كلمة المرور قصيرة جدًا. يجب أن تتضمن كلمة المرور أرقامًا أو رموزًا. يجب أن تكون كلمة المرور مختلفة عن كلمات المرور السابقة.</translation> <translation id="5541694225089836610">تم إيقاف الإجراء من قِبل المشرف.</translation> <translation id="5542132724887566711">الملف التعريفي</translation> @@ -4582,6 +4582,7 @@ <translation id="5787146423283493983">توافق المفاتيح</translation> <translation id="5787420647064736989">اسم الجهاز</translation> <translation id="5788367137662787332">عذرًا، تعذر تركيب جزء واحد على الأقل على الجهاز <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">تم بنجاح</translation> <translation id="5790651917470750848">يتوفّر منفذ بهذا الرقم.</translation> <translation id="5792728279623964091">يُرجى النقر على زر التشغيل.</translation> @@ -4813,10 +4814,8 @@ <ph name="BEGIN_PARAGRAPH2" />يمكنك إيقاف خدمة "الموقع الجغرافي" من خلال إيقاف إعداد "الموقع الجغرافي" الرئيسي على جهازك. وبإمكانك أيضًا إيقاف استخدام شبكات Wi-Fi وشبكات الجوّال وأجهزة الاستشعار للموقع الجغرافي من إعدادات الموقع الجغرافي.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">الخروج من عرض ملء الشاشة</translation> <translation id="6042308850641462728">عرض المزيد</translation> -<translation id="6043317578411397101">يشارك <ph name="APP_NAME" /> علامة تبويب متصفح Chrome من خلال <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">تعذّر تحليل الضبط</translation> <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="6049797270917061226">قد يتسبب هذا الملف في سرقة المهاجمين لمعلوماتك الشخصية.</translation> @@ -7314,7 +7313,6 @@ <translation id="8655295600908251630">القناة</translation> <translation id="8655972064210167941">فشل تسجيل الدخول، نظرًا لعدم القدرة على التحقق من كلمة مرورك، يُرجى الاتصال بالمسؤول أو إعادة المحاولة.</translation> <translation id="8657393004602556571">هل تريد تجاهل الملاحظات؟</translation> -<translation id="8658645149275195032">يشارك <ph name="APP_NAME" /> الشاشة والصوت من خلال <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">ف&تح رابط في نافذة التصفح المتخفي</translation> <translation id="8662671328352114214">الانضمام إلى شبكة <ph name="TYPE" /></translation> <translation id="8662733268723715832">تستغرق هذه العملية وقتًا أطول من المتوقّع. يمكنك تخطّي هذه العملية أو الانتظار حتى اكتمالها.</translation> @@ -7613,7 +7611,6 @@ <translation id="8941173171815156065">إلغاء الإذن "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">الترقية الدولية لـ Netscape</translation> <translation id="8944099748578356325">استخدام البطارية بسرعة أكبر (حاليًا <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280">يشارك <ph name="APP_NAME" /> نافذة من خلال <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">حجم الرمز</translation> <translation id="8946359700442089734">لم يتم تفعيل ميزات التصحيح كليًا على هذا الجهاز <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">جيدة</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 98560a8f..1183ce0 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -2800,7 +2800,6 @@ <translation id="3842552989725514455">চেৰিফ ফণ্ট</translation> <translation id="3843464315703645664">অভ্যন্তৰীণভাৱে অনুমতিৰ তালিকাত ৰখা হৈছে</translation> <translation id="3844888638014364087">ইম'জী ভৰোৱা হ’ল</translation> -<translation id="384513009320852920">আপোনাৰ ব্লুটুথ ডিভাইচটো পেয়াৰ কৰা ম’ডত আৰু ওচৰত থকাটো নিশ্চিত কৰক। <ph name="BEGIN_LINK_LEARN_MORE" />অধিক জানক<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">ৱেবছাইট, Android এপ্ আৰু বহুতো কাম কৰিবলৈ সঁজুলি লাভ কৰক। Linux ইনষ্টল কৰিলে <ph name="DOWNLOAD_SIZE" /> পৰিমাণৰ ডেটা ডাউনল‘ড হ‘ব।</translation> <translation id="3847319713229060696">প্ৰত্যেকজন বাবে ৱেবত সুৰক্ষা উন্নত কৰাত সহায় কৰক</translation> <translation id="3848547754896969219">&ইনক’গনিট’ ৱিণ্ড’ত খোলক</translation> @@ -4311,7 +4310,6 @@ <translation id="5485102783864353244">এপ্ যোগ কৰক</translation> <translation id="5485754497697573575">সকলো টেব পুনৰুদ্ধাৰ কৰক</translation> <translation id="5486261815000869482">পাছৱৰ্ড নিশ্চিত কৰক</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" />এ <ph name="TAB_NAME" />ৰ সৈতে আপোনাৰ স্ক্ৰীণ শ্বেয়াৰ কৰি আছে।</translation> <translation id="5486561344817861625">ছিমুলে’ট ব্ৰাউজাৰ ৰিষ্টাৰ্ট</translation> <translation id="5487460042548760727">প্ৰ'ফাইলটোৰ নাম <ph name="PROFILE_NAME" />লৈ সলনি কৰক</translation> <translation id="5487521232677179737">ডেটা মচক</translation> @@ -4373,6 +4371,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" />এ কৰিব বিচাৰে</translation> <translation id="5534304873398226603">ফট’ বা ভিডিঅ’ অগ্ৰাহ্য কৰক</translation> <translation id="5535941515421698170">এই ডিভাইচটোৰ পৰা আপোনাৰ পূর্বে থকা ডেটাও মচি পেলাওক</translation> +<translation id="5537725057119320332">কাষ্ট কৰক</translation> <translation id="5539221284352502426">আপুনি দিয়া পাছৱর্ডটো ছার্ভাৰে অগ্ৰাহ্য কৰিছে। সম্ভাব্য কাৰণ: পাছৱৰ্ডটো যথেষ্ট চুটি। পাছৱর্ডটোত সংখ্যা বা চিহ্ন অন্তর্ভুক্ত হ'ব লাগিব। পাছৱর্ডটো পূর্বৱর্তী পাছৱর্ডসমূহতকৈ পৃথক হ'ব লাগিব।</translation> <translation id="5541694225089836610">আপোনাৰ প্ৰশাসকে এই কার্যটো অক্ষম কৰিছে</translation> <translation id="5542132724887566711">প্ৰ’ফাইল</translation> @@ -4603,6 +4602,7 @@ <translation id="5787146423283493983">মুখ্য চুক্তি</translation> <translation id="5787420647064736989">ডিভাইচৰ নাম</translation> <translation id="5788367137662787332">ক্ষমা কৰিব, ডিভাইচটোৰ <ph name="DEVICE_LABEL" /> এতি কমেও এটা পাৰ্টিশ্বন মাউণ্ট কৰিব পৰা নাযাব।</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">সফল হৈছে</translation> <translation id="5790651917470750848">প’ৰ্ট ফৰৱাৰ্ড কৰাৰ সুবিধাটো ইতিমধ্যে আছে</translation> <translation id="5792728279623964091">অনুগ্ৰহ কৰি, আপোনাৰ পাৱাৰ বুটামটো টিপক</translation> @@ -4835,10 +4835,8 @@ <ph name="BEGIN_PARAGRAPH2" />আপুনি আপোনাৰ ডিভাইচৰ মুখ্য অৱস্থান সেৱাৰ ছেটিং অফ কৰি অৱস্থান সেৱা অফ কৰিব পাৰে৷ ইয়াৰ উপৰি, আপুনি অৱস্থান আৰু ৱাই-ফাই আৰু ব্লুটুথ স্কেনিঙৰ বাবে ৱাই-ফাই আৰু ম’বাইল নেটৱৰ্কৰ ব্যৱহাৰ কৰা কাৰ্য অৱস্থান ছেটিংসমূহলৈ গৈ অফ কৰিব পাৰে।<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">পূৰ্ণ স্ক্ৰীণৰ পৰা বাহিৰ হওক</translation> <translation id="6042308850641462728">অধিক</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" />এ <ph name="TAB_NAME" />ৰ সৈতে এটা Chrome টেব শ্বেয়াৰ কৰি আছে।</translation> <translation id="604388835206766544">কনফিগাৰেশ্বন পার্ছ কৰিব পৰা নগ’ল</translation> <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="6049797270917061226">এই ফাইলটোৱে আক্ৰমণকাৰীক আপোনাৰ ব্যক্তিগত তথ্য চুৰি কৰিবলৈ দিব পাৰে।</translation> @@ -7340,7 +7338,6 @@ <translation id="8655295600908251630">চেনেল</translation> <translation id="8655972064210167941">ছাইন ইন বিফল হ’ল কিয়নো আপোনাৰ পাছৱৰ্ডটোৰ প্ৰমাণীকৰণ কৰিব পৰা নগ’ল। অনুগ্ৰহ কৰি আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক বা আকৌ চেষ্টা কৰক।</translation> <translation id="8657393004602556571">আপুনি মতামতটো বাতিল কৰিব বিচাৰেনে?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" />এ <ph name="TAB_NAME" />ৰ সৈতে আপোনাৰ স্ক্ৰীণ আৰু অডিঅ’ শ্বেয়াৰ কৰিছে।</translation> <translation id="8661290697478713397">লিংকটো ইনক’&গনিট’ ৱিণ্ড'ত খোলক</translation> <translation id="8662671328352114214"><ph name="TYPE" /> নেটৱর্কত যোগদান কৰক</translation> <translation id="8662733268723715832">এইটোৱে আশা কৰাতকৈ বেছি সময় লৈছে, আপুনি এইটো বাদ দিব পাৰে অথবা এইটো সম্পূৰ্ণ হোৱালৈকে অপেক্ষা কৰিব পাৰে।</translation> @@ -7636,7 +7633,6 @@ <translation id="8941173171815156065">'<ph name="PERMISSION" />' অনুমতিটো প্ৰত্যাহাৰ কৰক</translation> <translation id="894360074127026135">নেটস্কেপৰ আন্তঃৰাষ্ট্ৰীয় ষ্টেপ আপ</translation> <translation id="8944099748578356325">বেটাৰী খৰকৈ ব্যৱহাৰ কৰক (বৰ্তমান <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" />এ <ph name="TAB_NAME" />ৰ সৈতে এখন ৱিণ্ড’ শ্বেয়াৰ কৰিছে।</translation> <translation id="8945274638472141382">চিহ্নৰ আকাৰ</translation> <translation id="8946359700442089734">ডিবাগিঙৰ সুবিধাসমূহ এই <ph name="IDS_SHORT_PRODUCT_NAME" /> ডিভাইচটোত সম্পূৰ্ণৰূপে সক্ষম কৰা হোৱা নাছিল।</translation> <translation id="894763922177556086">উন্নত মানৰ</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index dfdf446..34b4a17 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -531,6 +531,7 @@ <translation id="1549275686094429035">ARC Aktivdir</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> <ph name="VOLUME_NAME" /> daxil olmaq istəyir. Fayllarınızı dəyişə və ya silə bilər.</translation> <translation id="1552301827267621511">"<ph name="EXTENSION_NAME" />" artırması axtarış sistemini <ph name="SEARCH_PROVIDER_DOMAIN" /> seçiminə dəyişib</translation> +<translation id="1552752544932680961">Artırmanı idarə edin</translation> <translation id="1553538517812678578">Limitsiz</translation> <translation id="1555130319947370107">Mavi</translation> <translation id="1556537182262721003">Artırmanı birbaşa qovluğa daşıya bilmədi.</translation> @@ -2786,7 +2787,6 @@ <translation id="3842552989725514455">Serif şrifti</translation> <translation id="3843464315703645664">Daxili icazə verilənlər siyahısındadır</translation> <translation id="3844888638014364087">Emoji daxil edildi</translation> -<translation id="384513009320852920">Bluetooth cihazınızın birləşmə rejimində və yaxınlıqda olduğuna əmin olun. <ph name="BEGIN_LINK_LEARN_MORE" />Ətraflı məlumat<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Veb sayt, Android tətbiqləri və sairəni təkmilləşdirmək üçün alətlər əldə edin. Linux'un quraşdırılması ilə <ph name="DOWNLOAD_SIZE" /> data endiriləcək.</translation> <translation id="3847319713229060696">Vebdə hər kəsin güvənliyini artırmağa yardım edin</translation> <translation id="3848547754896969219">&Anonim pəncərədə açın</translation> @@ -4295,7 +4295,6 @@ <translation id="5485102783864353244">Tətbiq əlavə edin</translation> <translation id="5485754497697573575">Bütün Panelləri Bərpa edin</translation> <translation id="5486261815000869482">Şifrəni tesdiq edin:</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> ekranınızı <ph name="TAB_NAME" /> ilə paylaşır.</translation> <translation id="5486561344817861625">Yenidən Brauzer Başladılmasını Modelləşdirmək</translation> <translation id="5487460042548760727">Profilin adını <ph name="PROFILE_NAME" /> olaraq dəyişin</translation> <translation id="5487521232677179737">Datanı silin</translation> @@ -4357,6 +4356,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> bunu etmək istəyir:</translation> <translation id="5534304873398226603">Foto və ya videonu yadda saxlamayın</translation> <translation id="5535941515421698170">Həmçinin, mövcud datanı bu cihazdan silin</translation> +<translation id="5537725057119320332">Yayım</translation> <translation id="5539221284352502426">Daxil etdiyiniz parol server tərəfindən rədd edildi. Səbəblər bunlar ola bilər: Parol çox qısadır. Parol rəqəm və ya simvollardan ibarət olmalıdır. Parol əvvəlki paroldan fərqli olmalıdır.</translation> <translation id="5541694225089836610">Administrator əməliyyatı deaktiv edib</translation> <translation id="5542132724887566711">Profil</translation> @@ -4587,6 +4587,7 @@ <translation id="5787146423283493983">Açar Anlaşması</translation> <translation id="5787420647064736989">Cihaz adı</translation> <translation id="5788367137662787332">Üzr istəyirik, <ph name="DEVICE_LABEL" /> cihazının ən azı bir hissəsi montaj edilə bilməz.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Uğur</translation> <translation id="5790651917470750848">Port yönləndirməsi artıq mövcuddur</translation> <translation id="5792728279623964091">Yandırıb-söndürmə düyməsinə toxunun</translation> @@ -4817,10 +4818,8 @@ <ph name="BEGIN_PARAGRAPH2" />Cihazda əsas Məkan ayarını deaktiv etməklə Məkanı deaktiv edə bilərsiniz. Həmçinin, məkanın Wi-Fi və mobil şəbəkələr və sensorlardan istifadəsini məkan ayarlarından deaktiv edə bilərsiniz.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">"Tam ekran" rejimindən çıxın</translation> <translation id="6042308850641462728">Daha çox</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> tətbiqi Chrome panelini <ph name="TAB_NAME" /> ilə paylaşır.</translation> <translation id="604388835206766544">Konfiqurasiyanı nəzərdən keçirmək alınmadı</translation> <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="6049797270917061226">Bu fayl hücumçulara şəxsi məlumatlarınızı oğurlamaq imkanı vermiş ola bilər.</translation> @@ -7322,7 +7321,6 @@ <translation id="8655295600908251630">Kanal</translation> <translation id="8655972064210167941">Sign-sizin parol təsdiq edilə bilməz, çünki uğursuz oldu. Sizin administratoru ilə əlaqə və ya yenidən cəhd edin.</translation> <translation id="8657393004602556571">Rəydən imtina etmək istəyirsiniz?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> ekran və audionu <ph name="TAB_NAME" /> ilə paylaşır.</translation> <translation id="8661290697478713397">Linki gizli pəncərədə açın</translation> <translation id="8662671328352114214"><ph name="TYPE" /> şəbəkəsinə qoşulun</translation> <translation id="8662733268723715832">Bu, gözləniləndən daha uzun çəkir, keçə və ya tamamlanana qədər gözləyə bilərsiniz.</translation> @@ -7615,7 +7613,6 @@ <translation id="8941173171815156065">'<ph name="PERMISSION" />' icazəsini ləğv edin</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Batareyanı daha sürətlə istifadə edin (hazırda <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> ilə pəncərə paylaşır.</translation> <translation id="8945274638472141382">İkona ölçüsü</translation> <translation id="8946359700442089734">Debaq funksiyaları bu <ph name="IDS_SHORT_PRODUCT_NAME" /> cihazında yarımçıq aktiv edilib.</translation> <translation id="894763922177556086">Yaxşı</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 92b29ff..6bccab3d 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -161,6 +161,7 @@ <translation id="1153356358378277386">Спалучаныя прылады</translation> <translation id="1153636665119721804">Праграма палепшанай абароны Google</translation> <translation id="1155816283571436363">Ідзе падключэнне да тэлефона</translation> +<translation id="1158080958325422608">Зрабіць усе літары вялікімі</translation> <translation id="1158238185437008462">Паказаць успаміны</translation> <translation id="1161575384898972166">Увайдзіце ў <ph name="TOKEN_NAME" />, каб экспартаваць кліенцкі сертыфікат.</translation> <translation id="116173250649946226">Адміністратар задаў стандартную тэму, якую нельга змяняць.</translation> @@ -695,6 +696,7 @@ <translation id="1700079447639026019">Сайты, якім забаронена выкарыстоўваць файлы cookie</translation> <translation id="1703331064825191675">Паролі больш не наробяць клопату</translation> <translation id="1703666494654169921">Не дазваляць сайтам выкарыстоўваць даныя або прылады віртуальнай рэальнасці</translation> +<translation id="1704097193565924901">Зрабіць першыя літары слоў вялікімі</translation> <translation id="1704230497453185209">Не дазваляць сайтам прайграваць гук</translation> <translation id="1704970325597567340">Праверка бяспекі выконвалася <ph name="DATE" /></translation> <translation id="1706586824377653884">Дададзена адміністратарам</translation> @@ -2779,7 +2781,6 @@ <translation id="3842552989725514455">Шрыфт з засечкамі</translation> <translation id="3843464315703645664">Ва ўнутраным белым спісе</translation> <translation id="3844888638014364087">Эмодзі ўстаўлены</translation> -<translation id="384513009320852920">Упэўніцеся, што прылада з Bluetooth знаходзіцца паблізу і пераведзена ў рэжым спалучэння. <ph name="BEGIN_LINK_LEARN_MORE" />Даведацца больш<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Вы атрымаеце інструменты для распрацоўкі вэб-сайтаў, праграм Android і іншага. Каб усталяваць Linux, трэба будзе спампаваць <ph name="DOWNLOAD_SIZE" /> даных.</translation> <translation id="3847319713229060696">Дапамагаць павышаць бяспеку ў інтэрнэце для ўсіх</translation> <translation id="3848547754896969219">Адкрыць у &акне ў рэжыме інкогніта</translation> @@ -3564,6 +3565,7 @@ <translation id="4681453295291708042">Выключыць функцыю "Абагульванне паблізу"</translation> <translation id="4681930562518940301">Адкрыць зыходны &відарыс у новай укладцы</translation> <translation id="4682551433947286597">Шпалеры паказваюцца на экране ўваходу.</translation> +<translation id="4683629100208651599">Зрабіць усе літары малымі</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />% (стандартна)</translation> <translation id="4684427112815847243">Сінхранізаваць усё</translation> <translation id="4684471265911890182">Праграма "<ph name="APP_NAME" />" спрабуе атрымаць доступ да камеры. Каб дазволіць такі доступ, перавядзіце пераключальнік, які рэгулюе налады прыватнасці камеры, у становішча "выключана".</translation> @@ -4284,7 +4286,6 @@ <translation id="5485102783864353244">Дадаць праграму</translation> <translation id="5485754497697573575">Аднавіць усе ўкладкі</translation> <translation id="5486261815000869482">Пацвердзіце пароль</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> абагульвае ваш экран з укладкай <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Імітаваць перазапуск браўзера</translation> <translation id="5487460042548760727">Даць профілю назву "<ph name="PROFILE_NAME" />"</translation> <translation id="5487521232677179737">Ачысціць даныя</translation> @@ -4346,6 +4347,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> запытвае наступныя дазволы</translation> <translation id="5534304873398226603">Адхіліць фота ці відэа</translation> <translation id="5535941515421698170">Таксама выдаліць існуючыя даныя з гэтай прылады</translation> +<translation id="5537725057119320332">Трансліраваць</translation> <translation id="5539221284352502426">Уведзены пароль адхілены серверам. У ліку магчымых прычын: Пароль занадта кароткі. Пароль павінен змяшчаць лічбы або сімвалы. Пароль павінен адрознівацца ад папярэдніх пароляў.</translation> <translation id="5541694225089836610">Дзеянне адключана адміністратарам</translation> <translation id="5542132724887566711">Профіль</translation> @@ -4576,6 +4578,7 @@ <translation id="5787146423283493983">Узгадненне ключоў</translation> <translation id="5787420647064736989">Назва прылады</translation> <translation id="5788367137662787332">Як мінімум адзін раздзел на прыладзе <ph name="DEVICE_LABEL" /> не ўдалося падключыць.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Выканана</translation> <translation id="5790651917470750848">Пераадрасацыя порта ўжо зададзена</translation> <translation id="5792728279623964091">Націсніце кнопку сілкавання</translation> @@ -4807,10 +4810,8 @@ <ph name="BEGIN_PARAGRAPH2" />Каб выключыць гэту службу, выключыце галоўную наладу вызначэння месцазнаходжання на прыладзе. Таксама можна выключыць выкарыстанне Wi-Fi, мабільных сетак і датчыкаў для вызначэння месцазнаходжання ў адпаведных наладах.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Выключыць поўнаэкранны рэжым</translation> <translation id="6042308850641462728">Яшчэ</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> абагульвае ўкладку Chrome з укладкай <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Не ўдалося прааналізаваць канфігурацыю</translation> <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="6049797270917061226">З дапамогай гэтага файла зламыснікі могуць украсці вашу асабістую інфармацыю.</translation> @@ -5954,6 +5955,7 @@ <translation id="7257173066616499747">Сеткі Wi-Fi</translation> <translation id="725758059478686223">Сэрвіс друку</translation> <translation id="7257666756905341374">Прагляд даных, якія вы капіруеце і ўстаўляеце</translation> +<translation id="7258192266780953209">Пераўтварэнні</translation> <translation id="7258225044283673131">Праграма не адказвае. Каб закрыць яе, націсніце "Прымусова закрыць".</translation> <translation id="7262004276116528033">Гэты сэрвіс уваходу размешчаны на дамене <ph name="SAML_DOMAIN" /></translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Паспрабуйце знайсці і выправіць непаладку наступным чынам: @@ -7304,7 +7306,6 @@ <translation id="8655295600908251630">Версія</translation> <translation id="8655972064210167941">Уваход не выкананы, паколькі не ўдалося спраўдзіць пароль. Звярніцеся да адміністратара або паўтарыце спробу.</translation> <translation id="8657393004602556571">Скасаваць адпраўку водгуку?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> абагульвае ваш экран і аўдыя з укладкай <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Адкрыць спасылку ў акне інко&гніта</translation> <translation id="8662671328352114214">Падключэнне да сеткі <ph name="TYPE" /></translation> <translation id="8662733268723715832">Гэта займае больш часу, чым звычайна. Вы можаце прапусціць гэты этап або пачакаць яго завяршэння.</translation> @@ -7602,7 +7603,6 @@ <translation id="8941173171815156065">Адклікаць дазвол "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Шыфраванне International Step-Up ад Netscape</translation> <translation id="8944099748578356325">Актыўней спажывае зарад акумулятара (зараз – <ph name="BATTERY_PERCENTAGE" /> %)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> абагульвае акно з укладкай "<ph name="TAB_NAME" />".</translation> <translation id="8945274638472141382">Памер значкоў</translation> <translation id="8946359700442089734">Не ўсе функцыі адладкі былі ўключаны на гэтай прыладзе <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Добрая</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 8cb8508c..b807feb 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -531,6 +531,7 @@ <translation id="1549275686094429035">СИПC (средата на изпълнение на приложенията в Chrome) е активирана</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> иска достъп до „<ph name="VOLUME_NAME" />“. Приложението може да промени или изтрие файловете ви.</translation> <translation id="1552301827267621511">Разширението <ph name="EXTENSION_NAME" /> промени търсещата машина на <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Управление на разширението</translation> <translation id="1553538517812678578">неограничено</translation> <translation id="1555130319947370107">синьо</translation> <translation id="1556537182262721003">Не можа да се премести директорията на разширението в потребителския профил.</translation> @@ -2790,7 +2791,6 @@ <translation id="3842552989725514455">Серифен шрифт</translation> <translation id="3843464315703645664">В списъка на разрешените вътрешно</translation> <translation id="3844888638014364087">Вмъкнахте емоджи</translation> -<translation id="384513009320852920">Уверете се, че устройството ви с Bluetooth е в режим за сдвояване и наблизо. <ph name="BEGIN_LINK_LEARN_MORE" />Научете повече<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Получете инструменти за разработка на уебсайтове, приложения за Android и др. При инсталирането на Linux ще бъдат изтеглени <ph name="DOWNLOAD_SIZE" /> данни.</translation> <translation id="3847319713229060696">Помогнете за всеобщото подобряване на сигурността в мрежата</translation> @@ -4300,7 +4300,6 @@ <translation id="5485102783864353244">Добавяне на приложението</translation> <translation id="5485754497697573575">Възстановяване на всички раздели</translation> <translation id="5486261815000869482">Потвърждаване на паролата</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> споделя екрана ви с/ъс <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Симулиране на рестартиране на браузъра</translation> <translation id="5487460042548760727">Преименуване на потребителския профил на <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Изчиств. на данните</translation> @@ -4362,6 +4361,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> иска да</translation> <translation id="5534304873398226603">Отхвърляне на снимката или видеоклипа</translation> <translation id="5535941515421698170">Премахване и на съществуващите ви данни от това устройство</translation> +<translation id="5537725057119320332">Предаване</translation> <translation id="5539221284352502426">Въведената от вас парола бе отхвърлена от сървъра. Ето някои от възможните причини: паролата е твърде кратка; необходимо е да съдържа цифри или символи; трябва да е различна от предишните пароли.</translation> <translation id="5541694225089836610">Действието е деактивирано от администратора ви</translation> <translation id="5542132724887566711">Потребителски профил</translation> @@ -4593,6 +4593,7 @@ <translation id="5787146423283493983">Договаряне на ключ</translation> <translation id="5787420647064736989">Име на устройството</translation> <translation id="5788367137662787332">За съжаление поне един дял на устройството <ph name="DEVICE_LABEL" /> не можа да бъде свързан.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Успех</translation> <translation id="5790651917470750848">Пренасочването на порта вече съществува</translation> <translation id="5792728279623964091">Моля, докоснете бутона за захранване</translation> @@ -4824,10 +4825,8 @@ <ph name="BEGIN_PARAGRAPH2" />Можете да изключите местоположението, като деактивирате главната настройка за него на устройството си. Също така от настройките за местоположението имате възможност да изключите използването на Wi-Fi, мобилни мрежи и сензори за определянето му.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Изход от цял екран</translation> <translation id="6042308850641462728">Още</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> споделя раздел в Chrome с/ъс „<ph name="TAB_NAME" />“.</translation> <translation id="604388835206766544">Синтактичният анализ на конфигурацията не бе успешен</translation> <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="6049797270917061226">Този файл може да даде възможност на хакери да откраднат личната ви информация.</translation> @@ -7324,7 +7323,6 @@ <translation id="8655295600908251630">Канал</translation> <translation id="8655972064210167941">Влизането не бе успешно, тъй като паролата ви не можа да се потвърди. Моля, свържете се с администратора си или опитайте отново.</translation> <translation id="8657393004602556571">Искате ли да отхвърлите отзивите?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> споделя екрана и звука ви с/ъс „<ph name="TAB_NAME" />“.</translation> <translation id="8661290697478713397">Отваряне на връзката в прозорец при използване на функ&цията „инкогнито“</translation> <translation id="8662671328352114214">Присъединяване към <ph name="TYPE" /> мрежа</translation> <translation id="8662733268723715832">Процесът отнема по-дълго от очакваното. Можете да го пропуснете или да изчакате да завърши.</translation> @@ -7619,7 +7617,6 @@ <translation id="8941173171815156065">Отмяна на разрешението „<ph name="PERMISSION" />“</translation> <translation id="894360074127026135">Международно повишаване на сигурността от Netscape</translation> <translation id="8944099748578356325">използва батерията по-бързо (понастоящем тя е <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> споделя прозорец с/ъс „<ph name="TAB_NAME" />“.</translation> <translation id="8945274638472141382">Размер на иконите</translation> <translation id="8946359700442089734">Функциите за отстраняване на грешки не бяха напълно активирани на това устройство с <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">добра</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 0db5762..429b8d8 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -535,6 +535,7 @@ <translation id="1549275686094429035">ARC চালু করা হয়েছে</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> <ph name="VOLUME_NAME" /> অ্যাক্সেস করতে চায়৷ এটি আপনার ফাইলগুলিকে মডিফাই করতে বা মুছে ফেলতে পারে৷</translation> <translation id="1552301827267621511">"<ph name="EXTENSION_NAME" />" এক্সটেনশনের মাধ্যমে ডিফল্ট সার্চ ইঞ্জিনকে ওভাররাইড করা হয়েছে এবং এখন <ph name="SEARCH_PROVIDER_DOMAIN" />-এর মাধ্যমে কন্ট্রোল করা হচ্ছে</translation> +<translation id="1552752544932680961">এক্সটেনশান পরিচালনা করুন</translation> <translation id="1553538517812678578">সীমাহীন</translation> <translation id="1555130319947370107">নীল</translation> <translation id="1556537182262721003">প্রোফাইলে এক্সটেনশন ডিরেক্টরি সরানো যায়নি৷</translation> @@ -2794,7 +2795,6 @@ <translation id="3842552989725514455">Serif হরফ</translation> <translation id="3843464315703645664">অভ্যন্তরীণভাবে সাদাতালিকাভুক্ত</translation> <translation id="3844888638014364087">ইমোজি যোগ করা হয়েছে</translation> -<translation id="384513009320852920">আপনার ব্লুটুথ ডিভাইস কাছাকাছি এবং 'যোগ করার মোড'-এ আছে কিনা ভাল করে দেখে নিন। <ph name="BEGIN_LINK_LEARN_MORE" />আরও জানুন<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">ওয়েবসাইট, Android অ্যাপ সহ অনেক কিছু ডেভেলপ করতে টুলগুলি পান। Linux ইনস্টল করলে <ph name="DOWNLOAD_SIZE" /> ডেটা ডাউনলোড হবে।</translation> <translation id="3847319713229060696">সকলের জন্য ওয়েবে নিরাপত্তা উন্নত করতে সাহায্য করে</translation> <translation id="3848547754896969219">ছদ্মবেশী উইন্ডোতে খুলুন</translation> @@ -4302,7 +4302,6 @@ <translation id="5485102783864353244">অ্যাপ্লিকেশান যোগ করুন</translation> <translation id="5485754497697573575">সকল ট্যাব পুনরুদ্ধার করুন</translation> <translation id="5486261815000869482">পাসওয়ার্ড নিশ্চিত করুন</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> এর সঙ্গে আপনার স্ক্রিন ভাগ করছে৷</translation> <translation id="5486561344817861625">ব্রাউজার রিস্টার্ট সিমুলেট করুন</translation> <translation id="5487460042548760727">প্রোফাইলের নাম পরিবর্তন করে <ph name="PROFILE_NAME" /> রাখুন</translation> <translation id="5487521232677179737">ডেটা সাফ করুন</translation> @@ -4364,6 +4363,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> চায়</translation> <translation id="5534304873398226603">ফটো ভিডিও বাতিল করুন</translation> <translation id="5535941515421698170">এছাড়াও এই ডিভাইস থেকে আপনার বিদ্যমান ডেটা মুছুন</translation> +<translation id="5537725057119320332">কাস্ট করুন</translation> <translation id="5539221284352502426">আপনার দেওয়া পাসওয়ার্ডটি সার্ভার থেকে প্রত্যাখ্যান করা হয়েছে। সম্ভাব্য কারণ: পাসওয়ার্ডটি অনেক ছোট। পাসওয়ার্ডে অক্ষর বা সিম্বল থাকতে হবে। এই পাসওয়ার্ডটি আগের পাসওয়ার্ডগুলি থেকে অবশ্যই আলাদা হবে।</translation> <translation id="5541694225089836610">আপনার অ্যাডমিনিস্ট্রেটর এই সুবিধাটি বন্ধ করে দিয়েছে</translation> <translation id="5542132724887566711">প্রোফাইল</translation> @@ -4595,6 +4595,7 @@ <translation id="5787146423283493983">কী চুক্তি</translation> <translation id="5787420647064736989">ডিভাইসের নাম</translation> <translation id="5788367137662787332">দুঃখিত, <ph name="DEVICE_LABEL" /> ডিভাইসটির কমপক্ষে একটি ভাগ আটকানো যায়নি৷</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">সফল</translation> <translation id="5790651917470750848">পোর্ট ফরওয়ার্ড করার সুবিধা আগে থেকেই রয়েছে</translation> <translation id="5792728279623964091">পাওয়ার বোতাম ট্যাপ করুন</translation> @@ -4826,10 +4827,8 @@ <ph name="BEGIN_PARAGRAPH2" />এই ডিভাইসে মূল লোকেশন সেটিং বন্ধ করে আপনি লোকেশন শনাক্ত করার সুবিধাটি বন্ধ করতে পারেন। এছাড়াও আপনি লোকেশন সেটিংস থেকে লোকেশনের জন্য ওয়াই-ফাই, মোবাইল নেটওয়ার্ক এবং সেন্সরের ব্যবহার বন্ধ করতে পারবেন।<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">সম্পূর্ণ স্ক্রিন থেকে বেরিয়ে আসুন</translation> <translation id="6042308850641462728">আরও</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> এর সাথে একটি Chrome ট্যাব শেয়ার করছে।</translation> <translation id="604388835206766544">কনফিগারেশন পার্স করা যায়নি</translation> <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="6049797270917061226">এই ফাইলটি আক্রমণকারীকে আপনার ব্যক্তিগত তথ্য চুরি করার সুযোগ দিতে পারে।</translation> @@ -7325,7 +7324,6 @@ <translation id="8655295600908251630">চ্যানেল</translation> <translation id="8655972064210167941">আপনার পাসওয়ার্ড যাচাই করতে না পারায় সাইন-ইন করা যায়নি। অনুগ্রহ করে আপনার অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন অথবা আবার চেষ্টা করুন।</translation> <translation id="8657393004602556571">আপনি কি মতামতটি বাতিল করতে চান?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> এর সঙ্গে আপনার স্ক্রিন এবং অডিও শেয়ার করছে।</translation> <translation id="8661290697478713397">লিঙ্কটি ছদ্মবেশী উইন্ডোতে খুলুন</translation> <translation id="8662671328352114214"><ph name="TYPE" /> নেটওয়ার্কে সংযুক্ত হন</translation> <translation id="8662733268723715832">এটি করতে স্বাভাবিকের চেয়ে বেশি সময় লাগছে, তাই আপনি এড়িয়ে যেতে বা অপেক্ষা করতে পারেন।</translation> @@ -7621,7 +7619,6 @@ <translation id="8941173171815156065">অনুমতি '<ph name="PERMISSION" />' প্রত্যাহার করুন</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">ব্যাটারি আরও দ্রুত শেষ হবে (বর্তমানে <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> এর সঙ্গে একটি উইন্ডো শেয়ার করছে।</translation> <translation id="8945274638472141382">আইকনের সাইজ</translation> <translation id="8946359700442089734">এই <ph name="IDS_SHORT_PRODUCT_NAME" /> ডিভাইসে ডিবাগিং বৈশিষ্ট্যগুলি সম্পূর্ণরূপে চালু করা নেই৷</translation> <translation id="894763922177556086">শক্তিশালী</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 2418256a..34f843f 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -536,6 +536,7 @@ <translation id="1549275686094429035">ARC je omogućen</translation> <translation id="1549788673239553762">Aplikacija <ph name="APP_NAME" /> želi pristup za <ph name="VOLUME_NAME" />. Moguće je da će izmijeniti ili izbrisati fajlove.</translation> <translation id="1552301827267621511">Ekstenzija "<ph name="EXTENSION_NAME" />" je promijenila pretraživanje da koristi <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Upravljanje proširenjem</translation> <translation id="1553538517812678578">neograničeno</translation> <translation id="1555130319947370107">Plava</translation> <translation id="1556537182262721003">Prebacivanje direktorija ekstenzije u profil nije uspjelo.</translation> @@ -2792,7 +2793,6 @@ <translation id="3842552989725514455">Serifni font</translation> <translation id="3843464315703645664">Stavljeno na internu listu dozvoljenih</translation> <translation id="3844888638014364087">Emoji sličica je umetnuta</translation> -<translation id="384513009320852920">Provjerite je li Bluetooth uređaj u načinu rada za uparivanje i u blizini. <ph name="BEGIN_LINK_LEARN_MORE" />Saznajte više<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Preuzmite alate za programiranje web lokacija, aplikacija za Android i još mnogo toga. Instalacija Linuxa će preuzeti <ph name="DOWNLOAD_SIZE" /> podataka.</translation> <translation id="3847319713229060696">Pomozite nam da poboljšamo sigurnost na webu za sve</translation> <translation id="3848547754896969219">Otvori u &anonimnom prozoru</translation> @@ -4301,7 +4301,6 @@ <translation id="5485102783864353244">Dodaj aplikaciju</translation> <translation id="5485754497697573575">Vrati sve kartice</translation> <translation id="5486261815000869482">Potvrdite lozinku</translation> -<translation id="5486275809415469523">Aplikacija <ph name="APP_NAME" /> dijeli vaš ekran s karticom <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simuliacija ponovnog pokretanja preglednika</translation> <translation id="5487460042548760727">Promjena naziva profila u <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Obriši podatke</translation> @@ -4363,6 +4362,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> želi</translation> <translation id="5534304873398226603">Odbaci fotografiju ili video</translation> <translation id="5535941515421698170">Također uklonite svoje postojeće podatke s ovog uređaja</translation> +<translation id="5537725057119320332">Emitiraj</translation> <translation id="5539221284352502426">Server je odbio lozinku koju ste unijeli. Mogući razlozi su: Lozinka je prekratka. Lozinka mora uključivati brojeve ili simbole. Lozinka se mora razlikovati od prethodnih lozinki.</translation> <translation id="5541694225089836610">Radnju je onemogućio vaš administrator</translation> <translation id="5542132724887566711">Profil</translation> @@ -4593,6 +4593,7 @@ <translation id="5787146423283493983">Usaglašavanje ključeva</translation> <translation id="5787420647064736989">Naziv uređaja</translation> <translation id="5788367137662787332">Žao nam je, bar jedna particija uređaja <ph name="DEVICE_LABEL" /> ne može biti aktivirana</translation> +<translation id="5789643057113097023">,</translation> <translation id="5790085346892983794">Uspjeh</translation> <translation id="5790651917470750848">Prosljeđivanje priključka već postoji</translation> <translation id="5792728279623964091">Dodirnite dugme za uključivanje</translation> @@ -4824,10 +4825,8 @@ <ph name="BEGIN_PARAGRAPH2" />Lokaciju možete isključiti ako isključite glavnu postavku lokacije na uređaju. U postavkama lokacije možete isključiti i korištenje WiFi, mobilnih mreža i senzora za lokaciju.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Isključi prikaz preko cijelog ekrana</translation> <translation id="6042308850641462728">Više</translation> -<translation id="6043317578411397101">Aplikacija <ph name="APP_NAME" /> dijeli Chrome karticu s karticom <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Raščlanjivanje konfiguracije nije uspjelo</translation> <translation id="6043994281159824495">Odjavi se sada</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> dijeli karticu i zvuk Chromea s karticom <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Primarno dugme TrackPointa</translation> <translation id="6047632800149092791">Sinhronizacija ne funkcionira. Pokušajte se odjaviti i ponovo prijaviti.</translation> <translation id="6049797270917061226">Ovaj fajl može omogućiti napadačima da ukradu vaše lične informacije.</translation> @@ -7324,7 +7323,6 @@ <translation id="8655295600908251630">Kanal</translation> <translation id="8655972064210167941">Prijava nije uspjela jer vaša lozinka nije potvrđena. Obratite se administratoru ili pokušajte ponovo.</translation> <translation id="8657393004602556571">Želite li odbaciti povratne informacije?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> dijeli vaš ekran i zvuk s karticom <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Otvori link u anonimnom prozoru</translation> <translation id="8662671328352114214">Pridružite se <ph name="TYPE" /> mreži</translation> <translation id="8662733268723715832">Ovo traje duže nego što je očekivano. Možete preskočiti ili sačekajte dok se završi.</translation> @@ -7621,7 +7619,6 @@ <translation id="8941173171815156065">Opozovi odobrenje "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Netscape međunarodna nadogradnja</translation> <translation id="8944099748578356325">Brže troši bateriju (trenutno je na <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280">Aplikacija <ph name="APP_NAME" /> dijeli prozor s karticom <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Veličina ikona</translation> <translation id="8946359700442089734">Funkcije za uklanjanje grešaka nisu u potpunosti omogućene na ovom <ph name="IDS_SHORT_PRODUCT_NAME" /> uređaju.</translation> <translation id="894763922177556086">Dobra</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index a39df77..4552c28c 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -161,6 +161,7 @@ <translation id="1153356358378277386">Dispositius vinculats</translation> <translation id="1153636665119721804">Programa Protecció avançada de Google</translation> <translation id="1155816283571436363">S'està connectant al telèfon</translation> +<translation id="1158080958325422608">Canvia a majúscules</translation> <translation id="1158238185437008462">Consulta els records</translation> <translation id="1161575384898972166">Inicieu la sessió a <ph name="TOKEN_NAME" /> per exportar el certificat de client.</translation> <translation id="116173250649946226">L'administrador ha establert un tema predeterminat que no es pot canviar.</translation> @@ -530,6 +531,7 @@ <translation id="1549275686094429035">L'ARC està activat</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> vol accedir a <ph name="VOLUME_NAME" />. És possible que modifiqui o suprimeixi els fitxers.</translation> <translation id="1552301827267621511">L'extensió "<ph name="EXTENSION_NAME" />" ha canviat el proveïdor de cerca i ara s'utilitza <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Gestiona l'extensió</translation> <translation id="1553538517812678578">il·limitat</translation> <translation id="1555130319947370107">Blau</translation> <translation id="1556537182262721003">No s'ha pogut desplaçar el directori d'extensions al perfil.</translation> @@ -692,6 +694,7 @@ <translation id="1700079447639026019">Llocs web que mai no poden fer servir galetes</translation> <translation id="1703331064825191675">No et preocupis mai per les teves contrasenyes</translation> <translation id="1703666494654169921">No permetis que els llocs web utilitzin dades o dispositius de realitat virtual</translation> +<translation id="1704097193565924901">Posa en majúscula</translation> <translation id="1704230497453185209">No permetis que els llocs web reprodueixin so</translation> <translation id="1704970325597567340">Es va executar una comprovació de seguretat el dia <ph name="DATE" /></translation> <translation id="1706586824377653884">Afegida per l'administrador</translation> @@ -2776,7 +2779,6 @@ <translation id="3842552989725514455">Tipus de lletra Serif</translation> <translation id="3843464315703645664">Inclòs internament a la llista d'accés permès</translation> <translation id="3844888638014364087">S'ha inserit l'emoji</translation> -<translation id="384513009320852920">Comprova que el dispositiu Bluetooth es trobi a prop i en mode de vinculació. <ph name="BEGIN_LINK_LEARN_MORE" />Més informació<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Obtén eines per desenvolupar llocs web i aplicacions d'Android, entre d'altres. En instal·lar Linux, es baixaran <ph name="DOWNLOAD_SIZE" /> de dades.</translation> <translation id="3847319713229060696">Ajuda a millorar la seguretat al web per a tothom</translation> <translation id="3848547754896969219">Obre en una finestra d'&incògnit</translation> @@ -3560,6 +3562,7 @@ <translation id="4681453295291708042">Desactiva Compartició Nearby</translation> <translation id="4681930562518940301">Obre la &imatge original en una pestanya nova</translation> <translation id="4682551433947286597">Els fons de pantalla apareixen a la pantalla d'inici de sessió.</translation> +<translation id="4683629100208651599">Canvia a minúscules</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />% (opció predeterminada)</translation> <translation id="4684427112815847243">Sincronitza-ho tot</translation> <translation id="4684471265911890182"><ph name="APP_NAME" /> està provant d'accedir a la càmera. Desactiva l'interruptor de privadesa de la càmera per permetre-hi l'accés.</translation> @@ -4283,7 +4286,6 @@ <translation id="5485102783864353244">Afegeix l'aplicació</translation> <translation id="5485754497697573575">Restaura totes les pestanyes</translation> <translation id="5486261815000869482">Confirma la contrasenya</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> comparteix la vostra pantalla amb <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simula el reinici del navegador</translation> <translation id="5487460042548760727">Canvia el nom del perfil per <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Esborra les dades</translation> @@ -4345,6 +4347,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> vol</translation> <translation id="5534304873398226603">Descarta la foto o el vídeo</translation> <translation id="5535941515421698170">Suprimeix també les teves dades d'aquest dispositiu</translation> +<translation id="5537725057119320332">Emet</translation> <translation id="5539221284352502426">El servidor ha rebutjat la contrasenya que has introduït. Els motius poden ser els següents: la contrasenya és massa curta, la contrasenya ha d'incloure números o símbols, o la contrasenya no es pot haver utilitzat anteriorment.</translation> <translation id="5541694225089836610">L'administrador ha desactivat l'acció</translation> <translation id="5542132724887566711">Perfil</translation> @@ -4576,6 +4579,7 @@ <translation id="5787146423283493983">Acord de clau</translation> <translation id="5787420647064736989">Nom del dispositiu</translation> <translation id="5788367137662787332">Com a mínim una partició del dispositiu <ph name="DEVICE_LABEL" /> no s'ha pogut muntar.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Amb èxit</translation> <translation id="5790651917470750848">La redirecció de ports ja existeix</translation> <translation id="5792728279623964091">Toca el botó d'engegada</translation> @@ -4807,10 +4811,8 @@ <ph name="BEGIN_PARAGRAPH2" />Pots desactivar la ubicació desactivant l'opció Ubicació principal del dispositiu. També pots desactivar l'ús de sensors, xarxes mòbils i Wi-Fi per calcular la ubicació a la configuració d'ubicació.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Surt de la pantalla completa</translation> <translation id="6042308850641462728">Més</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> està compartint una pestanya de Chrome amb <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">No s'ha pogut analitzar la configuració</translation> <translation id="6043994281159824495">Tanca la sessió ara</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> està compartint una pestanya de Chrome i àudio amb <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Botó TrackPoint principal</translation> <translation id="6047632800149092791">La sincronització no funciona. Prova de tancar la sessió i iniciar-la de nou.</translation> <translation id="6049797270917061226">Aquest fitxer podria permetre que uns atacants et robessin informació personal.</translation> @@ -5954,6 +5956,7 @@ <translation id="7257173066616499747">Xarxes Wi-Fi</translation> <translation id="725758059478686223">Servei d'impressió</translation> <translation id="7257666756905341374">Llegeix les dades que es copiïn i s'enganxin</translation> +<translation id="7258192266780953209">Transformacions</translation> <translation id="7258225044283673131">L'aplicació no respon. Selecciona "Força el tancament" per tancar l'aplicació.</translation> <translation id="7262004276116528033">Aquest servei d'inici de sessió s'allotja a <ph name="SAML_DOMAIN" /></translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Prova aquests passos per resoldre el problema: @@ -7307,7 +7310,6 @@ <translation id="8655295600908251630">Canal</translation> <translation id="8655972064210167941">S'ha produït un problema en iniciar la sessió perquè no s'ha pogut verificar la contrasenya. Contacteu amb l'administrador o torneu a provar-ho.</translation> <translation id="8657393004602556571">Vols descartar els suggeriments?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> està compartint la pantalla i l'àudio amb <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Obre l'enllaç en una finestra d'incò&gnit</translation> <translation id="8662671328352114214">Connecta't a una xarxa <ph name="TYPE" /></translation> <translation id="8662733268723715832">Aquest procés està tardant més del previst. Pots ometre'l o esperar fins que acabi.</translation> @@ -7602,7 +7604,6 @@ <translation id="8941173171815156065">Revoca el permís <ph name="PERMISSION" /></translation> <translation id="894360074127026135">Entrada progressiva internacional de Netscape</translation> <translation id="8944099748578356325">Consumirà la bateria més ràpidament (actualment està al <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> està compartint una finestra amb <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Mida de la icona</translation> <translation id="8946359700442089734">Les funcions de depuració no s'han activat del tot en aquest dispositiu <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Bona</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 3477090..82ef68b 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -535,6 +535,7 @@ <translation id="1549275686094429035">Povoleno ARC</translation> <translation id="1549788673239553762">Aplikace <ph name="APP_NAME" /> chce získat přístup ke svazku <ph name="VOLUME_NAME" />. Bude moci upravit nebo smazat vaše soubory.</translation> <translation id="1552301827267621511">Rozšíření <ph name="EXTENSION_NAME" /> změnilo poskytovatele vyhledávání na <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Správa rozšíření</translation> <translation id="1553538517812678578">neomezené</translation> <translation id="1555130319947370107">Modrá</translation> <translation id="1556537182262721003">Adresář rozšíření nelze přesunout do profilu.</translation> @@ -2789,7 +2790,6 @@ <translation id="3842552989725514455">Patkové písmo</translation> <translation id="3843464315703645664">Na interním seznamu povolených</translation> <translation id="3844888638014364087">Byla vložena ikona emodži</translation> -<translation id="384513009320852920">Zařízení Bluetooth musí být v režimu párování a poblíž. <ph name="BEGIN_LINK_LEARN_MORE" />Další informace<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Získejte nástroje k vývoji webů, aplikací pro Android apod. Při instalaci systému Linux se stáhne <ph name="DOWNLOAD_SIZE" /> dat.</translation> <translation id="3847319713229060696">Pomáhat se zlepšováním bezpečnosti internetu pro všechny</translation> <translation id="3848547754896969219">Otevřít v &anonymním okně</translation> @@ -4299,7 +4299,6 @@ <translation id="5485102783864353244">Přidat aplikaci</translation> <translation id="5485754497697573575">Obnovit všechny karty</translation> <translation id="5486261815000869482">Potvrďte heslo</translation> -<translation id="5486275809415469523">Aplikace <ph name="APP_NAME" /> sdílí vaši obrazovku s kartou <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simulovat restart prohlížeče</translation> <translation id="5487460042548760727">Přejmenovat profil na <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Vymazat data</translation> @@ -4361,6 +4360,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> vyžaduje</translation> <translation id="5534304873398226603">Zahodit fotku nebo video</translation> <translation id="5535941515421698170">Zároveň z tohoto zařízení odstranit vaše stávající údaje</translation> +<translation id="5537725057119320332">Odeslat</translation> <translation id="5539221284352502426">Zadané heslo bylo serverem odmítnuto. Možné příčiny: Heslo je příliš krátké. Heslo musí obsahovat číslice nebo symboly. Heslo se musí lišit od předchozích hesel.</translation> <translation id="5541694225089836610">Administrátor akci zakázal</translation> <translation id="5542132724887566711">Profil</translation> @@ -4591,6 +4591,7 @@ <translation id="5787146423283493983">Smlouva o klíči</translation> <translation id="5787420647064736989">Název zařízení</translation> <translation id="5788367137662787332">Je nám líto, minimálně jeden oddíl zařízení <ph name="DEVICE_LABEL" /> nelze připojit.</translation> +<translation id="5789643057113097023">,</translation> <translation id="5790085346892983794">Úspěšně provedeno</translation> <translation id="5790651917470750848">Přesměrování portů již existuje</translation> <translation id="5792728279623964091">Klepněte na vypínač</translation> @@ -4823,10 +4824,8 @@ <ph name="BEGIN_PARAGRAPH2" />Určování polohy můžete vypnout tím, že v zařízení deaktivujete hlavní nastavení polohy. V nastavení polohy můžete také vypnout používání sítí Wi-Fi, mobilních sítí a senzorů k určování polohy.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Ukončit režim celé obrazovky</translation> <translation id="6042308850641462728">Více</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> sdílí kartu Chrome s kartou <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Konfiguraci se nepodařilo analyzovat</translation> <translation id="6043994281159824495">Odhlásit se</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> sdílí kartu Chrome a zvuk s kartou <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Primární tlačítko TrackPointu</translation> <translation id="6047632800149092791">Synchronizace nefunguje. Zkuste se odhlásit a znovu přihlásit.</translation> <translation id="6049797270917061226">Tento soubor by útočníkům mohl umožnit ukrást vaše osobní údaje.</translation> @@ -7329,7 +7328,6 @@ <translation id="8655295600908251630">Kanál</translation> <translation id="8655972064210167941">Přihlášení se nezdařilo, protože nelze ověřit vaše heslo. Kontaktujte administrátora nebo to zkuste znovu.</translation> <translation id="8657393004602556571">Chcete zpětnou vazbu zahodit?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> sdílí vaši obrazovku a zvuk s kartou <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Otevřít odkaz v &anonymním okně</translation> <translation id="8662671328352114214">Připojení k síti <ph name="TYPE" /></translation> <translation id="8662733268723715832">Tato akce trvá déle než obvykle. Můžete ji přeskočit nebo počkat na dokončení.</translation> @@ -7626,7 +7624,6 @@ <translation id="8941173171815156065">Odebrat oprávnění <ph name="PERMISSION" /></translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Bude rychleji vybíjet baterii (aktuálně <ph name="BATTERY_PERCENTAGE" /> %)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> sdílí okno s kartou <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Velikost ikon</translation> <translation id="8946359700442089734">V tomto zařízení <ph name="IDS_SHORT_PRODUCT_NAME" /> nebyly úplně povoleny funkce ladění.</translation> <translation id="894763922177556086">Dobrá</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 34f16a1..e9d25004 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -164,6 +164,7 @@ <translation id="1153636665119721804">Google-programmet Avanceret beskyttelse</translation> <translation id="1155545602507378023">Nej, kun denne enhed</translation> <translation id="1155816283571436363">Opretter forbindelse til din telefon</translation> +<translation id="1158080958325422608">Anvend store bogstaver</translation> <translation id="1158238185437008462">Se minder</translation> <translation id="1161575384898972166">Log ind på <ph name="TOKEN_NAME" /> for at eksportere klientcertifikatet.</translation> <translation id="116173250649946226">Din administrator har indstillet et standardtema, der ikke kan ændres.</translation> @@ -536,6 +537,7 @@ <translation id="1549275686094429035">ARC-kompatibel</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> ønsker at få adgang til <ph name="VOLUME_NAME" />. Dette kan ændre eller slette dine filer.</translation> <translation id="1552301827267621511">Udvidelsen "<ph name="EXTENSION_NAME" />" ændrede søgemaskinen til <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Administrer udvidelse</translation> <translation id="1553538517812678578">ubegrænset</translation> <translation id="1555130319947370107">Blå</translation> <translation id="1556537182262721003">Udvidelsesmappen kunne ikke flyttes til profilen.</translation> @@ -698,6 +700,7 @@ <translation id="1700079447639026019">Websites, der aldrig kan anvende cookies</translation> <translation id="1703331064825191675">Glem aldrig dine adgangskoder igen</translation> <translation id="1703666494654169921">Tillad ikke, at websites bruger virtual reality-enheder eller -data</translation> +<translation id="1704097193565924901">Anvend stort begyndelsesbogstav</translation> <translation id="1704230497453185209">Tillad ikke, at websites afspiller lyd</translation> <translation id="1704970325597567340">Sikkerhedstjekket blev udført <ph name="DATE" /></translation> <translation id="1706586824377653884">Tilføjet af din administrator</translation> @@ -2802,7 +2805,6 @@ <translation id="3842552989725514455">Serif-skrifttype</translation> <translation id="3843464315703645664">På intern tilladelsesliste</translation> <translation id="3844888638014364087">Der blev indsat en emoji</translation> -<translation id="384513009320852920">Sørg for, at din Bluetooth-enhed er i parringstilstand og befinder sig tæt på. <ph name="BEGIN_LINK_LEARN_MORE" />Få flere oplysninger<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Få værktøjer til at udvikle websites, Android-apps og meget mere. Når du installerer Linux, downloades <ph name="DOWNLOAD_SIZE" /> data.</translation> <translation id="3847319713229060696">Vær med til at forbedre sikkerheden på nettet for alle</translation> <translation id="3848547754896969219">Åbn i &inkognitovindue</translation> @@ -3590,6 +3592,7 @@ <translation id="4681453295291708042">Deaktiver Deling tæt på</translation> <translation id="4681930562518940301">Åbn originalbillede på ny fane</translation> <translation id="4682551433947286597">Baggrunde vises på loginskærmen.</translation> +<translation id="4683629100208651599">Anvend små bogstaver</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" /> % (standard)</translation> <translation id="4684427112815847243">Synkroniser alt</translation> <translation id="4684471265911890182"><ph name="APP_NAME" /> forsøger at få adgang til kameraet. Slå kameraets privatlivskontakt fra for at give appen adgang.</translation> @@ -4313,7 +4316,6 @@ <translation id="5485102783864353244">Tilføj app</translation> <translation id="5485754497697573575">Gendan alle faner</translation> <translation id="5486261815000869482">Bekræft adgangskode</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> deler din skærm med <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simuler genstart af browser</translation> <translation id="5487460042548760727">Omdøb profil til <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Ryd data</translation> @@ -4375,6 +4377,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> vil gerne</translation> <translation id="5534304873398226603">Slet billede eller video</translation> <translation id="5535941515421698170">Fjern også dine eksisterende data fra denne enhed</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">Den angivne adgangskode blev afvist af serveren. Mulige årsager: Adgangskoden er for kort. Adgangskoden skal indeholde tal eller symboler. Adgangskoden skal være forskellig fra tidligere adgangskoder.</translation> <translation id="5541694225089836610">Handlingen er deaktiveret af din administrator</translation> <translation id="5542132724887566711">Profil</translation> @@ -4605,6 +4608,7 @@ <translation id="5787146423283493983">Nøgleoverensstemmelse</translation> <translation id="5787420647064736989">Enhedsnavn</translation> <translation id="5788367137662787332">Vi beklager, men der kunne ikke oprettes forbindelse til mindst én partition på enheden <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Fuldført</translation> <translation id="5790651917470750848">Omdirigeringen af port findes allerede</translation> <translation id="5792728279623964091">Tryk på afbryderknappen</translation> @@ -4837,10 +4841,8 @@ <ph name="BEGIN_PARAGRAPH2" />Du kan slå Placering fra ved at deaktivere den overordnede lokationsindstilling på enheden. Du kan også deaktivere brugen af Wi-Fi, mobilnetværk og sensorer ifm. placering i lokationsindstillingerne.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Luk fuld skærm</translation> <translation id="6042308850641462728">Mere</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> deler en Chrome-fane med <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Konfigurationen kunne ikke parses</translation> <translation id="6043994281159824495">Log ud nu</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> deler en Chrome-fane og lyd med <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Primær TrackPoint-knap</translation> <translation id="6047632800149092791">Der kunne ikke synkroniseres. Prøv at logge ud og ind igen.</translation> <translation id="6049797270917061226">Denne fil lader muligvis hackere stjæle dine personlige oplysninger.</translation> @@ -5987,6 +5989,7 @@ <translation id="7257173066616499747">Wi-Fi-netværk</translation> <translation id="725758059478686223">Udskrivningstjeneste</translation> <translation id="7257666756905341374">Læs de data, du kopierer og indsætter</translation> +<translation id="7258192266780953209">Transformationer</translation> <translation id="7258225044283673131">Appen svarer ikke. Vælg "Tving til at lukke" for at lukke appen.</translation> <translation id="7262004276116528033">Denne logintjeneste hostes af <ph name="SAML_DOMAIN" />.</translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Prøv disse fejlfindingstrin: @@ -7342,7 +7345,6 @@ <translation id="8655295600908251630">Kanal</translation> <translation id="8655972064210167941">Login mislykkedes, da din adgangskode ikke kunne bekræftes. Kontakt din administrator, eller prøv igen.</translation> <translation id="8657393004602556571">Vil du slette denne feedback?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> deler din skærm og lyd med <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Åbn link i inko&gnitovindue</translation> <translation id="8662671328352114214">Opret forbindelse til <ph name="TYPE" />-netværk</translation> <translation id="8662733268723715832">Dette tager længere tid end forventet. Du kan springe opdateringen over eller vente, indtil den er gennemført.</translation> @@ -7639,7 +7641,6 @@ <translation id="8941173171815156065">Tilbagekald tilladelsen "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Netscape, international optrapning</translation> <translation id="8944099748578356325">Batteriet bruges hurtigere (i øjeblikket <ph name="BATTERY_PERCENTAGE" /> %)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> deler et vindue med <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Ikonstørrelse</translation> <translation id="8946359700442089734">Fejlretningsfunktionerne blev ikke aktiveret korrekt på denne <ph name="IDS_SHORT_PRODUCT_NAME" />-enhed.</translation> <translation id="894763922177556086">God</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 6144f85..ef443407 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -528,6 +528,7 @@ <translation id="1549275686094429035">ARC aktiviert</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> möchte auf <ph name="VOLUME_NAME" /> zugreifen. Ihre Dateien können geändert oder gelöscht werden.</translation> <translation id="1552301827267621511">Die Erweiterung "<ph name="EXTENSION_NAME" />" hat <ph name="SEARCH_PROVIDER_DOMAIN" /> als neuen Suchanbieter festgelegt</translation> +<translation id="1552752544932680961">Erweiterung verwalten</translation> <translation id="1553538517812678578">unbegrenzt</translation> <translation id="1555130319947370107">Blau</translation> <translation id="1556537182262721003">Erweiterungsverzeichnis konnte nicht in Profil verschoben werden.</translation> @@ -2776,7 +2777,6 @@ <translation id="3842552989725514455">Schriftart Serif</translation> <translation id="3843464315703645664">Intern auf der Zulassungsliste</translation> <translation id="3844888638014364087">Emoji eingefügt</translation> -<translation id="384513009320852920">Auf dem Bluetooth-Gerät muss der Kopplungsmodus aktiviert sein und es muss sich in der Nähe befinden <ph name="BEGIN_LINK_LEARN_MORE" />Weitere Informationen<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Entwicklertools für Websites, Android-Apps und mehr – für die Installation von Linux werden <ph name="DOWNLOAD_SIZE" /> an Daten heruntergeladen.</translation> <translation id="3847319713229060696">Dabei helfen, das Web für alle sicherer zu machen</translation> <translation id="3848547754896969219">In &Inkognitofenster öffnen</translation> @@ -4282,7 +4282,6 @@ <translation id="5485102783864353244">App hinzufügen</translation> <translation id="5485754497697573575">Alle Tabs wiederherstellen</translation> <translation id="5486261815000869482">Passwort bestätigen</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> teilt den Bildschirm mit <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Browser-Neustart simulieren</translation> <translation id="5487460042548760727">Profil umbenennen in „<ph name="PROFILE_NAME" />“</translation> <translation id="5487521232677179737">Daten löschen</translation> @@ -4344,6 +4343,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> möchte:</translation> <translation id="5534304873398226603">Foto oder Video verwerfen</translation> <translation id="5535941515421698170">Auch vorhandene Daten von diesem Gerät entfernen</translation> +<translation id="5537725057119320332">Streamen</translation> <translation id="5539221284352502426">Das eingegebene Passwort wurde vom Server zurückgewiesen. Mögliche Ursachen: Das Passwort ist zu kurz. Das Passwort muss Zahlen oder Symbole enthalten. Das Passwort muss sich von vorherigen Passwörtern unterscheiden.</translation> <translation id="5541694225089836610">Die Aktion wurde von Ihrem Administrator deaktiviert</translation> <translation id="5542132724887566711">Profil</translation> @@ -4574,6 +4574,7 @@ <translation id="5787146423283493983">Schlüsselvereinbarung</translation> <translation id="5787420647064736989">Gerätename</translation> <translation id="5788367137662787332">Mindestens eine Partition auf dem Gerät <ph name="DEVICE_LABEL" /> konnte nicht bereitgestellt werden.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Abgeschlossen</translation> <translation id="5790651917470750848">Portweiterleitung ist bereits vorhanden</translation> <translation id="5792728279623964091">Tippen Sie auf die Ein/Aus-Taste</translation> @@ -4805,10 +4806,8 @@ <ph name="BEGIN_PARAGRAPH2" />Sie können den Standortdienst deaktivieren, indem Sie die Haupteinstellung für den Standort auf Ihrem Gerät ausschalten. In den Standorteinstellungen können Sie auch die Nutzung von WLANs, Mobilfunknetzen und Sensoren für die Standortbestimmung deaktivieren.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Vollbildmodus beenden</translation> <translation id="6042308850641462728">Mehr</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> teilt einen Chrome-Tab mit <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Fehler beim Parsen der Konfiguration</translation> <translation id="6043994281159824495">Jetzt abmelden</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> teilt einen Chrome-Tab und Audio mit <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Primäre TrackPoint-Taste</translation> <translation id="6047632800149092791">Synchronisierung funktioniert nicht. Melden Sie sich ab und dann wieder an.</translation> <translation id="6049797270917061226">Diese Datei könnte es Angreifern ermöglichen, Ihre personenbezogenen Daten zu stehlen.</translation> @@ -7304,7 +7303,6 @@ <translation id="8655295600908251630">Kanal</translation> <translation id="8655972064210167941">Sie konnten nicht angemeldet werden, weil Ihr Passwort nicht bestätigt werden konnte. Bitte wenden Sie sich an Ihren Administrator oder versuchen Sie es erneut.</translation> <translation id="8657393004602556571">Möchten Sie das Feedback verwerfen?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> teilt Bildschirm und Audio mit <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Link in Inko&gnito-Fenster öffnen</translation> <translation id="8662671328352114214">Mit <ph name="TYPE" /> verbinden</translation> <translation id="8662733268723715832">Dieser Vorgang dauert länger als erwartet. Sie können ihn entweder überspringen oder warten, bis er abgeschlossen ist.</translation> @@ -7599,7 +7597,6 @@ <translation id="8941173171815156065">Berechtigung "<ph name="PERMISSION" />" aufheben</translation> <translation id="894360074127026135">Netscape International Step-up</translation> <translation id="8944099748578356325">Den Akku schneller verbrauchen (aktueller Stand: <ph name="BATTERY_PERCENTAGE" /> %)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> teilt ein Fenster mit <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Symbolgröße</translation> <translation id="8946359700442089734">Die Debugging-Funktionen wurden auf diesem <ph name="IDS_SHORT_PRODUCT_NAME" />-Gerät nicht vollständig aktiviert.</translation> <translation id="894763922177556086">Gut</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 1185331..504aac0 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -162,6 +162,7 @@ <translation id="1152346050262092795">Εισαγάγετε ξανά τον κωδικό πρόσβασής σας για να επαληθεύσετε τον λογαριασμό σας.</translation> <translation id="1153356358378277386">Συσκευές σε σύζευξη</translation> <translation id="1153636665119721804">Πρόγραμμα Σύνθετης προστασίας Google</translation> +<translation id="1155545602507378023">Όχι, μόνο αυτή η συσκευή</translation> <translation id="1155816283571436363">Γίνεται σύνδεση με το τηλέφωνό σας…</translation> <translation id="1158080958325422608">Μετατροπή σε κεφαλαία γράμματα</translation> <translation id="1158238185437008462">Δείτε αναμνήσεις</translation> @@ -396,6 +397,7 @@ <translation id="1410197035576869800">Εικονίδιο εφαρμογής</translation> <translation id="1410616244180625362">Να συνεχίσει να επιτρέπεται στο <ph name="HOST" /> η πρόσβαση στην κάμερά σας</translation> <translation id="1410806973194718079">Δεν είναι δυνατός ο έλεγχος πολιτικών.</translation> +<translation id="1412681350727866021">Επιπλέον επεκτάσεις</translation> <translation id="1414315029670184034">Να μην επιτρέπεται στους ιστοτόπους να χρησιμοποιούν την κάμερά σας</translation> <translation id="1414648216875402825">Πρόκειται να ενημερώσετε σε μια ασταθή έκδοση του <ph name="PRODUCT_NAME" />, η οποία περιλαμβάνει δυνατότητες που βρίσκονται υπό ανάπτυξη. Ενδεχομένως να υπάρχουν ατέλειες και απρόσμενα σφάλματα.</translation> <translation id="1415708812149920388">Δεν επιτρέπεται η πρόσβαση ανάγνωσης στο πρόχειρο</translation> @@ -534,6 +536,7 @@ <translation id="1549275686094429035">Το ARC ενεργοποιήθηκε</translation> <translation id="1549788673239553762">Η εφαρμογή <ph name="APP_NAME" /> θέλει να αποκτήσει πρόσβαση σε <ph name="VOLUME_NAME" />. Ενδέχεται να τροποποιήσει ή να διαγράψει τα αρχεία σας.</translation> <translation id="1552301827267621511">Η επέκταση "<ph name="EXTENSION_NAME" />" άλλαξε τον πάροχο αναζήτησης που χρησιμοποιείται <ph name="SEARCH_PROVIDER_DOMAIN" />.</translation> +<translation id="1552752544932680961">Διαχείριση επέκτασης</translation> <translation id="1553538517812678578">απεριόριστο</translation> <translation id="1555130319947370107">Μπλε</translation> <translation id="1556537182262721003">Δεν ήταν δυνατή η μετακίνηση του καταλόγου επέκτασης στο προφίλ.</translation> @@ -949,6 +952,7 @@ <translation id="1937774647013465102">Δεν είναι δυνατή η εισαγωγή ενός κοντέινερ με τύπο αρχιτεκτονικής <ph name="ARCHITECTURE_CONTAINER" /> με μια συσκευή της οποίας ο τύπος αρχιτεκτονικής είναι <ph name="ARCHITECTURE_DEVICE" />. Προσπαθήστε να επαναφέρετε αυτό το κοντέινερ σε μια άλλη συσκευή ή αποκτήστε πρόσβαση στα αρχεία αυτής της εικόνας κοντέινερ ανοίγοντάς τη στην εφαρμογή Αρχεία.</translation> <translation id="1938351510777341717">Εξωτερικό πλήκτρο Command</translation> <translation id="1940546824932169984">Συνδεδεμένες συσκευές</translation> +<translation id="1941410638996203291">Ώρα έναρξης <ph name="TIME" /></translation> <translation id="1942128823046546853">Ανάγνωση και αλλαγή όλων των δεδομένων σας σε όλους τους ιστοτόπους</translation> <translation id="1942600407708803723">Απενεργοποίηση όταν το κάλυμμα είναι κλειστό</translation> <translation id="1944528062465413897">Κωδικός σύζευξης Bluetooth:</translation> @@ -1327,6 +1331,7 @@ <translation id="2320295602967756579">Ενεργοποίηση φωτεινού θέματος</translation> <translation id="2322193970951063277">Κεφαλίδες και υποσέλιδα</translation> <translation id="2322318151094136999">Να γίνεται ερώτηση όταν ένας ιστότοπος επιθυμεί πρόσβαση στις σειριακές θύρες (συνιστάται)</translation> +<translation id="2322622365472107569">Ώρα λήξης <ph name="TIME" /></translation> <translation id="2323018538045954000">Αποθηκευμένα δίκτυα Wi-Fi</translation> <translation id="2325444234681128157">Απομνημόνευση κωδικού πρόσβασης</translation> <translation id="2326188115274135041">Επιβεβαίωση PIN για ενεργοποίηση αυτόματου ξεκλειδώματος</translation> @@ -1432,6 +1437,7 @@ <translation id="2435248616906486374">Η σύνδεση δικτύου διακόπηκε</translation> <translation id="2435457462613246316">Εμφάνιση κωδικού πρόσβασης</translation> <translation id="2436186046335138073">Να επιτρέπεται στο <ph name="HANDLER_HOSTNAME" /> το άνοιγμα όλων των συνδέσμων <ph name="PROTOCOL" />;</translation> +<translation id="2439626940657133600">Φόρτωση <ph name="WINDOW_TITLE" /></translation> <translation id="2440604414813129000">Προβολή κώ&δικα</translation> <translation id="244231003699905658">Μη έγκυρη διεύθυνση. Βεβαιωθείτε ότι η διεύθυνση είναι σωστή και δοκιμάστε ξανά.</translation> <translation id="2442916515643169563">Σκίαση κειμένου</translation> @@ -1937,6 +1943,7 @@ <translation id="2935654492420446828">Προσθέστε έναν σχολικό λογαριασμό αργότερα</translation> <translation id="2936851848721175671">Δημιουργία αντιγράφων ασφαλείας και επαναφορά</translation> <translation id="2938225289965773019">Άνοιγμα συνδέσμων <ph name="PROTOCOL" /></translation> +<translation id="2939908794993783865">Επιπλέον ανενεργοί ιστότοποι</translation> <translation id="2939938020978911855">Εμφάνιση διαθέσιμων συσκευών Bluetooth</translation> <translation id="2941112035454246133">Χαμηλή</translation> <translation id="2942279350258725020">Μηνύματα Android</translation> @@ -2082,6 +2089,7 @@ <translation id="3090589793601454425">Να μην γίνει μετακίνηση</translation> <translation id="3090819949319990166">Δεν είναι δυνατή η αντιγραφή του εξωτερικού αρχείου crx στο <ph name="TEMP_CRX_FILE" />.</translation> <translation id="3090871774332213558">Έγινε σύζευξη της συσκευής "<ph name="DEVICE_NAME" />"</translation> +<translation id="3093362725605442088">Ανάγνωση σειριακών αριθμών συσκευής Chrome OS και στοιχείων.</translation> <translation id="3093714882666365141">Να μην επιτρέπεται στους ιστοτόπους να εγκαθιστούν δείκτες χειρισμού για πληρωμές</translation> <translation id="3094141017404513551">Αυτό θα διαχωρίσει την περιήγησή σας από τον χρήστη <ph name="EXISTING_USER" />.</translation> <translation id="3095871294753148861">Οι σελιδοδείκτες, οι κωδικοί πρόσβασης και άλλα δεδομένα του προγράμματος περιήγησης συγχρονίζονται με τον κύριο λογαριασμό.</translation> @@ -2269,6 +2277,7 @@ <translation id="3308852433423051161">Φόρτωση Βοηθού Google…</translation> <translation id="3309330461362844500">Αναγνωριστικό προφίλ πιστοποιητικού</translation> <translation id="3311445899360743395">Τα δεδομένα που σχετίζονται με αυτήν την εφαρμογή μπορεί να καταργηθούν από αυτήν τη συσκευή.</translation> +<translation id="3312883087018430408">Για αναζήτηση σε έναν συγκεκριμένο ιστότοπο ή μέρος του Chrome, πληκτρολογήστε τη συντόμευση στη γραμμή διευθύνσεων και, στη συνέχεια, τη συντόμευση πληκτρολογίου που προτιμάτε. Για παράδειγμα, για αναζήτηση μόνο στους Σελιδοδείκτες, πληκτρολογήστε "@σελιδοδείκτες" και, στη συνέχεια, πατήστε Tab ή το πλήκτρο διαστήματος.</translation> <translation id="3313622045786997898">Τιμή υπογραφής πιστοποιητικού</translation> <translation id="3313950410573257029">Έλεγχος σύνδεσης</translation> <translation id="3315158641124845231">Απόκρυψη του <ph name="PRODUCT_NAME" /></translation> @@ -2688,6 +2697,7 @@ <translation id="3747077776423672805">Για να καταργήσετε εφαρμογές, μεταβείτε στις Ρυθμίσεις > Google Play Store > Διαχείριση προτιμήσεων Android > Εφαρμογές ή Διαχείριση εφαρμογών. Έπειτα, πατήστε την εφαρμογή που θέλετε να απεγκαταστήσετε (μπορεί να χρειαστεί να σύρετε προς τα δεξιά ή προς τα αριστερά για να βρείτε την εφαρμογή). Στη συνέχεια, πατήστε Απεγκατάσταση ή Απενεργοποίηση.</translation> <translation id="3747220812138541072">Εμφάνιση ενσωματωμένων προτάσεων γραφής που εμφανίζονται ενώ πληκτρολογείτε</translation> <translation id="3748706263662799310">Αναφορά σφάλματος</translation> +<translation id="3750562496035670393">Το Chrome αποθήκευσε τον κωδικό πρόσβασής σας σε αυτήν τη συσκευή, αλλά μπορείτε να τον αποθηκεύσετε στον Λογαριασμό σας Google. Στη συνέχεια, όλοι οι κωδικοί πρόσβασης στον Λογαριασμό σας Google θα είναι επίσης διαθέσιμοι ενώ είστε συνδεδεμένοι.</translation> <translation id="3752253558646317685">Ζητήστε από το παιδί σας να συνεχίσει να σηκώνει το δάκτυλό του για να αποθηκευτεί το δακτυλικό αποτύπωμα.</translation> <translation id="3752582316358263300">OK...</translation> <translation id="3753033997400164841">Αποθηκεύστε μία φορά. Χρησιμοποιήστε παντού.</translation> @@ -2794,7 +2804,6 @@ <translation id="3842552989725514455">Γραμματοσειρά Serif</translation> <translation id="3843464315703645664">Επιτρέπεται εσωτερικά</translation> <translation id="3844888638014364087">Έγινε εισαγωγή του emoji.</translation> -<translation id="384513009320852920">Βεβαιωθείτε ότι η συσκευή Bluetooth βρίσκεται σε λειτουργία σύζευξης και σε κοντινή απόσταση. <ph name="BEGIN_LINK_LEARN_MORE" />Μάθετε περισσότερα<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Αποκτήστε εργαλεία για τον προγραμματισμό ιστοτόπων, εφαρμογών Android και άλλων στοιχείων. Με την εγκατάσταση του Linux, θα ληφθούν <ph name="DOWNLOAD_SIZE" /> δεδομένα.</translation> <translation id="3847319713229060696">Συμβάλλετε στη βελτίωση της ασφάλειας στον ιστό για όλους</translation> <translation id="3848547754896969219">Άνοιγμα σε παράθυρο για &ανώνυμη περιήγηση</translation> @@ -3129,6 +3138,7 @@ <translation id="4194570336751258953">Ενεργοποίηση λειτουργίας χειρισμού με αφή</translation> <translation id="4195643157523330669">Άνοιγμα σε νέα καρτέλα</translation> <translation id="4195814663415092787">Συνέχεια από εκεί που σταματήσατε</translation> +<translation id="4198268995694216131">Επιπλέον ιστότοποι</translation> <translation id="4200689466366162458">Προσαρμοσμένες λέξεις</translation> <translation id="4200983522494130825">Νέα &καρτέλα</translation> <translation id="4201546031411513170">Μπορείτε πάντα να επιλέξετε τα στοιχεία που θέλετε να συγχρονίσετε στις ρυθμίσεις.</translation> @@ -3250,6 +3260,7 @@ <translation id="4341577178275615435">Για την ενεργοποίηση ή την απενεργοποίηση της περιήγησης με σύμβολα προσθήκης, χρησιμοποιήστε τη συντόμευση F7</translation> <translation id="4341905082470253054">Έλεγχος κατάστασης TPM…</translation> <translation id="434198521554309404">Ταχύτητα. Ασφάλεια. Ευκολία.</translation> +<translation id="4343250402091037179">Για αναζήτηση σε έναν συγκεκριμένο ιστότοπο ή μέρος του Chrome, πληκτρολογήστε τη συντόμευση στη γραμμή διευθύνσεων και, στη συνέχεια, τη συντόμευση πληκτρολογίου που προτιμάτε.</translation> <translation id="434404122609091467">Με τον τρέχοντα πάροχο υπηρεσιών σας</translation> <translation id="4345587454538109430">Διαμόρφωση...</translation> <translation id="4345732373643853732">Το όνομα χρήστη δεν είναι γνωστό στον διακομιστή</translation> @@ -4002,6 +4013,7 @@ <translation id="5153234146675181447">Θα γίνει παράβλεψη του τηλεφώνου</translation> <translation id="5154108062446123722">Σύνθετες ρυθμίσεις για <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Θέμα</translation> +<translation id="5155327081870541046">Στη γραμμή διευθύνσεων, εισαγάγετε τη συντόμευση για τον ιστότοπο που θέλετε να αναζητήσετε, όπως "@σελιδοδείκτες". Στη συνέχεια, πατήστε τη συντόμευση πληκτρολογίου που προτιμάτε και εισαγάγετε τον όρο αναζήτησης.</translation> <translation id="5157635116769074044">Καρφίτσωμα αυτής της σελίδας στην Οθόνη έναρξης…</translation> <translation id="5159094275429367735">Ρύθμιση του Crostini</translation> <translation id="5159419673777902220">Ο γονέας σου έχει απενεργοποιήσει τις άδειες επέκτασης</translation> @@ -4303,7 +4315,6 @@ <translation id="5485102783864353244">Προσθήκη εφαρμογής</translation> <translation id="5485754497697573575">Επαναφορά όλων των καρτελών</translation> <translation id="5486261815000869482">Επιβεβαίωση κωδικού πρόσβασης</translation> -<translation id="5486275809415469523">Η εφαρμογή <ph name="APP_NAME" /> μοιράζεται την οθόνη σας με την καρτέλα <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Προσομοίωση επανεκκίνησης προγράμματος περιήγησης</translation> <translation id="5487460042548760727">Μετονομασία προφίλ σε <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Διαγραφή δεδομένων</translation> @@ -4365,6 +4376,7 @@ <translation id="5533001281916885985">To <ph name="SITE_NAME" /> θέλει να</translation> <translation id="5534304873398226603">Απόρριψη φωτογραφίας ή βίντεο</translation> <translation id="5535941515421698170">Επίσης, καταργήστε τα υπάρχοντα δεδομένα σας από αυτήν τη συσκευή</translation> +<translation id="5537725057119320332">Μετάδοση</translation> <translation id="5539221284352502426">Ο κωδικός πρόσβασης που εισαγάγατε απορρίφθηκε από τον διακομιστή. Στις πιθανές αιτίες περιλαμβάνονται οι εξής: Ο κωδικός πρόσβασης είναι πάρα πολύ σύντομος. Ο κωδικός πρόσβασης πρέπει να περιέχει αριθμούς ή σύμβολα. Ο κωδικός πρόσβασης πρέπει να διαφέρει από τους προηγούμενους κωδικούς πρόσβασης.</translation> <translation id="5541694225089836610">Η ενέργεια απενεργοποιήθηκε από τον διαχειριστή σας</translation> <translation id="5542132724887566711">Προφίλ</translation> @@ -4596,6 +4608,7 @@ <translation id="5787146423283493983">Βασική συμφωνία</translation> <translation id="5787420647064736989">Όνομα συσκευής</translation> <translation id="5788367137662787332">Λυπούμαστε, δεν ήταν δυνατή η προσάρτηση τουλάχιστον ενός διαμερίσματος της συσκευής <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Επιτυχία</translation> <translation id="5790651917470750848">Η προώθηση θύρας υπάρχει ήδη</translation> <translation id="5792728279623964091">Πατήστε το κουμπί λειτουργίας</translation> @@ -4621,6 +4634,7 @@ <translation id="5816434091619127343">Οι ζητούμενες αλλαγές στον εκτυπωτή θα τον καθιστούσαν ακατάλληλο για χρήση.</translation> <translation id="5817069030404929329">Μετακίνηση κωδικών πρόσβασης από αυτήν τη συσκευή στον Λογαριασμό σας Google;</translation> <translation id="5817918615728894473">Σύζευξη</translation> +<translation id="581840385858998009">Προσαρμογή ταπετσαρίας, avatar, προφύλαξης οθόνης και περισσότερων</translation> <translation id="5821565227679781414">Δημιουργία συντόμευσης</translation> <translation id="5822095611691580107">Επίπεδο μπαταρίας αριστερού ακουστικού <ph name="BATTERY_PERCENTAGE" />%.</translation> <translation id="5825412242012995131">Ενεργοποίηση (Συνιστάται)</translation> @@ -4827,10 +4841,8 @@ <ph name="BEGIN_PARAGRAPH2" />Μπορείτε να απενεργοποιήσετε την Τοποθεσία απενεργοποιώντας τη βασική ρύθμιση "Τοποθεσία" στη συσκευή σας. Μπορείτε επίσης να απενεργοποιήσετε τη χρήση δικτύων Wi-Fi και κινητής τηλεφωνίας και των αισθητήρων για την τοποθεσία στις ρυθμίσεις τοποθεσίας.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Έξοδος από πλήρη οθόνη</translation> <translation id="6042308850641462728">Περισσότερα</translation> -<translation id="6043317578411397101">Η εφαρμογή <ph name="APP_NAME" /> μοιράζεται μια καρτέλα Chrome με το <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Η ανάλυση της διαμόρφωσης απέτυχε.</translation> <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="6049797270917061226">Αυτό το αρχείο μπορεί να επιτρέψει σε υπεύθυνους επίθεσης να υποκλέψουν τα προσωπικά στοιχεία σας.</translation> @@ -4910,6 +4922,7 @@ <translation id="6116921718742659598">Αλλαγή γλώσσας και ρυθμίσεις εισόδου</translation> <translation id="6119927814891883061">Ονομασία συσκευής ως <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Καρφίτσωμα αυτής της σελίδας στην Οθόνη έναρξης…</translation> +<translation id="6121773125605585883">Προβολή κωδικού πρόσβασης με όνομα χρήστη <ph name="USERNAME" /> για τον ιστότοπο <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">Η σύνδεσή σας στο διαδίκτυο παρακολουθείται</translation> <translation id="6122093587541546701">Διεύθυνση ηλεκτρονικού ταχυδρομείου (προαιρετικά):</translation> <translation id="6122095009389448667">Συνέχεια αποκλεισμού αυτού του ιστοτόπου από την προβολή του πρόχειρου</translation> @@ -4986,6 +4999,7 @@ <translation id="6208725777148613371">Δεν ήταν δυνατή η αποθήκευση στο <ph name="WEB_DRIVE" /> – <ph name="INTERRUPT_REASON" /></translation> <translation id="6209838773933913227">Ενημέρωση στοιχείου</translation> <translation id="6209908325007204267">Η συσκευή σας περιλαμβάνει Αναβάθμιση του Chrome για επιχειρήσεις, αλλά το όνομα χρήστη σας δεν συσχετίζεται με έναν εταιρικό λογαριασμό. Δημιουργήστε έναν εταιρικό λογαριασμό μεταβαίνοντας στη διεύθυνση g.co/ChromeEnterpriseAccount σε μια δευτερεύουσα συσκευή.</translation> +<translation id="6210282067670792090">Στη γραμμή διευθύνσεων, χρησιμοποιήστε αυτήν τη συντόμευση πληκτρολογίου με συντομεύσεις για μηχανές αναζήτησης και αναζήτηση ιστοτόπου</translation> <translation id="621172521139737651">{COUNT,plural, =0{Άνοιγμα όλων σε &νέα ομάδα καρτελών}=1{Άνοιγμα σε &νέα ομάδα καρτελών}other{Άνοιγμα και των ({COUNT}) σε &νέα ομάδα καρτελών}}</translation> <translation id="6212039847102026977">Προβολή σύνθετων ιδιοτήτων δικτύου</translation> <translation id="6212168817037875041">Απενεργοποίηση οθόνης</translation> @@ -5469,6 +5483,7 @@ <translation id="6709357832553498500">Σύνδεση με χρήση <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Προηγούμενο</translation> <translation id="6711146141291425900">Σύνδεση λογαριασμού <ph name="WEB_DRIVE" /> για τις Λήψεις</translation> +<translation id="6712943853047024245">Έχετε αποθηκεύσει ήδη έναν κωδικό πρόσβασης με αυτό το όνομα χρήστη <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Προσθήκη προφίλ εργασίας</translation> <translation id="6715803357256707211">Παρουσιάστηκε σφάλμα κατά την εγκατάσταση της εφαρμογής σας Linux. Κάντε κλικ στην ειδοποίηση για λεπτομέρειες.</translation> <translation id="671619610707606484">Με αυτήν την ενέργεια θα διαγραφούν <ph name="TOTAL_USAGE" /> των δεδομένων που έχουν αποθηκευτεί από ιστοτόπους.</translation> @@ -6094,6 +6109,7 @@ <translation id="7385854874724088939">Παρουσιάστηκε σφάλμα κατά την προσπάθεια εκτύπωσης. Ελέγξτε τον εκτυπωτή σας και προσπαθήστε ξανά.</translation> <translation id="7385896526023870365">Αυτή η επέκταση δεν έχει πρόσθετη πρόσβαση ιστοτόπου.</translation> <translation id="7387273928653486359">Αποδεκτή</translation> +<translation id="7387951778417998929">Για να χρησιμοποιήσετε μια μηχανή αναζήτησης διαφορετική από την προεπιλεγμένη, πληκτρολογήστε τη συντόμευση στη γραμμή διευθύνσεων και, στη συνέχεια, τη συντόμευση πληκτρολογίου που προτιμάτε. Μπορείτε επίσης να αλλάξετε την προεπιλεγμένη μηχανή αναζήτησης εδώ.</translation> <translation id="7388209873137778229">Εμφανίζονται μόνο υποστηριζόμενες συσκευές.</translation> <translation id="7392118418926456391">Απέτυχε η σάρωση για ιούς</translation> <translation id="7392915005464253525">Ε&παναφορά παραθύρου που έχει κλείσει</translation> @@ -6271,6 +6287,7 @@ <translation id="7559719679815339381">Παρακαλώ περιμένετε… Η εφαρμογή kiosk βρίσκεται σε διαδικασία ενημέρωσης. Μην αφαιρέσετε τη συσκευή αποθήκευσης USB.</translation> <translation id="7560756177962144929">Συγχρονίστε τη συσκευή <ph name="DEVICE_TYPE" /></translation> <translation id="7561196759112975576">Πάντα</translation> +<translation id="7562099761826673163">Εξατομικεύστε τη συσκευή σας</translation> <translation id="756445078718366910">Άνοιγμα παραθύρου προγράμματος περιήγησης</translation> <translation id="7564847347806291057">Τερματισμός διαδικασίας</translation> <translation id="756503097602602175">Μπορείτε να διαχειριστείτε τους συνδεδεμένους Λογαριασμούς Google από τις <ph name="LINK_BEGIN" />Ρυθμίσεις<ph name="LINK_END" />. Οι άδειες που έχετε εκχωρήσει σε ιστοτόπους και εφαρμογές ενδέχεται να ισχύουν για όλους τους λογαριασμούς. Εάν δεν θέλετε οι ιστότοποι ή οι εφαρμογές να έχουν πρόσβαση στις πληροφορίες του λογαριασμού σας, μπορείτε να συνδεθείτε στη συσκευή <ph name="DEVICE_TYPE" /> ως επισκέπτης ή να περιηγηθείτε στον ιστό μέσω ενός <ph name="LINK_2_BEGIN" />παραθύρου για ανώνυμη περιήγηση<ph name="LINK_2_END" />.</translation> @@ -6588,6 +6605,7 @@ <translation id="78526636422538552">Η δυνατότητα προσθήκης περισσότερων Λογαριασμών Google έχει απενεργοποιηθεί</translation> <translation id="7853747251428735">Περισσότερα Ε&ργαλεία</translation> <translation id="7855678561139483478">Μετακίνηση καρτέλας σε νέο παράθυρο</translation> +<translation id="7856654138655787862">Εκτέλεση διαγνωστικών ελέγχων Chrome OS.</translation> <translation id="7857093393627376423">Προτάσεις κειμένου</translation> <translation id="7857949311770343000">Είναι αυτή η σελίδα νέας καρτέλας που περιμένατε να δείτε;</translation> <translation id="7858328180167661092"><ph name="APP_NAME" /> (Windows)</translation> @@ -7237,6 +7255,7 @@ <translation id="8551588720239073785">Ρυθμίσεις ημερομηνίας και ώρας</translation> <translation id="8553342806078037065">Διαχείριση άλλων ατόμων</translation> <translation id="8554899698005018844">Καμία γλώσσα</translation> +<translation id="855604308879080518">Να επιτρέπεται στις εφαρμογές Android να έχουν πρόσβαση σε συσκευές USB σε αυτό το Chromebook. Θα ζητείται άδεια κάθε φορά που συνδέετε μια συσκευή USB. Οι μεμονωμένες εφαρμογές Android θα ζητούν πρόσθετες άδειες.</translation> <translation id="8557022314818157177">Συνεχίστε να αγγίζετε το κλειδί ασφαλείας σας μέχρι να καταγραφεί το δακτυλικό σας αποτύπωμα.</translation> <translation id="8557180006508471423">Ενεργοποίηση του "Google Chrome" στις Υπηρεσίες τοποθεσίας στον Mac</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Άνοιγμα όλων σε &νέο παράθυρο}=1{Άνοιγμα σε &νέο παράθυρο}other{Άνοιγμα όλων ({COUNT}) σε &νέο παράθυρο}}</translation> @@ -7327,7 +7346,6 @@ <translation id="8655295600908251630">Κανάλι</translation> <translation id="8655972064210167941">Η σύνδεση απέτυχε επειδή δεν ήταν δυνατή η επαλήθευση του κωδικού πρόσβασής σας. Επικοινωνήστε με τον διαχειριστή σας ή προσπαθήστε ξανά.</translation> <translation id="8657393004602556571">Θέλετε να απορρίψετε τα σχόλια;</translation> -<translation id="8658645149275195032">Η εφαρμογή <ph name="APP_NAME" /> μοιράζεται την οθόνη και τον ήχο σας με την καρτέλα <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Άνοιγμα Συνδέσμου σε Παράθυρο Ανών&υμης Περιήγησης</translation> <translation id="8662671328352114214">Συμμετοχή στο δίκτυο <ph name="TYPE" /></translation> <translation id="8662733268723715832">Αυτή η διαδικασία διαρκεί περισσότερο από το αναμενόμενο, μπορείτε να κάνετε παράβλεψη ή να περιμένετε μέχρι να ολοκληρωθεί.</translation> @@ -7620,7 +7638,6 @@ <translation id="8941173171815156065">Ανάκληση της άδειας "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Χρησιμοποιεί τη μπαταρία πιο γρήγορα (αυτήν τη στιγμή <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280">Η εφαρμογή <ph name="APP_NAME" /> μοιράζεται ένα παράθυρο με την καρτέλα <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Μέγεθος εικονιδίου</translation> <translation id="8946359700442089734">Οι λειτουργίες εντοπισμού σφαλμάτων δεν ήταν πλήρως ενεργοποιημένες σε αυτήν τη συσκευή <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Καλό</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index ede9b64..78c7e51 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -536,6 +536,7 @@ <translation id="1549275686094429035">ARC enabled</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> wants to access <ph name="VOLUME_NAME" />. It may modify or delete your files.</translation> <translation id="1552301827267621511">The '<ph name="EXTENSION_NAME" />' extension changed search to use <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Manage extension</translation> <translation id="1553538517812678578">unlimited</translation> <translation id="1555130319947370107">Blue</translation> <translation id="1556537182262721003">Could not move extension directory into profile.</translation> @@ -2803,7 +2804,6 @@ <translation id="3842552989725514455">Serif font</translation> <translation id="3843464315703645664">Allowlisted internally</translation> <translation id="3844888638014364087">Emoji inserted</translation> -<translation id="384513009320852920">Make sure that your Bluetooth device is in pairing mode and nearby. <ph name="BEGIN_LINK_LEARN_MORE" />Learn more<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Get tools for developing websites, Android apps and more. Installing Linux will download <ph name="DOWNLOAD_SIZE" /> of data.</translation> <translation id="3847319713229060696">Help improve security on the web for everyone</translation> <translation id="3848547754896969219">Open in &Incognito window</translation> @@ -4315,7 +4315,6 @@ <translation id="5485102783864353244">Add app</translation> <translation id="5485754497697573575">Restore All Tabs</translation> <translation id="5486261815000869482">Confirm password</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> is sharing your screen with <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simulate browser restart</translation> <translation id="5487460042548760727">Rename profile to <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Clear data</translation> @@ -4377,6 +4376,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> wants to</translation> <translation id="5534304873398226603">Discard photo or video</translation> <translation id="5535941515421698170">Also remove your existing data from this device</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">The password that you entered was rejected by the server. Possible reasons include: The password is too short. The password must include numbers or symbols. The password must be different from previous passwords.</translation> <translation id="5541694225089836610">Action is disabled by your administrator</translation> <translation id="5542132724887566711">Profile</translation> @@ -4607,6 +4607,7 @@ <translation id="5787146423283493983">Key Agreement</translation> <translation id="5787420647064736989">Device name</translation> <translation id="5788367137662787332">Sorry, at least one partition on the device <ph name="DEVICE_LABEL" /> could not be mounted.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Success</translation> <translation id="5790651917470750848">Port forward already exists</translation> <translation id="5792728279623964091">Please tap your power button</translation> @@ -4839,10 +4840,8 @@ <ph name="BEGIN_PARAGRAPH2" />You can turn off location by turning off the main location setting on your device. You can also turn off the use of Wi-Fi, mobile networks and sensors for location in location settings.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Exit Full Screen</translation> <translation id="6042308850641462728">More</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> is sharing a Chrome tab with <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Failed to parse configuration</translation> <translation id="6043994281159824495">Sign out now</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> is sharing a Chrome tab and audio with <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Primary TrackPoint button</translation> <translation id="6047632800149092791">Sync isn't working. Try signing out and back in again.</translation> <translation id="6049797270917061226">This file could let attackers steal your personal information.</translation> @@ -7346,7 +7345,6 @@ <translation id="8655295600908251630">Channel</translation> <translation id="8655972064210167941">Sign-in failed because your password could not be verified. Please contact your administrator or try again.</translation> <translation id="8657393004602556571">Do you want to discard the feedback?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> is sharing your screen and audio with <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Open Link in Inco&gnito Window</translation> <translation id="8662671328352114214">Join <ph name="TYPE" /> network</translation> <translation id="8662733268723715832">This is taking longer than expected; you can skip or wait until it's done.</translation> @@ -7641,7 +7639,6 @@ <translation id="8941173171815156065">Revoke the permission '<ph name="PERMISSION" />'</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Use the battery more quickly (currently <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> is sharing a window with <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Icon size</translation> <translation id="8946359700442089734">Debugging features were not completely enabled on this <ph name="IDS_SHORT_PRODUCT_NAME" /> device.</translation> <translation id="894763922177556086">Good</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 521b141..25fa60a 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -160,7 +160,9 @@ <translation id="1152346050262092795">Vuelve a ingresar la contraseña para verificar tu cuenta.</translation> <translation id="1153356358378277386">Dispositivos sincronizados</translation> <translation id="1153636665119721804">Programa de Protección Avanzada de Google</translation> +<translation id="1155545602507378023">No, solo en este dispositivo</translation> <translation id="1155816283571436363">Se está estableciendo conexión con tu teléfono</translation> +<translation id="1158080958325422608">Convertir a mayúsculas</translation> <translation id="1158238185437008462">Ver recuerdos</translation> <translation id="1161575384898972166">Accede a <ph name="TOKEN_NAME" /> para exportar el certificado de cliente.</translation> <translation id="116173250649946226">Tu administrador configuró un tema predeterminado que no se puede cambiar.</translation> @@ -393,6 +395,7 @@ <translation id="1410197035576869800">Ícono de la app</translation> <translation id="1410616244180625362">Seguir permitiendo que <ph name="HOST" /> acceda a la cámara</translation> <translation id="1410806973194718079">No se pueden revisar las políticas</translation> +<translation id="1412681350727866021">Extensiones adicionales</translation> <translation id="1414315029670184034">No permitir que los sitios usen la cámara</translation> <translation id="1414648216875402825">Estás por actualizar a una versión inestable de <ph name="PRODUCT_NAME" /> en la que se incluyen funciones que aún se están desarrollando. Se producirán bloqueos y errores inesperados. Continúa con precaución.</translation> <translation id="1415708812149920388">Se denegó el acceso de lectura al portapapeles</translation> @@ -400,6 +403,7 @@ <translation id="1418954524306642206">Explora para indicar la ubicación del PPD de tu impresora</translation> <translation id="1420834118113404499">Licencias de medios</translation> <translation id="1420920093772172268"><ph name="TURN_ON_BLUETOOTH_LINK" /> para habilitar la sincronización</translation> +<translation id="1421934779300263861">Para ayudar a mejorar las funciones y el rendimiento de Chrome y Chrome OS, envía automáticamente informes de fallas y datos de uso y de diagnóstico a Google. Algunos datos agregados también ayudarán a los socios de Google y las apps para Android. Si habilitaste la configuración Actividad web y de aplicaciones en tu Cuenta de Google, es posible que se almacenen tus datos de Android en la cuenta.</translation> <translation id="1422159345171879700">Cargar secuencias de comandos inseguras</translation> <translation id="1423716227250567100">Si realizas esta acción, sucederá lo siguiente: <ph name="LINE_BREAKS" /> @@ -526,6 +530,7 @@ <translation id="1549275686094429035">ARC habilitado</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> quiere acceder a <ph name="VOLUME_NAME" />. Podrá modificar o eliminar tus archivos.</translation> <translation id="1552301827267621511">La extensión "<ph name="EXTENSION_NAME" />" seleccionó <ph name="SEARCH_PROVIDER_DOMAIN" /> para realizar búsquedas</translation> +<translation id="1552752544932680961">Administrar extensión</translation> <translation id="1553538517812678578">ilimitado</translation> <translation id="1555130319947370107">Azul</translation> <translation id="1556537182262721003">No se pudo mover el directorio de extensiones al perfil</translation> @@ -621,6 +626,8 @@ <translation id="163309982320328737">El ancho del carácter inicial está completo</translation> <translation id="1633947793238301227">Inhabilitar el Asistente de Google</translation> <translation id="1634783886312010422">¿Ya cambiaste esta contraseña en <ph name="WEBSITE" />?</translation> +<translation id="163712950892155760"><ph name="BEGIN_PARAGRAPH1" />Los datos de las apps abarcan cualquier información guardada por una app (según la configuración del desarrollador), incluidos contactos, mensajes y fotos. La copia de seguridad de los datos no incide en la cuota de almacenamiento de Drive.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Puedes desactivar este servicio en Configuración.<ph name="END_PARAGRAPH2" /></translation> <translation id="1637224376458524414">Obtener este favorito en tu iPhone</translation> <translation id="1637350598157233081">Se guardó la contraseña en este dispositivo</translation> <translation id="1637765355341780467">Se produjo un error al abrir tu perfil. Es posible que algunas funciones no estén disponibles.</translation> @@ -686,6 +693,7 @@ <translation id="1700079447639026019">Sitios que nunca pueden usar cookies</translation> <translation id="1703331064825191675">Ya no tendrás que preocuparte por tus contraseñas</translation> <translation id="1703666494654169921">No permitir que los sitios usen datos ni dispositivos de realidad virtual</translation> +<translation id="1704097193565924901">Usar mayúsculas</translation> <translation id="1704230497453185209">No permitir que los sitios reproduzcan sonido</translation> <translation id="1704970325597567340">El <ph name="DATE" />, se ejecutó la verificación de seguridad</translation> <translation id="1706586824377653884">Agregado por el administrador</translation> @@ -751,6 +759,7 @@ <translation id="1768212860412467516">Envía comentarios sobre <ph name="EXPERIMENT_NAME" />.</translation> <translation id="1768278914020124551">Se produjo un error al contactar el servidor de acceso. Comprueba la conexión de tu red y el nombre del dominio; luego, vuelve a intentarlo.</translation> <translation id="1769104665586091481">Abrir vínculo en una ventana &nueva</translation> +<translation id="177053719077591686">Crea copias de seguridad de las apps para Android en Google Drive.</translation> <translation id="177336675152937177">Datos de aplicaciones alojadas</translation> <translation id="1775706469381199282">No permitir que los sitios usen JavaScript</translation> <translation id="1776712937009046120">Agregar usuario</translation> @@ -857,6 +866,7 @@ <translation id="186612162884103683">"<ph name="EXTENSION" />" puede leer archivos de video, sonido e imágenes en las ubicaciones seleccionadas y editarlos.</translation> <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> está preparado para completar la instalación.</translation> <translation id="1868553836791672080">La revisión de contraseña no está disponible en Chromium</translation> +<translation id="1868617395637139709">Usa la ubicación para los servicios y las apps para Android.</translation> <translation id="1869433484041798909">Botón de favoritos</translation> <translation id="1871098866036088250">Abrir en el navegador Chrome</translation> <translation id="187145082678092583">Menos apps</translation> @@ -927,6 +937,7 @@ <translation id="1937774647013465102">No se puede importar el tipo de arquitectura de contenedores <ph name="ARCHITECTURE_CONTAINER" /> con este dispositivo porque es <ph name="ARCHITECTURE_DEVICE" />. Puedes intentar restablecer este contenedor en otro dispositivo o acceder a los archivos en su interior con la app de Archivos.</translation> <translation id="1938351510777341717">Tecla externa Comando</translation> <translation id="1940546824932169984">Dispositivos conectados</translation> +<translation id="1941410638996203291">Hora de inicio <ph name="TIME" /></translation> <translation id="1942128823046546853">Leer y cambiar todos tus datos en todos los sitios web</translation> <translation id="1942600407708803723">Apagar cuando se cierra la tapa</translation> <translation id="1944528062465413897">Código de vinculación Bluetooth:</translation> @@ -1302,6 +1313,7 @@ <translation id="2320295602967756579">Habilitar el tema claro</translation> <translation id="2322193970951063277">Encabezados y pies de página</translation> <translation id="2322318151094136999">Preguntarme cuando un sitio intente acceder a puertos en serie (recomendado)</translation> +<translation id="2322622365472107569">Hora de finalización <ph name="TIME" /></translation> <translation id="2323018538045954000">Redes Wi-Fi guardadas</translation> <translation id="2325444234681128157">Recordar contraseña</translation> <translation id="2326188115274135041">Confirma el PIN para activar el desbloqueo automático</translation> @@ -1313,6 +1325,7 @@ <translation id="2332192922827071008">Abrir preferencias</translation> <translation id="2332515770639153015">Se activó la Navegación segura mejorada</translation> <translation id="2332742915001411729">Restablecer configuración de zoom predeterminada</translation> +<translation id="2332948465534020594">Se habilitó No interrumpir</translation> <translation id="2335111415680198280">{0,plural, =1{Cerrar # ventana}other{Cerrar # ventanas}}</translation> <translation id="2335122562899522968">Esta página establece cookies.</translation> <translation id="2336228925368920074">Agregar a favoritos todas las pestañas...</translation> @@ -1406,6 +1419,7 @@ <translation id="2435248616906486374">Red desconectada</translation> <translation id="2435457462613246316">Mostrar contraseña</translation> <translation id="2436186046335138073">¿Deseas permitir que <ph name="HANDLER_HOSTNAME" /> abra todos los vínculos de <ph name="PROTOCOL" />?</translation> +<translation id="2439626940657133600">Cargando <ph name="WINDOW_TITLE" /></translation> <translation id="2440604414813129000">Ver códig&o fuente</translation> <translation id="244231003699905658">La dirección no es válida. Verifica la dirección y vuelve a intentarlo.</translation> <translation id="2442916515643169563">Sombra del texto</translation> @@ -1458,6 +1472,7 @@ <translation id="2484959914739448251">Para borrar los datos de navegación de todos los dispositivos sincronizados y de tu Cuenta de Google, <ph name="BEGIN_LINK" />ingresa la frase de contraseña<ph name="END_LINK" />.</translation> <translation id="2485394160472549611">Recomendaciones para ti</translation> <translation id="2485422356828889247">Desinstalación</translation> +<translation id="2485681265915754872">Condiciones del Servicio de Google Play</translation> <translation id="2487067538648443797">Agregar un favorito nuevo</translation> <translation id="2487268545026948104">Para restablecer tus datos, conéctate a Internet</translation> <translation id="2489686758589235262">Asignar 2 interruptores más</translation> @@ -1910,6 +1925,7 @@ <translation id="2935654492420446828">Agrega una cuenta de institución educativa más tarde</translation> <translation id="2936851848721175671">Crear copia de seguridad y restablecer</translation> <translation id="2938225289965773019">Abrir vínculos de <ph name="PROTOCOL" /></translation> +<translation id="2939908794993783865">Sitios inactivos adicionales</translation> <translation id="2939938020978911855">Mostrar dispositivos Bluetooth disponibles</translation> <translation id="2941112035454246133">Baja</translation> <translation id="2942279350258725020">Mensajes Android</translation> @@ -2055,6 +2071,7 @@ <translation id="3090589793601454425">No mover</translation> <translation id="3090819949319990166">No se puede copiar el archivo crx externo a <ph name="TEMP_CRX_FILE" />.</translation> <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" sincronizado</translation> +<translation id="3093362725605442088">Lee los números de serie del componente y del dispositivo Chrome OS.</translation> <translation id="3093714882666365141">No permitir que los sitios instalen controladores de pago</translation> <translation id="3094141017404513551">Esta acción separará tu navegación de la de <ph name="EXISTING_USER" /></translation> <translation id="3095871294753148861">Los favoritos, las contraseñas y otros datos de navegación se sincronizan con la cuenta principal.</translation> @@ -2124,6 +2141,7 @@ <translation id="3162899666601560689">Los sitios pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar elementos del carrito de compras.</translation> <translation id="3163201441334626963">Producto desconocido <ph name="PRODUCT_ID" /> del proveedor <ph name="VENDOR_ID" /></translation> <translation id="3163254451837720982">Los siguientes servicios permiten proteger tus datos. Puedes desactivar estas funciones en cualquier momento.</translation> +<translation id="3163511056918491211">Cambia de dispositivo o restablece tus datos fácilmente en cualquier momento. Las copias de seguridad se suben a Google y se encriptan con la contraseña de tu Cuenta de Google.</translation> <translation id="3164329792803560526">Compartiendo esta pestaña en <ph name="APP_NAME" /></translation> <translation id="3165390001037658081">Es posible que algunos proveedores bloqueen esta función.</translation> <translation id="316652501498554287">Cuentas de G Suite for Education</translation> @@ -2241,6 +2259,7 @@ <translation id="3308852433423051161">Cargando el Asistente de Google…</translation> <translation id="3309330461362844500">ID del perfil del certificado</translation> <translation id="3311445899360743395">Es posible que los datos asociados a esta app se quiten de este dispositivo.</translation> +<translation id="3312883087018430408">Si quieres realizar una búsqueda en un sitio específico o en una parte de Chrome, escribe el atajo correspondiente en la barra de direcciones seguido de la combinación de teclas que hayas elegido. Por ejemplo, para realizar una búsqueda solo en Favoritos, escribe "@bookmarks" y, luego, presiona Tab o la barra espaciadora.</translation> <translation id="3313622045786997898">Valor de firma del certificado</translation> <translation id="3313950410573257029">Verificar conexión</translation> <translation id="3315158641124845231">Ocultar <ph name="PRODUCT_NAME" /></translation> @@ -2660,6 +2679,7 @@ <translation id="3747077776423672805">Para quitar apps, ve a Configuración > Google Play Store > Administrar preferencias de Android > Apps o Administrador de aplicaciones. Luego, presiona la app que quieras desinstalar (es posible que debas deslizar el dedo hacia la derecha o la izquierda para encontrarla). A continuación, presiona Desinstalar o Inhabilitar.</translation> <translation id="3747220812138541072">Mostrar sugerencias de escritura en la misma línea que aparecen mientras escribes</translation> <translation id="3748706263662799310">Informar un error</translation> +<translation id="3750562496035670393">Chrome guardó tu contraseña en este dispositivo, pero puedes guardarla en tu Cuenta de Google. Así, todas las contraseñas guardadas en tu Cuenta de Google estarán disponibles cuando accedas.</translation> <translation id="3752253558646317685">Haz que tu hijo siga levantando el dedo para guardar la huella dactilar.</translation> <translation id="3752582316358263300">Aceptar</translation> <translation id="3753033997400164841">Almacena las contraseñas una vez y úsalas en todas partes</translation> @@ -2683,6 +2703,7 @@ <translation id="3771290962915251154">Se inhabilitó esta configuración porque los controles parentales están activados</translation> <translation id="3771294271822695279">Archivos de video</translation> <translation id="3771851622616482156">Saldrás de este sitio, incluso si está en pestañas abiertas</translation> +<translation id="3772046291955677288">Leí y acepté las <ph name="BEGIN_LINK1" />Condiciones del Servicio de Google<ph name="END_LINK1" /> y las <ph name="BEGIN_LINK2" />Condiciones del Servicio Adicionales de Chrome y Chrome OS<ph name="END_LINK2" />.</translation> <translation id="3775432569830822555">Certificado del servidor SSL</translation> <translation id="3775705724665058594">Enviar a tus dispositivos</translation> <translation id="3776508619697147021">Permitir que los sitios soliciten permiso para descargar múltiples archivos de forma automática</translation> @@ -2715,6 +2736,7 @@ <translation id="3798449238516105146">Versión</translation> <translation id="3799128412641261490">Configuración de Accesibilidad con interruptores</translation> <translation id="3800806661949714323">Mostrar todo (recomendado)</translation> +<translation id="3800828618615365228">Condiciones Adicionales del Chrome OS y Google Chrome</translation> <translation id="380329542618494757">Nombre</translation> <translation id="3803345858388753269">Calidad del video</translation> <translation id="380408572480438692">Si habilitas la recopilación de datos de rendimiento, ayudarás a Google a mejorar el sistema con el tiempo. Para que se envíen los datos, debes presentar un informe de comentarios (Alt+Mayúscula+I) e incluir datos de rendimiento. Puedes volver a esta pantalla para inhabilitar la recopilación en cualquier momento.</translation> @@ -2747,6 +2769,7 @@ <translation id="3826440694796503677">Tu administrador inhabilitó la opción para agregar más Cuentas de Google</translation> <translation id="3827774300009121996">&Pantalla completa</translation> <translation id="3828029223314399057">Buscar favoritos</translation> +<translation id="3828953470056652895">Leí y acepté las <ph name="BEGIN_LINK1" />Condiciones del Servicio de Google<ph name="END_LINK1" />, las <ph name="BEGIN_LINK2" />Condiciones del Servicio Adicionales de Chrome y Chrome OS<ph name="END_LINK2" /> y las <ph name="BEGIN_LINK3" />Condiciones del Servicio de Play<ph name="END_LINK3" />.</translation> <translation id="3829765597456725595">Archivos compartidos SMB</translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{El administrador volvió a activar 1 extensión potencialmente dañina}other{El administrador volvió a activar {NUM_EXTENSIONS} extensiones potencialmente dañinas}}</translation> <translation id="3831436149286513437">Sugerencias de búsqueda de Google Drive</translation> @@ -2763,7 +2786,6 @@ <translation id="3842552989725514455">Fuente Serif</translation> <translation id="3843464315703645664">Permiso otorgado de manera interna</translation> <translation id="3844888638014364087">Se insertó el emoji</translation> -<translation id="384513009320852920">Asegúrate de que tu dispositivo Bluetooth esté cerca y tenga el modo de vinculación activado. <ph name="BEGIN_LINK_LEARN_MORE" />Más información<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Obtén herramientas para desarrollar sitios web, apps de Android y mucho más. Si instalas Linux, se descargarán <ph name="DOWNLOAD_SIZE" /> de datos.</translation> <translation id="3847319713229060696">Ayudar a mejorar la seguridad en la Web para todos los usuarios</translation> <translation id="3848547754896969219">Abrir en una ventana de &incógnito</translation> @@ -2925,6 +2947,9 @@ <translation id="3984431586879874039">¿Quieres permitir que este sitio vea tu llave de seguridad?</translation> <translation id="398477389655464998">Copiar el vínculo al texto destacado</translation> <translation id="3984862166739904574">Definición de Respuestas rápidas</translation> +<translation id="3986164906089840270"><ph name="BEGIN_PARAGRAPH1" />Si permites que los dispositivos con Chrome OS envíen informes automáticos, podemos priorizar las tareas de corrección y mejora en Chrome OS. Estos informes pueden incluir cierta información como el momento en que falló Chrome OS, qué funciones se estaban usando y la cantidad de memoria que se usaba en general.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Puedes permitir o cancelar estos informes en cualquier momento desde la configuración de tu dispositivo Chrome. Si eres el administrador de un dominio, puedes cambiar esta configuración en la Consola del administrador.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Aunque esta función esté desactivada, tu dispositivo podrá enviar la información necesaria para servicios esenciales, como seguridad y actualizaciones del sistema.<ph name="END_PARAGRAPH3" /></translation> <translation id="3987544746655539083">Seguir impidiendo que este sitio acceda a tu ubicación</translation> <translation id="3987938432087324095">No entendí.</translation> <translation id="3987993985790029246">Copiar vínculo</translation> @@ -3090,10 +3115,12 @@ <translation id="4184885522552335684">Arrastrar para mover una pantalla</translation> <translation id="4187424053537113647">Configurando <ph name="APP_NAME" />…</translation> <translation id="4190828427319282529">Destacar el enfoque del teclado</translation> +<translation id="4193836101014293726">No se puede borrar este perfil</translation> <translation id="419427585139779713">Ingresar una sola sílaba por vez</translation> <translation id="4194570336751258953">Habilitar el punteo para hacer clic</translation> <translation id="4195643157523330669">Abrir en una pestaña nueva</translation> <translation id="4195814663415092787">Continuar la sesión desde donde la dejaste</translation> +<translation id="4198268995694216131">Sitios adicionales</translation> <translation id="4200689466366162458">Palabras personalizadas</translation> <translation id="4200983522494130825">Nueva pes&taña</translation> <translation id="4201546031411513170">En la configuración, puedes elegir los datos para sincronizar en cualquier momento.</translation> @@ -3179,12 +3206,16 @@ <translation id="4297219207642690536">Reiniciar y restablecer</translation> <translation id="4297813521149011456">Rotación de la pantalla</translation> <translation id="4299022904780065004">Nueva ventana de &incógnito</translation> +<translation id="4301011537467809690"><ph name="BEGIN_PARAGRAPH1" />Si permites que los dispositivos con Chrome OS envíen informes automáticos, podemos priorizar las tareas de corrección y mejora en Chrome OS. Estos informes pueden incluir cierta información como el momento en que falló Chrome OS, qué funciones se estaban usando y la cantidad de memoria que se usaba en general.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Puedes permitir o cancelar estos informes en cualquier momento en la configuración del dispositivo con Chrome OS de tu hijo. Si eres el administrador de un dominio, puedes cambiar esta configuración en la Consola del administrador.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Aunque esta función esté desactivada, este dispositivo podrá enviar la información necesaria para los servicios esenciales, como seguridad y actualizaciones del sistema.<ph name="END_PARAGRAPH3" /></translation> <translation id="4301671483919369635">Esta página puede editar archivos</translation> <translation id="4303079906735388947">Configura un nuevo PIN para tu llave de seguridad</translation> <translation id="4305402730127028764">Copiar a <ph name="DEVICE_NAME" /></translation> <translation id="4305817255990598646">Cambiar</translation> <translation id="4306119971288449206">Las apps deben incluir el encabezado content-type "<ph name="CONTENT_TYPE" />"</translation> <translation id="4307992518367153382">Configuración básica</translation> +<translation id="4309165024397827958">Permite que los servicios y las apps para Android habilitadas usen la ubicación de este dispositivo. Es posible que Google recopile datos de ubicación anónimos periódicamente y los use para mejorar la precisión de la ubicación y los servicios basados en la ubicación.</translation> <translation id="4309420042698375243"><ph name="NUM_KILOBYTES" />K (<ph name="NUM_KILOBYTES_LIVE" />K en vivo)</translation> <translation id="4310139701823742692">El archivo no tiene el formato correcto. Verifica el archivo PPD y vuelve a intentarlo.</translation> <translation id="431076611119798497">&Detalles</translation> @@ -3211,6 +3242,7 @@ <translation id="4341577178275615435">Para activar o desactivar la navegación por cursor de texto, presiona F7</translation> <translation id="4341905082470253054">Comprobando el estado del TPM…</translation> <translation id="434198521554309404">Rápido. Seguro. Sencillo.</translation> +<translation id="4343250402091037179">Si quieres realizar una búsqueda en un sitio específico o en una parte de Chrome, escribe el atajo correspondiente en la barra de direcciones seguido de la combinación de teclas que hayas elegido.</translation> <translation id="434404122609091467">Con tu proveedor de servicios actual</translation> <translation id="4345587454538109430">Configurar...</translation> <translation id="4345732373643853732">El servidor no reconoce el nombre de usuario</translation> @@ -3264,6 +3296,7 @@ <translation id="4400632832271803360">Mantén presionada la tecla de Launcher para cambiar el comportamiento de las teclas en la fila superior</translation> <translation id="4400963414856942668">Puedes hacer clic en la estrella para agregar una pestaña a favoritos</translation> <translation id="4402755511846832236">No permitir que los sitios sepan cuando estás usando activamente este dispositivo</translation> +<translation id="4403266582403435904">Cambia de dispositivo o restablece los datos fácilmente en cualquier momento. Las copias de seguridad se encriptan con la contraseña de la Cuenta de Google de tu hijo y se suben a Google.</translation> <translation id="4403775189117163360">Elegir otra carpeta</translation> <translation id="4404136731284211429">Volver a analizar</translation> <translation id="4404843640767531781">Tu padre o madre bloquearon <ph name="APP_NAME" />. Si quieres usar esa app, pídeles permiso.</translation> @@ -3539,6 +3572,7 @@ <translation id="4681453295291708042">Inhabilitar Compartir con Nearby</translation> <translation id="4681930562518940301">Abrir imagen original en una pestaña nueva</translation> <translation id="4682551433947286597">Los fondos de pantalla aparecen en la pantalla de acceso.</translation> +<translation id="4683629100208651599">Convertir a minúsculas</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />% (predeterminado)</translation> <translation id="4684427112815847243">Sincronizar todo</translation> <translation id="4684471265911890182"><ph name="APP_NAME" /> intenta acceder a la cámara. Para permitir el acceso, desactiva el interruptor de privacidad de la cámara.</translation> @@ -3601,6 +3635,7 @@ <translation id="4768332406694066911">Tienes certificados de esas organizaciones que te identifican</translation> <translation id="4770119228883592393">Se solicitó un permiso; para responder, presiona ⌘ + Opción + flecha hacia abajo</translation> <translation id="4773112038801431077">Actualiza Linux</translation> +<translation id="4775142426314270551">Para ayudar a mejorar las funciones y el rendimiento de Chrome y Chrome OS, envía automáticamente informes de fallas y datos de uso y de diagnóstico a Google. Algunos datos agregados también ayudarán a los socios de Google y las apps para Android. Si se activó la configuración Actividad web y de aplicaciones para la Cuenta de Google de tu hijo, es posible que se almacenen sus datos de Android en la cuenta.</translation> <translation id="477647109558161443">Crear un acceso directo de escritorio</translation> <translation id="4776594120007763294">Si quieres agregar una página para leerla más tarde, haz clic en el botón</translation> <translation id="4777458362738635055">Otros usuarios de este dispositivo pueden usar esta red</translation> @@ -3628,6 +3663,7 @@ <translation id="4801512016965057443">Permitir itinerancia de datos móviles</translation> <translation id="4804818685124855865">Desconectar</translation> <translation id="4804827417948292437">Aguacate</translation> +<translation id="4806457879608775995">Revisa estas condiciones y controla tus datos</translation> <translation id="4807098396393229769">Nombre en la tarjeta</translation> <translation id="4808024018088054533">Chrome no encontró software dañino en la computadora • Se verificó ahora</translation> <translation id="4808667324955055115">Se bloquearon ventanas emergentes:</translation> @@ -3958,6 +3994,7 @@ <translation id="5153234146675181447">Olvidar el teléfono</translation> <translation id="5154108062446123722">Configuración avanzada para <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Asunto</translation> +<translation id="5155327081870541046">En la barra de direcciones, ingresa el atajo para el sitio donde quieres realizar la búsqueda, como "@favoritos". Luego, presiona la combinación de teclas que hayas elegido y escribe un término de búsqueda.</translation> <translation id="5157635116769074044">Fijar esta página a la pantalla de inicio…</translation> <translation id="5159094275429367735">Configurar Crostini</translation> <translation id="5159419673777902220">Tu padre o madre inhabilitaron los permisos de extensiones</translation> @@ -3993,6 +4030,8 @@ <translation id="5192062846343383368">Abre la app de Family Link para administrar la supervisión</translation> <translation id="5193988420012215838">Se copió en tu portapapeles</translation> <translation id="5194256020863090856">Esta acción solo afecta a las ventanas de incógnito</translation> +<translation id="5195863934285556588"><ph name="BEGIN_PARAGRAPH1" />El servicio de ubicación de Google usa fuentes como Wi-Fi, redes móviles y sensores para determinar la ubicación de este dispositivo.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Puedes desactivar la ubicación de este dispositivo Android en cualquier momento a través de Configuración > Apps > Google Play Store > Administrar las preferencias de Android > Seguridad y ubicación > Ubicación. Además, si quieres desactivar el uso de Wi-Fi, redes móviles y sensores para la ubicación de este dispositivo Android, desactiva "Precisión de la ubicación de Google" en el mismo menú.<ph name="END_PARAGRAPH2" /></translation> <translation id="5197255632782567636">Internet</translation> <translation id="5198430103906431024">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.</translation> <translation id="5199729219167945352">Experimentos</translation> @@ -4121,6 +4160,7 @@ <translation id="5331069282670671859">No tienes certificados en esta categoría</translation> <translation id="5331425616433531170">"<ph name="CHROME_EXTENSION_NAME" />" desea sincronizarse</translation> <translation id="5331975486040154427">Dispositivo USB-C (puerto lateral izquierdo trasero)</translation> +<translation id="5333896723098573627">Para quitar apps, ve a Configuración > Apps > Google Play Store > Administrar preferencias de Android > Apps o Administrador de aplicaciones. Luego, presiona la app que quieras desinstalar (es posible que debas deslizar el dedo hacia la derecha o la izquierda para encontrarla). A continuación, presiona Desinstalar o Inhabilitar.</translation> <translation id="5334142896108694079">Caché de la secuencia de comandos</translation> <translation id="5336126339807372270">No permitir que ningún sitio acceda a dispositivos USB</translation> <translation id="5336688142483283574">Esta página también se quitará de tu historial y actividad de <ph name="SEARCH_ENGINE" />.</translation> @@ -4201,6 +4241,7 @@ <translation id="5425863515030416387">Acceder fácilmente en varios dispositivos</translation> <translation id="5427278936122846523">Traducir siempre</translation> <translation id="5427459444770871191">Girar &a la derecha</translation> +<translation id="542750953150239272">Si continúas, aceptas que este dispositivo también descargue e instale automáticamente actualizaciones y apps de Google, tu operador y el fabricante del dispositivo usando datos móviles. Es posible que algunas de estas apps ofrezcan compras directas desde la aplicación.</translation> <translation id="5428850089342283580"><ph name="ACCNAME_APP" /> (actualización disponible)</translation> <translation id="5429373054983029602">Buscar en la pantalla con <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="542948651837270806">Debe instalarse una actualización del firmware del Módulo de plataforma de confianza. Consulta <ph name="TPM_FIRMWARE_UPDATE_LINK" />.</translation> @@ -4244,6 +4285,7 @@ <translation id="5471768120198416576">Hola, soy la voz que leerá tus textos.</translation> <translation id="5472627187093107397">Guardar contraseñas para este sitio</translation> <translation id="5473075389972733037">IBM</translation> +<translation id="5473099001878321374">Si continúas, aceptas que este dispositivo pueda descargar e instalar automáticamente actualizaciones y apps de Google, del operador de tu hijo y del fabricante del dispositivo, y que incluso use datos móviles para ello. Es posible que algunas de estas apps ofrezcan compras directas desde la aplicación.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{El PIN debe tener al menos un carácter}other{El PIN debe tener al menos # caracteres}}</translation> <translation id="5474859849784484111"><ph name="MANAGER" /> requiere que te conectes a una red Wi-Fi ahora y descargues una actualización. También puedes descargarla con una conexión de uso medido (es posible que se apliquen cargos).</translation> <translation id="5481273127572794904">No puede descargar múltiples archivos de forma automática</translation> @@ -4254,7 +4296,6 @@ <translation id="5485102783864353244">Agregar app</translation> <translation id="5485754497697573575">Restablecer todas las pestañas</translation> <translation id="5486261815000869482">Confirmar contraseña</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> está compartiendo tu pantalla con <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simular reinicio de navegador</translation> <translation id="5487460042548760727">Cambiar el nombre del perfil a <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Borrar datos</translation> @@ -4316,6 +4357,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> quiere</translation> <translation id="5534304873398226603">Descartar foto o video</translation> <translation id="5535941515421698170">También quitar tus datos existentes de este dispositivo</translation> +<translation id="5537725057119320332">Transmitir</translation> <translation id="5539221284352502426">El servidor rechazó la contraseña que ingresaste porque es demasiado corta, debe incluir números o símbolos, o debe ser diferente a las contraseñas anteriores.</translation> <translation id="5541694225089836610">Tu administrador inhabilitó esta acción</translation> <translation id="5542132724887566711">Perfil</translation> @@ -4422,6 +4464,10 @@ <translation id="5642508497713047">Firmante de la CRL</translation> <translation id="5643321261065707929">Red de uso medido</translation> <translation id="5643620609347735571">Borrar y continuar</translation> +<translation id="5644722238761632789"><ph name="BEGIN_PARAGRAPH1" />Para ayudar a mejorar las funciones y el rendimiento de Chrome y Chrome OS, envía automáticamente informes de fallas y datos de uso y de diagnóstico a Google.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Puedes permitir o cancelar estos informes en cualquier momento desde la configuración de tu dispositivo con Chrome OS. Si eres el administrador de un dominio, puedes cambiar esta configuración en la Consola del administrador.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Aunque esta función esté desactivada, tu dispositivo podrá enviar la información necesaria para servicios esenciales, como seguridad y actualizaciones del sistema.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" />Si habilitaste la configuración Actividad web y de aplicaciones en tu Cuenta de Google, es posible que se almacenen tus datos de Android en la cuenta. Para ver y borrar esa información, y cambiar la configuración de la cuenta, accede a account.google.com.<ph name="END_PARAGRAPH4" /></translation> <translation id="5646376287012673985">Ubicación</translation> <translation id="5646558797914161501">Empresario</translation> <translation id="5648166631817621825">Últimos 7 días</translation> @@ -4542,6 +4588,7 @@ <translation id="5787146423283493983">Acuerdo de claves</translation> <translation id="5787420647064736989">Nombre del dispositivo</translation> <translation id="5788367137662787332">Lo sentimos, al menos una partición en el dispositivo <ph name="DEVICE_LABEL" /> no se pudo montar.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Completado correctamente</translation> <translation id="5790651917470750848">Ya se está redireccionado ese puerto</translation> <translation id="5792728279623964091">Presiona el botón de encendido</translation> @@ -4567,6 +4614,7 @@ <translation id="5816434091619127343">Los cambios solicitados harán que la impresora no se pueda utilizar.</translation> <translation id="5817069030404929329">¿Deseas mover las contraseñas de este dispositivo a tu Cuenta de Google?</translation> <translation id="5817918615728894473">Sincronizar</translation> +<translation id="581840385858998009">Personaliza el fondo de pantalla, el avatar, el protector de pantalla y más</translation> <translation id="5821565227679781414">Crear acceso directo</translation> <translation id="5822095611691580107">Nivel de batería del Pixel Bud izquierdo <ph name="BATTERY_PERCENTAGE" />%.</translation> <translation id="5825412242012995131">Activado (recomendado)</translation> @@ -4773,14 +4821,16 @@ <ph name="BEGIN_PARAGRAPH2" />Para inhabilitar la Ubicación, desactiva la configuración de la ubicación principal de tu dispositivo. También puedes desactivar el uso de redes Wi-Fi, redes móviles y sensores para obtener la ubicación en la configuración de la ubicación.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Salir de la pantalla completa</translation> <translation id="6042308850641462728">Más</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> comparte una pestaña de Chrome con <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">No se pudo analizar la configuración</translation> <translation id="6043994281159824495">Salir ahora</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> comparte una pestaña de Chrome y audio con <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Botón principal de TrackPoint</translation> <translation id="6047632800149092791">La sincronización no funciona. Intenta salir y volver a acceder.</translation> <translation id="6049797270917061226">Es posible que este archivo permita que atacantes roben tu información personal.</translation> <translation id="6051354611314852653">El sistema no pudo autorizar el acceso a la API para este dispositivo.</translation> +<translation id="6051638103735819069"><ph name="BEGIN_PARAGRAPH1" />Si permites que los dispositivos con Chrome OS envíen informes automáticos, podemos priorizar las tareas de corrección y mejora en Chrome OS. Estos informes pueden incluir cierta información como el momento en que falló Chrome OS, qué funciones se estaban usando, la cantidad de memoria que se usaba en general y datos de uso y de diagnóstico sobre las apps para Android. Algunos datos agregados también ayudarán a las apps y los socios de Google, como los desarrolladores de Android.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Puedes permitir o cancelar estos informes en cualquier momento en la configuración del dispositivo con Chrome OS de tu hijo. Si eres el administrador de un dominio, puedes cambiar esta configuración en la Consola del administrador.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Aunque esta función esté desactivada, este dispositivo podrá enviar la información necesaria para los servicios esenciales, como seguridad y actualizaciones del sistema.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" />Si habilitaste la configuración Actividad web y de aplicaciones en la Cuenta de Google de tu hijo, es posible que se almacenen sus datos en la cuenta. Para obtener más información sobre estos parámetros de configuración y cómo ajustarlos, accede a families.google.com.<ph name="END_PARAGRAPH4" /></translation> <translation id="6052976518993719690">Entidad de certificación SSL</translation> <translation id="6053401458108962351">&Borrar datos de navegación...</translation> <translation id="6054284857788651331">Grupo de pestañas recientemente cerrado</translation> @@ -4852,6 +4902,7 @@ <translation id="6116921718742659598">Cambiar la configuración de idioma y de entrada de texto</translation> <translation id="6119927814891883061">Elegir <ph name="DEVICE_NAME" /> como nombre del dispositivo</translation> <translation id="6120205520491252677">Fijar esta página a la Pantalla de inicio...</translation> +<translation id="6121773125605585883">Ver la contraseña y el nombre de usuario <ph name="USERNAME" /> para <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">Se está controlando tu conexión a Internet</translation> <translation id="6122093587541546701">Correo electrónico (opcional):</translation> <translation id="6122095009389448667">Seguir impidiendo que este sitio vea el portapapeles</translation> @@ -4928,6 +4979,7 @@ <translation id="6208725777148613371">No se pudo guardar en <ph name="WEB_DRIVE" />: <ph name="INTERRUPT_REASON" /></translation> <translation id="6209838773933913227">Se está actualizando el componente</translation> <translation id="6209908325007204267">El dispositivo incluye una actualización de Chrome Enterprise, pero tu nombre de usuario no está asociado a una cuenta empresarial. Para crear una cuenta de este tipo, visita g.co/ChromeEnterpriseAccount en otro dispositivo.</translation> +<translation id="6210282067670792090">En la barra de direcciones, usa esta combinación de teclas con atajos para los motores de búsqueda y las búsquedas en el sitio</translation> <translation id="621172521139737651">{COUNT,plural, =0{Abrir todo en un &nuevo grupo de pestañas}=1{Abrir en un &nuevo grupo de pestañas}other{Abrir todo ({COUNT}) en un &nuevo grupo de pestañas}}</translation> <translation id="6212039847102026977">Mostrar las propiedades de red avanzadas</translation> <translation id="6212168817037875041">Apagar la pantalla</translation> @@ -5254,6 +5306,8 @@ <translation id="6545665334409411530">Frecuencia de repetición</translation> <translation id="6545867563032584178">El micrófono está desactivado en las Preferencias del Sistema de Mac</translation> <translation id="6547354035488017500">Libera al menos 512 MB de espacio o tu dispositivo dejará de funcionar. Para liberar espacio, borra archivos del almacenamiento del dispositivo.</translation> +<translation id="6547854317475115430"><ph name="BEGIN_PARAGRAPH1" />El servicio de ubicación de Google usa fuentes como Wi-Fi, redes móviles y sensores para ayudar a determinar la ubicación de tu dispositivo.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Puedes desactivar la ubicación de tu dispositivo Android en cualquier momento a través de Configuración > Apps > Google Play Store > Administrar las preferencias de Android > Seguridad y ubicación > Ubicación. Además, si quieres desactivar el uso de Wi-Fi, redes móviles y sensores para la ubicación de este dispositivo Android, desactiva "Precisión de la ubicación de Google" en el mismo menú.<ph name="END_PARAGRAPH2" /></translation> <translation id="654871471440386944">¿Deseas activar la navegación por cursor de texto?</translation> <translation id="6549038875972762904">Rehacer la configuración</translation> <translation id="6550675742724504774">Opciones</translation> @@ -5409,6 +5463,7 @@ <translation id="6709357832553498500">Conectar a través de <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6711146141291425900">Vincular la cuenta de <ph name="WEB_DRIVE" /> para las descargas</translation> +<translation id="6712943853047024245">Ya guardaste una contraseña con este nombre de usuario para <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Agregar un perfil de trabajo</translation> <translation id="6715803357256707211">Se produjo un error durante la instalación de la app de Linux. Haz clic en la notificación para obtener más detalles.</translation> <translation id="671619610707606484">Esta acción borrará <ph name="TOTAL_USAGE" /> de datos almacenados por todos los sitios</translation> @@ -5439,6 +5494,7 @@ <translation id="6746124502594467657">Mover hacia abajo</translation> <translation id="674632704103926902">Habilitar la función tocar y arrastrar</translation> <translation id="6748465660675848252">Puedes continuar, pero se restaurarán únicamente la configuración y los datos sincronizados. Se perderán todos los datos locales.</translation> +<translation id="6748980958975836188">Leí y acepté las <ph name="BEGIN_LINK1" />Condiciones del Servicio de Google<ph name="END_LINK1" /> y las <ph name="BEGIN_LINK2" />Condiciones del Servicio Adicionales de Chrome y Chrome OS<ph name="END_LINK2" />.</translation> <translation id="6750757184909117990">Inhabilitar la red móvil</translation> <translation id="6750946710563435348">Usar otro nombre de usuario</translation> <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Incógnito)</translation> @@ -5460,6 +5516,8 @@ <translation id="677965093459947883">Muy pequeño</translation> <translation id="6781005693196527806">Ad&ministrar motores de búsqueda…</translation> <translation id="6781284683813954823">Vínculo al doodle</translation> +<translation id="6781658011335120230"><ph name="BEGIN_PARAGRAPH1" />Los datos de las apps abarcan cualquier información guardada por una app (según la configuración del desarrollador), incluidos contactos, mensajes y fotos. Los datos de la copia de seguridad no inciden en la cuota de almacenamiento en Drive de tu hijo.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Puedes desactivar este servicio en Configuración.<ph name="END_PARAGRAPH2" /></translation> <translation id="6781978626986383437">Se canceló la copia de seguridad de Linux</translation> <translation id="6782067259631821405">El PIN no es válido</translation> <translation id="6784523122863989144">El perfil es compatible</translation> @@ -5808,6 +5866,7 @@ <translation id="7125148293026877011">Borrar Crostini</translation> <translation id="7127980134843952133">Historial de descargas</translation> <translation id="7128151990937044829">Mostrar un indicador en la barra de direcciones cuando las notificaciones estén bloqueadas</translation> +<translation id="7130890260487814974">Envía datos de uso y diagnóstico.</translation> <translation id="7131040479572660648">Leer los datos en <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> y <ph name="WEBSITE_3" /></translation> <translation id="713122686776214250">Agregar pá&gina...</translation> <translation id="7134098520442464001">Reducir el tamaño del texto</translation> @@ -5910,6 +5969,7 @@ <translation id="7257173066616499747">Redes Wi-Fi</translation> <translation id="725758059478686223">Servicio de impresión</translation> <translation id="7257666756905341374">Leer los datos que copias y pegas</translation> +<translation id="7258192266780953209">Transformaciones</translation> <translation id="7258225044283673131">La app no responde. Selecciona "Forzar cierre" para cerrar la app.</translation> <translation id="7262004276116528033">El servicio de acceso a la cuenta está alojado en <ph name="SAML_DOMAIN" /></translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Prueba los pasos que se indican a continuación para solucionar problemas: @@ -6029,6 +6089,7 @@ <translation id="7385854874724088939">Algo falló al intentar imprimir. Comprueba tu impresora e inténtalo nuevamente.</translation> <translation id="7385896526023870365">Esta extensión no tiene acceso al sitio.</translation> <translation id="7387273928653486359">Aceptable</translation> +<translation id="7387951778417998929">Para usar un motor de búsqueda que no sea el predeterminado, escribe el atajo correspondiente en la barra de direcciones seguido de la combinación de teclas que hayas elegido. Aquí también puedes cambiar el motor de búsqueda predeterminado.</translation> <translation id="7388209873137778229">Solo se muestran dispositivos compatibles.</translation> <translation id="7392118418926456391">Error en el análisis antivirus</translation> <translation id="7392915005464253525">Volver a abrir una ventana cerrada</translation> @@ -6054,10 +6115,12 @@ <translation id="7409735910987429903">Es posible que los sitios abran ventanas emergentes para mostrar anuncios o usen redireccionamientos para que accedas a sitios web que posiblemente no quieras visitar.</translation> <translation id="7409854300652085600">Se importaron los favoritos.</translation> <translation id="7410344089573941623">Preguntar si <ph name="HOST" /> quiere acceder a la cámara y al micrófono</translation> +<translation id="7410852728357935715">Transmitir a un dispositivo</translation> <translation id="741204030948306876">Sí, acepto</translation> <translation id="7412226954991670867">Memoria de GPU</translation> <translation id="7414464185801331860">18x</translation> <translation id="7415454883318062233">Configuración completa</translation> +<translation id="7416263748877373774">No se pueden cargar las Condiciones del Servicio. Verifica tu conexión de red y vuelve a intentarlo.</translation> <translation id="7416362041876611053">Error de red desconocido</translation> <translation id="741906494724992817">Esta aplicación no requiere ningún permiso especial.</translation> <translation id="7419565702166471774">Usar siempre conexiones seguras</translation> @@ -6204,6 +6267,7 @@ <translation id="7559719679815339381">Espera. La aplicación de kiosco se está actualizando. No desconectes el dispositivo USB.</translation> <translation id="7560756177962144929">Sincroniza tu <ph name="DEVICE_TYPE" /></translation> <translation id="7561196759112975576">Siempre</translation> +<translation id="7562099761826673163">Personaliza el dispositivo</translation> <translation id="756445078718366910">Abrir la ventana del navegador</translation> <translation id="7564847347806291057">Finalizar proceso</translation> <translation id="756503097602602175">Desde <ph name="LINK_BEGIN" />Configuración<ph name="LINK_END" />, puedes administrar las Cuentas de Google a las que se accedió. Es posible que se apliquen a todas las cuentas los permisos que otorgaste a sitios web y apps. Si no quieres que los sitios o las apps accedan a la información de tu cuenta, podrás acceder a tu <ph name="DEVICE_TYPE" /> como invitado o navegar en la Web desde una <ph name="LINK_2_BEGIN" />ventana de incógnito<ph name="LINK_2_END" />.</translation> @@ -6521,6 +6585,7 @@ <translation id="78526636422538552">La opción para agregar más Cuentas de Google está inhabilitada</translation> <translation id="7853747251428735">&Más herramientas</translation> <translation id="7855678561139483478">Mueve la pestaña a una ventana nueva</translation> +<translation id="7856654138655787862">Ejecuta pruebas diagnóstico de Chrome OS.</translation> <translation id="7857093393627376423">Sugerencias de texto</translation> <translation id="7857949311770343000">¿Esta es la página Nueva pestaña que esperabas ver?</translation> <translation id="7858328180167661092"><ph name="APP_NAME" /> (Windows)</translation> @@ -6814,6 +6879,7 @@ <translation id="8146177459103116374">Si ya estás registrado en este dispositivo, puedes <ph name="LINK2_START" />acceder como un usuario existente<ph name="LINK2_END" /> .</translation> <translation id="8146287226035613638">Agrega tus idiomas preferidos y ordénalos. Los sitios web, cuando sea posible, se mostrarán en estos idiomas. Estas preferencias están sincronizadas con la configuración de tu navegador. <ph name="BEGIN_LINK_LEARN_MORE" />Más información<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Se produjo un error en el acceso. Comunícate con el administrador o vuelve a intentarlo.</translation> +<translation id="8147346945017130012">Para ayudar a mejorar las funciones y el rendimiento de Chrome y Chrome OS, envía automáticamente informes de fallas y datos de uso y de diagnóstico a Google.</translation> <translation id="8147900440966275470">Se encontró <ph name="NUM" /> pestaña</translation> <translation id="8148760431881541277">Limitar el acceso</translation> <translation id="8149564499626272569">Verificar por teléfono con un cable USB</translation> @@ -7043,6 +7109,7 @@ <translation id="8404893580027489425">El sensor de huellas dactilares se encuentra del lado derecho de tu <ph name="DEVICE_TYPE" />. Tócalo suavemente con un dedo.</translation> <translation id="8405046151008197676">Conoce las novedades de la última actualización</translation> <translation id="8407199357649073301">Nivel de registro:</translation> +<translation id="8408270600235826886">Puedes controlar qué datos se comparten con Google. Puedes cambiar este parámetro cuando lo desees en Configuración. Se usarán los datos según la <ph name="BEGIN_LINK" />Política de Privacidad<ph name="END_LINK" /> de Google.</translation> <translation id="8410775397654368139">Google Play</translation> <translation id="8412136526970428322">Permisos habilitados: <ph name="PERMISSION" /> y <ph name="COUNT" /> más</translation> <translation id="8413385045638830869">Preguntar primero (recomendado)</translation> @@ -7168,6 +7235,7 @@ <translation id="8551588720239073785">Configuración de fecha y hora</translation> <translation id="8553342806078037065">Administrar otras personas</translation> <translation id="8554899698005018844">Ningún idioma</translation> +<translation id="855604308879080518">Permite que las apps para Android accedan a dispositivos USB en esta Chromebook. Se solicitará permiso cada vez que conectes un dispositivo USB. Las apps para Android individuales solicitarán permisos adicionales.</translation> <translation id="8557022314818157177">Continúa tocando la llave de seguridad hasta que se capture tu huella dactilar</translation> <translation id="8557180006508471423">Activa "Google Chrome" en los Servicios de ubicación de tu Mac</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Abrir todo en una ventana &nueva}=1{Abrir en una ventana &nueva}other{Abrir todo ({COUNT}) en una ventana &nueva}}</translation> @@ -7225,6 +7293,7 @@ <translation id="862727964348362408">En suspensión</translation> <translation id="862750493060684461">Caché CSS</translation> <translation id="8627795981664801467">Conexiones seguras solamente</translation> +<translation id="8627804903623428808">Revisa estas condiciones y controla los datos de tu hijo</translation> <translation id="8630338733867813168">Suspender mientras se carga el dispositivo</translation> <translation id="8631032106121706562">Pétalos</translation> <translation id="863109444997383731">Los sitios no podrán pedirte permiso para mostrarte notificaciones. Si un sitio solicita mostrar notificaciones, aparecerá un indicador de bloqueo en la barra de direcciones.</translation> @@ -7257,7 +7326,6 @@ <translation id="8655295600908251630">Canal</translation> <translation id="8655972064210167941">Se produjo un error de acceso porque no se pudo verificar la contraseña. Comunícate con el administrador o vuelve a intentarlo.</translation> <translation id="8657393004602556571">¿Quieres descartar los comentarios?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> comparte tu pantalla y audio con <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Abrir el vínculo en una ventana de incó&gnito</translation> <translation id="8662671328352114214">Unirse a la red <ph name="TYPE" /></translation> <translation id="8662733268723715832">Esta acción está tardando más de lo normal. Puedes omitirla o esperar a que se complete.</translation> @@ -7487,6 +7555,7 @@ <translation id="8872155268274985541">Se encontró un archivo de manifiesto de actualización externa de la aplicación de kiosco no válido. No se pudo actualizar la aplicación de kiosco. Desconecta el dispositivo USB.</translation> <translation id="8872777911145321141">Preguntarme cuando un sitio desee utilizar mis datos o dispositivos de realidad virtual (recomendado)</translation> <translation id="8874184842967597500">No conectado</translation> +<translation id="8874341931345877644">Transmitir a un dispositivo:</translation> <translation id="8875520811099717934">Actualización de Linux</translation> <translation id="8875736897340638404">Elige la visibilidad</translation> <translation id="8876307312329369159">No se puede cambiar esta configuración en la sesión de demostración.</translation> @@ -7551,7 +7620,6 @@ <translation id="8941173171815156065">Revocar el permiso "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Suplemento especial internacional de Netscape</translation> <translation id="8944099748578356325">Usa la batería de forma más rápida (nivel actual: <ph name="BATTERY_PERCENTAGE" />%).</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> comparte una ventana con <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Tamaño del ícono</translation> <translation id="8946359700442089734">Las funciones de depuración no se habilitaron completamente en este dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Buena</translation> @@ -7677,6 +7745,7 @@ Obtén más información sobre los datos que Google recopila (y los motivos para ello) en <ph name="BEGIN_LINK2" />policies.google.com<ph name="END_LINK2" />.</translation> <translation id="9066777626153702300">Sitios inactivos</translation> <translation id="9066782832737749352">Texto a voz</translation> +<translation id="9068298336633421551">Permite que los servicios y las apps para Android con permiso de ubicación usen la ubicación de este dispositivo. Es posible que Google recopile datos anónimos periódicamente y los use para mejorar la precisión de la ubicación y los servicios basados en la ubicación.</translation> <translation id="9068878141610261315">Tipo de archivo no compatible</translation> <translation id="9070342919388027491">Se movió la pestaña hacia la izquierda</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 1f563fc..d4a9646 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -162,6 +162,7 @@ <translation id="1153636665119721804">Programa de Protección Avanzada de Google</translation> <translation id="1155545602507378023">No, solo este dispositivo</translation> <translation id="1155816283571436363">Conectando con tu teléfono</translation> +<translation id="1158080958325422608">Convertir en mayúsculas</translation> <translation id="1158238185437008462">Ver recuerdos</translation> <translation id="1161575384898972166">Inicia sesión en <ph name="TOKEN_NAME" /> para exportar el certificado de cliente.</translation> <translation id="116173250649946226">El administrador ha establecido un tema predeterminado que no se puede cambiar.</translation> @@ -532,6 +533,7 @@ <translation id="1549275686094429035">ARC habilitado</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> quiere acceder a <ph name="VOLUME_NAME" />. Puede modificar o eliminar tus archivos.</translation> <translation id="1552301827267621511">La extensión <ph name="EXTENSION_NAME" /> ha cambiado el proveedor de búsquedas a <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Gestionar extensión</translation> <translation id="1553538517812678578">sin límite</translation> <translation id="1555130319947370107">Azul</translation> <translation id="1556537182262721003">No se ha podido mover el directorio de la extensión al perfil.</translation> @@ -694,6 +696,7 @@ <translation id="1700079447639026019">Sitios web que no pueden usar cookies nunca</translation> <translation id="1703331064825191675">No vuelvas a preocuparte por tus contraseñas</translation> <translation id="1703666494654169921">No permitir que los sitios usen datos ni dispositivos de realidad virtual</translation> +<translation id="1704097193565924901">Mayúsculas</translation> <translation id="1704230497453185209">No permitir que los sitios reproduzcan sonido</translation> <translation id="1704970325597567340">La comprobación de seguridad se ejecutó el <ph name="DATE" /></translation> <translation id="1706586824377653884">Añadido por tu administrador</translation> @@ -2786,7 +2789,6 @@ <translation id="3842552989725514455">Fuente Serif</translation> <translation id="3843464315703645664">En la lista de permitidos interna</translation> <translation id="3844888638014364087">Emoji insertado</translation> -<translation id="384513009320852920">Comprueba que tu dispositivo Bluetooth esté cerca y en modo de emparejamiento. <ph name="BEGIN_LINK_LEARN_MORE" />Más información<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Consigue herramientas para desarrollar sitios web, aplicaciones de Android y mucho más. Al instalar Linux, se descargarán <ph name="DOWNLOAD_SIZE" /> de datos.</translation> <translation id="3847319713229060696">Ayudar a mejorar la seguridad de todos los usuarios en la Web</translation> <translation id="3848547754896969219">Abrir en una ventana de &incógnito</translation> @@ -3572,6 +3574,7 @@ <translation id="4681453295291708042">Inhabilitar Compartir con Nearby</translation> <translation id="4681930562518940301">Abrir &imagen original en una pestaña nueva</translation> <translation id="4682551433947286597">Aparecen fondos de pantalla en la pantalla de inicio de sesión.</translation> +<translation id="4683629100208651599">Convertir en minúsculas</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" /> % (predeterminado)</translation> <translation id="4684427112815847243">Sincronizar todo</translation> <translation id="4684471265911890182"><ph name="APP_NAME" /> está intentando acceder a la cámara. Desactiva el interruptor de privacidad de la cámara para darle acceso.</translation> @@ -4295,7 +4298,6 @@ <translation id="5485102783864353244">Añadir aplicación</translation> <translation id="5485754497697573575">Restaurar todas las pestañas</translation> <translation id="5486261815000869482">Confirmar contraseña</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> comparte tu pantalla con <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simular reinicio del navegador</translation> <translation id="5487460042548760727">Cambiar el nombre del perfil a <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Borrar datos</translation> @@ -4357,6 +4359,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> quiere</translation> <translation id="5534304873398226603">Descartar foto o vídeo</translation> <translation id="5535941515421698170">Eliminar también los datos de este dispositivo</translation> +<translation id="5537725057119320332">Enviar</translation> <translation id="5539221284352502426">El servidor ha rechazado la contraseña que has introducido. Puede deberse a alguna de estas causas: la contraseña es demasiado corta. La contraseña debe contener números o símbolos. La contraseña debe ser diferente a las contraseñas anteriores.</translation> <translation id="5541694225089836610">Tu administrador ha inhabilitado esta acción</translation> <translation id="5542132724887566711">Perfil</translation> @@ -4587,6 +4590,7 @@ <translation id="5787146423283493983">Acuerdo de claves</translation> <translation id="5787420647064736989">Nombre del dispositivo</translation> <translation id="5788367137662787332">Lo sentimos, pero no se ha podido activar al menos una partición del dispositivo <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Completado correctamente</translation> <translation id="5790651917470750848">Esa redirección de puertos ya existe</translation> <translation id="5792728279623964091">Toca el botón de encendido</translation> @@ -4819,10 +4823,8 @@ <ph name="BEGIN_PARAGRAPH2" />Para inhabilitar la ubicación, desactiva la opción Ubicación del dispositivo. También puedes inhabilitar el uso de sensores y redes Wi‑Fi o móviles para determinar la ubicación en los ajustes de ubicación.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Salir del modo de pantalla completa</translation> <translation id="6042308850641462728">Más</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> está compartiendo una pestaña de Chrome con <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Se ha producido un error al analizar la configuración</translation> <translation id="6043994281159824495">Salir ahora</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> está compartiendo audio y una pestaña de Chrome con <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Botón principal del TrackPoint</translation> <translation id="6047632800149092791">No funciona la sincronización. Prueba a cerrar sesión y volver a iniciarla.</translation> <translation id="6049797270917061226">Este archivo podría permitir a los atacantes robar tu información personal.</translation> @@ -5969,6 +5971,7 @@ <translation id="7257173066616499747">Redes Wi-Fi</translation> <translation id="725758059478686223">Servicio de impresión</translation> <translation id="7257666756905341374">Leer los datos que copias y pegas</translation> +<translation id="7258192266780953209">Transformaciones</translation> <translation id="7258225044283673131">La aplicación no responde. Selecciona "Forzar cierre" para cerrar la aplicación.</translation> <translation id="7262004276116528033">Este servicio de inicio de sesión está alojado por <ph name="SAML_DOMAIN" /></translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Prueba estos pasos para solucionar el problema: @@ -7325,7 +7328,6 @@ <translation id="8655295600908251630">Canal</translation> <translation id="8655972064210167941">Se ha producido un error al iniciar sesión porque no ha sido posible verificar la contraseña. Ponte en contacto con el administrador o vuelve a intentarlo.</translation> <translation id="8657393004602556571">¿Quieres descartar los comentarios?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> está compartiendo la pantalla y el audio con <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Abrir enlace en una ventana de incó&gnito</translation> <translation id="8662671328352114214">Unirse a la red <ph name="TYPE" /></translation> <translation id="8662733268723715832">El proceso está tardando más tiempo del esperado. Puedes saltártelo o esperar hasta que acabe.</translation> @@ -7620,7 +7622,6 @@ <translation id="8941173171815156065">Revocar el permiso <ph name="PERMISSION" /></translation> <translation id="894360074127026135">Certificado Step-Up International de Netscape</translation> <translation id="8944099748578356325">Consumirá batería de forma más rápida (carga actual: <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> está compartiendo una ventana con <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Tamaño del icono</translation> <translation id="8946359700442089734">Las funciones de depuración no se han habilitado completamente en este dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Buena</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 50ccc70..224776a 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -534,6 +534,7 @@ <translation id="1549275686094429035">ARC on lubatud</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> soovib juurdepääsu seadmele <ph name="VOLUME_NAME" />. See võib teie faile muuta või need kustutada.</translation> <translation id="1552301827267621511">Laiendus „<ph name="EXTENSION_NAME" />” määras otsinguteenuse pakkujaks teenuse <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Laienduse haldamine</translation> <translation id="1553538517812678578">piiranguteta</translation> <translation id="1555130319947370107">Sinine</translation> <translation id="1556537182262721003">Laienduste kataloogi ei õnnestunud profiili teisaldada.</translation> @@ -2785,7 +2786,6 @@ <translation id="3842552989725514455">Seriifidega font</translation> <translation id="3843464315703645664">Sisemiselt lubamisloendisse lisatud</translation> <translation id="3844888638014364087">Emotikon on sisestatud</translation> -<translation id="384513009320852920">Veenduge, et teie Bluetooth-seade oleks sidumisrežiimis ja läheduses. <ph name="BEGIN_LINK_LEARN_MORE" />Lisateave<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Hankige tööriistad veebisaitide, Androidi rakenduste ja muu arendamiseks. Linuxi installimisel laaditakse alla <ph name="DOWNLOAD_SIZE" /> ulatuses andmeid.</translation> <translation id="3847319713229060696">Aidake veebi kõigi jaoks turvalisemaks muuta</translation> <translation id="3848547754896969219">Ava &inkognito aknas</translation> @@ -4293,7 +4293,6 @@ <translation id="5485102783864353244">Lisa rakendus</translation> <translation id="5485754497697573575">Taasta kõik vahekaardid</translation> <translation id="5486261815000869482">Kinnitage parool</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> jagab teie ekraanikuva vahelehega <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simuleeri brauseri taaskäivitamist</translation> <translation id="5487460042548760727">Määra profiili uueks nimeks <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Kustuta andmed</translation> @@ -4355,6 +4354,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> soovib</translation> <translation id="5534304873398226603">Eemalda foto või video</translation> <translation id="5535941515421698170">Eemaldage sellest seadmest ka oma olemasolevad andmed</translation> +<translation id="5537725057119320332">Ülekanne</translation> <translation id="5539221284352502426">Server lükkas sisestatud parooli tagasi. Võimalikud põhjused on järgmised. Parool on liiga lühike. Parool peab sisaldama numbreid või sümboleid. Parool peab erinema eelmistest paroolidest.</translation> <translation id="5541694225089836610">Administraator on selle toimingu keelanud</translation> <translation id="5542132724887566711">Profiil</translation> @@ -4585,6 +4585,7 @@ <translation id="5787146423283493983">Võtme ühildumine</translation> <translation id="5787420647064736989">Seadme nimi</translation> <translation id="5788367137662787332">Kahjuks ei õnnestunud seadmes <ph name="DEVICE_LABEL" /> vähemalt ühe kettapartitsiooni ühendamine.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Õnnestus</translation> <translation id="5790651917470750848">Pordisiire on juba olemas</translation> <translation id="5792728279623964091">Puudutage toitenuppu.</translation> @@ -4816,10 +4817,8 @@ <ph name="BEGIN_PARAGRAPH2" />Funktsiooni Asukoht saab välja lülitada, kui lülitate välja oma seadme peamise asukohaseade. Asukohaseadetes võite välja lülitada ka WiFi- ja mobiilsidevõrkude ning andurite kasutamise asukoha määramiseks.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Välju täisekraanilt</translation> <translation id="6042308850641462728">Rohkem</translation> -<translation id="6043317578411397101">Rakendus <ph name="APP_NAME" /> jagab Chrome'i vahelehte vahelehega <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Seadistuse sõelumine nurjus</translation> <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="6049797270917061226">See fail võib ründajatel teie isikuandmete varastamist võimaldada.</translation> @@ -7316,7 +7315,6 @@ <translation id="8655295600908251630">Kanal</translation> <translation id="8655972064210167941">Sisselogimine ebaõnnestus, kuna teie parooli ei saanud kinnitada. Võtke ühendust administraatoriga või proovige uuesti.</translation> <translation id="8657393004602556571">Kas soovite tagasisidest loobuda?</translation> -<translation id="8658645149275195032">Rakendus <ph name="APP_NAME" /> jagab teie ekraani ja heli vahelehega <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Ava link inko&gnito aknas</translation> <translation id="8662671328352114214"><ph name="TYPE" />-võrguga liitumine</translation> <translation id="8662733268723715832">See võtab oodatust kauem aega. Võite selle vahele jätta või lõpuni oodata.</translation> @@ -7611,7 +7609,6 @@ <translation id="8941173171815156065">Tühista luba „<ph name="PERMISSION" />”</translation> <translation id="894360074127026135">Netscape'i rahvusvaheline seadistus</translation> <translation id="8944099748578356325">Aku kiiremini kulutamine (praegu <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> jagab akent vahelehega <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Ikooni suurus</translation> <translation id="8946359700442089734">Silumisfunktsioone ei lubatud täielikult selles toote <ph name="IDS_SHORT_PRODUCT_NAME" /> seadmes.</translation> <translation id="894763922177556086">Hea</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 33ef138..dad9179 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -531,6 +531,7 @@ <translation id="1549275686094429035">ARC gaituta</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> aplikazioak <ph name="VOLUME_NAME" /> atzitu nahi du. Fitxategiak alda edo ezaba ditzake.</translation> <translation id="1552301827267621511">"<ph name="EXTENSION_NAME" />" luzapenak bidalketa-hornitzailea aldatu du, eta <ph name="SEARCH_PROVIDER_DOMAIN" /> erabiliko da hemendik aurrera</translation> +<translation id="1552752544932680961">Kudeatu luzapena</translation> <translation id="1553538517812678578">mugagabea</translation> <translation id="1555130319947370107">Urdina</translation> <translation id="1556537182262721003">Ezin izan da luzapenen direktorioa profilera eraman.</translation> @@ -2778,7 +2779,6 @@ <translation id="3842552989725514455">Serif letra</translation> <translation id="3843464315703645664">Chrome-ren onartutakoen zerrendan</translation> <translation id="3844888638014364087">Txertatu da emojia</translation> -<translation id="384513009320852920">Ziurtatu Bluetooth bidezko gailua gertu eta parekatzeko moduan dagoela. <ph name="BEGIN_LINK_LEARN_MORE" />Lortu informazio gehiago<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Lortu webguneak, Android-erako aplikazioak eta beste garatzeko tresnak. Linux instalatuz gero, <ph name="DOWNLOAD_SIZE" /> deskargatuko dira.</translation> <translation id="3847319713229060696">Hobetu sareko segurtasuna denontzat</translation> <translation id="3848547754896969219">Ireki &ezkutuko moduko leiho batean</translation> @@ -4286,7 +4286,6 @@ <translation id="5485102783864353244">Gehitu aplikazioa</translation> <translation id="5485754497697573575">Leheneratu fitxa guztiak</translation> <translation id="5486261815000869482">Berretsi pasahitza</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> aplikazioa zure pantaila partekatzen ari da <ph name="TAB_NAME" /> fitxarekin.</translation> <translation id="5486561344817861625">Simulatu arakatzailea berrabiaraztea</translation> <translation id="5487460042548760727">Aldatu <ph name="PROFILE_NAME" /> profilaren izena</translation> <translation id="5487521232677179737">Garbitu datuak</translation> @@ -4348,6 +4347,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> webguneak hau egin nahi du:</translation> <translation id="5534304873398226603">Baztertu argazkia edo bideoa</translation> <translation id="5535941515421698170">Eta kendu lehendik dauden datuak gailu honetatik</translation> +<translation id="5537725057119320332">Igorri</translation> <translation id="5539221284352502426">Zerbitzariak idatzi duzun pasahitza baztertu du, arrazoi hauetako baten ondorioz: pasahitza laburregia da, pasahitzak zenbakiak edo ikurrak izan behar ditu, edo pasahitza ezin da izan aurreko baten berdina.</translation> <translation id="5541694225089836610">Administratzaileak desgaitu egin du ekintza</translation> <translation id="5542132724887566711">Profila</translation> @@ -4578,6 +4578,7 @@ <translation id="5787146423283493983">Gakoei buruzko akordioa</translation> <translation id="5787420647064736989">Gailuaren izena</translation> <translation id="5788367137662787332">Ezin izan da muntatu <ph name="DEVICE_LABEL" /> gailuaren partizio bat edo gehiago.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Behar bezala egin da</translation> <translation id="5790651917470750848">Ataka-birbideratzea badago dagoeneko</translation> <translation id="5792728279623964091">Sakatu etengailua</translation> @@ -4809,10 +4810,8 @@ <ph name="BEGIN_PARAGRAPH2" />Kokapena desaktibatzeko, desaktibatu gailuaren kokapen-ezarpen nagusia. Bestela, desaktibatu kokapena zehazteko wifi-sareak, sare mugikorrak eta sentsoreak erabiltzeko aukera kokapen-ezarpenetan.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Irten pantaila osoko modutik</translation> <translation id="6042308850641462728">Gehiago</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> Chrome-ko fitxa bat partekatzen ari da <ph name="TAB_NAME" /> fitxarekin.</translation> <translation id="604388835206766544">Ezin izan da analizatu konfigurazioa</translation> <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="6049797270917061226">Baliteke fitxategiak erasotzaileei informazio pertsonala lapurtzen uztea.</translation> @@ -7307,7 +7306,6 @@ <translation id="8655295600908251630">Kanala</translation> <translation id="8655972064210167941">Ezin izan da hasi saioa, ezin izan delako egiaztatu pasahitza. Jarri administratzailearekin harremanetan edo saiatu berriro.</translation> <translation id="8657393004602556571">Oharrak baztertu nahi dituzu?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> pantaila eta audioa partekatzen ari da <ph name="TAB_NAME" /> fitxarekin.</translation> <translation id="8661290697478713397">Ireki esteka &ezkutuko moduko leihoan</translation> <translation id="8662671328352114214">Sartu <ph name="TYPE" /> sarean</translation> <translation id="8662733268723715832">Ohi baino gehiago ari da luzatzen prozesua. Salta ezazu edo itxaron amaitu arte.</translation> @@ -7602,7 +7600,6 @@ <translation id="8941173171815156065">Baliogabetu "<ph name="PERMISSION" />" baimena</translation> <translation id="894360074127026135">Nazioarteko Netscape Step-Up ziurtagiria</translation> <translation id="8944099748578356325">Bateria gehiago kontsumitu (% <ph name="BATTERY_PERCENTAGE" /> geratzen zaizu)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> leiho bat partekatzen ari da <ph name="TAB_NAME" /> fitxarekin.</translation> <translation id="8945274638472141382">Ikonoaren tamaina</translation> <translation id="8946359700442089734">Arazketa-eginbideak ez dira guztiz gaitu <ph name="IDS_SHORT_PRODUCT_NAME" /> gailu honetan.</translation> <translation id="894763922177556086">ona</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 0ae1cc7..9e89278 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -532,6 +532,7 @@ <translation id="1549275686094429035">زمان اجرای برنامه ویژه (ARC) فعال شد</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> میخواهد به <ph name="VOLUME_NAME" /> دسترسی یابد. ممکن است فایلهایتان را تغییر داده یا حذف کند.</translation> <translation id="1552301827267621511">افزونه «<ph name="EXTENSION_NAME" />»، <ph name="SEARCH_PROVIDER_DOMAIN" /> را تغییر داد تا جستجو با استفاده از آن انجام شود</translation> +<translation id="1552752544932680961">مدیریت برنامه افزودنی</translation> <translation id="1553538517812678578">نامحدود</translation> <translation id="1555130319947370107">آبی</translation> <translation id="1556537182262721003">انتقال دایرکتوری برنامهٔ افزودنی به نمایه ممکن نیست.</translation> @@ -2791,7 +2792,6 @@ <translation id="3842552989725514455">قلم Serif</translation> <translation id="3843464315703645664">بهصورت داخلی در فهرست مجازها قرار گرفته است</translation> <translation id="3844888638014364087">اموجی درج شد</translation> -<translation id="384513009320852920">مطمئن شوید دستگاه بلوتوث در حالت مرتبطسازی و در همین اطراف باشد. <ph name="BEGIN_LINK_LEARN_MORE" />بیشتر بدانید<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">دریافت ابزارهایی برای برنامهنویسی وبسایت، برنامههای Android و سایر موارد. با نصب Linux، <ph name="DOWNLOAD_SIZE" /> داده بارگیری خواهد شد.</translation> <translation id="3847319713229060696">کمک به بهبود امنیت برای همه کاربران وب</translation> <translation id="3848547754896969219">باز کردن در «پنجره ناشناس»</translation> @@ -4300,7 +4300,6 @@ <translation id="5485102783864353244">افزودن برنامه</translation> <translation id="5485754497697573575">بازیابی همه برگهها</translation> <translation id="5486261815000869482">تأیید گذرواژه</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> در حال اشتراکگذاری صفحه نمایشتان با <ph name="TAB_NAME" /> است.</translation> <translation id="5486561344817861625">شبیهسازی راهاندازی مجدد مرورگر</translation> <translation id="5487460042548760727">تغییر دادن نام نمایه به <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">پاک کردن دادهها</translation> @@ -4362,6 +4361,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> میخواهد</translation> <translation id="5534304873398226603">صرفنظر کردن از عکس یا ویدیو</translation> <translation id="5535941515421698170">همچنین دادههای موجودتان را در این دستگاه پاک کنید</translation> +<translation id="5537725057119320332">فرستادن</translation> <translation id="5539221284352502426">سرور گذرواژهای را که وارد کردهاید نپذیرفته است. دلایل احتمالی عبارت است از: گذرواژه خیلی کوتاه است. گذرواژه باید حاوی اعداد یا نمادها باشد. گذرواژه باید با گذرواژههای قبلی متفاوت باشد.</translation> <translation id="5541694225089836610">سرپرستتان کنش را غیرفعال کرده است</translation> <translation id="5542132724887566711">نمایه</translation> @@ -4592,6 +4592,7 @@ <translation id="5787146423283493983">قرارداد کلید</translation> <translation id="5787420647064736989">نام دستگاه</translation> <translation id="5788367137662787332">متأسفیم، حداقل یک پارتیشن در دستگاه <ph name="DEVICE_LABEL" /> نصب نمیشود.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">موفق شدید</translation> <translation id="5790651917470750848">بازارسال درگاه ازقبل موجود است</translation> <translation id="5792728279623964091">لطفاً روی دکمه روشن/خاموش ضربه بزنید</translation> @@ -4823,10 +4824,8 @@ <ph name="BEGIN_PARAGRAPH2" />با خاموش کردن تنظیم اصلی «مکان» در دستگاهتان میتوانید «مکان» را خاموش کنید. همچنین میتوانید در تنظیمات مکان، استفاده از Wi-Fi، شبکههای تلفن همراه و حسگرها را برای مکان خاموش کنید.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">خروج از تمام صفحه</translation> <translation id="6042308850641462728">بیشتر</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> در حال اشتراکگذاری یک برگه Chrome با <ph name="TAB_NAME" /> است.</translation> <translation id="604388835206766544">پیکربندی تجزیهوتحلیل نشد</translation> <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="6049797270917061226">این فایل میتواند به مهاجمان اجازه دهد اطلاعات شخصی شما را سرقت کنند.</translation> @@ -7323,7 +7322,6 @@ <translation id="8655295600908251630">کانال</translation> <translation id="8655972064210167941">ورود به سیستم ناموفق بود زیرا گذرواژه شما تأیید نشد. لطفاً با سرپرستتان تماس بگیرید یا دوباره امتحان کنید.</translation> <translation id="8657393004602556571">میخواهید از بازخورد صرفنظر کنید؟</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> درحال اشتراکگذاری صفحه و صوت شما با <ph name="TAB_NAME" /> است.</translation> <translation id="8661290697478713397">باز کردن پیوند در پنجره حالت &ناشناس</translation> <translation id="8662671328352114214">پیوستن به شبکه <ph name="TYPE" /></translation> <translation id="8662733268723715832">این کار بیشاز حد انتظار طول کشیده است، میتوانید این مرحله را رد کنید یا منتظر بمانید تا تمام شود.</translation> @@ -7619,7 +7617,6 @@ <translation id="8941173171815156065">لغو مجوز «<ph name="PERMISSION" />»</translation> <translation id="894360074127026135">ارتقاء بینالمللی Netscape</translation> <translation id="8944099748578356325">استفاده سریعتر از باتری (درحالحاضر <ph name="BATTERY_PERCENTAGE" />٪)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> درحال اشتراکگذاری یک پنجره با <ph name="TAB_NAME" /> است.</translation> <translation id="8945274638472141382">اندازه نماد</translation> <translation id="8946359700442089734">ویژگیهای رفع اشکال در این دستگاه <ph name="IDS_SHORT_PRODUCT_NAME" /> کاملاً فعال نشدند.</translation> <translation id="894763922177556086">خوب</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 54b27b17..e5ccc66 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -163,6 +163,7 @@ <translation id="1153356358378277386">Laiteparit</translation> <translation id="1153636665119721804">Googlen Lisäsuojaus-ohjelma</translation> <translation id="1155816283571436363">Yhdistetään puhelimeen</translation> +<translation id="1158080958325422608">Muuta isoiksi kirjaimiksi</translation> <translation id="1158238185437008462">Katso muistoja</translation> <translation id="1161575384898972166">Kirjaudu sisään laitteeseen <ph name="TOKEN_NAME" /> ja tuo asiakkaan varmenne.</translation> <translation id="116173250649946226">Järjestelmänvalvojasi on valinnut oletusteeman, jota ei voi muuttaa.</translation> @@ -533,6 +534,7 @@ <translation id="1549275686094429035">ARC käytössä</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> haluaa käyttää tallennusvälinettä <ph name="VOLUME_NAME" />. Luvan saatuaan sovellus voi muokata tai poistaa tiedostojasi.</translation> <translation id="1552301827267621511"><ph name="EXTENSION_NAME" /> muutti hakupalvelua, se on nyt <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Hallinnoi laajennusta</translation> <translation id="1553538517812678578">rajoittamaton</translation> <translation id="1555130319947370107">Sininen</translation> <translation id="1556537182262721003">Laajennushakemiston siirtäminen profiiliin ei onnistunut.</translation> @@ -695,6 +697,7 @@ <translation id="1700079447639026019">Sivustot, jotka eivät koskaan voi käyttää evästeitä</translation> <translation id="1703331064825191675">Enää ei tarvitse huolehtia salasanoista</translation> <translation id="1703666494654169921">Älä salli sivustojen käyttää virtuaalitodellisuuslaitteita tai ‑dataa</translation> +<translation id="1704097193565924901">Muuta alkukirjain isoksi</translation> <translation id="1704230497453185209">Älä salli sivustojen toistaa ääntä</translation> <translation id="1704970325597567340">Turvatarkistus tehtiin <ph name="DATE" /></translation> <translation id="1706586824377653884">Järjestelmänvalvojan lisäämä</translation> @@ -2791,7 +2794,6 @@ <translation id="3842552989725514455">Serif-fontti</translation> <translation id="3843464315703645664">Sallittu sisäisesti</translation> <translation id="3844888638014364087">Emoji lisätty</translation> -<translation id="384513009320852920">Varmista, että Bluetooth-laitteesi on parinmuodostustilassa ja lähellä. <ph name="BEGIN_LINK_LEARN_MORE" />Lue lisää<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Saat verkkosivustojen kehittämistyökaluja, Android-sovelluksia ja paljon muuta. Linuxin asennus lataa <ph name="DOWNLOAD_SIZE" /> dataa.</translation> <translation id="3847319713229060696">Auta lisäämään verkon turvallisuutta kaikille</translation> <translation id="3848547754896969219">Avaa &incognito-ikkunassa</translation> @@ -3574,6 +3576,7 @@ <translation id="4681453295291708042">Poista lähijakaminen käytöstä</translation> <translation id="4681930562518940301">Avaa alkuperäinen &kuva uudessa välilehdessä</translation> <translation id="4682551433947286597">Taustakuva näytetään kirjautumisruudulla.</translation> +<translation id="4683629100208651599">Muuta pieniksi kirjaimiksi</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" /> % (oletus)</translation> <translation id="4684427112815847243">Synkronoi kaikki</translation> <translation id="4684471265911890182"><ph name="APP_NAME" /> yrittää käyttää kameraa. Salli kameran käyttö laittamalla sen yksityisyysvalinta pois päältä.</translation> @@ -4296,7 +4299,6 @@ <translation id="5485102783864353244">Lisää sovellus</translation> <translation id="5485754497697573575">Palauta kaikki välilehdet</translation> <translation id="5486261815000869482">Vahvista salasana</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> jakaa ruutusi välilehden <ph name="TAB_NAME" /> kanssa.</translation> <translation id="5486561344817861625">Simuloi selaimen uudelleenkäynnistys</translation> <translation id="5487460042548760727">Nimeä profiili uudelleen: <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Poista tiedot</translation> @@ -4358,6 +4360,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> pyytää lupaa</translation> <translation id="5534304873398226603">Hylkää kuva tai video</translation> <translation id="5535941515421698170">Poista myös olemassa olevat tietosi tältä laitteelta</translation> +<translation id="5537725057119320332">Suoratoista</translation> <translation id="5539221284352502426">Palvelin hylkäsi antamasi salasanan. Mahdollisia syitä: Salasana on liian lyhyt. Salasanassa on oltava numeroita tai merkkejä. Salasanan on oltava eri kuin aiemmat salasanat.</translation> <translation id="5541694225089836610">Järjestelmänvalvoja on poistanut toiminnon käytöstä</translation> <translation id="5542132724887566711">Profiili</translation> @@ -4588,6 +4591,7 @@ <translation id="5787146423283493983">Avainsopimus</translation> <translation id="5787420647064736989">Laitteen nimi</translation> <translation id="5788367137662787332">Ainakin yhtä laitteen <ph name="DEVICE_LABEL" /> osiosta ei voitu ottaa käyttöön.</translation> +<translation id="5789643057113097023">,</translation> <translation id="5790085346892983794">Onnistui</translation> <translation id="5790651917470750848">Porttiohjaus on jo olemassa</translation> <translation id="5792728279623964091">Paina virtapainiketta</translation> @@ -4819,10 +4823,8 @@ <ph name="BEGIN_PARAGRAPH2" />Voit poistaa palvelun käytöstä poistamalla laitteen sijainnin pääasetuksen käytöstä. Sijaintiasetuksissa voit myös estää Wi-Fin, mobiiliverkkojen ja anturien käytön sijainnin määrityksessä.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Poistu koko näytön tilasta</translation> <translation id="6042308850641462728">Lisää</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> jakaa Chrome-välilehden välilehdelle <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Määrityksen jäsentäminen epäonnistui</translation> <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="6049797270917061226">Tämä tiedosto voi päästää hyökkääjät varastamaan henkilökohtaisia tietojasi.</translation> @@ -5966,6 +5968,7 @@ <translation id="7257173066616499747">Wi-Fi-verkot</translation> <translation id="725758059478686223">Tulostuspalvelu</translation> <translation id="7257666756905341374">Lukea kopioimiasi ja liittämiäsi tietoja</translation> +<translation id="7258192266780953209">Muunnokset</translation> <translation id="7258225044283673131">Sovellus ei vastaa. Sulje sovellus valitsemalla Pakota sulkeutumaan.</translation> <translation id="7262004276116528033">Tätä kirjautumispalvelua ylläpitää <ph name="SAML_DOMAIN" />.</translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Kokeile näitä ratkaisuja: @@ -7317,7 +7320,6 @@ <translation id="8655295600908251630">Kanava</translation> <translation id="8655972064210167941">Sisäänkirjautuminen epäonnistui, koska salasanasi vahvistaminen epäonnistui. Ota yhteyttä järjestelmänvalvojaan tai yritä uudelleen.</translation> <translation id="8657393004602556571">Hylätäänkö palaute?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> jakaa näyttösi ja äänesi välilehdelle <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Avaa linkki inco&gnito-ikkunassa</translation> <translation id="8662671328352114214">Liity <ph name="TYPE" />-verkkoon</translation> <translation id="8662733268723715832">Tässä kestää odotettua kauemmin. Voit ohittaa tämän vaiheen tai odottaa sen valmistumista.</translation> @@ -7612,7 +7614,6 @@ <translation id="8941173171815156065">Kumoa käyttölupa <ph name="PERMISSION" /></translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Käyttää akkua nopeammin (akkua tällä hetkellä <ph name="BATTERY_PERCENTAGE" /> %)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> jakaa ikkunan välilehdelle <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Kuvakkeen koko</translation> <translation id="8946359700442089734">Virheenkorjausominaisuudet eivät olleet täysin käytössä tällä <ph name="IDS_SHORT_PRODUCT_NAME" />-laitteella.</translation> <translation id="894763922177556086">Hyvä</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 9208170..d04d688 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -537,6 +537,7 @@ <translation id="1549275686094429035">Naka-enable ang ARC</translation> <translation id="1549788673239553762">Gusto ng <ph name="APP_NAME" /> na i-access ang <ph name="VOLUME_NAME" />. Maaari nitong baguhin o i-delete ang iyong mga file.</translation> <translation id="1552301827267621511">Pinalitan ng extension na "<ph name="EXTENSION_NAME" />" ang paghahanap para magamit ang <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Mamahala ng extension</translation> <translation id="1553538517812678578">walang limitasyon</translation> <translation id="1555130319947370107">Asul</translation> <translation id="1556537182262721003">Hindi maililipat ang direktoryo ng extension papunta sa profile.</translation> @@ -2804,7 +2805,6 @@ <translation id="3842552989725514455">Serif font</translation> <translation id="3843464315703645664">Internal na na-allowlist</translation> <translation id="3844888638014364087">Naglagay ng emoji</translation> -<translation id="384513009320852920">Tiyaking nasa pairing mode at nasa malapit ang iyong Bluetooth device. <ph name="BEGIN_LINK_LEARN_MORE" />Matuto pa<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Kumuha ng mga tool sa paggawa ng mga website, Android app, at higit pa. Kapag na-install ang Linux, mada-download ang <ph name="DOWNLOAD_SIZE" /> ng data.</translation> <translation id="3847319713229060696">Tumulong na pahusayin ang seguridad sa web para sa lahat</translation> <translation id="3848547754896969219">Buksan lahat sa &Incognito window</translation> @@ -4316,7 +4316,6 @@ <translation id="5485102783864353244">Magdagdag ng app</translation> <translation id="5485754497697573575">Ibalik ang Lahat ng Mga Tab</translation> <translation id="5486261815000869482">Kumpirmahin ang password</translation> -<translation id="5486275809415469523">Ibinabahagi ng <ph name="APP_NAME" /> ang iyong screen sa <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">I-simulate ang Pag-restart ng Browser</translation> <translation id="5487460042548760727">I-rename ang profile sa <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">I-clear ang data</translation> @@ -4378,6 +4377,7 @@ <translation id="5533001281916885985">Gusto ng <ph name="SITE_NAME" /> na</translation> <translation id="5534304873398226603">I-discard ang larawan o video</translation> <translation id="5535941515421698170">Alisin din ang iyong kasalukuyang data sa device na ito</translation> +<translation id="5537725057119320332">I-cast</translation> <translation id="5539221284352502426">Tinanggihan ng server ang password na inilagay mo. Kabilang sa mga posibleng dahilan: Masyadong maikli ang password. Dapat may mga numero o simbolo ang password. Dapat naiiba ang password sa mga nakaraang password.</translation> <translation id="5541694225089836610">Na-disable ng iyong administrator ang pagkilos na ito</translation> <translation id="5542132724887566711">Profile</translation> @@ -4608,6 +4608,7 @@ <translation id="5787146423283493983">Pangunahing Kasunduan</translation> <translation id="5787420647064736989">Pangalan ng device</translation> <translation id="5788367137662787332">Paumanhin, hindi mai-mount ang hindi bababa sa isang bahagi ng device na <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Tagumpay</translation> <translation id="5790651917470750848">Mayroon nang forward ng port</translation> <translation id="5792728279623964091">Paki-tap ang iyong power button</translation> @@ -4840,10 +4841,8 @@ <ph name="BEGIN_PARAGRAPH2" />Maaari mong i-off ang Lokasyon sa pamamagitan ng pag-off sa pangunahing setting ng Lokasyon sa device na ito. Maaari mo ring i-off ang paggamit ng Wi‑Fi, mga mobile network, at mga sensor para sa lokasyon sa mga setting ng lokasyon.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Lumabas sa Fullscreen</translation> <translation id="6042308850641462728">Marami pang iba</translation> -<translation id="6043317578411397101">Nagbabahagi ang <ph name="APP_NAME" /> ng tab ng Chrome sa <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Hindi na-parse ang configuration</translation> <translation id="6043994281159824495">Mag-sign out ngayon</translation> -<translation id="6044805581023976844">Nagbabahagi ang <ph name="APP_NAME" /> ng tab ng Chrome at audio sa <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Pangunahing button ng TrackPoint</translation> <translation id="6047632800149092791">Hindi gumagana ang pag-sync. Subukang mag-sign out at mag-sign in ulit.</translation> <translation id="6049797270917061226">Puwedeng bigyang-daan ng file na ito na manakaw ng mga attacker ang iyong personal na impormasyon.</translation> @@ -7348,7 +7347,6 @@ <translation id="8655295600908251630">Channel</translation> <translation id="8655972064210167941">Hindi nakapag-sign in dahil hindi ma-verify ang iyong password. Mangyaring makipag-ugnayan sa iyong administrator o subukang muli.</translation> <translation id="8657393004602556571">Gusto mo bang i-discard ang feedback?</translation> -<translation id="8658645149275195032">Ibinabahagi ng <ph name="APP_NAME" /> ang iyong screen at audio sa <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Buksan ang link sa Inco&gnito Window</translation> <translation id="8662671328352114214">Sumali sa <ph name="TYPE" /> network</translation> <translation id="8662733268723715832">Mas matagal ito kaysa sa inaasahan, puwede mong laktawan o hintayin hanggang sa matapos ito.</translation> @@ -7645,7 +7643,6 @@ <translation id="8941173171815156065">Bawiin ang pahintulot na '<ph name="PERMISSION" />'</translation> <translation id="894360074127026135">International Step-Up ng Netscape</translation> <translation id="8944099748578356325">Mas mabilis na mauubos ang baterya (kasalukuyang <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280">Nagbabahagi ang <ph name="APP_NAME" /> ng window sa <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Laki ng icon</translation> <translation id="8946359700442089734">Ang mga feature para sa pagde-debug ay hindi ganap na na-enable sa <ph name="IDS_SHORT_PRODUCT_NAME" /> device na ito.</translation> <translation id="894763922177556086">Malakas</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index ea2dc1b6..78e0240 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -531,6 +531,7 @@ <translation id="1549275686094429035">Technologie ARC activée</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> souhaite accéder à <ph name="VOLUME_NAME" />. Cela peut modifier ou supprimer vos fichiers.</translation> <translation id="1552301827267621511">L'extension « <ph name="EXTENSION_NAME" /> » a activé un moteur de recherche différent : <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Gérer l'extension</translation> <translation id="1553538517812678578">Sans limites</translation> <translation id="1555130319947370107">Bleu</translation> <translation id="1556537182262721003">Échec de déplacement du répertoire d'extensions dans le profil.</translation> @@ -2779,7 +2780,6 @@ <translation id="3842552989725514455">Police avec empattement</translation> <translation id="3843464315703645664">Placé sur la liste verte à l'interne</translation> <translation id="3844888638014364087">Émoji inséré</translation> -<translation id="384513009320852920">Assurez-vous que votre appareil Bluetooth est en mode d'association et à proximité. <ph name="BEGIN_LINK_LEARN_MORE" />En savoir plus<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Obtenez des outils pour concevoir des sites Web, des applications Android et plus encore. L'installation de Linux téléchargera <ph name="DOWNLOAD_SIZE" /> de données.</translation> <translation id="3847319713229060696">Contribuer à l'amélioration de la sécurité sur le Web pour tout le monde</translation> <translation id="3848547754896969219">Ouvrir dans une &fenêtre de navigation privée</translation> @@ -4286,7 +4286,6 @@ <translation id="5485102783864353244">Ajouter une application</translation> <translation id="5485754497697573575">Restaurer tous les onglets</translation> <translation id="5486261815000869482">Confirmation du mot de passe</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> partage votre écran avec <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simuler le redémarrage du navigateur</translation> <translation id="5487460042548760727">Renommer le profil <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Effacer les données</translation> @@ -4348,6 +4347,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> souhaite</translation> <translation id="5534304873398226603">Supprimer la photo ou la vidéo</translation> <translation id="5535941515421698170">Supprimer également vos données existantes de cet appareil</translation> +<translation id="5537725057119320332">Diffuser</translation> <translation id="5539221284352502426">Le mot de passe que vous avez entré a été refusé par le serveur. Voici des raisons possibles : le mot de passe est trop court. Le mot de passe doit comporter des chiffres ou des symboles. Le mot de passe doit être différent des mots de passe précédents.</translation> <translation id="5541694225089836610">Cette action est désactivée par votre administrateur</translation> <translation id="5542132724887566711">Profil</translation> @@ -4578,6 +4578,7 @@ <translation id="5787146423283493983">Accord de la clé</translation> <translation id="5787420647064736989">Nom de l'appareil</translation> <translation id="5788367137662787332">Nous sommes désolés, il y a au moins une partition sur le périphérique <ph name="DEVICE_LABEL" /> qui n'est pas installable.</translation> +<translation id="5789643057113097023">,</translation> <translation id="5790085346892983794">Opération réussie</translation> <translation id="5790651917470750848">Cette redirection de port existe déjà</translation> <translation id="5792728279623964091">Veuillez toucher l'interrupteur</translation> @@ -4809,10 +4810,8 @@ <ph name="BEGIN_PARAGRAPH2" />Vous pouvez couper ce service en désactivant le paramètre de localisation principal de l'appareil. Vous pouvez également désactiver l'utilisation des réseaux Wi‑Fi, des réseaux cellulaires et des capteurs pour la localisation dans les paramètres de localisation.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Quitter le mode Plein écran</translation> <translation id="6042308850641462728">Plus</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> partage un onglet Chrome avec <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Impossible d'analyser la configuration</translation> <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="6049797270917061226">Ce fichier pourrait laisser des pirates voler vos renseignements personnels.</translation> @@ -7307,7 +7306,6 @@ <translation id="8655295600908251630">Version</translation> <translation id="8655972064210167941">La connexion a échoué, car votre mot de passe n'a pas pu être vérifié. Veuillez communiquer avec votre administrateur ou réessayer.</translation> <translation id="8657393004602556571">Voulez-vous supprimer les commentaires?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> partage votre écran et le son avec <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Ouvrir le lien dans une fenêtre de navi&gation privée</translation> <translation id="8662671328352114214">Se joindre au réseau <ph name="TYPE" /></translation> <translation id="8662733268723715832">Cette opération prend plus de temps que prévu. Vous pouvez l'ignorer ou attendre qu'elle soit terminée.</translation> @@ -7603,7 +7601,6 @@ <translation id="8941173171815156065">Révoquer l'autorisation « <ph name="PERMISSION" /> »</translation> <translation id="894360074127026135">Fonction d'optimisation internationale Netscape</translation> <translation id="8944099748578356325">Épuisera plus rapidement la pile (actuellement à <ph name="BATTERY_PERCENTAGE" /> %)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> partage une fenêtre avec <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Taille de l'icône</translation> <translation id="8946359700442089734">Les fonctionnalités de débogage ne sont pas complètement activées sur cet appareil <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Bonne</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index da564830..af2583e 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -532,6 +532,7 @@ <translation id="1549275686094429035">ARC activé</translation> <translation id="1549788673239553762">"<ph name="APP_NAME" />" souhaite accéder à "<ph name="VOLUME_NAME" />". L'application peut modifier ou supprimer vos fichiers.</translation> <translation id="1552301827267621511">L'extension "<ph name="EXTENSION_NAME" />" a remplacé le moteur de recherche par <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Gérer l'extension</translation> <translation id="1553538517812678578">sans limite</translation> <translation id="1555130319947370107">Bleu</translation> <translation id="1556537182262721003">Impossible de déplacer le répertoire d'extensions dans le profil.</translation> @@ -2780,7 +2781,6 @@ <translation id="3842552989725514455">Police Serif</translation> <translation id="3843464315703645664">Ajouté à la liste d'autorisation interne</translation> <translation id="3844888638014364087">Emoji ajouté</translation> -<translation id="384513009320852920">Assurez-vous que votre appareil Bluetooth est en mode association et à proximité. <ph name="BEGIN_LINK_LEARN_MORE" />En savoir plus<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Accédez à des outils conçus pour développer des sites Web, des applications Android, etc. En installant Linux, vous téléchargerez <ph name="DOWNLOAD_SIZE" /> de données.</translation> <translation id="3847319713229060696">Contribuer à améliorer la sécurité sur le Web pour tous</translation> <translation id="3848547754896969219">Ouvrir dans une fenêtre de navigation &privée</translation> @@ -4288,7 +4288,6 @@ <translation id="5485102783864353244">Ajouter l'application</translation> <translation id="5485754497697573575">Restaurer tous les onglets</translation> <translation id="5486261815000869482">Confirmer le mot de passe</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> partage votre écran avec <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simuler le redémarrage du navigateur</translation> <translation id="5487460042548760727">Renommer le profil en <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Effacer les données</translation> @@ -4350,6 +4349,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> souhaite</translation> <translation id="5534304873398226603">Supprimer la photo ou la vidéo</translation> <translation id="5535941515421698170">Supprimer également les données de cet appareil</translation> +<translation id="5537725057119320332">Caster</translation> <translation id="5539221284352502426">Le serveur a refusé le mot de passe que vous avez saisi. Voici plusieurs raisons possibles : le mot de passe est trop court. Il ne contient pas de chiffres ni de symboles. Il est identique aux précédents mots de passe.</translation> <translation id="5541694225089836610">Votre administrateur a désactivé cette action</translation> <translation id="5542132724887566711">Profil</translation> @@ -4581,6 +4581,7 @@ <translation id="5787146423283493983">Accord de la clé</translation> <translation id="5787420647064736989">Nom de l'appareil</translation> <translation id="5788367137662787332">Désolé, impossible d'installer au moins une partition du périphérique <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Succès</translation> <translation id="5790651917470750848">Ce port existe déjà</translation> <translation id="5792728279623964091">Veuillez appuyer sur le bouton Marche/Arrêt</translation> @@ -4812,10 +4813,8 @@ <ph name="BEGIN_PARAGRAPH2" />Pour arrêter ce service, désactivez le paramètre de localisation principal sur votre appareil. Vous pouvez également désactiver l'utilisation du Wi-Fi, des réseaux mobiles et des capteurs dans vos paramètres de localisation.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Quitter le mode plein écran</translation> <translation id="6042308850641462728">Plus</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> partage un onglet Chrome avec <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Échec de l'analyse de la configuration</translation> <translation id="6043994281159824495">Se déconnecter maintenant</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> partage un onglet Chrome et un contenu audio 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, puis de vous reconnecter.</translation> <translation id="6049797270917061226">Ce fichier pourrait permettre à des pirates informatiques de dérober vos informations personnelles.</translation> @@ -7312,7 +7311,6 @@ <translation id="8655295600908251630">Version</translation> <translation id="8655972064210167941">Échec de la connexion, car il est impossible de valider votre mot de passe. Veuillez contacter votre administrateur ou réessayer.</translation> <translation id="8657393004602556571">Voulez-vous supprimer les commentaires ?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> partage votre écran et un contenu audio avec <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Ouvrir le lien dans la fenêtre de navi&gation privée</translation> <translation id="8662671328352114214">Rejoindre le réseau <ph name="TYPE" /></translation> <translation id="8662733268723715832">Cette opération dure plus longtemps que prévu. Vous pouvez l'annuler ou attendre qu'elle prenne fin.</translation> @@ -7608,7 +7606,6 @@ <translation id="8941173171815156065">Révoquer l'autorisation "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Fonction d'optimisation internationale Netscape </translation> <translation id="8944099748578356325">Sollicitera davantage la batterie (<ph name="BATTERY_PERCENTAGE" /> % actuellement)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> partage une fenêtre avec <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Taille des icônes</translation> <translation id="8946359700442089734">Les fonctionnalités de débogage n'ont pas été complètement activées sur cet appareil <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Bonne</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 7370d58..3a4f042 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -530,6 +530,7 @@ <translation id="1549275686094429035">Compatible con ARC</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> quere acceder a <ph name="VOLUME_NAME" />. É posible que modifique ou elimine os teus ficheiros.</translation> <translation id="1552301827267621511">A extensión <ph name="EXTENSION_NAME" /> cambiou o provedor de busca para que se utilice <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Xestionar extensión</translation> <translation id="1553538517812678578">ilimitado</translation> <translation id="1555130319947370107">Azul</translation> <translation id="1556537182262721003">Non se puido mover o directorio de extensións ao perfil.</translation> @@ -2777,7 +2778,6 @@ <translation id="3842552989725514455">Tipo de letra Serif</translation> <translation id="3843464315703645664">Lista de entidades permitidas internamente</translation> <translation id="3844888638014364087">Púxose o emoji</translation> -<translation id="384513009320852920">Asegúrate de que o dispositivo Bluetooth estea teña activado o modo de vinculación e estea preto. <ph name="BEGIN_LINK_LEARN_MORE" />Máis información<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Consigue ferramentas para programar sitios web, aplicacións Android etc. A instalación de Linux provocará a descarga de <ph name="DOWNLOAD_SIZE" /> de datos.</translation> <translation id="3847319713229060696">Axudar a mellorar a seguranza na Web para todos</translation> <translation id="3848547754896969219">Abrir nunha ventá do modo de &incógnito</translation> @@ -4285,7 +4285,6 @@ <translation id="5485102783864353244">Engadir aplicación</translation> <translation id="5485754497697573575">Restaurar todas as pestanas</translation> <translation id="5486261815000869482">Confirmar contrasinal</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> está compartindo a túa pantalla con <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simular o reinicio do navegador</translation> <translation id="5487460042548760727">Cambiar nome do perfil por <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Borrar datos</translation> @@ -4347,6 +4346,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> quere:</translation> <translation id="5534304873398226603">Descartar foto ou vídeo</translation> <translation id="5535941515421698170">Eliminar tamén os datos existentes deste dispositivo</translation> +<translation id="5537725057119320332">Emitir</translation> <translation id="5539221284352502426">O servidor rexeitou o contrasinal que introduciches. Pode deberse a algunha destas causas: o contrasinal é demasiado curto, debe incluír números ou símbolos, ou non é diferente dos contrasinais anteriores.</translation> <translation id="5541694225089836610">O teu administrador desactivou esta acción</translation> <translation id="5542132724887566711">Perfil</translation> @@ -4577,6 +4577,7 @@ <translation id="5787146423283493983">Acordo de claves</translation> <translation id="5787420647064736989">Nome do dispositivo</translation> <translation id="5788367137662787332">É posible que polo menos unha partición do dispositivo <ph name="DEVICE_LABEL" /> non estea instalada.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Correcto</translation> <translation id="5790651917470750848">O encamiñamento de porto xa existe</translation> <translation id="5792728279623964091">Toca o botón de acendido.</translation> @@ -4808,10 +4809,8 @@ <ph name="BEGIN_PARAGRAPH2" />Para desactivar a localización, desactiva a opción principal de localización do teu dispositivo. Tamén podes desactivar o uso de sensores e redes wifi ou de telefonía móbil para calcular a localización na configuración da localización.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Saír da pantalla completa</translation> <translation id="6042308850641462728">Máis</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> está compartindo unha pestana de Chrome con <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Produciuse un erro ao analizar a configuración</translation> <translation id="6043994281159824495">Pechar sesión agora</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> está compartindo audio e unha pestana de Chrome con <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Botón principal de TrackPoint</translation> <translation id="6047632800149092791">A sincronización non funciona. Tenta pechar sesión e iniciala de novo.</translation> <translation id="6049797270917061226">Con este ficheiro, os atacantes poderían roubarche información persoal.</translation> @@ -7306,7 +7305,6 @@ <translation id="8655295600908251630">Canle</translation> <translation id="8655972064210167941">Produciuse un erro no inicio de sesión porque o teu contrasinal non se puido verificar. Contacta co administrador ou téntao de novo.</translation> <translation id="8657393004602556571">Queres descartar o comentario?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> está compartindo a túa pantalla e o teu audio con <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Abrir ligazón na ventá de incó&gnito</translation> <translation id="8662671328352114214">Unirse á rede <ph name="TYPE" /></translation> <translation id="8662733268723715832">Este proceso está demorándose máis do previsto. Podes omitilo ou agardar a que remate.</translation> @@ -7601,7 +7599,6 @@ <translation id="8941173171815156065">Revogar o permiso "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Certificado Step-Up de Netscape International</translation> <translation id="8944099748578356325">Consome a batería de forma máis rápida (actualmente <ph name="BATTERY_PERCENTAGE" /> %)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> está compartindo unha ventá con <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Tamaño das iconas</translation> <translation id="8946359700442089734">As funcións de depuración non se activaron completamente neste dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Boa</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index c68f258..8fee662 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -531,6 +531,7 @@ <translation id="1549275686094429035">ARC ચાલુ છે</translation> <translation id="1549788673239553762"><ph name="APP_NAME" />, <ph name="VOLUME_NAME" />ને ઍક્સેસ કરવા માંગે છે. તે તમારી ફાઇલોમાં ફેરફાર કરી અથવા ડિલીટ કરી શકે છે.</translation> <translation id="1552301827267621511">"<ph name="EXTENSION_NAME" />" એક્સ્ટેન્શન દ્વારા શોધને <ph name="SEARCH_PROVIDER_DOMAIN" />નો ઉપયોગ કરવા પર બદલવામાં આવ્યું</translation> +<translation id="1552752544932680961">એક્સ્ટેન્શનનું સંચાલન કરો</translation> <translation id="1553538517812678578">અસીમિત</translation> <translation id="1555130319947370107">વાદળી</translation> <translation id="1556537182262721003">એક્સટેંશન ડિરેક્ટરીને પ્રોફાઇલમાં ખસેડી શકાઈ નથી.</translation> @@ -2786,7 +2787,6 @@ <translation id="3842552989725514455">Serif ફૉન્ટ</translation> <translation id="3843464315703645664">આંતરિક રીતે વ્હાઇટલિસ્ટેડ</translation> <translation id="3844888638014364087">ઇમોજી ઉમેર્યું</translation> -<translation id="384513009320852920">ખાતરી કરો કે તમારું બ્લૂટૂથ ડિવાઇસ જોડાણ બનાવવાના મોડમાં અને નજીકમાં છે. <ph name="BEGIN_LINK_LEARN_MORE" />વધુ જાણો<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">વેબસાઇટ, Android ઍપ અને બીજા ઘણા માટે વિકાસના સાધનો મેળવો. Linux ઇન્સ્ટૉલ કરવાથી <ph name="DOWNLOAD_SIZE" /> ડેટા ડાઉનલોડ થશે.</translation> <translation id="3847319713229060696">વેબ પરની દરેક વ્યક્તિ માટે સુરક્ષાને બહેતર બનાવવા સહાય કરો</translation> <translation id="3848547754896969219">&છૂપી વિન્ડોમાં ખોલો</translation> @@ -4297,7 +4297,6 @@ <translation id="5485102783864353244">ઍપ્લિકેશન ઉમેરો</translation> <translation id="5485754497697573575">તમામ ટૅબ્સ પુનર્સ્થાપિત કરો</translation> <translation id="5486261815000869482">પાસવર્ડની પુષ્ટિ કરો</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> તમારી સ્ક્રીનને <ph name="TAB_NAME" /> સાથે શેર કરી રહ્યું છે.</translation> <translation id="5486561344817861625">બ્રાઉઝર પુનઃપ્રારંભનું અનુકરણ કરો</translation> <translation id="5487460042548760727">પ્રોફાઇલનું નામ બદલીને <ph name="PROFILE_NAME" /> કરો</translation> <translation id="5487521232677179737">ડેટા સાફ કરો</translation> @@ -4359,6 +4358,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" />ને આ પરવાનગીની જરૂર છે</translation> <translation id="5534304873398226603">ફોટો અથવા વીડિયો કાઢી નાખો</translation> <translation id="5535941515421698170">આ ઉપકરણ પરથી તમારો અસ્તિત્વમાંનો ડેટા પણ દૂર કરો</translation> +<translation id="5537725057119320332">કાસ્ટ કરો</translation> <translation id="5539221284352502426">તમે દાખલ કરેલો પાસવર્ડ સર્વર દ્વારા નકારવામાં આવ્યો હતો. આ શક્ય કારણો હોઈ શકે છે: પાસવર્ડ ખૂબ ટૂંકો છે. પાસવર્ડમાં સંખ્યાઓ અથવા પ્રતીકોનો સમાવેશ થવો જ જોઈએ. પાસવર્ડ પહેલાંના પાસવર્ડ કરતાં જુદો હોવો જોઈએ.</translation> <translation id="5541694225089836610">તમારા વ્યવસ્થાપકે ક્રિયા બંધ કરી છે</translation> <translation id="5542132724887566711">પ્રોફાઇલ</translation> @@ -4590,6 +4590,7 @@ <translation id="5787146423283493983">કી એગ્રીમેન્ટ</translation> <translation id="5787420647064736989">ડિવાઇસનું નામ</translation> <translation id="5788367137662787332">માફ કરશો, ઉપકરણ <ph name="DEVICE_LABEL" /> પર ઓછામાં ઓછું એક પાર્ટિશન માઉન્ટ કરી શકાયું નથી.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">સફળતા</translation> <translation id="5790651917470750848">પોર્ટ ફૉરવર્ડ પહેલેથી જ અસ્તિત્વમાં છે</translation> <translation id="5792728279623964091">કૃપા કરીને તમારા પાવર બટન પર ટૅપ કરો</translation> @@ -4823,10 +4824,8 @@ <ph name="BEGIN_PARAGRAPH2" />તમે તમારા ડિવાઇસ પરની મુખ્ય સ્થાન સેટિંગને બંધ કરીને સ્થાન સેવાને બંધ કરી શકો છો. તમે સ્થાન સેટિંગમાં સ્થાન સેવા માટે વાઇ-ફાઇ, મોબાઇલ નેટવર્ક અને સેન્સરનો ઉપયોગ પણ બંધ કરી શકો છો.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">પૂર્ણસ્ક્રીનમાંથી બહાર નીકળો</translation> <translation id="6042308850641462728">વધુ</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> સાથે Chrome ટૅબ શેર કરી રહી છે.</translation> <translation id="604388835206766544">ગોઠવણીનું વિશ્લેષણ કરવામાં નિષ્ફળ થયાં</translation> <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="6049797270917061226">હુમલાખોરો આ ફાઇલમાંથી તમારી વ્યક્તિગત માહિતી ચોરી શક્યા.</translation> @@ -7324,7 +7323,6 @@ <translation id="8655295600908251630">ચેનલ</translation> <translation id="8655972064210167941">સાઇન-ઇન નિષ્ફળ થયું કારણ કે તમારો પાસવર્ડ ચકાસી શકાયો નથી. કૃપા કરીને તમારા વ્યવસ્થાપકનો સંપર્ક કરો અથવા ફરી પ્રયાસ કરો.</translation> <translation id="8657393004602556571">શું તમે પ્રતિસાદ કાઢી નાખવા માંગો છો?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> સાથે તમારી સ્ક્રીન અને ઑડિઓને શેર કરી રહી છે.</translation> <translation id="8661290697478713397">છુ&પી વિંડોમાં લિંક ખોલો</translation> <translation id="8662671328352114214"><ph name="TYPE" /> નેટવર્કમાં જોડાઓ</translation> <translation id="8662733268723715832">આમાં અપેક્ષા કરતાં વધારે સમય લાગી રહ્યો છે, તમે છોડી શકો અથવા પૂરું ન થાય ત્યાં સુધી રાહ જોઈ શકો છો.</translation> @@ -7620,7 +7618,6 @@ <translation id="8941173171815156065">પરવાનગી પાછી ખેંચો '<ph name="PERMISSION" />'</translation> <translation id="894360074127026135">નેટસ્કેપ ઇન્ટરનેશનલ સ્ટેપ-અપ</translation> <translation id="8944099748578356325">વધુ ઝડપથી બૅટરીનો ઉપયોગ કરો (હાલમાં <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> સાથે એક વિંડો શેર કરી રહી છે.</translation> <translation id="8945274638472141382">આઇકનનું કદ</translation> <translation id="8946359700442089734">આ <ph name="IDS_SHORT_PRODUCT_NAME" /> ઉપકરણ પર ડિબગિંગ સુવિધાઓ સંપૂર્ણપણે સક્ષમ ન હતી.</translation> <translation id="894763922177556086">સારી</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 5ed22a2..8e3dacfb 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -535,6 +535,7 @@ <translation id="1549275686094429035">एआरसी चालू है</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> ऐक्सेस करना चाहता है <ph name="VOLUME_NAME" />. वह आपकी फ़ाइलों में बदलाव कर सकता है या उन्हें मिटा सकता है.</translation> <translation id="1552301827267621511">"<ph name="EXTENSION_NAME" />" एक्सटेंशन ने <ph name="SEARCH_PROVIDER_DOMAIN" /> का इस्तेमाल करने के लिए सर्च इंजन बदला है</translation> +<translation id="1552752544932680961">एक्सटेंशन प्रबंधित करें</translation> <translation id="1553538517812678578">असीमित</translation> <translation id="1555130319947370107">नीला</translation> <translation id="1556537182262721003">एक्सटेंशन निर्देशिका को प्रोफ़ाइल में नहीं ले जा सका.</translation> @@ -2794,7 +2795,6 @@ <translation id="3842552989725514455">Serif फ़ॉन्ट</translation> <translation id="3843464315703645664">डिफ़ॉल्ट के तौर पर चालू है</translation> <translation id="3844888638014364087">इमोजी डाला गया</translation> -<translation id="384513009320852920">पक्का करें कि आपका ब्लूटूथ डिवाइस, दूसरे डिवाइस से जोड़ने वाले मोड में और आस-पास है. <ph name="BEGIN_LINK_LEARN_MORE" />ज़्यादा जानें<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">वेबसाइटें, Android ऐप्लिकेशन वगैरह बनाने के टूल पाएं. Linux इंस्टॉल करने पर <ph name="DOWNLOAD_SIZE" /> डेटा डाउनलोड होगा.</translation> <translation id="3847319713229060696">वेब को सभी के लिए ज़्यादा सुरक्षित बनाने में मदद करें</translation> <translation id="3848547754896969219">यूआरएल को &गुप्त विंडो में खोलें</translation> @@ -4302,7 +4302,6 @@ <translation id="5485102783864353244">ऐप्लिकेशन जोड़ें</translation> <translation id="5485754497697573575">सभी टैब पुनर्स्थापित करें</translation> <translation id="5486261815000869482">पासवर्ड की पुष्टि करें</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> आपकी स्क्रीन <ph name="TAB_NAME" /> के साथ शेयर कर रहा है.</translation> <translation id="5486561344817861625">ब्राउज़र पुनर्प्रारंभ को सिम्युलेट करें</translation> <translation id="5487460042548760727">प्रोफ़ाइल नाम को <ph name="PROFILE_NAME" /> से बदलें</translation> <translation id="5487521232677179737">डेटा साफ़ करें</translation> @@ -4364,6 +4363,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> को अनुमति चाहिए</translation> <translation id="5534304873398226603">फ़ोटो या वीडियो खारिज करें</translation> <translation id="5535941515421698170">इस डिवाइस से अपना मौजूदा डेटा भी निकालें</translation> +<translation id="5537725057119320332">कास्ट करें</translation> <translation id="5539221284352502426">आपने जो पासवर्ड डाला है, उसे सर्वर ने अस्वीकार कर दिया है. संभावित कारण ये हो सकते हैं: पासवर्ड बहुत छोटा है. पासवर्ड में संख्याएं या चिह्न होने चाहिए. पासवर्ड, पिछले पासवर्ड से अलग होना चाहिए.</translation> <translation id="5541694225089836610">आपके एडमिन ने कार्रवाई बंद कर दी है</translation> <translation id="5542132724887566711">प्रोफ़ाइल</translation> @@ -4594,6 +4594,7 @@ <translation id="5787146423283493983">मुख्य अनुबंध</translation> <translation id="5787420647064736989">डिवाइस का नाम</translation> <translation id="5788367137662787332">क्षमा करें, डिवाइस <ph name="DEVICE_LABEL" /> पर कम-से-कम एक विभाजन माउंट नहीं हो सका.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">सफलता</translation> <translation id="5790651917470750848">पोर्ट फ़ॉरवर्ड की सुविधा पहले से मौजूद है</translation> <translation id="5792728279623964091">'पावर बटन' पर टैप करें</translation> @@ -4825,10 +4826,8 @@ <ph name="BEGIN_PARAGRAPH2" />आप अपने डिवाइस पर जगह की मुख्य सेटिंग बंद करके जगह की जानकारी वाली सेवा को बंद कर सकते हैं. आप जगह की सेटिंग में जाकर वाई-फ़ाई, मोबाइल नेटवर्क और जगह की जानकारी का पता लगाने वाले सेंसर का इस्तेमाल करना बंद भी कर सकते हैं.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">पूर्णस्क्रीन से बाहर निकलें</translation> <translation id="6042308850641462728">और ज़्यादा</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> के साथ Chrome टैब को शेयर कर रहा है.</translation> <translation id="604388835206766544">कॉन्फ़िगरेशन को पार्स नहीं किया जा सका</translation> <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="6049797270917061226">इस फ़ाइल से हमलावर आपकी निजी जानकारी चुरा सकते हैं.</translation> @@ -7324,7 +7323,6 @@ <translation id="8655295600908251630">चैनल</translation> <translation id="8655972064210167941">साइन इन नहीं हो पाया क्योंकि आपके पासवर्ड की पुष्टि नहीं की जा सकी. कृपया अपने एडमिन से संपर्क करें या फिर से कोशिश करें.</translation> <translation id="8657393004602556571">क्या आप फ़ीडबैक (सुझाव, शिकायत या राय) को खारिज करना चाहते हैं?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> के साथ आपकी स्क्रीन और ऑडियो को शेयर कर रहा है.</translation> <translation id="8661290697478713397">लिंक को गुप्त& विंडो में खोलें</translation> <translation id="8662671328352114214"><ph name="TYPE" /> नेटवर्क में शामिल हों</translation> <translation id="8662733268723715832">इसमें उम्मीद से ज़्यादा समय लग रहा है. आप चाहें, तो इसे स्किप कर दें या फिर इसके पूरा होने का इंतज़ार करें.</translation> @@ -7620,7 +7618,6 @@ <translation id="8941173171815156065">अनुमति '<ph name="PERMISSION" />' को निरस्त करें</translation> <translation id="894360074127026135">Netscape अंतर्राष्ट्रीय स्टेप-अप</translation> <translation id="8944099748578356325">बैटरी का उपयोग ज़्यादा तेज़ी से करेंं (इस समय <ph name="BATTERY_PERCENTAGE" />% है)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> के साथ कोई विंडो शेयर कर रहा है.</translation> <translation id="8945274638472141382">आइकॉन का साइज़</translation> <translation id="8946359700442089734">डीबग करने वाली सुविधाएं इस <ph name="IDS_SHORT_PRODUCT_NAME" /> डिवाइस पर पूरी तरह सक्षम नहीं की गई थीं.</translation> <translation id="894763922177556086">अच्छा</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index a80b4a7..4044f40 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -533,6 +533,7 @@ <translation id="1549275686094429035">ARC je omogućen</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> želi pristupiti jedinici <ph name="VOLUME_NAME" />. Ta aplikacija može izmijeniti ili izbrisati vaše datoteke.</translation> <translation id="1552301827267621511">Proširenje "<ph name="EXTENSION_NAME" />" prebacilo je pretraživanje na domenu <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Upravljanje proširenjem</translation> <translation id="1553538517812678578">neograničeno</translation> <translation id="1555130319947370107">Plava</translation> <translation id="1556537182262721003">Nije uspjelo premještanje direktorija proširenja na profil.</translation> @@ -2782,7 +2783,6 @@ <translation id="3842552989725514455">Font Serif</translation> <translation id="3843464315703645664">Na popisu interno dopuštenih</translation> <translation id="3844888638014364087">Emoji je umetnut</translation> -<translation id="384513009320852920">Provjerite je li vaš Bluetooth uređaj u načinu uparivanja i u blizini. <ph name="BEGIN_LINK_LEARN_MORE" />Saznajte više<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Preuzmite alate za razvoj web-lokacija, Android aplikacija itd. Instaliranjem Linuxa preuzet će se <ph name="DOWNLOAD_SIZE" /> podataka.</translation> <translation id="3847319713229060696">Pomozite poboljšati sigurnost na webu za sve korisnike</translation> <translation id="3848547754896969219">Otvori u &anonimnom prozoru</translation> @@ -4290,7 +4290,6 @@ <translation id="5485102783864353244">Dodaj aplikaciju</translation> <translation id="5485754497697573575">Vrati sve kartice</translation> <translation id="5486261815000869482">Potvrdite zaporku</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> dijeli vaš zaslon s karticom <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simulacija ponovnog pokretanja preglednika</translation> <translation id="5487460042548760727">Promjena naziva profila u <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Izbriši podatke</translation> @@ -4352,6 +4351,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> traži</translation> <translation id="5534304873398226603">Odbaci fotografiju ili videozapis</translation> <translation id="5535941515421698170">Također uklonite postojeće podatke s uređaja</translation> +<translation id="5537725057119320332">Emitiraj</translation> <translation id="5539221284352502426">Poslužitelj je odbio zaporku koju ste unijeli. Mogući su razlozi sljedeći: zaporka je prekratka. Zaporka mora sadržavati brojeve ili simbole. Zaporka mora biti različita od prethodnih zaporki.</translation> <translation id="5541694225089836610">Radnju je onemogućio administrator</translation> <translation id="5542132724887566711">Profil</translation> @@ -4582,6 +4582,7 @@ <translation id="5787146423283493983">Sporazum ključa</translation> <translation id="5787420647064736989">Naziv uređaja</translation> <translation id="5788367137662787332">Žao nam je, nije bilo moguće postaviti najmanje jednu particiju na uređaju <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Uspjeh</translation> <translation id="5790651917470750848">Prosljeđivanje priključka već postoji</translation> <translation id="5792728279623964091">Dodirnite tipku za uključivanje/isključivanje</translation> @@ -4813,10 +4814,8 @@ <ph name="BEGIN_PARAGRAPH2" />Lokaciju možete isključiti tako što ćete isključiti glavnu postavku lokacije na ovom uređaju. U postavkama lokacije također možete isključiti upotrebu Wi‑Fija, mobilnih mreža i senzora za lokaciju.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Izađi iz punog zaslona</translation> <translation id="6042308850641462728">Više</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> dijeli Chromeovu karticu s karticom <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Analiza konfiguracije nije uspjela</translation> <translation id="6043994281159824495">Odjavi se odmah</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> dijeli Chromeovu karticu i zvuk s karticom <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Primarni gumb za TrackPoint</translation> <translation id="6047632800149092791">Sinkronizacija ne funkcionira. Odjavite se pa se ponovo prijavite.</translation> <translation id="6049797270917061226">Datoteka bi mogla omogućiti napadačima da ukradu vaše osobne podatke.</translation> @@ -7312,7 +7311,6 @@ <translation id="8655295600908251630">Kanal</translation> <translation id="8655972064210167941">Prijava nije uspjela jer zaporka nije potvrđena. Obratite se administratoru ili pokušajte ponovo.</translation> <translation id="8657393004602556571">Želite li odbaciti povratne informacije?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> dijeli zaslon i zvuk s karticom <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Otvori vezu u anoni&mnom prozoru</translation> <translation id="8662671328352114214">Pridruži se mreži <ph name="TYPE" /></translation> <translation id="8662733268723715832">Ovo traje neuobičajeno dugo, možete preskočiti ili pričekati da završi.</translation> @@ -7609,7 +7607,6 @@ <translation id="8941173171815156065">Opoziv dopuštenja "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Netscape međunarodni iskorak</translation> <translation id="8944099748578356325">brže trošiti bateriju (trenutačno <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> dijeli prozor s karticom <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Veličina ikona</translation> <translation id="8946359700442089734">Značajke uklanjanja pogrešaka nisu posve omogućene na ovom uređaju <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Dobra</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 065400e..4133849e 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -164,6 +164,7 @@ <translation id="1153636665119721804">A Google Speciális védelem programja</translation> <translation id="1155545602507378023">Nem, csak ez az eszköz</translation> <translation id="1155816283571436363">Kapcsolódás a telefonhoz…</translation> +<translation id="1158080958325422608">Átalakítás nagybetűssé</translation> <translation id="1158238185437008462">Emlékek megtekintése</translation> <translation id="1161575384898972166">Kérjük, jelentkezzen be a(z) <ph name="TOKEN_NAME" /> szolgáltatásba az ügyféltanúsítvány exportálásához.</translation> <translation id="116173250649946226">A rendszergazda alapértelmezett témát állított be, amely nem módosítható.</translation> @@ -535,6 +536,7 @@ <translation id="1549275686094429035">ARC engedélyezve</translation> <translation id="1549788673239553762">A(z) <ph name="APP_NAME" /> meg akarja nyitni a következőt: <ph name="VOLUME_NAME" />. A művelet módosíthatja vagy törölheti a fájljait.</translation> <translation id="1552301827267621511">A(z) „<ph name="EXTENSION_NAME" />” bővítmény a következőre módosította a keresési szolgáltatót: <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Bővítmény kezelése</translation> <translation id="1553538517812678578">korlátlan</translation> <translation id="1555130319947370107">Kék</translation> <translation id="1556537182262721003">Nem sikerült áthelyezni a bővítménykönyvtárat a profilba.</translation> @@ -697,6 +699,7 @@ <translation id="1700079447639026019">Webhelyek, amelyek sosem használhatnak cookie-kat</translation> <translation id="1703331064825191675">Sosem kell aggódnia jelszavai miatt</translation> <translation id="1703666494654169921">A webhelyek nem használhatnak virtuálisvalóság-eszközöket és -adatokat</translation> +<translation id="1704097193565924901">Átalakítás nagy kezdőbetűssé</translation> <translation id="1704230497453185209">A webhelyek nem játszhatnak le hangokat</translation> <translation id="1704970325597567340">A biztonsági ellenőrzés utolsó lefutásának dátuma: <ph name="DATE" /></translation> <translation id="1706586824377653884">A rendszergazda által hozzáadva</translation> @@ -2799,7 +2802,6 @@ <translation id="3842552989725514455">Talpas betűtípus</translation> <translation id="3843464315703645664">Belső engedélyezőlistán</translation> <translation id="3844888638014364087">Emoji beillesztve</translation> -<translation id="384513009320852920">Győződjön meg róla, hogy a Bluetooth-eszköz párosítási módban és a közelben van. <ph name="BEGIN_LINK_LEARN_MORE" />További információ<ph name="END_LINK_LEARN_MORE" />.</translation> <translation id="3846116211488856547">Eszközök webhelyek és Android-alkalmazások fejlesztéséhez és egyebekhez. A Linux telepítése <ph name="DOWNLOAD_SIZE" /> adat letöltésével jár.</translation> <translation id="3847319713229060696">Segítsen nekünk abban, hogy mindenkinek biztonságosabbá tegyük az internetezést</translation> <translation id="3848547754896969219">Megnyitás &inkognitó ablakban</translation> @@ -3586,6 +3588,7 @@ <translation id="4681453295291708042">Közeli megosztás kikapcsolása</translation> <translation id="4681930562518940301">Az eredeti &kép megnyitása új lapon</translation> <translation id="4682551433947286597">A háttérképek a bejelentkezési képernyőn jelennek meg.</translation> +<translation id="4683629100208651599">Átalakítás kisbetűssé</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />% (alapértelmezett)</translation> <translation id="4684427112815847243">Az összes szinkronizálása</translation> <translation id="4684471265911890182">A(z) <ph name="APP_NAME" /> hozzá szeretne férni a kamerához. A hozzáférés engedélyezéséhez kapcsolja ki a kamera adatvédelmi kapcsolóját.</translation> @@ -4310,7 +4313,6 @@ <translation id="5485102783864353244">Alkalmazás hozzáadása</translation> <translation id="5485754497697573575">Minden lap visszaállítása</translation> <translation id="5486261815000869482">Jelszó megerősítése</translation> -<translation id="5486275809415469523">A(z) <ph name="APP_NAME" /> megosztja a képernyőt a következővel: <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Böngésző újraindításának szimulálása</translation> <translation id="5487460042548760727">Profil átnevezése a következőre: <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Adatok törlése</translation> @@ -4372,6 +4374,7 @@ <translation id="5533001281916885985">A(z) <ph name="SITE_NAME" /> a következőket szeretné tenni:</translation> <translation id="5534304873398226603">Kép vagy videó elvetése</translation> <translation id="5535941515421698170">Továbbá a meglévő adatok eltávolítása az eszközről</translation> +<translation id="5537725057119320332">Küldés</translation> <translation id="5539221284352502426">A szerver elutasította a megadott jelszót. Lehetséges okok: Túl rövid a jelszó. A jelszónak tartalmaznia kell számokat és szimbólumokat. A jelszó nem egyezhet meg korábbi jelszavakkal.</translation> <translation id="5541694225089836610">A rendszergazda letiltotta a műveletet.</translation> <translation id="5542132724887566711">Profil</translation> @@ -4603,6 +4606,7 @@ <translation id="5787146423283493983">Kulcsmegegyezés</translation> <translation id="5787420647064736989">Eszköznév</translation> <translation id="5788367137662787332">Elnézést kérünk, de a(z) <ph name="DEVICE_LABEL" /> eszköz legalább egy partíciója nem csatolható.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Siker</translation> <translation id="5790651917470750848">Már van ilyen portátirányítás</translation> <translation id="5792728279623964091">Koppintson a bekapcsológombra</translation> @@ -4835,10 +4839,8 @@ <ph name="BEGIN_PARAGRAPH2" />A helyszolgáltatás kikapcsolásához kapcsolja ki eszköze fő „Hely” beállítását. Emellett a helybeállításoknál kikapcsolhatja a Wi-Fi- és a mobilhálózatok, illetve az érzékelők használatát a tartózkodási hely meghatározásához.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Kilépés a teljes képernyős módból</translation> <translation id="6042308850641462728">Továbbiak</translation> -<translation id="6043317578411397101">A(z) <ph name="APP_NAME" /> megosztja a Chrome egy lapját a következővel: <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Nem sikerült a konfiguráció elemzése</translation> <translation id="6043994281159824495">Kijelentkezés most</translation> -<translation id="6044805581023976844">A(z) <ph name="APP_NAME" /> megosztja a Chrome egy lapját és a hangot a következővel: <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Elsődleges TrackPoint-gomb</translation> <translation id="6047632800149092791">A szinkronizálás nem működik. Próbáljon meg kijelentkezni, majd újra bejelentkezni.</translation> <translation id="6049797270917061226">A fájl segítségével a támadók ellophatják az Ön személyes adatait.</translation> @@ -5985,6 +5987,7 @@ <translation id="7257173066616499747">Wi-Fi-hálózatok</translation> <translation id="725758059478686223">Nyomtatási szolgáltatás</translation> <translation id="7257666756905341374">Az Ön által másolt és beillesztett adatok olvasása</translation> +<translation id="7258192266780953209">Transzformációk</translation> <translation id="7258225044283673131">Az alkalmazás nem válaszol. A bezárásához válassza a „Bezárás most” gombot.</translation> <translation id="7262004276116528033">Ezt a bejelentkezési szolgáltatást a(z) <ph name="SAML_DOMAIN" /> biztosítja</translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />A problémamegoldáshoz próbálkozzon a következő lépésekkel: @@ -7340,7 +7343,6 @@ <translation id="8655295600908251630">Csatorna</translation> <translation id="8655972064210167941">A bejelentkezés nem sikerült, mert a jelszót nem sikerült ellenőrizni. Kérjük, forduljon rendszergazdájához vagy próbálja újra.</translation> <translation id="8657393004602556571">Elveti a visszajelzést?</translation> -<translation id="8658645149275195032">A(z) <ph name="APP_NAME" /> megosztja a képernyőt és a hangot a következővel: <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Link megnyitása inko&gnitóablakban</translation> <translation id="8662671328352114214">Csatlakozás <ph name="TYPE" />-hálózatra</translation> <translation id="8662733268723715832">Ez a vártnál hosszabb ideig tart; átugorhatja, vagy megvárhatja, míg befejeződik.</translation> @@ -7635,7 +7637,6 @@ <translation id="8941173171815156065">A(z) „<ph name="PERMISSION" />” engedély visszavonása</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Megnövekedett akkumulátorhasználat (jelenleg <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280">A(z) <ph name="APP_NAME" /> megoszt egy ablakot a következővel: <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Ikon mérete</translation> <translation id="8946359700442089734">A hibakereső szolgáltatásokat nem kapcsolták be teljes körűen ezen a(z) <ph name="IDS_SHORT_PRODUCT_NAME" /> eszközön.</translation> <translation id="894763922177556086">Jó</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 5009109..d58f4ea 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -535,6 +535,7 @@ <translation id="1549275686094429035">ARC-ն միացված է</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> հավելվածը ցանկանում է օգտվել <ph name="VOLUME_NAME" />-ից: Այն կարող է փոփոխել կամ ջնջել ձեր ֆայլերը:</translation> <translation id="1552301827267621511">«<ph name="EXTENSION_NAME" />» ընդլայնումը փոխել է օգտագործվող որոնիչը։ Այժմ օգտագործվում է <ph name="SEARCH_PROVIDER_DOMAIN" />-ը։</translation> +<translation id="1552752544932680961">Կառավարել ընդլայնումը</translation> <translation id="1553538517812678578">անսահմանափակ</translation> <translation id="1555130319947370107">Կապույտ</translation> <translation id="1556537182262721003">Չհաջողվեց պրոֆիլ տեղափոխել ընդլայնման գրացուցակը:</translation> @@ -2789,7 +2790,6 @@ <translation id="3842552989725514455">Serif տառատեսակ</translation> <translation id="3843464315703645664">Թույլատրված է ներքին օգտագործման համար</translation> <translation id="3844888638014364087">Զմայլիկը զետեղվեց</translation> -<translation id="384513009320852920">Համոզվեք, որ ձեր Bluetooth սարքը մոտակայքում է և զուգակցման ռեժիմում։ <ph name="BEGIN_LINK_LEARN_MORE" />Իմանալ ավելին<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Ստացեք գործիքներ, որոնցով կարող եք մշակել կայքեր, Android հավելվածներ և այլն: Linux-ի տեղադրման դեպքում կներբեռնվեն <ph name="DOWNLOAD_SIZE" /> ծավալով տվյալներ:</translation> <translation id="3847319713229060696">Օգնեք բարելավել համացանցից օգտվողների անվտանգությունը</translation> <translation id="3848547754896969219">Բացել &ինկոգնիտո պատուհանում</translation> @@ -4303,7 +4303,6 @@ <translation id="5485102783864353244">Ավելացնել հավելված</translation> <translation id="5485754497697573575">Վերականգնել բոլոր ներդիրները</translation> <translation id="5486261815000869482">Հաստատեք գաղտնաբառը</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> հավելվածը համօգտագործում է ձեր էկրանը <ph name="TAB_NAME" />-ի հետ:</translation> <translation id="5486561344817861625">Նմանակել դիտարկիչի վերագործարկումը</translation> <translation id="5487460042548760727">Վերանվանել պրոֆիլը <ph name="PROFILE_NAME" />-ի</translation> <translation id="5487521232677179737">Ջնջել տվյալները</translation> @@ -4365,6 +4364,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" />․ անհրաժեշտ է հետևյալ թույլտվությունը՝</translation> <translation id="5534304873398226603">Հեռացնել լուսանկարը կամ տեսանյութը</translation> <translation id="5535941515421698170">Սարքից հեռացնել ընթացիկ տվյալները</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">Ձեր մուտքագրած գաղտնաբառը չի ընդունվում սերվերի կողմից: Հնարավոր պատճառներն են՝ գաղտնաբառը չափազանց կարճ է, գաղտնաբառը պետք է պարունակի թվեր կամ նշաններ, գաղտնաբառը պետք է տարբեր լինի նախորդ գաղտնաբառերից:</translation> <translation id="5541694225089836610">Ձեր ադմինիստրատորն անջատել է այս գործողությունը</translation> <translation id="5542132724887566711">Պրոֆիլ</translation> @@ -4595,6 +4595,7 @@ <translation id="5787146423283493983">Բանալիների համաձայնեցում</translation> <translation id="5787420647064736989">Սարքի անվանումը</translation> <translation id="5788367137662787332"><ph name="DEVICE_LABEL" /> սարքի առնվազն մեկ մասնաբաժին հնարավոր չէ միացնել:</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Հաջողվեց</translation> <translation id="5790651917470750848">Միացքի վերահասցեավորում արդեն գոյություն ունի</translation> <translation id="5792728279623964091">Հպեք միացնելու/անջատելու կոճակին</translation> @@ -4827,10 +4828,8 @@ <ph name="BEGIN_PARAGRAPH2" />Դուք կարող եք անջատել տեղորոշումը՝ սարքում անջատելով տեղորոշման հիմնական կարգավորումը: Ինչպես նաև տեղադրության կարգավորումներում կարող եք անջատել Wi-Fi-ի, բջջային ցանցերի ու տվիչների օգտագործումը տեղորոշման համար։<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Դուրս գալ լիաէկրան ռեժիմից</translation> <translation id="6042308850641462728">Ավելին</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> հավելվածը կիսվում է Chrome-ի ներդիրով <ph name="TAB_NAME" />-ի հետ:</translation> <translation id="604388835206766544">Չհաջողվեց վերլուծել կազմաձևը</translation> <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="6049797270917061226">Այս ֆայլի միջոցով հաքերները կարող են հափշտակել ձեր անձնական տեղեկությունները։</translation> @@ -7331,7 +7330,6 @@ <translation id="8655295600908251630">Վարկած</translation> <translation id="8655972064210167941">Մուտքը չհաջողվեց, քանի որ ձեր գաղտնաբառը չհաջողվեց հաստատել: Կապվեք ադմինիստրատորի հետ կամ նորից փորձեք:</translation> <translation id="8657393004602556571">Չուղարկե՞լ կարծիքը։</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> հավելվածը կիսվում է ձեր էկրանով և ձայնով <ph name="TAB_NAME" />-ի հետ:</translation> <translation id="8661290697478713397">Բացել հղումը ինկոգ&նիտո պատուհանով</translation> <translation id="8662671328352114214">Նոր <ph name="TYPE" /> ցանց</translation> <translation id="8662733268723715832">Գործողությունը սովորականից երկար է տևում։ Դուք կարող եք սպասել կամ բաց թողնել այս քայլը։</translation> @@ -7627,7 +7625,6 @@ <translation id="8941173171815156065">Հետ կանչել «<ph name="PERMISSION" />» թույլտվությունը</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Մարտկոցի լիցքավորումն ավելի արագ կսպառվի (այժմ լիցքավորված է <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> հավելվածը կիսվում է պատուհանով <ph name="TAB_NAME" />-ի հետ:</translation> <translation id="8945274638472141382">Պատկերակների չափը</translation> <translation id="8946359700442089734">Վրիպազերծման գործառույթները լրիվ միացված չեն այս <ph name="IDS_SHORT_PRODUCT_NAME" /> սարքի վրա:</translation> <translation id="894763922177556086">Լավ</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 6f94436..c51fd73 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -163,6 +163,7 @@ <translation id="1153356358378277386">Perangkat dihubungkan</translation> <translation id="1153636665119721804">Program Perlindungan Lanjutan Google</translation> <translation id="1155816283571436363">Menghubungkan ke ponsel Anda</translation> +<translation id="1158080958325422608">Jadikan Huruf Besar</translation> <translation id="1158238185437008462">Lihat kenangan</translation> <translation id="1161575384898972166">Masuklah ke <ph name="TOKEN_NAME" /> untuk mengeskpor sertifikat klien.</translation> <translation id="116173250649946226">Administrator telah menyetel tema default yang tidak dapat diubah.</translation> @@ -533,6 +534,7 @@ <translation id="1549275686094429035">ARC Aktif</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> ingin mengakses <ph name="VOLUME_NAME" />. Ini dapat mengubah atau menghapus file Anda.</translation> <translation id="1552301827267621511">Ekstensi "<ph name="EXTENSION_NAME" />" mengubah penyedia penelusuran menjadi <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Kelola ekstensi</translation> <translation id="1553538517812678578">tidak terbatas</translation> <translation id="1555130319947370107">Biru</translation> <translation id="1556537182262721003">Tidak dapat memindah direktori ekstensi ke dalam profil.</translation> @@ -695,6 +697,7 @@ <translation id="1700079447639026019">Situs yang tidak boleh menggunakan cookie</translation> <translation id="1703331064825191675">Tidak perlu mengkhawatirkan sandi Anda</translation> <translation id="1703666494654169921">Jangan izinkan situs menggunakan perangkat atau data virtual reality</translation> +<translation id="1704097193565924901">Huruf Besar di Awal Kata</translation> <translation id="1704230497453185209">Jangan izinkan situs memutar suara</translation> <translation id="1704970325597567340">Pemeriksaan keamanan berjalan tanggal <ph name="DATE" /></translation> <translation id="1706586824377653884">Ditambahkan oleh administrator Anda</translation> @@ -2792,7 +2795,6 @@ <translation id="3842552989725514455">Font Serif</translation> <translation id="3843464315703645664">Diizinkan secara internal</translation> <translation id="3844888638014364087">Emoji disisipkan</translation> -<translation id="384513009320852920">Pastikan perangkat Bluetooth Anda dalam mode penyambungan dan berada di sekitar. <ph name="BEGIN_LINK_LEARN_MORE" />Pelajari lebih lanjut<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Dapatkan fitur untuk mengembangkan situs, aplikasi Android, dan lainnya. Menginstal Linux akan mendownload <ph name="DOWNLOAD_SIZE" /> data.</translation> <translation id="3847319713229060696">Bantu sempurnakan keamanan di web untuk semuanya</translation> <translation id="3848547754896969219">Buka di &jendela Samaran</translation> @@ -3578,6 +3580,7 @@ <translation id="4681453295291708042">Nonaktifkan Berbagi Langsung</translation> <translation id="4681930562518940301">Buka &gambar asli di tab baru</translation> <translation id="4682551433947286597">Wallpaper muncul di Layar Login.</translation> +<translation id="4683629100208651599">Jadikan Huruf Kecil</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />% (default)</translation> <translation id="4684427112815847243">Sinkronkan semua</translation> <translation id="4684471265911890182"><ph name="APP_NAME" /> sedang mencoba mengakses kamera. Nonaktifkan tombol mode privasi kamera untuk mengizinkan akses.</translation> @@ -4300,7 +4303,6 @@ <translation id="5485102783864353244">Tambahkan aplikasi</translation> <translation id="5485754497697573575">Pulihkan Semua Tab</translation> <translation id="5486261815000869482">Konfirmasi sandi</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> membagikan layar Anda dengan <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simulasikan Mulai Ulang Browser</translation> <translation id="5487460042548760727">Ganti nama profil menjadi <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Hapus data</translation> @@ -4362,6 +4364,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ingin</translation> <translation id="5534304873398226603">Hapus foto atau video</translation> <translation id="5535941515421698170">Tindakan ini juga menghapus data yang sudah ada dari perangkat ini</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">Sandi yang Anda masukkan ditolak oleh server. Kemungkinan alasannya adalah: Sandi terlalu pendek. Sandi harus menyertakan angka atau simbol. Sandi harus berbeda dari sandi sebelumnya.</translation> <translation id="5541694225089836610">Tindakan dinonaktifkan oleh administrator Anda</translation> <translation id="5542132724887566711">Profil</translation> @@ -4592,6 +4595,7 @@ <translation id="5787146423283493983">Perjanjian Kunci</translation> <translation id="5787420647064736989">Nama perangkat</translation> <translation id="5788367137662787332">Maaf, setidaknya satu partisi pada perangkat <ph name="DEVICE_LABEL" /> tidak dapat dipasang.</translation> +<translation id="5789643057113097023">:</translation> <translation id="5790085346892983794">Berhasil</translation> <translation id="5790651917470750848">Port penerusan sudah ada</translation> <translation id="5792728279623964091">Harap ketuk power Anda</translation> @@ -4823,10 +4827,8 @@ <ph name="BEGIN_PARAGRAPH2" />Anda dapat menonaktifkan Lokasi dengan menonaktifkan setelan Lokasi utama di perangkat. Anda juga dapat menonaktifkan penggunaan Wi-Fi, jaringan seluler, dan sensor untuk lokasi di setelan lokasi.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Keluar dari Layar Penuh</translation> <translation id="6042308850641462728">Lainnya</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> membagikan tab Chrome dengan <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Gagal mengurai konfigurasi</translation> <translation id="6043994281159824495">Keluar sekarang</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> membagikan tab Chrome dan audio dengan <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Tombol TrackPoint utama</translation> <translation id="6047632800149092791">Sinkronisasi tidak berfungsi. Coba logout lalu login lagi.</translation> <translation id="6049797270917061226">File ini dapat memungkinkan penyerang mencuri informasi pribadi Anda.</translation> @@ -5970,6 +5972,7 @@ <translation id="7257173066616499747">Jaringan Wi-Fi</translation> <translation id="725758059478686223">Layanan Pencetakan</translation> <translation id="7257666756905341374">Mengakses data yang Anda salin dan tempel</translation> +<translation id="7258192266780953209">Transformasi</translation> <translation id="7258225044283673131">Aplikasi tidak merespons. Pilih "Tutup paksa" untuk menutup aplikasi.</translation> <translation id="7262004276116528033">Layanan masuk ini dihosting oleh <ph name="SAML_DOMAIN" /></translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Coba langkah pemecahan masalah berikut: @@ -7322,7 +7325,6 @@ <translation id="8655295600908251630">Saluran</translation> <translation id="8655972064210167941">Proses masuk gagal karena sandi Anda tidak dapat diverifikasi. Hubungi administrator atau coba lagi.</translation> <translation id="8657393004602556571">Ingin menghapus masukan?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> membagikan layar dan audio Anda dengan <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Buka Tautan di Jendela Penya&maran</translation> <translation id="8662671328352114214">Bergabung dengan jaringan <ph name="TYPE" /></translation> <translation id="8662733268723715832">Proses ini lebih lama dari perkiraan. Anda dapat melewati atau menunggu hingga proses selesai.</translation> @@ -7617,7 +7619,6 @@ <translation id="8941173171815156065">Cabut izin '<ph name="PERMISSION" />'</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Menghabiskan baterai lebih cepat (saat ini <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> membagikan jendela dengan <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Ukuran ikon</translation> <translation id="8946359700442089734">Fitur debug belum diaktifkan sepenuhnya di perangkat <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Baik</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 17593bb9..157fb15 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -163,6 +163,7 @@ <translation id="1153356358378277386">Pöruð tæki</translation> <translation id="1153636665119721804">Áætlun Google um ítarlega vernd</translation> <translation id="1155816283571436363">Tengist símanum þínum</translation> +<translation id="1158080958325422608">Breyta í hástafi</translation> <translation id="1158238185437008462">Skoða minningar</translation> <translation id="1161575384898972166">Skráðu þig inn á <ph name="TOKEN_NAME" /> til að flytja biðlaravottorðið út.</translation> <translation id="116173250649946226">Stjórnandinn hefur stillt sjálfgefið þema sem ekki er hægt að breyta.</translation> @@ -534,6 +535,7 @@ <translation id="1549275686094429035">ARC er virkt</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> vill fá aðgang að <ph name="VOLUME_NAME" />. Það gæti breytt eða eytt skránum þínum.</translation> <translation id="1552301827267621511">Viðbótin „<ph name="EXTENSION_NAME" />“ breytti leit í að nota <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Stjórna viðbót</translation> <translation id="1553538517812678578">ótakmarkað</translation> <translation id="1555130319947370107">Blár</translation> <translation id="1556537182262721003">Ekki var hægt að færa viðbótamöppuna inn í prófílinn.</translation> @@ -696,6 +698,7 @@ <translation id="1700079447639026019">Vefsvæði sem geta aldrei notað fótspor</translation> <translation id="1703331064825191675">Losnaðu undan áhyggjum af aðgangsorðum</translation> <translation id="1703666494654169921">Ekki leyfa vefsvæðum að nota sýndarveruleikatæki eða -gögn</translation> +<translation id="1704097193565924901">Nota upphafsstafi</translation> <translation id="1704230497453185209">Ekki leyfa vefsvæðum að spila hljóð</translation> <translation id="1704970325597567340">Öryggisathugun var keyrð <ph name="DATE" /></translation> <translation id="1706586824377653884">Kerfisstjórinn bætti þessu við</translation> @@ -2792,7 +2795,6 @@ <translation id="3842552989725514455">Serif-letur</translation> <translation id="3843464315703645664">Innri hvítur listi</translation> <translation id="3844888638014364087">Emoji sett inn</translation> -<translation id="384513009320852920">Gakktu úr skugga um að Bluetooth-tækið þitt sé nálægt og í pörunarstillingu. <ph name="BEGIN_LINK_LEARN_MORE" />Nánar<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Fáðu verkfæri til að þróa vefsíður, Android forrit og fleira. Uppsetning Linux mun hlaða niður <ph name="DOWNLOAD_SIZE" /> af gögnum.</translation> <translation id="3847319713229060696">Hjálpaðu til við að auka öryggi allra á vefnum</translation> <translation id="3848547754896969219">Opna í &huliðsglugga</translation> @@ -3578,6 +3580,7 @@ <translation id="4681453295291708042">Slökkva á Nærdeilingu</translation> <translation id="4681930562518940301">Opna upprunalega &mynd á nýjum flipa</translation> <translation id="4682551433947286597">Veggfóður birtast á innskráningarskjánum.</translation> +<translation id="4683629100208651599">Breyta í lágstafi</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />% (sjálfgefið)</translation> <translation id="4684427112815847243">Samstilla allt</translation> <translation id="4684471265911890182"><ph name="APP_NAME" /> er að reyna að opna myndavélina. Slökktu á persónuverndarrofa myndavélarinnar til að heimila aðgang.</translation> @@ -4300,7 +4303,6 @@ <translation id="5485102783864353244">Bæta forriti við</translation> <translation id="5485754497697573575">Endurheimta alla flipa</translation> <translation id="5486261815000869482">Staðfestu aðgangsorð</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> deilir skjánum þínum með <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Líkja eftir endurræsingu vafra</translation> <translation id="5487460042548760727">Breyta heiti prófíls í <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Hreinsa gögn</translation> @@ -4362,6 +4364,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> vill</translation> <translation id="5534304873398226603">Fleygja mynd eða myndskeiði</translation> <translation id="5535941515421698170">Fjarlægja einnig fyrirliggjandi gögn af tækinu</translation> +<translation id="5537725057119320332">Senda út</translation> <translation id="5539221284352502426">Vefþjónninn hafnaði aðgangsorðinu sem þú færðir inn. Mögulegar ástæður geta verið: Aðgangsorðið er of stutt. Aðgangsorðið verður að innihalda tölustafi eða tákn. Aðgangsorðið þarf að vera frábrugðið fyrri aðgangsorðum.</translation> <translation id="5541694225089836610">Kerfisstjóri hefur gert aðgerðina óvirka</translation> <translation id="5542132724887566711">Prófíll</translation> @@ -4592,6 +4595,7 @@ <translation id="5787146423283493983">Lykilsamningur</translation> <translation id="5787420647064736989">Heiti tækis</translation> <translation id="5788367137662787332">Því miður tókst ekki að tengja að minnsta kosti eina sneið tækisins <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Tókst</translation> <translation id="5790651917470750848">Framsend gátt er þegar til</translation> <translation id="5792728279623964091">Ýttu á aflrofann</translation> @@ -4823,10 +4827,8 @@ <ph name="BEGIN_PARAGRAPH2" />Hægt er að slökkva á staðsetningu með því að slökkva á aðalstaðsetningarstillingu tækisins. Einnig er hægt að slökkva á notkun Wi-Fi, farsímakerfa og skynjara við ákvörðun staðsetningar í staðsetningarstillingunum.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Hætta að skoða á öllum skjánum</translation> <translation id="6042308850641462728">Meira</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> deilir flipa í Chrome með <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Ekki tókst að þátta stillingu</translation> <translation id="6043994281159824495">Skrá út núna</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> deilir flipa og hljóði í Chrome með <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Aðal TrackPoint-hnappur</translation> <translation id="6047632800149092791">Samstilling virkar ekki. Prófaðu að skrá þig út og inn aftur.</translation> <translation id="6049797270917061226">Þessi skrá gæti gert tölvuþrjótum kleift að stela persónuupplýsingunum þínum.</translation> @@ -5970,6 +5972,7 @@ <translation id="7257173066616499747">Wi-Fi net</translation> <translation id="725758059478686223">Prentþjónusta</translation> <translation id="7257666756905341374">Lesa gögn sem þú afritar og límir</translation> +<translation id="7258192266780953209">Umbreytingar</translation> <translation id="7258225044283673131">Forritið svarar ekki. Veldu „Þvinga fram lokun“ til að loka forritinu.</translation> <translation id="7262004276116528033">Þessi innskráningarþjónusta er hýst af <ph name="SAML_DOMAIN" /></translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Reyndu að leysa vandann á eftirfarandi máta: @@ -7321,7 +7324,6 @@ <translation id="8655295600908251630">Rás</translation> <translation id="8655972064210167941">Innskráning mistókst vegna þess að ekki tókst að staðfesta aðgangsorðið. Hafðu samband við kerfisstjóra eða reyndu aftur.</translation> <translation id="8657393004602556571">Viltu hætta við ábendingarnar?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> deilir skjá og hljóði með <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Opna ten&gil í huliðsglugga</translation> <translation id="8662671328352114214">Tengjast <ph name="TYPE" /> neti</translation> <translation id="8662733268723715832">Þetta tekur lengri tíma en venjulega. Þú getur sleppt þessu eða beðið þar til þessu lýkur.</translation> @@ -7617,7 +7619,6 @@ <translation id="8941173171815156065">Afturkalla heimildina „<ph name="PERMISSION" />“'</translation> <translation id="894360074127026135">Alþjóðleg uppreiknun Netscape</translation> <translation id="8944099748578356325">Nota rafhlöðu hraðar (<ph name="BATTERY_PERCENTAGE" />% að svo stöddu)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> deilir glugga með <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Stærð tákns</translation> <translation id="8946359700442089734">Eiginleikar villuleitar eru ekki að fullu virkir í þessu <ph name="IDS_SHORT_PRODUCT_NAME" /> tæki.</translation> <translation id="894763922177556086">Góð</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 060e97db..f41c3d8 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -532,6 +532,7 @@ <translation id="1549275686094429035">ARC attivato</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> vorrebbe accedere a <ph name="VOLUME_NAME" />. Potrebbe modificare o eliminare i tuoi file.</translation> <translation id="1552301827267621511">L'estensione "<ph name="EXTENSION_NAME" />" ha modificato la ricerca per utilizzare <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Gestisci estensione</translation> <translation id="1553538517812678578">illimitato</translation> <translation id="1555130319947370107">Blu</translation> <translation id="1556537182262721003">Impossibile spostare la directory dell'estensione nel profilo.</translation> @@ -2780,7 +2781,6 @@ <translation id="3842552989725514455">Carattere serif</translation> <translation id="3843464315703645664">Consentita internamente</translation> <translation id="3844888638014364087">Emoji inserita</translation> -<translation id="384513009320852920">Assicurati che il dispositivo Bluetooth sia in modalità di accoppiamento e nelle vicinanze. <ph name="BEGIN_LINK_LEARN_MORE" />Scopri di più<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Scarica strumenti per sviluppare siti web, app Android e non solo. Se installi Linux verranno scaricati <ph name="DOWNLOAD_SIZE" /> di dati.</translation> <translation id="3847319713229060696">Contribuisci ad aumentare la sicurezza sul Web per tutti gli utenti</translation> <translation id="3848547754896969219">Apri l'URL nella finestra di navigazione in &incognito</translation> @@ -4288,7 +4288,6 @@ <translation id="5485102783864353244">Aggiungi app</translation> <translation id="5485754497697573575">Ripristina tutte le schede</translation> <translation id="5486261815000869482">Conferma password</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> condivide il tuo schermo con <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simula riavvio browser</translation> <translation id="5487460042548760727">Rinomina il profilo in <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Cancella dati</translation> @@ -4350,6 +4349,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> vorrebbe</translation> <translation id="5534304873398226603">Elimina foto o video</translation> <translation id="5535941515421698170">Rimuovi anche i dati esistenti da questo dispositivo</translation> +<translation id="5537725057119320332">Trasmetti</translation> <translation id="5539221284352502426">La password inserita è stata rifiutata dal server. Alcune possibili cause sono: la password è troppo breve; la password deve includere numeri o simboli; la password deve essere diversa dalle password precedenti.</translation> <translation id="5541694225089836610">Azione disattivata dall'amministratore</translation> <translation id="5542132724887566711">Profilo</translation> @@ -4580,6 +4580,7 @@ <translation id="5787146423283493983">Chiave concordata</translation> <translation id="5787420647064736989">Nome dispositivo</translation> <translation id="5788367137662787332">Spiacenti, impossibile montare almeno una partizione del dispositivo <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Completato</translation> <translation id="5790651917470750848">Il port forwarding esiste già</translation> <translation id="5792728279623964091">Tocca il tasto di accensione</translation> @@ -4811,10 +4812,8 @@ <ph name="BEGIN_PARAGRAPH2" />Puoi disattivare la geolocalizzazione tramite la disattivazione dell'impostazione Posizione principale del tuo dispositivo. Puoi anche disattivare l'uso di reti Wi-Fi e mobili e di sensori per la geolocalizzazione nelle impostazioni di geolocalizzazione.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Chiudi schermo intero</translation> <translation id="6042308850641462728">Altro</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> condivide una scheda Chrome con <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Impossibile analizzare la configurazione</translation> <translation id="6043994281159824495">Esci ora</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> condivide l'audio e una scheda Chrome con <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Pulsante principale TrackPoint</translation> <translation id="6047632800149092791">La sincronizzazione non funziona. Prova a uscire e ripetere l'accesso.</translation> <translation id="6049797270917061226">Questo file potrebbe consentire agli utenti malintenzionati di rubare le tue informazioni personali.</translation> @@ -7311,7 +7310,6 @@ <translation id="8655295600908251630">Canale</translation> <translation id="8655972064210167941">Accesso non riuscito perché non è stato possibile verificare la password. Contatta l'amministratore o riprova.</translation> <translation id="8657393004602556571">Vuoi ignorare il feedback?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> condivide l'audio e il tuo schermo con <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Apri link in finestra di navigazione in inco&gnito</translation> <translation id="8662671328352114214">Aggiungi la rete <ph name="TYPE" /></translation> <translation id="8662733268723715832">L'operazione sta richiedendo più tempo del previsto. Puoi saltarla o attendere fino al completamento.</translation> @@ -7607,7 +7605,6 @@ <translation id="8941173171815156065">Revoca l'autorizzazione "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Consumerà più velocemente la batteria (attualmente con <ph name="BATTERY_PERCENTAGE" />% di carica)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> condivide una finestra con <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Dimensioni delle icone</translation> <translation id="8946359700442089734">Le funzioni di debug non sono state attivate completamente su questo dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Buona</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 22eb2993..0d60285 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -163,6 +163,7 @@ <translation id="1153356358378277386">מכשירים מותאמים</translation> <translation id="1153636665119721804">תוכנית ההגנה המתקדמת של Google</translation> <translation id="1155816283571436363">מתבצע חיבור לטלפון שלך</translation> +<translation id="1158080958325422608">שינוי לאותיות גדולות</translation> <translation id="1158238185437008462">להצגת הזיכרונות</translation> <translation id="1161575384898972166">יש להיכנס אל <ph name="TOKEN_NAME" /> כדי לייצא את אישור הלקוח.</translation> <translation id="116173250649946226">מנהל המערכת הגדיר עיצוב כברירת מחדל שלא ניתן לשנות.</translation> @@ -532,6 +533,7 @@ <translation id="1549275686094429035">ARC מופעל</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> רוצה לגשת אל <ph name="VOLUME_NAME" />. ייתכן שהוא יישנה או ימחק את הקבצים.</translation> <translation id="1552301827267621511">התוסף "<ph name="EXTENSION_NAME" />" שינה את הגדרות החיפוש לשימוש ב-<ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">נהל תוספים</translation> <translation id="1553538517812678578">לא מוגבל</translation> <translation id="1555130319947370107">כחול</translation> <translation id="1556537182262721003">לא היתה אפשרות להעביר ספריית תוספים לפרופיל.</translation> @@ -694,6 +696,7 @@ <translation id="1700079447639026019">אתרים שאף פעם לא יכולים להשתמש בקובצי cookie</translation> <translation id="1703331064825191675">אין יותר צורך לדאוג לגבי הסיסמאות שלך</translation> <translation id="1703666494654169921">לא לאפשר לאתרים להשתמש במכשירי מציאות מדומה או בנתונים כאלה</translation> +<translation id="1704097193565924901">אותיות רישיות</translation> <translation id="1704230497453185209">לא לאפשר לאתרים להפעיל צליל</translation> <translation id="1704970325597567340">בדיקת הבטיחות פעלה בתאריך <ph name="DATE" /></translation> <translation id="1706586824377653884">נוסף על ידי מנהל המערכת שלך</translation> @@ -2792,7 +2795,6 @@ <translation id="3842552989725514455">גופן Serif</translation> <translation id="3843464315703645664">ברשימת ההיתרים הפנימית</translation> <translation id="3844888638014364087">האמוג'י נוסף</translation> -<translation id="384513009320852920">צריך לוודא שמכשיר ה-Bluetooth נמצא במצב התאמה ובקרבת מקום. <ph name="BEGIN_LINK_LEARN_MORE" />מידע נוסף<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">אפשר להוריד כלים לפיתוח אתרים, אפליקציות Android ועוד. התקנת Linux תוריד נתונים בנפח של <ph name="DOWNLOAD_SIZE" />.</translation> <translation id="3847319713229060696">סיוע לשיפור האבטחה באינטרנט לטובת כולם</translation> <translation id="3848547754896969219">פתיחה בחלון &אנונימי</translation> @@ -3578,6 +3580,7 @@ <translation id="4681453295291708042">השבתה של 'שיתוף בקרבת מקום'</translation> <translation id="4681930562518940301">פתיחת ה&תמונה המקורית בכרטיסייה חדשה</translation> <translation id="4682551433947286597">טפטים מופיעים במסך הכניסה.</translation> +<translation id="4683629100208651599">שינוי לאותיות קטנות</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />% (ברירת מחדל)</translation> <translation id="4684427112815847243">סנכרון הכל</translation> <translation id="4684471265911890182"><ph name="APP_NAME" /> מנסה לגשת למצלמה. יש לכבות את מתג הפרטיות של המצלמה כדי להתיר גישה.</translation> @@ -4300,7 +4303,6 @@ <translation id="5485102783864353244">התקנת האפליקציה</translation> <translation id="5485754497697573575">שחזור כל הכרטיסיות</translation> <translation id="5486261815000869482">אישור סיסמה</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> משתף את המסך שלך עם <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">ביצוע הדמיה של הפעלת דפדפן מחדש</translation> <translation id="5487460042548760727">שינוי שם הפרופיל לשם <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">ניקוי נתונים</translation> @@ -4362,6 +4364,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> מבקש</translation> <translation id="5534304873398226603">מחיקת תמונה או סרטון</translation> <translation id="5535941515421698170">הסרה גם של הנתונים הקיימים שלך ממכשיר זה</translation> +<translation id="5537725057119320332">העברה</translation> <translation id="5539221284352502426">השרת דחה את הסיסמה שהזנת. סיבות אפשריות לכך: הסיסמה קצרה מדי; הסיסמה חייבת לכלול ספרות או סמלים; הסיסמה לא יכולה להיות זהה לסיסמה שכבר השתמשת בה בעבר.</translation> <translation id="5541694225089836610">האפשרות לבצע את הפעולה הזו הושבתה על-ידי מנהל המערכת</translation> <translation id="5542132724887566711">פרופיל</translation> @@ -4592,6 +4595,7 @@ <translation id="5787146423283493983">הסכם מפתח</translation> <translation id="5787420647064736989">שם המכשיר</translation> <translation id="5788367137662787332">מצטערים, לא ניתן להעלות לפחות מחיצה אחת במכשיר <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">הצלחה</translation> <translation id="5790651917470750848">היציאה המועברת כבר קיימת</translation> <translation id="5792728279623964091">יש להקיש על לחצן ההפעלה</translation> @@ -4823,10 +4827,8 @@ <ph name="BEGIN_PARAGRAPH2" />ניתן להשבית את ההעברה של נתוני מיקום על-ידי כיבוי של הגדרת המיקום הראשית במכשיר. אפשר גם להשבית את השימוש ב-Wi-Fi, ברשתות סלולריות ובחיישנים לאיתור המיקום בהגדרות המיקום.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">יציאה ממסך מלא</translation> <translation id="6042308850641462728">עוד</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> משתף כרטיסיית Chrome עם <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">ניתוח ההגדרה נכשל</translation> <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="6049797270917061226">הקובץ הזה עלול לאפשר לתוקפים לגנוב את המידע האישי שלך.</translation> @@ -5970,6 +5972,7 @@ <translation id="7257173066616499747">רשתות Wi-Fi</translation> <translation id="725758059478686223">שירות הדפסה</translation> <translation id="7257666756905341374">קריאת נתונים שהועתקו והודבקו</translation> +<translation id="7258192266780953209">טרנספורמציות</translation> <translation id="7258225044283673131">האפליקציה לא מגיבה. כדי לסגור את האפליקציה, יש לבחור באפשרות "אילוץ סגירה".</translation> <translation id="7262004276116528033">שירות הכניסה הזה מתארח ב-<ph name="SAML_DOMAIN" />.</translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />מומלץ לפעול לפי השלבים הבאים לפתרון הבעיה: @@ -7323,7 +7326,6 @@ <translation id="8655295600908251630">ערוץ</translation> <translation id="8655972064210167941">הכניסה נכשלה מפני שלא ניתן היה לאמת את הסיסמה. יש לפנות למנהל המערכת או לנסות שוב.</translation> <translation id="8657393004602556571">רוצה למחוק את המשוב?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> משתף את המסך והאודיו שלך עם <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">פתיחת הקישור בחלון &אנונימי</translation> <translation id="8662671328352114214">התחברות לרשת <ph name="TYPE" /></translation> <translation id="8662733268723715832">נראה שהפעולה נמשכת יותר זמן מהצפוי. יש לך אפשרות לדלג או להמתין עד סיום הפעולה.</translation> @@ -7620,7 +7622,6 @@ <translation id="8941173171815156065">ביטול ההרשאה '<ph name="PERMISSION" />'</translation> <translation id="894360074127026135">הגברה בינלאומית של Netscape</translation> <translation id="8944099748578356325">אפשרות זו גורמת לפריקה מהירה יותר של הסוללה (כרגע %<ph name="BATTERY_PERCENTAGE" />)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> משתף חלון עם <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">גודל סמלים</translation> <translation id="8946359700442089734">תכונות לניפוי באגים לא הופעלו באופן מלא במכשיר <ph name="IDS_SHORT_PRODUCT_NAME" /> זה.</translation> <translation id="894763922177556086">איכות טובה</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index cef84d99..24f419a 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -531,6 +531,7 @@ <translation id="1549275686094429035">ARC は有効になっています</translation> <translation id="1549788673239553762">「<ph name="APP_NAME" />」が <ph name="VOLUME_NAME" /> へのアクセスを求めています。ファイルが変更または削除される可能性があります。</translation> <translation id="1552301827267621511">「<ph name="EXTENSION_NAME" />」拡張機能により <ph name="SEARCH_PROVIDER_DOMAIN" /> を使用して検索するよう変更されました</translation> +<translation id="1552752544932680961">拡張機能を管理</translation> <translation id="1553538517812678578">無制限</translation> <translation id="1555130319947370107">青</translation> <translation id="1556537182262721003">拡張機能ディレクトリをプロフィールに移動できませんでした。</translation> @@ -2776,7 +2777,6 @@ <translation id="3842552989725514455">Serif フォント</translation> <translation id="3843464315703645664">内部で許可リストに登録済み</translation> <translation id="3844888638014364087">絵文字を挿入しました</translation> -<translation id="384513009320852920">Bluetooth デバイスがペア設定モードになっていて、近くにあることを確認してください。<ph name="BEGIN_LINK_LEARN_MORE" />詳細<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">ウェブサイト、Android アプリなどの開発に役立つツールをご利用ください。Linux をインストールする際には <ph name="DOWNLOAD_SIZE" /> のデータがダウンロードされます。</translation> <translation id="3847319713229060696">すべてのユーザーのウェブ上のセキュリティ強化に協力する</translation> <translation id="3848547754896969219">シークレット ウィンドウで開く(&I)</translation> @@ -4275,7 +4275,6 @@ <translation id="5485102783864353244">アプリを追加</translation> <translation id="5485754497697573575">すべてのタブを復元</translation> <translation id="5486261815000869482">パスワードの確認入力</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> が <ph name="TAB_NAME" /> の画面を共有しています。</translation> <translation id="5486561344817861625">ブラウザ再起動のシミュレート</translation> <translation id="5487460042548760727">プロファイル名を <ph name="PROFILE_NAME" /> に変更します</translation> <translation id="5487521232677179737">データを削除</translation> @@ -4337,6 +4336,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> が次の許可を求めています</translation> <translation id="5534304873398226603">写真または動画を破棄</translation> <translation id="5535941515421698170">このデバイスから既存のデータも削除する</translation> +<translation id="5537725057119320332">キャスト</translation> <translation id="5539221284352502426">入力したパスワードはサーバーによって拒否されました。考えられる原因は次のとおりです。パスワードが短すぎる。パスワードに数字または記号が含まれていない。以前と同じパスワードを指定した。</translation> <translation id="5541694225089836610">操作が管理者によって無効にされています</translation> <translation id="5542132724887566711">プロフィール</translation> @@ -4564,6 +4564,7 @@ <translation id="5787146423283493983">キー合意</translation> <translation id="5787420647064736989">デバイス名</translation> <translation id="5788367137662787332">デバイス <ph name="DEVICE_LABEL" /> の少なくとも 1 つのパーティションがマウントできませんでした。</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">完了</translation> <translation id="5790651917470750848">ポート転送はすでに設定されています</translation> <translation id="5792728279623964091">電源ボタンをタップしてください</translation> @@ -4795,10 +4796,8 @@ <ph name="BEGIN_PARAGRAPH2" />位置情報の使用を無効にするには、お使いのデバイスでメインの位置情報の設定を無効にします。また、位置情報の設定で、Wi‑Fi、モバイル ネットワーク、センサーを現在地の特定に使用しないよう指定することもできます。<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">全画面表示を終了</translation> <translation id="6042308850641462728">もっと見る</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> が <ph name="TAB_NAME" /> の Chrome タブを共有しています。</translation> <translation id="604388835206766544">設定を解析処理できませんでした</translation> <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="6049797270917061226">このファイルを開くと攻撃者に個人情報を盗まれる可能性があります。</translation> @@ -7288,7 +7287,6 @@ <translation id="8655295600908251630">チャンネル</translation> <translation id="8655972064210167941">パスワードを確認できなかったためログインできませんでした。管理者に問い合わせるか、もう一度お試しください。</translation> <translation id="8657393004602556571">フィードバックを破棄してもよろしいですか?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> が <ph name="TAB_NAME" /> の画面と音声を共有しています。</translation> <translation id="8661290697478713397">シークレット ウインドウでリンクを開く(&G)</translation> <translation id="8662671328352114214"><ph name="TYPE" /> ネットワークへの接続</translation> <translation id="8662733268723715832">予想以上に時間がかかっています。スキップするか、終わるまでお待ちください。</translation> @@ -7583,7 +7581,6 @@ <translation id="8941173171815156065">権限「<ph name="PERMISSION" />」を取り消します</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">バッテリー消費が速くなります(現在 <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> が <ph name="TAB_NAME" /> のウィンドウを共有しています。</translation> <translation id="8945274638472141382">アイコンのサイズ</translation> <translation id="8946359700442089734">この <ph name="IDS_SHORT_PRODUCT_NAME" /> デバイスでデバッグ機能が完全に有効になっていませんでした。</translation> <translation id="894763922177556086">良い</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 8932b50a..1f0d818 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -531,6 +531,7 @@ <translation id="1549275686094429035">ARC ჩართულია</translation> <translation id="1549788673239553762"><ph name="APP_NAME" />-ს <ph name="VOLUME_NAME" />-ზე წვდომა სურს. მას თქვენი ფაილების შეცვლა ან წაშლა შეუძლია.</translation> <translation id="1552301827267621511">გაფართოებამ „<ph name="EXTENSION_NAME" />“ შეცვალა ძიების პროვაიდერი <ph name="SEARCH_PROVIDER_DOMAIN" />-ით</translation> +<translation id="1552752544932680961">გაფართოების მართვა</translation> <translation id="1553538517812678578">შეუზღუდავo</translation> <translation id="1555130319947370107">ლურჯი</translation> <translation id="1556537182262721003">გაფართოების დირექტორიის გადატანა პროფილში ვერ მოხერხდა.</translation> @@ -2779,7 +2780,6 @@ <translation id="3842552989725514455">Serif-შრიფტი</translation> <translation id="3843464315703645664">დაშვებულია შიდა გამოყენებისთვის</translation> <translation id="3844888638014364087">Emoji ჩასმულია</translation> -<translation id="384513009320852920">დარწმუნდით, რომ თქვენი Bluetooth-მოწყობილობა დაწყვილების რეჟიმია და ახლოს მდებარეობს. <ph name="BEGIN_LINK_LEARN_MORE" />შეიტყვეთ მეტი<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">ჩამოტვირთეთ ხელსაწყოები ვებსაიტების, Android-ის აპების და სხვა კონტენტის დეველოპერებისთვის. Linux-ის ინსტალაციისთვის ჩამოიტვირთება მონაცემთა <ph name="DOWNLOAD_SIZE" />.</translation> <translation id="3847319713229060696">ხელი შეუწყვეთ ვების უსაფრთხოების ყველასთვის გაუმჯობესებას</translation> <translation id="3848547754896969219">&ინკოგნიტო ფანჯარაში გახსნა</translation> @@ -4287,7 +4287,6 @@ <translation id="5485102783864353244">აპის დამატება</translation> <translation id="5485754497697573575">ყველა ჩანართის აღდგენა</translation> <translation id="5486261815000869482">დაადასტურეთ პაროლი</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> უზიარებს ეკრანს <ph name="TAB_NAME" />-ს.</translation> <translation id="5486561344817861625">ბრაუზერის გადატვირთვის სიმულაცია</translation> <translation id="5487460042548760727">პროფილის გადარქმევა „<ph name="PROFILE_NAME" />“-ზე</translation> <translation id="5487521232677179737">მონაცემების წაშლა</translation> @@ -4349,6 +4348,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" />-ს სურს:</translation> <translation id="5534304873398226603">ფოტოს ან ვიდეოს გაუქმება</translation> <translation id="5535941515421698170">ამ მოწყობილობიდან არსებული მონაცემების ამოშლაც</translation> +<translation id="5537725057119320332">მაუწყებლობა</translation> <translation id="5539221284352502426">თქვენ მიერ შეყვანილი პაროლი უარყოფილია სერვერის მიერ. შესაძლო მიზეზებია: პაროლი მეტისმეტად მოკლეა. პაროლი უნდა შეიცავდეს ციფრებს ან სიმბოლოებს. პაროლი უნდა განსხვავდებოდეს წინა პაროლებისგან.</translation> <translation id="5541694225089836610">ქმედება გათიშულია თქვენი ადმინისტრატორის მიერ</translation> <translation id="5542132724887566711">პროფილი</translation> @@ -4579,6 +4579,7 @@ <translation id="5787146423283493983">ძირითადი შეთანხმება</translation> <translation id="5787420647064736989">მოწყობილობის სახელი</translation> <translation id="5788367137662787332">სამწუხაროდ, სულ მცირე, ერთი დანაყოფის მიერთება ვერ მოხერხდა მოწყობილობაში <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">წარმატება</translation> <translation id="5790651917470750848">პორტის გადამისამართება უკვე არსებობს</translation> <translation id="5792728279623964091">შეეხეთ ელკვების ღილაკს</translation> @@ -4810,10 +4811,8 @@ <ph name="BEGIN_PARAGRAPH2" />მდებარეობის გამორთვა შესაძლებელია თქვენს მოწყობილობაზე მდებარეობის მთავარი პარამეტრის გამორთვით. ასევე შეგიძლიათ გამორთოთ Wi-Fi კავშირის, მობილური ქსელებისა და სენსორების გამოყენება მდებარეობის დასადგენად.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">სრულეკრანიანი რეჟიმიდან გამოსვლა</translation> <translation id="6042308850641462728">სხვა</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> Chrome-ის ჩანართს <ph name="TAB_NAME" />-ს უზიარებს.</translation> <translation id="604388835206766544">კონფიგურაციის გარჩევა ვერ მოხერხდა</translation> <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="6049797270917061226">ამ ფაილმა, შესაძლოა, საშუალება მისცეს თავდამსხმელებს, მოიპარონ თქვენი პერსონალური ინფორმაცია.</translation> @@ -7308,7 +7307,6 @@ <translation id="8655295600908251630">არხი</translation> <translation id="8655972064210167941">შესვლა ვერ მოხერხდა, რადგან თქვენი პაროლის დადასტურება შეუძლებელია. გთხოვთ, დაუკავშირდეთ ადმინისტრატორს ან სცადოთ ხელახლა.</translation> <translation id="8657393004602556571">გსურთ გამოხმაურების გაუქმება?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> თქვენს ეკრანსა და აუდიოს <ph name="TAB_NAME" />-ს უზიარებს.</translation> <translation id="8661290697478713397">ბმულის გახსნა ინკო&გნიტო ფანჯარაში</translation> <translation id="8662671328352114214">„<ph name="TYPE" />“ ქსელში გაწევრიანება</translation> <translation id="8662733268723715832">ამ პროცესს მოსალოდნელზე მეტი დრო სჭირდება. სურვილისამებრ, შეგიძლიათ გამოტოვოთ ან დაელოდოთ მის დასრულებას.</translation> @@ -7603,7 +7601,6 @@ <translation id="8941173171815156065">ნებართვის „<ph name="PERMISSION" />“ გაუქმება</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">ბატარეის უფრო სწრაფად მოხმარება (ამჟამინდელი დონე: <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> ფანჯარას <ph name="TAB_NAME" />-ს უზიარებს.</translation> <translation id="8945274638472141382">ხატულის ზომა</translation> <translation id="8946359700442089734">ხარვეზის აღმოფხვრის ფუნქციები არ იყო მთლიანად ჩართულია ამ <ph name="IDS_SHORT_PRODUCT_NAME" /> მოწყობილობისათვის.</translation> <translation id="894763922177556086">კარგი</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 88d8d963..8d749cb 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -528,6 +528,7 @@ <translation id="1549275686094429035">ARC қосылды</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> қолданбасы <ph name="VOLUME_NAME" /> құрылғысына кіруге рұқсат сұрауда. Ол файлдарыңызды өзгертуі немесе жоюы мүмкін.</translation> <translation id="1552301827267621511">"<ph name="EXTENSION_NAME" />" кеңейтімі іздеуді <ph name="SEARCH_PROVIDER_DOMAIN" /> пайдалануға ауыстырды.</translation> +<translation id="1552752544932680961">Кеңейтімді басқару</translation> <translation id="1553538517812678578">шектелмеген</translation> <translation id="1555130319947370107">Көк</translation> <translation id="1556537182262721003">Кеңейтім каталогін профиль ішіне жылжыту мүмкін емес.</translation> @@ -656,6 +657,7 @@ <translation id="16620462294541761">Кешіріңіз, құпия сөзіңізді растау мүмкін болмады. Әрекетті қайталап көріңіз.</translation> <translation id="1662777896967868795">Қосулы. Ол күн шыққанда автоматты түрде өшеді.</translation> <translation id="166278006618318542">Тақырыптың ортақ кілт алгоритмі</translation> +<translation id="1662801900924515589"><ph name="APP" /> орнатылды.</translation> <translation id="1666232093776384142">Перифериялық құрылғылар үшін деректердің пайдаланылуын қорғау параметрін өшіру</translation> <translation id="1668435968811469751">Қолмен тіркеу</translation> <translation id="1668979692599483141">Ұсыныстар туралы ақпарат</translation> @@ -2546,6 +2548,7 @@ <translation id="3616741288025931835">&Шолу деректерін жою…</translation> <translation id="3617891479562106823">Фондар жоқ. Кейінірек қайталап көріңіз.</translation> <translation id="3619115746895587757">Капучино</translation> +<translation id="3619962278978697442">Кірген сайын бір экран құлпын таңдаңыз.</translation> <translation id="362266093274784978">{COUNT,plural, =1{қолданба}other{# қолданба}}</translation> <translation id="362333465072914957">Сертификат шығуы үшін CA күтілуде</translation> <translation id="3624567683873126087">Құрылғының құлпын ашу және Google аккаунтына кіру</translation> @@ -2773,7 +2776,6 @@ <translation id="3842552989725514455">Serif қаріпі</translation> <translation id="3843464315703645664">Ішкі қолданысқа рұқсат етілген</translation> <translation id="3844888638014364087">Эмоджи қойылды.</translation> -<translation id="384513009320852920">Bluetooth құрылғыңыз жұптау режимінде және маңайда болсын. <ph name="BEGIN_LINK_LEARN_MORE" />Толығырақ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Веб-сайттарды, Android қолданбаларын, т.б. әзірлеуге арналған құралдарды алыңыз. Linux жүйесін орнату кезінде <ph name="DOWNLOAD_SIZE" /> дерек жүктеп алынады.</translation> <translation id="3847319713229060696">Интернеттің барлық пайдаланушылары үшін қауіпсіздікті жақсартуға көмектеседі.</translation> <translation id="3848547754896969219">Инкогнито терезесінде ашу</translation> @@ -3072,6 +3074,7 @@ <translation id="4138267921960073861">Кіру экранында пайдаланушы аттары мен фотосуреттерді көрсету</translation> <translation id="4138598238327913711">Әзірше тек ағылшын тілінің грамматикасын тексеруге болады.</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – HID құрылғысы қосылған</translation> +<translation id="4139326893730851150">Микробағдарлама жаңартулары</translation> <translation id="4142052906269098341">Телефон арқылы <ph name="DEVICE_TYPE" /> құрылғысының құлпын ашыңыз. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="4142518881503042940">Анықталған принтерлерді профиліңізге сақтаңыз немесе жаңа принтер енгізіңіз. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Жоғары сапалы бейнелерді көріп, батарея зарядын үнемдеңіз. Бейне Cast қосылған экранда ғана ойнайды.</translation> @@ -3563,6 +3566,7 @@ <translation id="4684471265911890182"><ph name="APP_NAME" /> камераны пайдаланғалы жатыр. Пайдалануға рұқсат беру үшін камераның құпиялылық функциясын өшіріңіз.</translation> <translation id="4687613760714619596">Белгісіз құрылғы (<ph name="DEVICE_ID" />)</translation> <translation id="4688036121858134881">Жергілікті журнал идентификаторы: <ph name="WEBRTC_EVENT_LOG_LOCAL_ID" />.</translation> +<translation id="4688176403504673761"><ph name="MANAGER" /> бұл құрылғыны алдыңғы нұсқаға қайтарды (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="4689235506267737042">Демо параметрлерін таңдаңыз</translation> <translation id="4689421377817139245">Осы бетбелгіні iPhone телефоныңызға синхрондаңыз</translation> <translation id="4690091457710545971"><Intel Wi-Fi микробағдарламасы жасаған төрт файл: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Алғашқы үшеуі тіркеу қателерінен тұратын бинарлы файлдар болып табылады және Intel-дің мәлімдеуі бойынша оларда жеке тұлғаны не құрылғыны айқындайтын ақпарат қамтылмайды. Соңғы файл – Intel микробағдарламасындағы бағдарламаның орындалу трассасы. Ондағы жеке тұлғаны не құрылғыны айқындайтын барлық ақпарат жойылған, бірақ ол үлкен болғандықтан, осы жерде көрсету мүмкін емес. Осы файлдар құрылғыңыздағы Wi-Fi желісіне қатысты соңғы мәселелерге сәйкес жасалды және олар Intel компаниясына жіберіліп, аталған мәселелерді шешуге көмектеседі.></translation> @@ -4279,7 +4283,6 @@ <translation id="5485102783864353244">Қолданба қосу</translation> <translation id="5485754497697573575">Барлық қойындыларды қалпына келтіру</translation> <translation id="5486261815000869482">Құпия сөзді растау</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> экраныңызды <ph name="TAB_NAME" /> қойындысы арқылы бөлісуде.</translation> <translation id="5486561344817861625">Браузердің қайта іске қосылуын үлгілеу</translation> <translation id="5487460042548760727">Профиль атауын "<ph name="PROFILE_NAME" />" деп өзгерту</translation> <translation id="5487521232677179737">Деректерді жою</translation> @@ -4341,6 +4344,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> үшін қажетті әрекеттер:</translation> <translation id="5534304873398226603">Фотосурет не бейне жойылсын ба?</translation> <translation id="5535941515421698170">Сондай-ақ бұл құрылғыдағы деректерді өшіріңіз</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">Енгізген құпия сөзіңізді сервер қабылдамады. Себептері: Құпия сөз тым қысқа. Құпия сөзде сандар немесе таңбалар болуы керек. Құпия сөз алдыңғы құпия сөздерден басқа болуы керек.</translation> <translation id="5541694225089836610">Әрекетті сіздің әкімшіңіз өшірді.</translation> <translation id="5542132724887566711">Профиль</translation> @@ -4571,6 +4575,7 @@ <translation id="5787146423283493983">Негізгі келісім</translation> <translation id="5787420647064736989">Құрылғы атауы</translation> <translation id="5788367137662787332">Кешіріңіз, <ph name="DEVICE_LABEL" /> құрылғыңыздағы кемінде бір бөлімді орнату мүмкін емес.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Орындалды</translation> <translation id="5790651917470750848">Ондай порт бұрыннан бар.</translation> <translation id="5792728279623964091">Қуат түймесін түртіңіз.</translation> @@ -4802,10 +4807,8 @@ <ph name="BEGIN_PARAGRAPH2" />Құрылғыңыздағы негізгі геодерек параметрін өшіру арқылы орналасқан жердің анықталуын өшіруге болады. Сонымен қатар Wi‑Fi мен мобильдік желілердің және сенсорлардың орынды анықтау үшін қолданылуын геодерек параметрлерінен өшіре аласыз.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Толық экран режимінен шығу</translation> <translation id="6042308850641462728">Жаю</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> қолданбасы <ph name="TAB_NAME" /> сайтымен Chrome қойындысын бөлісуде.</translation> <translation id="604388835206766544">Конфигурацияны талдау мүмкін болмады.</translation> <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="6049797270917061226">Бұл файл хакерлердің жеке ақпаратыңызды ұрлауына мүмкіндік беруі мүмкін.</translation> @@ -5299,6 +5302,7 @@ <translation id="655483977608336153">Қайталау</translation> <translation id="6555432686520421228">Барлық пайдаланушы аккаунттарын жойып, <ph name="IDS_SHORT_PRODUCT_NAME" /> құрылғыңызды жаңадай қылып бастапқы күйіне орнатады.</translation> <translation id="6555810572223193255">Әзірге өшіру мүмкін емес</translation> +<translation id="6556477848444788999">Бұл PIN коды немесе құпия сөз <ph name="DEVICE_TYPE" /> құрылғысындағы деректі, соның ішінде телефоннан трансляцияланатын барлық мазмұнды қорғайды.</translation> <translation id="6556866813142980365">Қайта орындау</translation> <translation id="6556903358015358733">Тақырып және тұсқағаз</translation> <translation id="6557290421156335491">Таңбашаларым</translation> @@ -6181,6 +6185,7 @@ <translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation> <translation id="7495778526395737099">Ескі құпия сөзді ұмытып қалдыңыз ба?</translation> <translation id="7497981768003291373">Жақында WebRTC мәтіндік журналдарын жазып алмадыңыз.</translation> +<translation id="7501957181231305652">немесе</translation> <translation id="7503191893372251637">Netscape сертификат түрі</translation> <translation id="7503985202154027481">Осы сайтқа кіргеніңіз туралы жазба қауіпсіздік кілтінде сақталады.</translation> <translation id="750509436279396091">Жүктеулер қалтасын ашу</translation> @@ -6219,6 +6224,7 @@ <translation id="7535791657097741517">Жарық тақырыпты қосу</translation> <translation id="7537451260744431038">Сайттар шолуды жақсарту (мысалы, аккаунттан шығармау не сатып алу себетіңіздегі нәрселерді есте сақтау) үшін cookie файлдарын пайдалана алмайды.</translation> <translation id="7540972813190816353">Жаңартуларды тексеру кезінде қате пайда болды: <ph name="ERROR" /></translation> +<translation id="7541076351905098232"><ph name="MANAGER" /> бұл құрылғыны алдыңғы нұсқаға қайтарды. Маңызды файлдарды сақтап, құрылғыны өшіріп қосыңыз. Құрылғыдағы барлық дерек жойылады.</translation> <translation id="7541773865713908457"><ph name="APP_NAME" /> қолданбасымен <ph name="ACTION_NAME" /></translation> <translation id="754207240458482646">Аккаунтыңыздағы басқа құрылғылармен синхрондалды. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="7543104066686362383">Осы <ph name="IDS_SHORT_PRODUCT_NAME" /> құрылғысындағы түзету мүмкіндіктерін қосу</translation> @@ -6691,6 +6697,7 @@ <translation id="7984068253310542383"><ph name="DISPLAY_NAME" /> дисплейінің көшірмесін көрсету</translation> <translation id="7986295104073916105">Сақталған құпия сөз параметрлерін оқып, өзгерту</translation> <translation id="7987814697832569482">Үнемі осы VPN арқылы қосылу</translation> +<translation id="7987932397583333141">PIN кодын немесе құпия сөз орнату</translation> <translation id="7988355189918024273">Арнайы мүмкіндіктерді қосу</translation> <translation id="7988805580376093356">Ағымдағы операциялық жүйені қалдырып, USB арқылы <ph name="DEVICE_OS" /> қосу.</translation> <translation id="7991296728590311172">Switch Access параметрлері</translation> @@ -7296,9 +7303,9 @@ <translation id="8655295600908251630">Арна</translation> <translation id="8655972064210167941">Кірілмеді, себебі құпия сөзіңіз расталмады. Әкімшіңізге хабарласыңыз немесе әрекетті қайталаңыз.</translation> <translation id="8657393004602556571">Пікірді жою керек пе?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> қолданбасы <ph name="TAB_NAME" /> сайтымен экранды және аудионы бөлісуде.</translation> <translation id="8661290697478713397">Сілтемені Инко&гнито терезесінде ашу</translation> <translation id="8662671328352114214"><ph name="TYPE" /> желісіне қосылу</translation> +<translation id="8662733268723715832">Бұл әдеттегіден ұзақ уақыт алады. Оны өткізіп жіберуге немесе соңына дейін күтуге болады.</translation> <translation id="8662795692588422978">Байланыстар</translation> <translation id="8662811608048051533">Көп сайттардан шығарады.</translation> <translation id="8662911384982557515">Негізгі бетті келесіге өзгерту: <ph name="HOME_PAGE" /></translation> @@ -7590,7 +7597,6 @@ <translation id="8941173171815156065">"<ph name="PERMISSION" />" рұқсатын қайтарып алу</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Батарея жылдамырақ пайдаланылады (қазір: <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> қолданбасы <ph name="TAB_NAME" /> сайтымен терезені бөлісуде.</translation> <translation id="8945274638472141382">Белгіше өлшемі</translation> <translation id="8946359700442089734">Бұл <ph name="IDS_SHORT_PRODUCT_NAME" /> құрылғысында түзету мүмкіндіктері толық қосылмады.</translation> <translation id="894763922177556086">Жақсы</translation> @@ -7836,6 +7842,7 @@ <translation id="9179524979050048593">Кіру экранындағы пайдаланушы аты</translation> <translation id="9180281769944411366">Бұл процесс бірнеше минутқа созылуы мүмкін. Linux контейнері іске қосылуда.</translation> <translation id="9180380851667544951">Сайт экраныңызды бөлісе алады</translation> +<translation id="918224512343736195">SSH арқылы қосылу</translation> <translation id="9182556968660520230">Сайттардың қорғалған мазмұнды ойнатуына рұқсат бермеу</translation> <translation id="918352324374649435">{COUNT,plural, =1{Қолданба}other{# қолданба}}</translation> <translation id="9186963452600581158">Баланың Google аккаунтымен кіру</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index a621c3c..94f27bb 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -536,6 +536,7 @@ <translation id="1549275686094429035">បានបើក ARC</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> ចង់ចូលប្រើ <ph name="VOLUME_NAME" />។ វាអាចនឹងកែសម្រួល ឬលុបឯកសាររបស់អ្នក។</translation> <translation id="1552301827267621511">កម្មវិធីបន្ថែម "<ph name="EXTENSION_NAME" />" បានប្ដូរការស្វែងរកទៅប្រើ <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">គ្រប់គ្រងកម្មវិធីបន្ថែម</translation> <translation id="1553538517812678578">គ្មានដែនកំណត់</translation> <translation id="1555130319947370107">ខៀវ</translation> <translation id="1556537182262721003">មិនអាចផ្លាស់ទីថតឯកសារកម្មវិធីបន្ថែមទៅក្នុងទម្រង់ទេ។</translation> @@ -2803,7 +2804,6 @@ <translation id="3842552989725514455">ពុម្ពអក្សរ Serif</translation> <translation id="3843464315703645664">ស្ថិតក្នុងបញ្ជីអនុញ្ញាតផ្ទៃក្នុង</translation> <translation id="3844888638014364087">បានបញ្ចូលរូបអារម្មណ៍</translation> -<translation id="384513009320852920">ត្រូវប្រាកដថា ឧបករណ៍ប៊្លូធូសរបស់អ្នកស្ថិតនៅក្នុងមុខងារផ្គូផ្គង និងនៅជិត។ <ph name="BEGIN_LINK_LEARN_MORE" />ស្វែងយល់បន្ថែម<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">ទាញយកឧបករណ៍សម្រាប់ការអភិវឌ្ឍគេហទំព័រ កម្មវិធី Android និងអ្វីៗជាច្រើនទៀត។ ការដំឡើង Linux នឹងទាញយកទិន្នន័យ <ph name="DOWNLOAD_SIZE" /> ។</translation> <translation id="3847319713229060696">ជួយពង្រឹងសុវត្ថិភាពនៅលើអ៊ីនធឺណិតសម្រាប់អ្នករាល់គ្នា</translation> <translation id="3848547754896969219">បើកនៅក្នុង&ផ្ទាំងឯកជន</translation> @@ -4315,7 +4315,6 @@ <translation id="5485102783864353244">បន្ថែមកម្មវិធី</translation> <translation id="5485754497697573575">ស្តារផ្ទាំងទាំងអស់</translation> <translation id="5486261815000869482">អះអាងពាក្យសម្ងាត់</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> កំពុងចែករំលែកអេក្រង់ជាមួយ <ph name="TAB_NAME" />។</translation> <translation id="5486561344817861625">កម្មវិធីរុករកសាកល្បងចាប់ផ្តើមឡើងវិញ</translation> <translation id="5487460042548760727">ប្ដូរឈ្មោះកម្រងព័ត៌មានទៅ <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">ជម្រះទិន្នន័យ</translation> @@ -4377,6 +4376,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ចង់</translation> <translation id="5534304873398226603">បោះបង់រូបថត ឬវីដេអូ</translation> <translation id="5535941515421698170">ក៏លុបទិន្នន័យដែលមានស្រាប់របស់អ្នកចេញពីឧបករណ៍នេះផងដែរ</translation> +<translation id="5537725057119320332">ខាស</translation> <translation id="5539221284352502426">ពាក្យសម្ងាត់ដែលអ្នកបានបញ្ចូលត្រូវបានបដិសេធដោយម៉ាស៊ីនមេ។ អាចបណ្តាលមកពីមូលហេតុដូចជា៖ ពាក្យសម្ងាត់ខ្លីពេក។ ពាក្យសម្ងាត់ត្រូវតែមានលេខ ឬនិមិត្តសញ្ញា។ ពាក្យសម្ងាត់ត្រូវតែខុសពីពាក្យសម្ងាត់ពីមុន។</translation> <translation id="5541694225089836610">សកម្មភាពត្រូវបានបិទដោយអ្នកគ្រប់គ្រងរបស់អ្នក</translation> <translation id="5542132724887566711">ទម្រង់</translation> @@ -4608,6 +4608,7 @@ <translation id="5787146423283493983">ការព្រមព្រៀងចំពោះសោ</translation> <translation id="5787420647064736989">ឈ្មោះឧបករណ៍</translation> <translation id="5788367137662787332">សូមទោស យ៉ាងហោចណាស់ផ្នែកមួយនៃឧបករណ៍នេះ <ph name="DEVICE_LABEL" /> មិនអាចម៉ោនបានទេ។</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">ជោគជ័យ</translation> <translation id="5790651917470750848">ការបញ្ជូនច្រកបន្តមានរួចហើយ</translation> <translation id="5792728279623964091">សូមចុចប៊ូតុងថាមពលរបស់អ្នក</translation> @@ -4840,10 +4841,8 @@ <ph name="BEGIN_PARAGRAPH2" />អ្នកអាចបិទទីតាំងដោយបិទការកំណត់ទីតាំងចម្បងនៅលើឧបករណ៍របស់អ្នក។ អ្នកក៏អាចបិទការប្រើប្រាស់ Wi-Fi, បណ្តាញទូរសព្ទចល័ត និងឧបករណ៍ចាប់សញ្ញាសម្រាប់ទីតាំងនៅក្នុងការកំណត់ទីតាំងបានផងដែរ។<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">ចាកចេញពីអេក្រង់ពេញ</translation> <translation id="6042308850641462728">ច្រើនទៀត</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> កំពុងចែករំលែកផ្ទាំង Chrome ជាមួយ <ph name="TAB_NAME" />។</translation> <translation id="604388835206766544">មិនអាចញែកការកំណត់រចនាសម្ព័ន្ធបានទេ</translation> <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="6049797270917061226">ឯកសារនេះអាចឱ្យអ្នកវាយប្រហារលួចព័ត៌មានផ្ទាល់ខ្លួនរបស់អ្នកបាន។</translation> @@ -7346,7 +7345,6 @@ <translation id="8655295600908251630">បណ្តាញ</translation> <translation id="8655972064210167941">បានបរាជ័យក្នុងការចូលពីព្រោះពាក្យសម្ងាត់របស់អ្នកមិនអាចផ្ទៀងផ្ទាត់បានទេ។ សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក ឬព្យាយាមម្តងទៀត។</translation> <translation id="8657393004602556571">តើអ្នកចង់លុបចោលមតិកែលម្អនេះដែរទេ?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> កំពុងចែករំលែកអេក្រង់ និងសម្លេងរបស់អ្នកជាមូួយ <ph name="TAB_NAME" />។</translation> <translation id="8661290697478713397">បើកតំណនៅក្នុងផ្ទាំងអនាមិក</translation> <translation id="8662671328352114214">ចូលរួមបណ្ដាញ <ph name="TYPE" /></translation> <translation id="8662733268723715832">សកម្មភាពនេះកំពុងចំណាយពេលយូរជាងការរំពឹងទុក។ អ្នកអាចរំលង ឬរង់ចាំរហូតដល់រួចរាល់បាន។</translation> @@ -7641,7 +7639,6 @@ <translation id="8941173171815156065">បញ្ឈប់សុពលភាពការអនុញ្ញាត '<ph name="PERMISSION" />'</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">ប្រើថ្មអស់លឿនជាងមុន (បច្ចុប្បន្ន <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> កំពុងចែករំលែកផ្ទាំងវិនដូជាមួយ <ph name="TAB_NAME" />។</translation> <translation id="8945274638472141382">ទំហំរូបតំណាង</translation> <translation id="8946359700442089734">លក្ខណៈពិសេសកម្ចាត់កំហុសមិនត្រូវបានបើកដំណើរការទាំងស្រុងនៅលើឧបករណ៍ <ph name="IDS_SHORT_PRODUCT_NAME" /> នេះទេ។</translation> <translation id="894763922177556086">ខ្លាំង</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 4354af6f..26da669 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -538,6 +538,7 @@ <translation id="1549275686094429035">ARC ಸಕ್ರಿಯಗೊಂಡಿದೆ</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> ಅಪ್ಲಿಕೇಶನ್ <ph name="VOLUME_NAME" /> ಅನ್ನು ಪ್ರವೇಶಿಸಲು ಬಯಸುತ್ತದೆ. ಅದು ನಿಮ್ಮ ಫೈಲ್ಗಳನ್ನು ಮಾರ್ಪಡಿಸಬಹುದು ಅಥವಾ ಅಳಿಸಬಹುದು.</translation> <translation id="1552301827267621511"><ph name="SEARCH_PROVIDER_DOMAIN" /> ಅನ್ನು ಬಳಸಲು, <ph name="EXTENSION_NAME" /> ವಿಸ್ತರಣೆಯು ಹುಡುಕಾಟವನ್ನು ಬದಲಿಸಿದೆ</translation> +<translation id="1552752544932680961">ವಿಸ್ತರಣೆ ನಿರ್ವಹಿಸಿ</translation> <translation id="1553538517812678578">ಸೀಮಿತವಲ್ಲದ</translation> <translation id="1555130319947370107">ನೀಲಿ</translation> <translation id="1556537182262721003">ಫ್ರೋಫೈಲ್ಗೆ ಎಕ್ಸ್ಟೆನ್ಷನ್ ಡೈರೆಕ್ಟರಿಯನ್ನು ಚಲಿಸಲಾಗುವುದಿಲ್ಲ.</translation> @@ -2796,7 +2797,6 @@ <translation id="3842552989725514455">Serif ಫಾಂಟ್</translation> <translation id="3843464315703645664">ಆಂತರಿಕವಾಗಿ ಅನುಮತಿಸಿದ ಪಟ್ಟಿ</translation> <translation id="3844888638014364087">ಎಮೋಜಿಯನ್ನು ಸೇರಿಸಲಾಗಿದೆ</translation> -<translation id="384513009320852920">ನಿಮ್ಮ ಬ್ಲೂಟೂತ್ ಸಾಧನವು ಜೋಡಿಸುವಿಕೆ ಮೋಡ್ನಲ್ಲಿದೆ ಮತ್ತು ಸಮೀಪದಲ್ಲಿದೆ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ. <ph name="BEGIN_LINK_LEARN_MORE" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">ವೆಬ್ಸೈಟ್ಗಳು, Android ಆ್ಯಪ್ಗಳು, ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನವುಗಳನ್ನು ಅಭಿವೃದ್ಧಿಪಡಿಸಲು ಪರಿಕರಗಳನ್ನು ಪಡೆಯಿರಿ. Linux ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವುದರಿಂದ <ph name="DOWNLOAD_SIZE" /> ಗಾತ್ರದ ಡೇಟಾವನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ.</translation> <translation id="3847319713229060696">ಎಲ್ಲರಿಗಾಗಿ ವೆಬ್ನ ಸುರಕ್ಷತೆಯನ್ನು ಸುಧಾರಿಸಲು ಸಹಾಯಮಾಡಿ</translation> <translation id="3848547754896969219">&ಅಜ್ಞಾತ ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯಿರಿ</translation> @@ -4308,7 +4308,6 @@ <translation id="5485102783864353244">ಅಪ್ಲಿಕೇಶನ್ ಸೇರಿಸು</translation> <translation id="5485754497697573575">ಎಲ್ಲಾ ಟ್ಯಾಬ್ಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಿ </translation> <translation id="5486261815000869482">ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಖಚಿತಪಡಿಸು</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> ನಿಮ್ಮ ಪರದೆಯನ್ನು <ph name="TAB_NAME" /> ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation> <translation id="5486561344817861625">ಬ್ರೌಸರ್ ಮರುಪ್ರಾರಂಭಿಸುವಿಕೆ ಸಿಮ್ಯುಲೇಟ್ ಮಾಡು</translation> <translation id="5487460042548760727">ಪ್ರೊಫೈಲ್ ಅನ್ನು <ph name="PROFILE_NAME" /> ಗೆ ಮರುಹೆಸರಿಸಿ</translation> <translation id="5487521232677179737">ಡೇಟಾ ತೆರವುಗೊಳಿಸು</translation> @@ -4370,6 +4369,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ಗೆ ಅನುಮತಿ ಬೇಕಿದೆ</translation> <translation id="5534304873398226603">ಫೋಟೋ ಅಥವಾ ವೀಡಿಯೊವನ್ನು ತ್ಯಜಿಸಿ</translation> <translation id="5535941515421698170">ಹಾಗೆಯೇ ಈ ಸಾಧನದಿಂದ ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಡೇಟಾವನ್ನು ತೆಗೆದುಹಾಕಿ</translation> +<translation id="5537725057119320332">ಪಾತ್ರವರ್ಗ</translation> <translation id="5539221284352502426">ನೀವು ನಮೂದಿಸಿದ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಸರ್ವರ್ ನಿಂದ ತಿರಸ್ಕರಿಸಲಾಗಿದೆ. ಸಂಭವನೀಯ ಕಾರಣಗಳು ಇವುಗಳನ್ನು ಒಳಗೊಂಡಿವೆ: ಪಾಸ್ವರ್ಡ್ ತುಂಬಾ ಚಿಕ್ಕದಾಗಿದೆ. ಪಾಸ್ವರ್ಡ್ ಸಂಖ್ಯೆಗಳು ಅಥವಾ ಸಂಕೇತಗಳನ್ನು ಒಳಗೊಂಡಿರಬೇಕು. ಹಿಂದಿನ ಪಾಸ್ವರ್ಡ್ಗಿಂತ ಈ ಪಾಸ್ವರ್ಡ್ ವಿಭಿನ್ನವಾಗಿರಬೇಕು.</translation> <translation id="5541694225089836610">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಕ್ರಿಯೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ</translation> <translation id="5542132724887566711">ಪ್ರೊಫೈಲ್</translation> @@ -4601,6 +4601,7 @@ <translation id="5787146423283493983">ಪ್ರಮುಖ ಒಪ್ಪಂದ</translation> <translation id="5787420647064736989">ಸಾಧನದ ಹೆಸರು</translation> <translation id="5788367137662787332">ಕ್ಷಮಿಸಿ, <ph name="DEVICE_LABEL" /> ಸಾಧನದಲ್ಲಿನ ಕನಿಷ್ಠ ಒಂದೇ ಒಂದು ಭಾಗವನ್ನೂ ಜೋಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">ಯಶಸ್ವಿಯಾಗಿದೆ</translation> <translation id="5790651917470750848">ಪೋರ್ಟ್ ಫಾರ್ವರ್ಡ್ ಮಾಡುವಿಕೆ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ</translation> <translation id="5792728279623964091">ದಯವಿಟ್ಟು ನಿಮ್ಮ ಪವರ್ ಬಟನ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ</translation> @@ -4833,10 +4834,8 @@ <ph name="BEGIN_PARAGRAPH2" />ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಮುಖ್ಯ ಸ್ಥಳ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಆಫ್ ಮಾಡುವ ಮೂಲಕ ನೀವು ಸ್ಥಳವನ್ನು ಆಫ್ ಮಾಡಬಹುದು. ನೀವು ಸ್ಥಳ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಸ್ಥಳಕ್ಕಾಗಿ ವೈ-ಫೈ, ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ಗಳು ಮತ್ತು ಸೆನ್ಸರ್ಗಳ ಬಳಕೆಯನ್ನು ಸಹ ಆಫ್ ಮಾಡಬಹುದು.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">ಪೂರ್ಣಪರದೆಯಿಂದ ನಿರ್ಗಮಿಸಿ</translation> <translation id="6042308850641462728">ಇನ್ನಷ್ಟು</translation> -<translation id="6043317578411397101"><ph name="TAB_NAME" /> ಜೊತೆಗೆ <ph name="APP_NAME" /> Chrome ಟ್ಯಾಬ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation> <translation id="604388835206766544">ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ವಿಶ್ಲೇಷಿಸಲು ವಿಫಲವಾಗಿದೆ</translation> <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="6049797270917061226">ಈ ಫೈಲ್ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಕದಿಯಲು ದಾಳಿಕೋರರಿಗೆ ಅವಕಾಶ ನೀಡಬಹುದು.</translation> @@ -7337,7 +7336,6 @@ <translation id="8655295600908251630">ಚಾನಲ್</translation> <translation id="8655972064210167941">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲದಿರುವುದರಿಂದ ಸೈನ್ ಇನ್ ವಿಫಲವಾಗಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ ಅಥವಾ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="8657393004602556571">ನೀವು ಪ್ರತಿಕ್ರಿಯೆ ತ್ಯಜಿಸಲು ಬಯಸುವಿರಾ?</translation> -<translation id="8658645149275195032"><ph name="TAB_NAME" /> ಜೊತೆಗೆ ನಿಮ್ಮ ಪರದೆ ಮತ್ತು ಆಡಿಯೋವನ್ನು <ph name="APP_NAME" /> ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation> <translation id="8661290697478713397">ಅಜ್ಞಾ&ತ ವಿಂಡೋದಲ್ಲಿ ಲಿಂಕ್ ತೆರೆಯಿರಿ</translation> <translation id="8662671328352114214"><ph name="TYPE" /> ನೆಟ್ವರ್ಕ್ಗೆ ಸೇರಿಕೊಳ್ಳಿ</translation> <translation id="8662733268723715832">ಇದು ನಿರೀಕ್ಷೆಗಿಂತ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತಿದೆ, ನೀವು ಸ್ಕಿಪ್ ಮಾಡಬಹುದು ಅಥವಾ ಅದು ಮುಗಿಯುವವರೆಗೆ ಕಾಯಬಹುದು.</translation> @@ -7633,7 +7631,6 @@ <translation id="8941173171815156065">'<ph name="PERMISSION" />' ಅನುಮತಿಯನ್ನು ಹಿಂತೆಗೆದುಕೊಳ್ಳಿ</translation> <translation id="894360074127026135">Netscape ಅಂತರರಾಷ್ಟ್ರೀಯ ಸ್ಟೆಪ್-ಅಪ್</translation> <translation id="8944099748578356325">ಇನ್ನಷ್ಟು ತ್ವರಿತವಾಗಿ ಬ್ಯಾಟರಿ ಬಳಸಿ (ಪ್ರಸ್ತುತವಾಗಿ <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="TAB_NAME" /> ಜೊತೆಗೆ <ph name="APP_NAME" /> ವಿಂಡೋ ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation> <translation id="8945274638472141382">ಐಕಾನ್ ಗಾತ್ರ</translation> <translation id="8946359700442089734">ದೋಷ ನಿವಾರಣೆಯಾಗುತ್ತಿರುವ ವೈಶಿಷ್ಟ್ಯಗಳು ಈ ಸಾಧನದಲ್ಲಿ <ph name="IDS_SHORT_PRODUCT_NAME" /> ಇನ್ನೂ ಸಂಫೂರ್ಣವಾಗಿ ಸಕ್ರಿಯವಾಗಿಲ್ಲ.</translation> <translation id="894763922177556086">ಉತ್ತಮ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index a52ba9a..bebfdf51 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -533,6 +533,7 @@ <translation id="1549275686094429035">ARC 사용 설정됨</translation> <translation id="1549788673239553762"><ph name="APP_NAME" />에서 <ph name="VOLUME_NAME" />에 액세스하려고 합니다. 내 파일을 수정하거나 삭제할 수 있습니다.</translation> <translation id="1552301827267621511">'<ph name="EXTENSION_NAME" />' 확장 프로그램에서 검색에 <ph name="SEARCH_PROVIDER_DOMAIN" /> 서비스를 사용하도록 변경했습니다.</translation> +<translation id="1552752544932680961">확장 프로그램 관리</translation> <translation id="1553538517812678578">무제한</translation> <translation id="1555130319947370107">파란색</translation> <translation id="1556537182262721003">확장 프로그램 디렉터리를 프로필로 이동하지 못했습니다.</translation> @@ -2792,7 +2793,6 @@ <translation id="3842552989725514455">Serif</translation> <translation id="3843464315703645664">내부적으로 허용됨</translation> <translation id="3844888638014364087">그림 이모티콘 삽입됨</translation> -<translation id="384513009320852920">블루투스 기기를 페어링 모드로 설정하고 가까이 두세요. <ph name="BEGIN_LINK_LEARN_MORE" />자세히 알아보기<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">웹사이트, Android 앱 등을 개발할 수 있는 도구를 이용해 보세요. Linux를 설치하면 <ph name="DOWNLOAD_SIZE" />의 데이터가 다운로드됩니다.</translation> <translation id="3847319713229060696">모든 웹 사용자를 위한 보안 개선에 참여</translation> <translation id="3848547754896969219">시크릿 창에서 열기(&I)</translation> @@ -4297,7 +4297,6 @@ <translation id="5485102783864353244">앱 추가</translation> <translation id="5485754497697573575">모든 탭 복원</translation> <translation id="5486261815000869482">비밀번호 확인</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" />에서 <ph name="TAB_NAME" />와(과) 내 화면을 공유 중입니다.</translation> <translation id="5486561344817861625">브라우저 다시 시작 시뮬레이션</translation> <translation id="5487460042548760727">프로필 이름을 다음으로 변경 <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">인터넷 사용 기록 삭제</translation> @@ -4359,6 +4358,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" />에서 다음 권한을 요청합니다.</translation> <translation id="5534304873398226603">사진 또는 동영상 삭제</translation> <translation id="5535941515421698170">기기에서 기존 데이터도 삭제</translation> +<translation id="5537725057119320332">전송</translation> <translation id="5539221284352502426">입력한 비밀번호가 서버에 의해 거부되었습니다. 가능한 이유는 다음과 같습니다. 비밀번호가 너무 짧습니다. 비밀번호에 숫자 또는 기호가 포함되어야 합니다. 이전 비밀번호와 달라야 합니다.</translation> <translation id="5541694225089836610">관리자가 사용 중지한 작업입니다.</translation> <translation id="5542132724887566711">프로필</translation> @@ -4589,6 +4589,7 @@ <translation id="5787146423283493983">키 계약</translation> <translation id="5787420647064736989">기기 이름</translation> <translation id="5788367137662787332">죄송합니다. 기기(<ph name="DEVICE_LABEL" />)에 있는 하나 이상의 파티션을 마운트하지 못했습니다.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">완료</translation> <translation id="5790651917470750848">포트 전달이 이미 존재합니다.</translation> <translation id="5792728279623964091">전원 버튼을 탭하세요.</translation> @@ -4820,10 +4821,8 @@ <ph name="BEGIN_PARAGRAPH2" />기기에서 기본 위치 설정을 사용 중지하여 위치 정보를 끌 수 있습니다. 또한 위치 설정에서 위치 파악에 Wi‑Fi, 모바일 네트워크, 센서의 사용을 중지할 수도 있습니다.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">전체화면 종료</translation> <translation id="6042308850641462728">자세히</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" />에서 <ph name="TAB_NAME" />와(과) Chrome 탭을 공유 중입니다.</translation> <translation id="604388835206766544">설정을 파싱할 수 없습니다.</translation> <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="6049797270917061226">이 파일로 인해 공격자가 개인 정보를 도용할 가능성이 있습니다.</translation> @@ -7319,7 +7318,6 @@ <translation id="8655295600908251630">채널</translation> <translation id="8655972064210167941">비밀번호를 확인할 수 없어 로그인할 수 없습니다. 관리자에게 문의하거나 다시 시도해 주세요.</translation> <translation id="8657393004602556571">의견을 삭제하시겠습니까?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" />에서 <ph name="TAB_NAME" />와(과) 내 화면 및 오디오를 공유 중입니다.</translation> <translation id="8661290697478713397">시크릿 창에서 링크 열기(&G)</translation> <translation id="8662671328352114214"><ph name="TYPE" /> 네트워크에 연결</translation> <translation id="8662733268723715832">예상보다 많은 시간이 걸리고 있습니다. 계속 기다리거나 건너뛸 수 있습니다.</translation> @@ -7614,7 +7612,6 @@ <translation id="8941173171815156065">'<ph name="PERMISSION" />' 권한 취소</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">배터리 소모가 빨라짐(현재 <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" />에서 <ph name="TAB_NAME" />와(과) 창을 공유 중입니다.</translation> <translation id="8945274638472141382">아이콘 크기</translation> <translation id="8946359700442089734">이 <ph name="IDS_SHORT_PRODUCT_NAME" /> 기기에서 디버깅 기능의 사용 설정을 완료하지 못했습니다.</translation> <translation id="894763922177556086">좋음</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 8623591..4682ee53 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -536,6 +536,7 @@ <translation id="1549275686094429035">ARC иштетилди</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> колдонмосу <ph name="VOLUME_NAME" /> дегенге мүмкүнчүлүк алгысы келет. Ал файлдарыңызды өзгөртүп же жок кылышы мүмкүн.</translation> <translation id="1552301827267621511">"<ph name="EXTENSION_NAME" />" кеңейтүүсү эми издөө үчүн <ph name="SEARCH_PROVIDER_DOMAIN" /> колдонула тургандай кылып өзгөртүп койду</translation> +<translation id="1552752544932680961">Кеңейтүүнү башкаруу</translation> <translation id="1553538517812678578">чексиз</translation> <translation id="1555130319947370107">Көк</translation> <translation id="1556537182262721003">Кеңейтүү каталогу профилге жылган жок.</translation> @@ -2803,7 +2804,6 @@ <translation id="3842552989725514455">Serif ариби</translation> <translation id="3843464315703645664">Ички колдонууга уруксат берилгендердин тизмеси</translation> <translation id="3844888638014364087">Быйтыкча коюлду</translation> -<translation id="384513009320852920">Bluetooth түзмөгүңүз жупташтыруу режиминде жана жакын турат. <ph name="BEGIN_LINK_LEARN_MORE" />Кеңири маалымат<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Вебсайттарды, Android колдонмолорун жана башкаларды иштеп чыгуу үчүн куралдарды орнотуп алыңыз. Linux'ту орнотуу үчүн <ph name="DOWNLOAD_SIZE" /> дайын жүктөлүп алынат.</translation> <translation id="3847319713229060696">Баары үчүн Интернеттеги коопсуздукту арттырууга жардам берүү</translation> <translation id="3848547754896969219">&Жашыруун терезеде ачуу</translation> @@ -4315,7 +4315,6 @@ <translation id="5485102783864353244">Колдонмо кошуу</translation> <translation id="5485754497697573575">Бардык өтмөктөрдү калыбына келтирүү</translation> <translation id="5486261815000869482">Сырсөздү ырастаңыз</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> экраныңызды <ph name="TAB_NAME" /> менен бөлүшүүдө.</translation> <translation id="5486561344817861625">Серепчини өчүрүп күйгүзүп көрүү</translation> <translation id="5487460042548760727">Профилди <ph name="PROFILE_NAME" /> кылып өзгөртүү</translation> <translation id="5487521232677179737">Дайын-даректерди өчүрүү</translation> @@ -4377,6 +4376,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> бул аракеттерди аткарат</translation> <translation id="5534304873398226603">Сүрөттү же видеону жарактан чыгаруу</translation> <translation id="5535941515421698170">Учурдагы дайын-даректериңизди да бул түзмөктөн алып саласызбы?</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">Киргизген сырсөзүңүздү сервер кабыл алган жок. Сырсөз өтө кыска болушу мүмкүн. Ал сандардан жана символдордон туруп, мурунку сырсөздөрдөн башкача болушу керек.</translation> <translation id="5541694225089836610">Аракетти администраторуңуз өчүрүп койгон</translation> <translation id="5542132724887566711">Профиль</translation> @@ -4607,6 +4607,7 @@ <translation id="5787146423283493983">Негизги макулдашуу</translation> <translation id="5787420647064736989">Түзмөктүн аталышы</translation> <translation id="5788367137662787332">Кечиресиз, <ph name="DEVICE_LABEL" /> түзмөгүнүн жада калса 1 бөлүгү жалгаштырылган жок.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Ийгилик</translation> <translation id="5790651917470750848">Портту багыттоо мурунтан эле бар</translation> <translation id="5792728279623964091">Кубат баскычын басыңыз</translation> @@ -4839,10 +4840,8 @@ <ph name="BEGIN_PARAGRAPH2" />Бул кызматты өчүрүү үчүн түзмөгүңүздөгү Жайгашкан жерди аныктоо функциясын өчүрүп салыңыз. Ошол эле жерден жайгашкан жерди аныктай турган Wi-Fi жана мобилдик тармактардын сигналдарынын, сенсорлордун колдонулушуна тыюу сала аласыз.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Толук экран режиминен чыгуу</translation> <translation id="6042308850641462728">Дагы</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> колдонмосу Chrome өтмөгүн <ph name="TAB_NAME" /> менен бөлүшүп жатат.</translation> <translation id="604388835206766544">Конфигурация талданган жок</translation> <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="6049797270917061226">Бул файл чабуулчуларга жеке маалыматыңызды уурдаганда уруксат бериши мүмкүн.</translation> @@ -7345,7 +7344,6 @@ <translation id="8655295600908251630">Канал</translation> <translation id="8655972064210167941">Сырсөзүңүз тастыкталбай койгондуктан, аккаунтка кире албай калдыңыз. Администраторуңузга кайрылыңыз же кайталап көрүңүз.</translation> <translation id="8657393004602556571">Пикирди өчүрөсүзбү?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> колдонмосу экраныңызды жана аудио файлын <ph name="TAB_NAME" /> менен бөлүшүп жатат.</translation> <translation id="8661290697478713397">Шилтемени жашыр&уун терезеде ачуу</translation> <translation id="8662671328352114214"><ph name="TYPE" /> тармагына кошулуу</translation> <translation id="8662733268723715832">Бул күтүлгөндөн көбүрөөк созулуп жатат. Өткөрүп жиберип же бүткөнгө чейин күтө турсаңыз болот.</translation> @@ -7640,7 +7638,6 @@ <translation id="8941173171815156065">"<ph name="PERMISSION" />" уруксатын жоюу</translation> <translation id="894360074127026135">Netscape эл аралык жогорулатмасы</translation> <translation id="8944099748578356325">Батареяны тезирээк сарптайт (учурда <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> колдонмосу терезесин <ph name="TAB_NAME" /> менен бөлүшүп жатат.</translation> <translation id="8945274638472141382">Сүрөтчө өлчөмү</translation> <translation id="8946359700442089734">Бул <ph name="IDS_SHORT_PRODUCT_NAME" /> түзмөгүндө мүчүлүштүктөрдү таап оңдоо өзгөчөлүктөрү толук иштетилген эмес.</translation> <translation id="894763922177556086">Жакшы</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index f1b7ce1..39452556 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -534,6 +534,7 @@ <translation id="1549275686094429035">ເປີດການນຳໃຊ້ ARC ແລ້ວ</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> ຕ້ອງການເຂົ້າຫາ <ph name="VOLUME_NAME" />. ມັນອາດຈະດັດແປງ ຫຼືລຶບໄຟລ໌ຂອງທ່ານ.</translation> <translation id="1552301827267621511">ສ່ວນຂະຫຍາຍ "<ph name="EXTENSION_NAME" />" ໄດ້ປ່ຽນການຊອກຫາໄປໃຊ້ <ph name="SEARCH_PROVIDER_DOMAIN" /> ແລ້ວ</translation> +<translation id="1552752544932680961">ຈັດການສ່ວນຂະຫຍາຍ</translation> <translation id="1553538517812678578">ບໍ່ຈໍາກັດ</translation> <translation id="1555130319947370107">ສີຟ້າ</translation> <translation id="1556537182262721003">ບໍ່ສາມາດຍ້າຍໄດເຣັກຕໍຣີສ່ວນຂະຫຍາຍເພີ່ມເຕີມໄປເປັນໂປຣໄຟລ໌ໄດ້.</translation> @@ -2800,7 +2801,6 @@ <translation id="3842552989725514455">ຟອນ Serif</translation> <translation id="3843464315703645664">ເປັນລາຍການທີ່ອະນຸຍາດພາຍໃນ</translation> <translation id="3844888638014364087">ແຊກອີໂມຈິແລ້ວ</translation> -<translation id="384513009320852920">ກະລຸນາກວດສອບວ່າອຸປະກອນ Bluetooth ຂອງທ່ານຢູ່ໃນໂໝດຈັບຄູ່ ແລະ ຢູ່ໃກ້ຄຽງ. <ph name="BEGIN_LINK_LEARN_MORE" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">ດາວໂຫຼດເຄື່ອງມືສຳລັບພັດທະນາເວັບໄຊ, ແອັບ Android ແລະ ອື່ນໆອີກ. ການຕິດຕັ້ງ Linux ຈະດາວໂຫຼດຂໍ້ມູນ <ph name="DOWNLOAD_SIZE" />.</translation> <translation id="3847319713229060696">ຊ່ວຍປັບປຸງຄວາມປອດໄພໃນເວັັບໄຊສຳລັບທຸກຄົນ</translation> <translation id="3848547754896969219">ເປີດໃນ&ໜ້າຈໍທີ່ບໍ່ເປີດເຜີຍຕົວຕົນ</translation> @@ -4311,7 +4311,6 @@ <translation id="5485102783864353244">ເພີ່ມແອັບ</translation> <translation id="5485754497697573575">ຟື້ນຄືນທຸກແຖບ</translation> <translation id="5486261815000869482">ຢືນຢັນລະຫັດຜ່ານ</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> ກໍາລັງແຊຣ໌ໜ້າຈໍຂອງທ່ານກັບ <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">ຈໍາລອງການເລີ່ມປິດເປີດບຣາວເຊີໃໝ່</translation> <translation id="5487460042548760727">ປ່ຽນຊື່ໂປຣໄຟລ໌ເປັນ <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">ລຶບລ້າງຂໍ້ມູນ</translation> @@ -4373,6 +4372,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ຕ້ອງການ</translation> <translation id="5534304873398226603">ລຶບຮູບພາບ ຫຼື ວິດີໂອຖິ້ມ</translation> <translation id="5535941515421698170">ຍັງລຶບຂໍ້ມູນທີ່ມີຢູ່ຂອງທ່ານອອກຈາກອຸປະກອນນີ້ນຳອີກ</translation> +<translation id="5537725057119320332">ຄາສທ໌</translation> <translation id="5539221284352502426">ລະຫັດຜ່ານທີ່ທ່ານປ້ອນເຂົ້າໄດ້ຖືກປະຕິເສດໂດຍເຊີເວີແລ້ວ. ເຫດຜົນທີ່ເປັນໄປໄດ້ລວມມີ: ລະຫັດຜ່ານສັ້ນເກີນໄປ. ລະຫັດຜ່ານຕ້ອງລວມມີຕົວເລກ ຫຼື ສັນຍາລັກ. ລະຫັດຜ່ານຕ້ອງແຕກຕ່າງຈາກລະຫັດຜ່ານໃນເມື່ອກ່ອນ.</translation> <translation id="5541694225089836610">ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານປິດນຳໃຊ້ຄຳສັ່ງນີ້</translation> <translation id="5542132724887566711">ໂປຣໄຟລ໌</translation> @@ -4603,6 +4603,7 @@ <translation id="5787146423283493983">ຂໍ້ຕົກລົງລະຫັດ</translation> <translation id="5787420647064736989">ຊື່ອຸປະກອນ</translation> <translation id="5788367137662787332">ຂໍອະໄພ, ຢ່າງໜ້ອຍສ່ວນແບ່ງໜຶ່ງຢູ່ໃນອຸປະກອນ <ph name="DEVICE_LABEL" /> ບໍ່ສາມາດຕໍ່ໄດ້.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">ສໍາເລັດ</translation> <translation id="5790651917470750848">ມີການສົ່ງຕໍ່ຜອດຢູ່ແລ້ວ</translation> <translation id="5792728279623964091">ກະລຸນາແຕະປຸ່ມປິດເປີດເຄື່ອງຂອງທ່ານ</translation> @@ -4835,10 +4836,8 @@ <ph name="BEGIN_PARAGRAPH2" />ທ່ານສາມາດປິດສະຖານທີ່ໄດ້ໂດຍການປິດການຕັ້ງຄ່າສະຖານທີ່ຫຼັກຢູ່ໃນອຸປະກອນຂອງທ່ານ. ນອກຈາກທ່ານຍັງສາມາດປິດການໃຊ້ Wi‑Fi, ເຄືອຂ່າຍມືຖື ແລະ ເຊັນເຊີຕ່າງໆສຳລັບສະຖານທີ່ໄດ້ໃນການຕັ້ງຄ່າສະຖານທີ່.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">ອອກຈາກເຕັມໜ້າຈໍ</translation> <translation id="6042308850641462728">ເພີ່ມເຕີມ</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> ກຳລັງແບ່ງປັນແຖບ Chrome ກັບ <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">ແຍກວິເຄາະການກຳນົດຄ່າບໍ່ສຳເລັດ</translation> <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="6049797270917061226">ໄຟລ໌ນີ້ອາດເຮັດໃຫ້ຜູ້ໂຈມຕີສາມາດລັກຂໍ້ມູນສ່ວນຕົວຂອງທ່ານໄດ້.</translation> @@ -7340,7 +7339,6 @@ <translation id="8655295600908251630">ຊ່ອງ</translation> <translation id="8655972064210167941">ລົງຊື່ເຂົ້າໃຊ້ບໍ່ສຳເລັດ ເພາະວ່າລະຫັດຜ່ານຂອງທ່ານບໍ່ສາມາດຢືນຢັນໄດ້. ກະລຸນາຕິດຕໍ່ຜູ້ຄວບຄຸມຂອງທ່ານ ຫຼື ລອງໃໝ່ອີກ.</translation> <translation id="8657393004602556571">ທ່ານຕ້ອງການຍົກເລີກຄຳຕິຊົມບໍ?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> ກຳລັງແບ່ງປັນໜ້າຈໍ ແລະ ສຽງຂອງທ່ານກັບ <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">ເປີດລິ້ງຢູ່ໃນໜ້າຕ່າງທີ່ບໍ່ເຜີຍຕົນຕົວ</translation> <translation id="8662671328352114214">ເຂົ້າຮ່ວມເຄືອຂ່າຍ <ph name="TYPE" /></translation> <translation id="8662733268723715832">ຂັ້ນຕອນນີ້ກຳລັງໃຊ້ເວລາດົນກວ່າທີ່ຄາດໄວ້, ທ່ານສາມາດຂ້າມ ຫຼື ລໍຖ້າຈົນກວ່າມັນຈະແລ້ວໄດ້.</translation> @@ -7635,7 +7633,6 @@ <translation id="8941173171815156065">ຖອນໃບອະນຸຍາດ '<ph name="PERMISSION" />' ຄືນ</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">ໃຊ້ແບັດເຕີຣີໝົດໄວກວ່າ (ປັດຈຸບັນ <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> ກຳລັງແບ່ງປັນໜ້າຈໍກັບ <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">ຂະໜາດໄອຄອນ</translation> <translation id="8946359700442089734">ຄຸນສົມບັດແກ້ໄຂບັນຫາບໍ່ຖືກເປີດໃຊ້ງານຢ່າງເຕັມທີ່ຢູ່ເທິງອຸປະກອນ <ph name="IDS_SHORT_PRODUCT_NAME" /> ນີ້.</translation> <translation id="894763922177556086">ແຮງດີ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 3364c18..fbf8f09 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -164,6 +164,7 @@ <translation id="1153636665119721804">„Google“ papildomos apsaugos programa</translation> <translation id="1155545602507378023">Ne, tik šis įrenginys</translation> <translation id="1155816283571436363">Prisijungiama prie telefono</translation> +<translation id="1158080958325422608">Rašyti didžiosiomis raidėmis</translation> <translation id="1158238185437008462">Peržiūrėti prisiminimus</translation> <translation id="1161575384898972166">Jei norite eksportuoti programos sertifikatą, prisijunkite prie „<ph name="TOKEN_NAME" />“.</translation> <translation id="116173250649946226">Administratorius nustatė numatytąją temą, kurios negalima keisti.</translation> @@ -538,6 +539,7 @@ <translation id="1549275686094429035">Įgalinta ARC</translation> <translation id="1549788673239553762">„<ph name="APP_NAME" />“ nori pasiekti „<ph name="VOLUME_NAME" />“. Programa galės keisti arba ištrinti failus.</translation> <translation id="1552301827267621511">Pritaikius plėtinį „<ph name="EXTENSION_NAME" />“, paieškos svetainė buvo pakeista į <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Valdyti plėtinį</translation> <translation id="1553538517812678578">neribotas</translation> <translation id="1555130319947370107">Mėlyna</translation> <translation id="1556537182262721003">Nepavyko perkelti plėtinio katalogo į profilį.</translation> @@ -700,6 +702,7 @@ <translation id="1700079447639026019">Svetainės, kuriose niekada negalima naudoti slapukų</translation> <translation id="1703331064825191675">Niekada nesijaudinkite dėl slaptažodžių</translation> <translation id="1703666494654169921">Neleisti svetainėms naudoti virtualiosios realybės įrenginių ar duomenų</translation> +<translation id="1704097193565924901">Rašyti didžiosiomis raidėmis</translation> <translation id="1704230497453185209">Neleisti svetainėms leisti garso</translation> <translation id="1704970325597567340">Saugos patikra atlikta <ph name="DATE" /></translation> <translation id="1706586824377653884">Pridėjo jūsų administratorius</translation> @@ -2802,7 +2805,6 @@ <translation id="3842552989725514455">Šriftas „Serif“</translation> <translation id="3843464315703645664">Vidinis leidžiamųjų sąrašas</translation> <translation id="3844888638014364087">Jaustukas įterptas</translation> -<translation id="384513009320852920">Įsitikinkite, kad „Bluetooth“ įrenginys yra netoliese ir veikia susiejimo režimu. <ph name="BEGIN_LINK_LEARN_MORE" />Sužinokite daugiau<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Gaukite svetainių, „Android“ programų ir kt. kūrimo įrankius. Įdiegiant „Linux“ bus atsisiųsta <ph name="DOWNLOAD_SIZE" /> duomenų.</translation> <translation id="3847319713229060696">Pagalba didinant visų naudotojų saugą žiniatinklyje</translation> <translation id="3848547754896969219">Atidaryti &inkognito lange</translation> @@ -3590,6 +3592,7 @@ <translation id="4681453295291708042">Išjungti Bendrinimo netoliese funkciją</translation> <translation id="4681930562518940301">Atidaryti originalų &vaizdą naujame skirtuke</translation> <translation id="4682551433947286597">Ekrano fonai rodomi prisijungimo ekrane.</translation> +<translation id="4683629100208651599">Rašyti mažosiomis raidėmis</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" /> % (numatyta)</translation> <translation id="4684427112815847243">Viską sinchronizuoti</translation> <translation id="4684471265911890182">„<ph name="APP_NAME" />“ bando pasiekti kamerą. Išjunkite kameros privatumo jungiklį, kad leistumėte pasiekti.</translation> @@ -4313,7 +4316,6 @@ <translation id="5485102783864353244">Pridėti programą</translation> <translation id="5485754497697573575">Atkurti visus skirtukus</translation> <translation id="5486261815000869482">Patvirtinti slaptažodį</translation> -<translation id="5486275809415469523">„<ph name="APP_NAME" />“ bendrina jūsų ekraną su „<ph name="TAB_NAME" />“.</translation> <translation id="5486561344817861625">Imituoti naršyklės paleidimą iš naujo</translation> <translation id="5487460042548760727">Pervardyti profilį į „<ph name="PROFILE_NAME" />“</translation> <translation id="5487521232677179737">Išvalyti duomenis</translation> @@ -4375,6 +4377,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> nori:</translation> <translation id="5534304873398226603">Atmesti nuotrauką arba vaizdo įrašą</translation> <translation id="5535941515421698170">Taip pat pašalinkite esamus duomenis iš šio įrenginio</translation> +<translation id="5537725057119320332">Perduoti</translation> <translation id="5539221284352502426">Serveris atmetė įvestą slaptažodį. Taip galėjo nutikti dėl toliau išvardytų priežasčių. Slaptažodis yra per trumpas. Slaptažodį turi sudaryti ir skaičiai arba simboliai. Slaptažodis turi skirtis nuo ankstesnių slaptažodžių.</translation> <translation id="5541694225089836610">Veiksmą išjungė administratorius</translation> <translation id="5542132724887566711">Profilis</translation> @@ -4606,6 +4609,7 @@ <translation id="5787146423283493983">Sutartis dėl rakto</translation> <translation id="5787420647064736989">Įrenginio pavadinimas</translation> <translation id="5788367137662787332">Apgailestaujame, tačiau neįmanoma įrengti bent vieno įrenginio <ph name="DEVICE_LABEL" /> disko skaidinio.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Atlikta</translation> <translation id="5790651917470750848">Toks prievado numeris jau yra</translation> <translation id="5792728279623964091">Palieskite maitinimo mygtuką</translation> @@ -4838,10 +4842,8 @@ <ph name="BEGIN_PARAGRAPH2" />Galite išjungti vietovės nustatymą išjungdami pagrindinį vietovės nustatymą įrenginyje. Vietovės nustatymuose taip pat galite išjungti „Wi‑Fi“, mobiliojo ryšio tinklų ir jutiklių naudojimą vietovei nustatyti.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Išjungti viso ekrano režimą</translation> <translation id="6042308850641462728">Daugiau</translation> -<translation id="6043317578411397101">„<ph name="APP_NAME" />“ bendrina „Chrome“ skirtuką su <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Nepavyko išanalizuoti konfigūracijos</translation> <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="6049797270917061226">Šis failas gali leisti atakos vykdytojams pavogti jūsų asmens informaciją.</translation> @@ -5986,6 +5988,7 @@ <translation id="7257173066616499747">„Wi-Fi“ tinklai</translation> <translation id="725758059478686223">Spausdinimo paslauga</translation> <translation id="7257666756905341374">Skaityti kopijuojamus ir įklijuojamus duomenis</translation> +<translation id="7258192266780953209">Transformacijos</translation> <translation id="7258225044283673131">Programa nereaguoja. Pasirinkite „Priverstinai uždaryti“, kad uždarytumėte programą.</translation> <translation id="7262004276116528033">Ši prisijungimo paslauga priglobiama <ph name="SAML_DOMAIN" />.</translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Išbandykite toliau nurodytus trikčių šalinimo veiksmus. @@ -7341,7 +7344,6 @@ <translation id="8655295600908251630">Kanalas</translation> <translation id="8655972064210167941">Nepavyko prisijungti, nes negalima patvirtinti slaptažodžio. Susisiekite su administratoriumi arba bandykite dar kartą.</translation> <translation id="8657393004602556571">Ar norite atmesti atsiliepimą?</translation> -<translation id="8658645149275195032">„<ph name="APP_NAME" />“ bendrina jūsų ekraną ir garsą su <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Atidaryti nuorodą inko&gnito lange</translation> <translation id="8662671328352114214">Prisijungimas prie „<ph name="TYPE" />“ tinklo</translation> <translation id="8662733268723715832">Tai trunka ilgiau, nei tikėtasi. Galite praleisti arba palaukti, kol bus baigta.</translation> @@ -7639,7 +7641,6 @@ <translation id="8941173171815156065">Anuliuoti leidimą „<ph name="PERMISSION" />“</translation> <translation id="894360074127026135">„Netscape“ tarptautinė sąranka</translation> <translation id="8944099748578356325">Greičiau naudos akumuliatoriaus energiją (šiuo metu <ph name="BATTERY_PERCENTAGE" /> %)</translation> -<translation id="8944964446326379280">„<ph name="APP_NAME" />“ bendrina langą su <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Piktogramos dydis</translation> <translation id="8946359700442089734">Šiame „<ph name="IDS_SHORT_PRODUCT_NAME" />“ įrenginyje įgalintos ne visos derinimo funkcijos.</translation> <translation id="894763922177556086">Geras</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index bf8a152..b07738b 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -161,6 +161,7 @@ <translation id="1153356358378277386">Pārī savienotās ierīces</translation> <translation id="1153636665119721804">Google papildu aizsardzības programma</translation> <translation id="1155816283571436363">Notiek savienojuma izveide ar tālruni</translation> +<translation id="1158080958325422608">Pārveidot par lielajiem burtiem</translation> <translation id="1158238185437008462">Skatīt atmiņas</translation> <translation id="1161575384898972166">Pierakstieties ierīcē <ph name="TOKEN_NAME" />, lai eksportētu klienta sertifikātu.</translation> <translation id="116173250649946226">Jūsu administrators ir iestatījis noklusējuma motīvu, ko nevar nomainīt.</translation> @@ -532,6 +533,7 @@ <translation id="1549275686094429035">ARC iespējots</translation> <translation id="1549788673239553762">Lietotne <ph name="APP_NAME" /> vēlas piekļūt krātuvei <ph name="VOLUME_NAME" />. Tā var pārveidot vai dzēst failus.</translation> <translation id="1552301827267621511">Paplašinājums “<ph name="EXTENSION_NAME" />” meklēšanai iestatīja meklētājprogrammu <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Pārvaldīt paplašinājumu</translation> <translation id="1553538517812678578">neierobežots</translation> <translation id="1555130319947370107">Zila</translation> <translation id="1556537182262721003">Nevarēja pārvietot paplašinājuma katalogu uz profilu.</translation> @@ -694,6 +696,7 @@ <translation id="1700079447639026019">Vietnes, kas nekad nedrīkst izmantot sīkfailus</translation> <translation id="1703331064825191675">Nekad neraizējieties par parolēm</translation> <translation id="1703666494654169921">Neļaut vietnēm izmantot jūsu virtuālās realitātes ierīces vai datus</translation> +<translation id="1704097193565924901">Sākt katru vārdu ar lielo burtu</translation> <translation id="1704230497453185209">Neļaut vietnēm atskaņot skaņu</translation> <translation id="1704970325597567340">Drošības pārbaude tika izpildīta šādā datumā: <ph name="DATE" /></translation> <translation id="1706586824377653884">Pievienoja administrators</translation> @@ -2779,7 +2782,6 @@ <translation id="3842552989725514455">Serif fonts</translation> <translation id="3843464315703645664">Iekšējā atļaušanas sarakstā</translation> <translation id="3844888638014364087">Emocijzīme ievietota</translation> -<translation id="384513009320852920">Jūsu Bluetooth ierīcē ir jābūt aktivizētam režīmam savienošanai pārī, un tai ir jāatrodas tuvumā. <ph name="BEGIN_LINK_LEARN_MORE" />Uzziniet vairāk<ph name="END_LINK_LEARN_MORE" />.</translation> <translation id="3846116211488856547">Iegūstiet vietņu, Android lietotņu izstrādes rīkus un citus rīkus. Instalējot Linux, tiks lejupielādēts šāds datu apjoms: <ph name="DOWNLOAD_SIZE" />.</translation> <translation id="3847319713229060696">Palīdzēt uzlabot drošību tīmeklī visiem lietotājiem</translation> <translation id="3848547754896969219">Atvērt &inkognito režīma logā</translation> @@ -3564,6 +3566,7 @@ <translation id="4681453295291708042">Atspējot funkciju Kopīgošana tuvumā</translation> <translation id="4681930562518940301">Atvērt sākotnējo &attēlu jaunā cilnē</translation> <translation id="4682551433947286597">Fona tapetes tiek rādītas pierakstīšanās ekrānā.</translation> +<translation id="4683629100208651599">Pārveidot par mazajiem burtiem</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />% (noklusējums)</translation> <translation id="4684427112815847243">Sinhronizēt visu</translation> <translation id="4684471265911890182">Lietotne <ph name="APP_NAME" /> mēģina piekļūt kamerai. Lai atļautu piekļuvi, izslēdziet kameras konfidencialitātes slēdzi.</translation> @@ -4286,7 +4289,6 @@ <translation id="5485102783864353244">Pievienot lietotni</translation> <translation id="5485754497697573575">Atjaunot visas cilnes</translation> <translation id="5486261815000869482">Apstipriniet paroli</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> koplieto jūsu ekrānu ar cilni <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Imitēt pārlūkprogrammas restartēšanu</translation> <translation id="5487460042548760727">Pārdēvēt profilu par <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Notīrīt datus</translation> @@ -4348,6 +4350,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> pieprasa:</translation> <translation id="5534304873398226603">Atmest fotoattēlu vai video</translation> <translation id="5535941515421698170">Noņemt no šīs ierīces arī jūsu esošos datus</translation> +<translation id="5537725057119320332">Apraidīt</translation> <translation id="5539221284352502426">Ievadīto paroli noraidīja serveris. Iespējamie iemesli: parole ir pārāk īsa; parolē ir jābūt ietvertiem cipariem vai simboliem; parolei ir jāatšķiras no iepriekšējām parolēm.</translation> <translation id="5541694225089836610">Jūsu administrators ir atspējojis darbību.</translation> <translation id="5542132724887566711">Profils</translation> @@ -4578,6 +4581,7 @@ <translation id="5787146423283493983">Atslēgu saskaņošana</translation> <translation id="5787420647064736989">Ierīces nosaukums</translation> <translation id="5788367137662787332">Diemžēl vismaz vienu ierīces <ph name="DEVICE_LABEL" /> nodalījumu nevar uzstādīt.</translation> +<translation id="5789643057113097023">:</translation> <translation id="5790085346892983794">Veiksmīgi pabeigts</translation> <translation id="5790651917470750848">Porta pārsūtīšana jau pastāv</translation> <translation id="5792728279623964091">Lūdzu, pieskarieties savai barošanas pogai</translation> @@ -4809,10 +4813,8 @@ <ph name="BEGIN_PARAGRAPH2" />Varat izslēgt atrašanās vietas noteikšanu, izslēdzot ierīces galveno atrašanās vietas iestatījumu. Atrašanās vietas iestatījumos varat arī izslēgt Wi‑Fi, mobilo tīklu un sensoru izmantošanu atrašanās vietas noteikšanai.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Aizvērt pilnekrāna režīmu</translation> <translation id="6042308850641462728">Vairāk</translation> -<translation id="6043317578411397101">Lietotne <ph name="APP_NAME" /> koplieto Chrome cilni ar cilni <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Neizdevās parsēt konfigurāciju</translation> <translation id="6043994281159824495">Izrakstīties tagad</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> koplieto Chrome cilni un audio ar cilni <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Galvenā TrackPoint poga</translation> <translation id="6047632800149092791">Sinhronizācija nedarbojas. Izrakstieties un atkārtoti pierakstieties.</translation> <translation id="6049797270917061226">Uzbrucēji varētu izmantot šo failu, lai nozagtu jūsu personas informāciju.</translation> @@ -5956,6 +5958,7 @@ <translation id="7257173066616499747">Wi-Fi tīkli</translation> <translation id="725758059478686223">Drukāšanas pakalpojums</translation> <translation id="7257666756905341374">Lasīt datus, ko kopējat un ielīmējat</translation> +<translation id="7258192266780953209">Pārveidošana</translation> <translation id="7258225044283673131">Šī lietojumprogramma nereaģē. Lai aizvērtu lietotni, atlasiet vienumu “Aizvērt piespiedu kārtā”.</translation> <translation id="7262004276116528033">Šo pierakstīšanās pakalpojumu nodrošina <ph name="SAML_DOMAIN" /></translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Veiciet tālāk norādītās darbības problēmas novēršanai. @@ -7307,7 +7310,6 @@ <translation id="8655295600908251630">Kanāls</translation> <translation id="8655972064210167941">Neizdevās pierakstīties, jo nevarēja apstiprināt paroli. Lūdzu, sazinieties ar administratoru vai mēģiniet vēlreiz.</translation> <translation id="8657393004602556571">Vai vēlaties atmest atsauksmes?</translation> -<translation id="8658645149275195032">Lietotne <ph name="APP_NAME" /> koplieto jūsu ekrānu un audio ar cilni <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Atvērt saiti inko&gnito režīma logā</translation> <translation id="8662671328352114214">Pievienošanās <ph name="TYPE" /> tīklam</translation> <translation id="8662733268723715832">Diemžēl tam ir nepieciešams ilgāks laiks, nekā paredzēts. Varat izlaist šo darbību vai gaidīt, līdz tā tiek pabeigta.</translation> @@ -7604,7 +7606,6 @@ <translation id="8941173171815156065">Atsaukt atļauju “<ph name="PERMISSION" />”</translation> <translation id="894360074127026135">Netscape starptautiskā palielināšana</translation> <translation id="8944099748578356325">tiks ātrāk iztērēta akumulatora jauda (pašlaik: <ph name="BATTERY_PERCENTAGE" />%);</translation> -<translation id="8944964446326379280">Lietotne <ph name="APP_NAME" /> koplieto logu ar cilni <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Ikonu lielums</translation> <translation id="8946359700442089734">Atkļūdošanas funkcijas šajā <ph name="IDS_SHORT_PRODUCT_NAME" /> ierīcē netika pilnībā iespējotas.</translation> <translation id="894763922177556086">labs</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 01d96757..b7c6c0b 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -537,6 +537,7 @@ <translation id="1549275686094429035">ARC е овозможена</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> сака да пристапи на <ph name="VOLUME_NAME" />. Тоа може да ги измени или да ги избрише вашите датотеки.</translation> <translation id="1552301827267621511">Екстензијата „<ph name="EXTENSION_NAME" />“ го смени пребарувачот и ќе го користи <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Управувај со наставка</translation> <translation id="1553538517812678578">неограничено</translation> <translation id="1555130319947370107">Сина</translation> <translation id="1556537182262721003">Не може да го премести директориумот за наставки во профилот.</translation> @@ -2804,7 +2805,6 @@ <translation id="3842552989725514455">Фонт Serif</translation> <translation id="3843464315703645664">Внатрешно ставена на списокот на дозволен пристап</translation> <translation id="3844888638014364087">Внесено е емоџи</translation> -<translation id="384513009320852920">Проверете дали уредот со Bluetooth е во режим на спарување и во близина. <ph name="BEGIN_LINK_LEARN_MORE" />Дознајте повеќе<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Добијте алатки за програмирање веб-сајтови, апликации за Android и друго. Ако инсталирате Linux, ќе се преземат <ph name="DOWNLOAD_SIZE" /> податоци.</translation> <translation id="3847319713229060696">Помогнете да се подобри безбедноста на интернет за сите</translation> <translation id="3848547754896969219">Отвори во &прозорец „Инкогнито“</translation> @@ -4316,7 +4316,6 @@ <translation id="5485102783864353244">Додај апликација</translation> <translation id="5485754497697573575">Обнови ги сите картички</translation> <translation id="5486261815000869482">Потврди лозинка</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> го споделува вашиот екран со <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Симулирај рестартирање на прелистувач</translation> <translation id="5487460042548760727">Преименувајте го профилот во <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Избриши податоци</translation> @@ -4378,6 +4377,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> сака да</translation> <translation id="5534304873398226603">Отфрли фотографија или видео</translation> <translation id="5535941515421698170">Исто така, отстранете ги постојните податоци од уредов</translation> +<translation id="5537725057119320332">Емитувај</translation> <translation id="5539221284352502426">Серверот ја одби лозинката што ја внесовте. Можни причини за тоа се: лозинката е премногу кратка; лозинката мора да содржи броеви или симболи; лозинката мора да се разликува од претходните лозинки.</translation> <translation id="5541694225089836610">Дејството е оневозможено од администраторот</translation> <translation id="5542132724887566711">Профил</translation> @@ -4608,6 +4608,7 @@ <translation id="5787146423283493983">Клучен договор</translation> <translation id="5787420647064736989">Име на уредот</translation> <translation id="5788367137662787332">Извинете, најмалку една партиција на уредот <ph name="DEVICE_LABEL" /> не може да се постави.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Успешно</translation> <translation id="5790651917470750848">Проследувањето на портата веќе постои</translation> <translation id="5792728279623964091">Допрете го копчето за вклучување</translation> @@ -4840,10 +4841,8 @@ <ph name="BEGIN_PARAGRAPH2" />Може да ја исклучите „Локацијата“ со исклучување на главната поставка „Локација“ на уредот. Може да го исклучите и користењето Wi-Fi, мобилни мрежи и сензори за локација во поставките за локација.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Излези од цел екран</translation> <translation id="6042308850641462728">Повеќе</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> споделува картичка на Chrome со <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Неуспешно анализирање на конфигурацијата</translation> <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="6049797270917061226">Датотекава може да дозволи напаѓачи да ги украдат вашите лични податоци.</translation> @@ -7349,7 +7348,6 @@ <translation id="8655295600908251630">Канал</translation> <translation id="8655972064210167941">Најавувањето не успеа бидејќи не може да се потврди вашата лозинка. Контактирајте со администраторот или обидете се повторно.</translation> <translation id="8657393004602556571">Дали сакате да ги откажете повратните информации?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> ги споделува вашиот екран и аудио со <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Отвори ја врската во инко&гнито прозорец</translation> <translation id="8662671328352114214">Придружување на мрежа <ph name="TYPE" /></translation> <translation id="8662733268723715832">Ова трае подолго од очекуваното, може да прескокнете или да почекате да заврши.</translation> @@ -7645,7 +7643,6 @@ <translation id="8941173171815156065">Отповикај ја дозволата „<ph name="PERMISSION" />“</translation> <translation id="894360074127026135">Меѓународно покачување на Netscape</translation> <translation id="8944099748578356325">Ја троши батеријата побрзо (во моментов <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> споделува прозорец со <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Големина на иконата</translation> <translation id="8946359700442089734">Функциите за отстранување грешки не се целосно овозможени на овој уред со <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Добро</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 393e690..d1ebd7bd 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -532,6 +532,7 @@ <translation id="1549275686094429035">ARC പ്രവർത്തനക്ഷമമാക്കി</translation> <translation id="1549788673239553762"><ph name="APP_NAME" />, <ph name="VOLUME_NAME" /> എന്നത് ആക്സസ് ചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു. ഇത് നിങ്ങളുടെ ഫയലുകൾ പരിഷ്ക്കരിക്കുകയോ ഇല്ലാതാക്കുകയോ ചെയ്യാം</translation> <translation id="1552301827267621511">"<ph name="EXTENSION_NAME" />" വിപുലീകരണം <ph name="SEARCH_PROVIDER_DOMAIN" /> ഉപയോഗിക്കാൻ തിരയൽ മാറ്റി</translation> +<translation id="1552752544932680961">വിപുലീകരണം നിയന്ത്രിക്കുക</translation> <translation id="1553538517812678578">പരിമിതികളില്ലാത്ത</translation> <translation id="1555130319947370107">നീല</translation> <translation id="1556537182262721003">വിപുലീകരണ ഡയറക്ടറി പ്രൊഫൈലിലേക്ക് നീക്കാന് കഴിഞ്ഞില്ല.</translation> @@ -2787,7 +2788,6 @@ <translation id="3842552989725514455">Serif font </translation> <translation id="3843464315703645664">ആന്തരികമായി വൈറ്റ്ലിസ്റ്റ് ചെയ്തത്</translation> <translation id="3844888638014364087">ഇമോജി ചേർത്തു</translation> -<translation id="384513009320852920">നിങ്ങളുടെ Bluetooth ഉപകരണം ജോടിയാക്കൽ മോഡിലാണെന്നും സമീപത്തുണ്ടെന്നും ഉറപ്പാക്കുക. <ph name="BEGIN_LINK_LEARN_MORE" />കൂടുതലറിയുക<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">വെബ്സൈറ്റുകളും Android ആപ്പുകളും മറ്റും വികസിപ്പിച്ചെടുക്കാൻ ടൂളുകൾ നേടുക. Linux ഇൻസ്റ്റാൾ ചെയ്യുമ്പോൾ <ph name="DOWNLOAD_SIZE" /> ഡാറ്റ ഡൗൺലോഡ് ചെയ്യപ്പെടും.</translation> <translation id="3847319713229060696">എല്ലാവർക്കുമായി വെബിലെ സുരക്ഷ മെച്ചപ്പെടുത്താൻ സഹായിക്കുക</translation> <translation id="3848547754896969219">&അദൃശ്യ വിൻഡോയിൽ തുറക്കുക</translation> @@ -4297,7 +4297,6 @@ <translation id="5485102783864353244">ആപ്പ് ചേർക്കുക</translation> <translation id="5485754497697573575">എല്ലാ ടാബുകളും പുനസ്ഥാപിക്കുക</translation> <translation id="5486261815000869482">പാസ്വേഡ് സ്ഥിരീകരിക്കുക</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" />,<ph name="TAB_NAME" /> എന്നതുമായി നിങ്ങളുടെ സ്ക്രീൻ പങ്കിടുന്നു.</translation> <translation id="5486561344817861625">ബ്രൗസർ പുനരാരംഭിക്കൽ പരീക്ഷിക്കുക</translation> <translation id="5487460042548760727"><ph name="PROFILE_NAME" /> എന്നതായി പ്രൊഫൈലിന്റെ പേര് മാറ്റുക</translation> <translation id="5487521232677179737">ഡാറ്റ മായ്ക്കുക</translation> @@ -4359,6 +4358,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ഇത് ചെയ്യാൻ ആവശ്യപ്പെടുന്നു</translation> <translation id="5534304873398226603">ഫോട്ടോയോ വീഡിയോയോ തള്ളിക്കളയുക</translation> <translation id="5535941515421698170">ഈ ഉപകരണത്തിൽ നിന്ന് നിലവിലുള്ള വിവരങ്ങളും നീക്കംചെയ്യുക</translation> +<translation id="5537725057119320332">കാസ്റ്റ്</translation> <translation id="5539221284352502426">നിങ്ങൾ നൽകിയ പാസ്വേഡ് സെർവർ നിരസിച്ചു. സാധ്യമായ കാരണങ്ങൾ ഇവയാണ്: പാസ്വേഡ് വളരെ ചെറുതാണ്. പാസ്വേഡിൽ അക്കങ്ങളും ചിഹ്നങ്ങളും അടങ്ങിയിരിക്കണം. പുതിയ പാസ്വേഡ്, മുമ്പ് ഉപയോഗിച്ചിട്ടുള്ള പാസ്വേഡുകളിൽ നിന്ന് വ്യത്യസ്തമായിരിക്കണം.</translation> <translation id="5541694225089836610">പ്രവർത്തനം നിങ്ങളുടെ അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കി</translation> <translation id="5542132724887566711">പ്രൊഫൈൽ</translation> @@ -4590,6 +4590,7 @@ <translation id="5787146423283493983">കീ കരാര്</translation> <translation id="5787420647064736989">ഉപകരണത്തിന്റെ പേര്</translation> <translation id="5788367137662787332">ക്ഷമിക്കണം, <ph name="DEVICE_LABEL" /> എന്ന ഉപകരണത്തിലെ ഏറ്റവും കുറഞ്ഞത് ഒരു ഭാഗം പോലും മൗണ്ട് ചെയ്യാൻ കഴിഞ്ഞില്ല.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">വിജയകരം</translation> <translation id="5790651917470750848">പോർട്ട് ഫോർവേഡ് ഇതിനകം തന്നെ നിലവിലുള്ളതാണ്.</translation> <translation id="5792728279623964091">നിങ്ങളുടെ പവർ ബട്ടൺ ടാപ്പ് ചെയ്യുക</translation> @@ -4822,10 +4823,8 @@ <ph name="BEGIN_PARAGRAPH2" />നിങ്ങളുടെ ഉപകരണത്തിലെ പ്രധാന ലൊക്കേഷൻ ക്രമീകരണം ഓഫാക്കി, നിങ്ങൾക്ക് ലൊക്കേഷൻ ഓഫാക്കാം. ലൊക്കേഷന് വേണ്ടിയുള്ള വൈഫൈ, മൊബൈൽ നെറ്റ്വർക്കുകൾ, സെൻസറുകൾ എന്നിവയുടെ ഉപയോഗവും ലൊക്കേഷൻ ക്രമീകരണത്തിൽ ഓഫാക്കാനാവും.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">മുഴുവൻസ്ക്രീനിൽ നിന്നും നിർഗമിക്കുക</translation> <translation id="6042308850641462728">കൂടുതൽ</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> എന്നതുമായി Chrome ടാബ് പങ്കിടുന്നു.</translation> <translation id="604388835206766544">കോൺഫിഗറേഷൻ പാഴ്സ് ചെയ്യാനായില്ല</translation> <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="6049797270917061226">ആക്രമണകാരികളെ നിങ്ങളുടെ വ്യക്തിപരമായ വിവരങ്ങൾ മോഷ്ടിക്കാൻ ഈ ഫയൽ അനുവദിച്ചേക്കാം.</translation> @@ -7329,7 +7328,6 @@ <translation id="8655295600908251630">ചാനല്</translation> <translation id="8655972064210167941">നിങ്ങളുടെ പാസ്വേഡ് പരിശോധിച്ചുറപ്പിക്കാനാകാത്തതിനാൽ സൈൻ ഇൻ ചെയ്യുന്നതിന് പരാജയപ്പെട്ടു. അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുകയോ വീണ്ടും ശ്രമിക്കുകയോ ചെയ്യുക.</translation> <translation id="8657393004602556571">ഫീഡ്ബാക്ക് ഉപേക്ഷിക്കണോ?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> എന്നതുമായി നിങ്ങളുടെ സ്ക്രീനും ഓഡിയോയും പങ്കിടുന്നു.</translation> <translation id="8661290697478713397">അദൃശ്യ വിൻഡോയിൽ ലിങ്ക് തുറക്കുക</translation> <translation id="8662671328352114214"><ph name="TYPE" /> നെറ്റ്വർക്കിൽ ചേരുക</translation> <translation id="8662733268723715832">ഇത് പ്രതീക്ഷിച്ചതിലും കൂടുതൽ സമയമെടുക്കുന്നു, ഇത് പൂർത്തിയാകുന്നത് വരെ നിങ്ങൾക്ക് ഒഴിവാക്കുകയോ കാത്തിരിക്കുകയോ ചെയ്യാം.</translation> @@ -7623,7 +7621,6 @@ <translation id="8941173171815156065">'<ph name="PERMISSION" />' എന്ന അനുമതി റദ്ദാക്കുക</translation> <translation id="894360074127026135">നെറ്റ്സ്കേപ്പ് അന്തര്ദ്ദേശീയ സ്റ്റെപ്പ്-അപ്പ്</translation> <translation id="8944099748578356325">കൂടുതൽ വേഗത്തിൽ ബാറ്ററി ഉപയോഗിക്കുക (നിലവിൽ <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> എന്നതുമായി ഒരു വിൻഡോ പങ്കിടുന്നു.</translation> <translation id="8945274638472141382">ഐക്കൺ വലുപ്പം</translation> <translation id="8946359700442089734">ഈ <ph name="IDS_SHORT_PRODUCT_NAME" /> ഉപകരണത്തിൽ ഡീബഗ് ചെയ്യൽ ഫീച്ചറുകൾ പൂർണ്ണമായി പ്രവർത്തനക്ഷമമാക്കിയിട്ടില്ല.</translation> <translation id="894763922177556086">നല്ലത്</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 41a1c5f..3de425ee 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -533,6 +533,7 @@ <translation id="1549275686094429035">ARC-г идэвхжүүлсэн</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> нь <ph name="VOLUME_NAME" /> руу нэвтрэхийг хүсч байна. Энэ нь таны файлуудыг өөрчилж эсвэл устгаж болно.</translation> <translation id="1552301827267621511">"<ph name="EXTENSION_NAME" />" өргөтгөл хайлтыг <ph name="SEARCH_PROVIDER_DOMAIN" />-г ашиглах болгож өөрчилсөн байна</translation> +<translation id="1552752544932680961">Өргөтгөлийг удирдах</translation> <translation id="1553538517812678578">хязгааргүй</translation> <translation id="1555130319947370107">Цэнхэр</translation> <translation id="1556537182262721003">Өргөтгөлийн директорыг профайл руу зөөж чадсангүй.</translation> @@ -2799,7 +2800,6 @@ <translation id="3842552989725514455">Шовх үзүүртэй үгсийн фонт</translation> <translation id="3843464315703645664">Дотооддоо зөвшөөрсөн жагсаалт</translation> <translation id="3844888638014364087">Эможиг оруулсан</translation> -<translation id="384513009320852920">Bluetooth төхөөрөмжөө хослуулах горим болон ойролцоо байгаа эсэхийг шалгаарай. <ph name="BEGIN_LINK_LEARN_MORE" />Нэмэлт мэдээлэл авах<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Вебсайт, Android апп болон бусад зүйлийг хөгжүүлэхэд зориулсан хэрэгслийг аваарай. Linux-г суулгаснаар <ph name="DOWNLOAD_SIZE" /> өгөгдөл татаж авах болно.</translation> <translation id="3847319713229060696">Хүн бүрийн төлөө вебийн аюулгүй байдлыг сайжруулахад туслах</translation> <translation id="3848547754896969219">&Нууцлалтай цонхонд нээх</translation> @@ -4310,7 +4310,6 @@ <translation id="5485102783864353244">Апп нэмэх</translation> <translation id="5485754497697573575">Бүх Tab-г дахин сэргээх</translation> <translation id="5486261815000869482">Нууц үгийг баталгаажуул</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> нь таны дэлгэцийг <ph name="TAB_NAME" />-тай хуваалцаж байна.</translation> <translation id="5486561344817861625">Simulate Browser Restart</translation> <translation id="5487460042548760727">Профайлын нэрийг <ph name="PROFILE_NAME" /> болгож өөрчлөх</translation> <translation id="5487521232677179737">Өгөгдлийг устгах</translation> @@ -4372,6 +4371,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" />-нь дараах хүсэлтэй байна</translation> <translation id="5534304873398226603">Зураг эсвэл видеог устгах</translation> <translation id="5535941515421698170">Мөн одоогийн өгөгдлөө энэ төхөөрөмжөөс устгана уу</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">Таны оруулсан нууц үгийг серверээс зөвшөөрөөгүй байна. Үүнд дараах шалтгаан байж болно: Нууц үг хэт богино. Нууц үг тоо эсвэл тэмдэгт агуулах ёстой. Нууц үг нь өмнөх нууц үгээс өөр байх шаардлагатай.</translation> <translation id="5541694225089836610">Таны админ үйлдлийг идэвхгүй болгосон байна</translation> <translation id="5542132724887566711">Танилцуулга</translation> @@ -4603,6 +4603,7 @@ <translation id="5787146423283493983">Гол хэлэлцээр</translation> <translation id="5787420647064736989">Төхөөрөмжийн нэр</translation> <translation id="5788367137662787332">Уучлаарай, <ph name="DEVICE_LABEL" /> төхөөрөмжийн ядаж нэг хуваалтыг засаж чадсангүй.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Амжилттай гүйцэтгэлээ</translation> <translation id="5790651917470750848">Порт дамжуулах оролт аль хэдийн байна</translation> <translation id="5792728279623964091">Асаах товчийг товшино уу</translation> @@ -4834,10 +4835,8 @@ <ph name="BEGIN_PARAGRAPH2" />Та төхөөрөмжийнхөө Байршлын үндсэн тохиргоог унтрааж, Байршлыг унтраах боломжтой. Түүнчлэн та байршлын Wi‑Fi, мобайл сүлжээ болон мэдрэгчийн ашиглалтыг байршлын тохиргоонд унтрааж болно.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Бүтэн дэлгэцээс гарах</translation> <translation id="6042308850641462728">Илүү их</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> нь Chrome-н чихтэй хуудсыг <ph name="TAB_NAME" />-тай хуваалцаж байна.</translation> <translation id="604388835206766544">Тохируулгын задаргаа амжилтгүй боллоо</translation> <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="6049797270917061226">Энэ файл нь халдагчдад таны хувийн мэдээллийг хулгайлах боломжийг олгож болзошгүй.</translation> @@ -7338,7 +7337,6 @@ <translation id="8655295600908251630">Суваг</translation> <translation id="8655972064210167941">Таны нууц үгийг баталгаажуулж чадаагүй тул нэвтэрч чадсангүй. Та админтайгаа холбогдох, эсвэл дахин оролдох хэрэгтэй.</translation> <translation id="8657393004602556571">Та санал хүсэлтээ болихыг хүсэж байна уу?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> нь таны дэлгэц болон дууг <ph name="TAB_NAME" />-тай хуваалцаж байна.</translation> <translation id="8661290697478713397">Холбоосыг нууцлалтай цонхонд нээх</translation> <translation id="8662671328352114214"><ph name="TYPE" /> сүлжээнд нэгдэх</translation> <translation id="8662733268723715832">Энэ нь ердийнхөөс удаж байгаа бөгөөд та алгасах эсвэл үүнийг дуусах хүртэл нь хүлээх боломжтой.</translation> @@ -7631,7 +7629,6 @@ <translation id="8941173171815156065">Зөвшөөрлийг "<ph name="PERMISSION" />" хүчингүй болго</translation> <translation id="894360074127026135">Нетскейп олон улсын хурдасгагч</translation> <translation id="8944099748578356325">Батерейг илүү хурдан ашиглах (одоогоор <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> нь <ph name="TAB_NAME" />-тай цонх хуваалцаж байна.</translation> <translation id="8945274638472141382">Дүрс тэмдгийн хэмжээ</translation> <translation id="8946359700442089734">Энэ <ph name="IDS_SHORT_PRODUCT_NAME" /> төхөөрөмж дээр алдаа засах тохиргоог бүрэн идэвхжүүлээгүй байна.</translation> <translation id="894763922177556086">Сайн</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 14ce3ef..6d867c30 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -536,6 +536,7 @@ <translation id="1549275686094429035">ARC सुरू केले</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> <ph name="VOLUME_NAME" /> ॲक्सेस करू इच्छित आहे. हे तुमच्या फायलीमध्ये फेरफार करू किंवा त्या हटवू शकते.</translation> <translation id="1552301827267621511"><ph name="SEARCH_PROVIDER_DOMAIN" /> वापरण्यासाठी "<ph name="EXTENSION_NAME" />" एक्स्टेंशनने शोधामध्ये बदल केला आहे</translation> +<translation id="1552752544932680961">विस्तार व्यवस्थापित करा</translation> <translation id="1553538517812678578">अमर्यादित</translation> <translation id="1555130319947370107">निळा</translation> <translation id="1556537182262721003">प्रोफाइलमध्ये एक्स्टेंशन डिरेक्टरी हलविणे शक्य नाही.</translation> @@ -2802,7 +2803,6 @@ <translation id="3842552989725514455">Serif font</translation> <translation id="3843464315703645664">अंतर्गतरीत्या अनुमती दिलेली सूची</translation> <translation id="3844888638014364087">इमोजी घातली</translation> -<translation id="384513009320852920">तुमचे ब्लूटूथ डिव्हाइस हे पेअरिंग मोडमध्ये आणि जवळपास असल्याची खात्री करा. <ph name="BEGIN_LINK_LEARN_MORE" />अधिक जाणून घ्या<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">वेबसाइट, Android ॲप्स आणि बरेच काही विकसित करण्यासाठी टूल मिळवा. Linux इंस्टॉल केल्याने <ph name="DOWNLOAD_SIZE" /> डेटा डाउनलोड केला जाईल.</translation> <translation id="3847319713229060696">वेबवरील प्रत्येकासाठी सुरक्षिततेत सुधारणा करण्यात मदत करा</translation> <translation id="3848547754896969219">गुप्त विंडोमध्ये उघडा</translation> @@ -4312,7 +4312,6 @@ <translation id="5485102783864353244">ॲप्लिकेशन जोडा</translation> <translation id="5485754497697573575">सर्व टॅब पुनर्संचयित करा</translation> <translation id="5486261815000869482">पासवर्ड कन्फर्म करा</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> तुमची स्क्रीन <ph name="TAB_NAME" /> सह शेअर करत आहे.</translation> <translation id="5486561344817861625">ब्राउझर रीस्टार्ट प्रतिकृती करा</translation> <translation id="5487460042548760727">प्रोफाइलचे नाव <ph name="PROFILE_NAME" /> वर बदला</translation> <translation id="5487521232677179737">डेटा साफ करा</translation> @@ -4374,6 +4373,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ला हे करायचे आहे</translation> <translation id="5534304873398226603">फोटो किंवा व्हिडिओ टाकून द्या</translation> <translation id="5535941515421698170">या डिव्हाइस मधून तुमचा विद्यमान डेटा देखील हटवा</translation> +<translation id="5537725057119320332">कास्ट करा</translation> <translation id="5539221284352502426">तुम्ही टाकलेला पासवर्ड सर्व्हरने नाकारला होता. संभाव्य कारणांमध्ये याचा समावेश आहे: पासवर्ड खूप लहान आहे. पासवर्डमध्ये संख्या किंवा आयकन असणे आवश्यक आहे. पासवर्ड आधीच्या पासवर्डपेक्षा वेगळा असणे आवश्यक आहे.</translation> <translation id="5541694225089836610">तुमच्या ॲडमिनिस्ट्रेटरने क्रिया बंद केली आहे</translation> <translation id="5542132724887566711">प्रोफाइल</translation> @@ -4604,6 +4604,7 @@ <translation id="5787146423283493983">की करार</translation> <translation id="5787420647064736989">डिव्हाइसचे नाव</translation> <translation id="5788367137662787332">क्षमस्व, <ph name="DEVICE_LABEL" /> डिव्हाइसवरील कमीत कमी एक विभाग बसविला जाऊ शकत नाही.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">यशस्वी</translation> <translation id="5790651917470750848">पोर्ट फॉरवर्ड आधीपासून अस्तित्वात आहे</translation> <translation id="5792728279623964091">कृपया तुमच्या पॉवर बटणावर टॅप करा</translation> @@ -4837,10 +4838,8 @@ <ph name="BEGIN_PARAGRAPH2" />तुम्ही या डिव्हाइसवरील मुख्य स्थान सेटिंग बंद करून स्थान बंद करू शकता. तुम्ही स्थान सेटिंग्जमध्ये स्थानासाठी वाय-फाय, मोबाइल नेटवर्क आणि सेंसरचा वापर देखील बंद करू शकता.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">क्षेत्रेमधून बाहेर पडा</translation> <translation id="6042308850641462728">अधिक</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> Chrome टॅब <ph name="TAB_NAME" /> सह शेअर करीत आहे.</translation> <translation id="604388835206766544">कॉंफिगरेशन पार्स करता आले नाही</translation> <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="6049797270917061226">ही फाइल हल्लेखोरांना तुमची वैयक्तिक माहिती चोरी करण्याची अनुमती देऊ शकेल.</translation> @@ -7342,7 +7341,6 @@ <translation id="8655295600908251630">खाडी</translation> <translation id="8655972064210167941">साइन-इन अयशस्वी झाले कारण तुमचा पासवर्डची पडताळणी करणे शक्य झाले नाही. कृपया तुमच्या ॲडमिनिस्ट्रेटरला संपर्क साधा किंवा पुन्हा प्रयत्न करा.</translation> <translation id="8657393004602556571">तुम्हाला फीडबॅक काढून टाकायचा आहे का?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> तुमची स्क्रीन आणि ऑडिओ <ph name="TAB_NAME" /> सह शेअर करीत आहे.</translation> <translation id="8661290697478713397">गुप्त विंडोमध्ये लिंक उघडा</translation> <translation id="8662671328352114214"><ph name="TYPE" /> नेटवर्कमध्ये सामील व्हा</translation> <translation id="8662733268723715832">हे अपेक्षेपेक्षा जास्त वेळ घेत आहे. तुम्ही वगळू शकता किंवा पूर्ण होईपर्यंत प्रतीक्षा करू शकता.</translation> @@ -7638,7 +7636,6 @@ <translation id="8941173171815156065">'<ph name="PERMISSION" />' परवानगी मागे घ्या</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">अधिक द्रुतपणे बॅटरी वापरा (सध्या <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> विंडो <ph name="TAB_NAME" /> सह शेअर करीत आहे.</translation> <translation id="8945274638472141382">आयकन आकार</translation> <translation id="8946359700442089734">या <ph name="IDS_SHORT_PRODUCT_NAME" /> डिव्हाइसवर डीबगिंग वैशिष्ट्ये पूर्णपणे सक्षम केलेली नव्हती.</translation> <translation id="894763922177556086">चांगला</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 5e7ad619..378bd82 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -536,6 +536,7 @@ <translation id="1549275686094429035">ARC Didayakan</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> ingin mengakses <ph name="VOLUME_NAME" />. Apl mungkin mengubah suai atau memadamkan fail anda.</translation> <translation id="1552301827267621511">Sambungan "<ph name="EXTENSION_NAME" />" telah menukar carian agar menggunakan <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Uruskan sambungan</translation> <translation id="1553538517812678578">tidak terhad</translation> <translation id="1555130319947370107">Biru</translation> <translation id="1556537182262721003">Tidak dapat menggerakkan direktori sambungan ke profil.</translation> @@ -2803,7 +2804,6 @@ <translation id="3842552989725514455">Fon Serif</translation> <translation id="3843464315703645664">Senarai izin dalaman</translation> <translation id="3844888638014364087">Emoji disisipkan</translation> -<translation id="384513009320852920">Pastikan peranti Bluetooth anda dalam mod penggandingan dan berdekatan. <ph name="BEGIN_LINK_LEARN_MORE" />Ketahui lebih lanjut<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Dapatkan alatan untuk membangunkan laman web, apl Android dan pelbagai lagi. Pemasangan Linux akan memuat turun <ph name="DOWNLOAD_SIZE" /> data.</translation> <translation id="3847319713229060696">Bantu tingkatkan keselamatan di web untuk semua orang</translation> <translation id="3848547754896969219">Buka dalam tetingkap &Inkognito</translation> @@ -4315,7 +4315,6 @@ <translation id="5485102783864353244">Tambah apl</translation> <translation id="5485754497697573575">Pulihkan Semua Tab</translation> <translation id="5486261815000869482">Sahkan kata laluan</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> mengongsi skrin anda dengan <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Rangsang Mula Semula Penyemak Imbas</translation> <translation id="5487460042548760727">Namakan semula profil kepada <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Kosongkan data</translation> @@ -4377,6 +4376,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ingin</translation> <translation id="5534304873398226603">Buang foto atau video</translation> <translation id="5535941515421698170">Turut mengalih keluar data sedia ada anda daripada peranti ini</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">Kata laluan yang anda masukkan telah ditolak oleh pelayan. Sebab yang mungkin termasuk: Kata laluan terlalu pendek. Kata laluan mesti merangkumi nombor atau simbol. Kata laluan mesti berbeza daripada kata laluan yang sebelumnya.</translation> <translation id="5541694225089836610">Tindakan dilumpuhkan oleh pentadbir anda</translation> <translation id="5542132724887566711">Profil</translation> @@ -4607,6 +4607,7 @@ <translation id="5787146423283493983">Perjanjian Penting</translation> <translation id="5787420647064736989">Nama peranti</translation> <translation id="5788367137662787332">Maaf, sekurang-kurangnya satu pemetakan pada peranti <ph name="DEVICE_LABEL" /> tidak dapat dilekapkan.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Berjaya</translation> <translation id="5790651917470750848">Kiriman semula sudah wujud</translation> <translation id="5792728279623964091">Sila ketik butang kuasa anda</translation> @@ -4839,10 +4840,8 @@ <ph name="BEGIN_PARAGRAPH2" />Anda boleh mematikan Lokasi dengan mematikan tetapan Lokasi utama pada peranti anda. Anda juga boleh mematikan penggunaan Wi-Fi, rangkaian mudah alih dan penderia untuk lokasi dalam tetapan lokasi.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Keluar Daripada Skrin Penuh</translation> <translation id="6042308850641462728">Lagi</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> berkongsi tab Chrome dengan <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Gagal menghuraikan konfigurasi</translation> <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="6049797270917061226">Fail ini dapat membolehkan penyerang mencuri maklumat peribadi anda.</translation> @@ -7347,7 +7346,6 @@ <translation id="8655295600908251630">Saluran</translation> <translation id="8655972064210167941">Log masuk gagal kerana kata laluan anda tidak dapat disahkan. Sila hubungi pentadbir anda atau cuba lagi.</translation> <translation id="8657393004602556571">Adakah anda ingin membuang maklum balas?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> berkongsi skrin dan audio anda dengan <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Buka Pautan dalam Tetingkap Inko&gnito</translation> <translation id="8662671328352114214">Sertai rangkaian <ph name="TYPE" /></translation> <translation id="8662733268723715832">Proses ini mengambil masa lebih lama daripada jangkaan, anda boleh melangkau atau menunggu sehingga selesai.</translation> @@ -7642,7 +7640,6 @@ <translation id="8941173171815156065">Tarik balik kebenaran '<ph name="PERMISSION" />'</translation> <translation id="894360074127026135">Peningkatan Antarabangsa Netscape</translation> <translation id="8944099748578356325">Gunakan bateri dengan lebih cepat (pada masa ini <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> berkongsi tetingkap dengan <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Saiz ikon</translation> <translation id="8946359700442089734">Ciri penyahpepijatan tidak didayakan sepenuhnya pada peranti ini <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Bagus</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 65969d2..e34affa 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -535,6 +535,7 @@ <translation id="1549275686094429035">ARC ဖွင့်ထားသည်</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> သည် <ph name="VOLUME_NAME" /> သို့ ဝင်ရောက်သုံးခွင့် ရလိုသည်။ ၎င်းသည် သင့်ဖိုင်များအား ပြင်ဆင်ခြင်း သို့မဟုတ် ဖျက်ပစ်ခြင်းများ ပြုလုပ်နိုင်သည်။</translation> <translation id="1552301827267621511"><ph name="SEARCH_PROVIDER_DOMAIN" /> အသုံးပြုရန် <ph name="EXTENSION_NAME" /> နောက်ဆက်တွဲက ရှာဖွေမှုစနစ်ကို ပြောင်းလိုက်သည်</translation> +<translation id="1552752544932680961">အိတ်စတန်းရှင်း စီမံမည်</translation> <translation id="1553538517812678578">အကန့်အသတ်မရှိ</translation> <translation id="1555130319947370107">အပြာရောင်</translation> <translation id="1556537182262721003">တိုးချဲ့မှုကို ပရိုဖိုင် ထဲကို တိုက်ရိုက် ရွှေ့မပေးနိုင်ပါ။</translation> @@ -2801,7 +2802,6 @@ <translation id="3842552989725514455">Serif ဖောင့်</translation> <translation id="3843464315703645664">စက်အတွင်း ခွင့်ပြုစာရင်း</translation> <translation id="3844888638014364087">အီမိုဂျီ ထည့်ထားသည်</translation> -<translation id="384513009320852920">သင့်ဘလူးတုသ်သုံးစက်သည် တွဲချိတ်ခြင်းမုဒ်တွင် ရှိပြီး အနီးအနားတွင် ရှိနေကြောင်း သေချာပါစေ။ <ph name="BEGIN_LINK_LEARN_MORE" />ပိုမိုလေ့လာရန်<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">ဝဘ်ဆိုက်များ၊ Android အက်ပ်များနှင့် အခြားအရာများ တီထွင်ရန် တူးလ်များ ရယူပါ။ Linux ကို ထည့်သွင်းခြင်းက ဒေတာ <ph name="DOWNLOAD_SIZE" /> ကို ဒေါင်းလုဒ်လုပ်သွားပါမည်။</translation> <translation id="3847319713229060696">လူတိုင်းအတွက် ဝဘ်ပေါ်တွင် လုံခြုံရေးပိုမိုကောင်းမွန်လာအောင် ကူညီပါ</translation> <translation id="3848547754896969219">&ရုပ်ဖျက် ဝင်းဒိုးတွင် ဖွင့်ရန်</translation> @@ -4312,7 +4312,6 @@ <translation id="5485102783864353244">အပ်ဖ်ပေါင်းထည့်မည်</translation> <translation id="5485754497697573575">တဲဘ်မျာ အားလုံး ပြန်ဖေါ်ထုတ်ရန်</translation> <translation id="5486261815000869482">စကားဝှက် အတည်ပြုရန်</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> က သင်၏ မျက်နှာပြင်ကို <ph name="TAB_NAME" />အာ မျှဝေပေးနေသည်။</translation> <translation id="5486561344817861625">ဘရောင်ဇာ စတင်မှု ဟန်ပြပြုလုပ်ရန်</translation> <translation id="5487460042548760727">ပရိုဖိုင်ကို <ph name="PROFILE_NAME" /> ဟု အမည်ပြောင်းရန်</translation> <translation id="5487521232677179737">ဒေတာများကို ရှင်းလင်းပါ</translation> @@ -4374,6 +4373,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> က ပြုလုပ်လိုသည်မှာ</translation> <translation id="5534304873398226603">ဓာတ်ပုံ သို့မဟုတ် ဗီဒီယိုကို ဖယ်ပစ်ရန်</translation> <translation id="5535941515421698170">သင်၏ လက်ရှိဒေတာများကို ဤစက်ပစ္စည်းမှ ဖယ်ရှားလိုက်ပါမည်</translation> +<translation id="5537725057119320332">သရုပ်ဆောင်များ</translation> <translation id="5539221284352502426">သင်ထည့်ထားသော စကားဝှက်ကို ဆာဗာမှ ငြင်းဆိုလိုက်သည်။ ဖြစ်နိုင်သည့် အကြောင်းရင်းများတွင် − စကားဝှက်တိုလွန်းခြင်းတို့ ပါဝင်သည်။ စကားဝှက်တွင် နံပါတ် သို့မဟုတ် သင်္ကေတများ ပါရမည်။ စကားဝှက်သည် ယခင်စကားဝှက်များနှင့် ကွဲပြားရမည်။</translation> <translation id="5541694225089836610">လုပ်ဆောင်ချက်ကို သင့်စီမံခန့်ခွဲသူက ပိတ်ထားပါသည်</translation> <translation id="5542132724887566711">ပရိုဖိုင်</translation> @@ -4605,6 +4605,7 @@ <translation id="5787146423283493983">ကီးဘုတ် သဘောတူညီချက်</translation> <translation id="5787420647064736989">စက်အမည်</translation> <translation id="5788367137662787332">ဆော်ရီး၊ အနည်းဆုံးအားဖြင့် ကိရိယာ <ph name="DEVICE_LABEL" /> ပေါ်က အကန့် တစ်ခုကို တပ်မထားရန် လိုသည်။</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">အောင်မြင်ခြင်း</translation> <translation id="5790651917470750848">ပို့တ်ထပ်ဆင့်ပို့ခြင်း ရှိပြီးဖြစ်သည်</translation> <translation id="5792728279623964091">သင့်ဖွင့်ပိတ်ခလုတ်ကို တို့ပါ</translation> @@ -4835,10 +4836,8 @@ <ph name="BEGIN_PARAGRAPH2" />ဤစက်ပေါ်ရှိ ပင်မ 'တည်နေရာ' ဆက်တင်ကို ပိတ်ခြင်းဖြင့် 'တည်နေရာ' ကို ပိတ်နိုင်သည်။တည်နေရာဆက်တင်များတွင် Wi-Fi၊ မိုဘိုင်းကွန်ရက်နှင့် တည်နေရာအတွက် အာရုံခံစနစ်များ အသုံးပြုခြင်းကိုလည်း ပိတ်နိုင်သည်။<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">မျက်နှာပြင်အပြည့်မုဒ်မှ ထွက်ရန်</translation> <translation id="6042308850641462728">နောက်ထပ်</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> သည် Chrome တဘ်ကို <ph name="TAB_NAME" /> ဖြင့်မျှဝေနေသည်။</translation> <translation id="604388835206766544">စီစဉ်သတ်မှတ်မှုကို ခွဲခြမ်းစိတ်ဖြာ၍မရပါ</translation> <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="6049797270917061226">ဤဖိုင်သည် တိုက်ခိုက်သူများအား သင်၏ကိုယ်ရေးကိုယ်တာအချက်လက်များကို ခိုးယူခွင့်ပေးနိုင်သည်။</translation> @@ -7340,7 +7339,6 @@ <translation id="8655295600908251630">လိုင်း</translation> <translation id="8655972064210167941">သင့်စကားဝှက်အား အတည်ပြုနိုင်သောကြောင့် လက်မှတ်ထိုးဝင်ရောက်မှု မအောင်မြင်ပါ။ ကျေးဇူးပြု၍ သင့်ကြီးကြပ်သူကို ဆက်သွယ်ပါ သို့မဟုတ် နောက်တစ်ကြိမ်ကြိုးစားပါ။</translation> <translation id="8657393004602556571">အကြံပြုချက်ကို ဖယ်ပစ်လိုသလား။</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> သည် သင့်ဖန်သားပြင်နှင့် အသံကို <ph name="TAB_NAME" /> နှင့်မျှဝေနေပါသည်။</translation> <translation id="8661290697478713397">ရုပ်&ဖျက် ဝင်ဒိုး ထဲမှာ လင့်ကို ဖွင့်ရန်</translation> <translation id="8662671328352114214"><ph name="TYPE" /> ကွန်ရက်သို့ ချိတ်ခြင်း</translation> <translation id="8662733268723715832">မျှော်မှန်းထားသည်ထက် ပိုကြာနေသည်။ ၎င်းကို ကျော်နိုင်သည် (သို့) ပြီးသည်အထိ စောင့်နိုင်သည်။</translation> @@ -7635,7 +7633,6 @@ <translation id="8941173171815156065">ခွင့်ပြုချက် '<ph name="PERMISSION" />'ကို ရုပ်သိမ်းရန်</translation> <translation id="894360074127026135">Netscape အပြည်ပြည်ဆိုင်ရာ Step-Up</translation> <translation id="8944099748578356325">ဘက်ထရီကို ပိုမိုလျှင်မြန်စွာ အသုံးပြုမည် (လက်ရှိ <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> သည် ဝင်းဒိုးတစ်ခုကို <ph name="TAB_NAME" /> နှင့်မျှဝေနေပါသည်။</translation> <translation id="8945274638472141382">သင်္ကေတ အရွယ်အစား</translation> <translation id="8946359700442089734">ဤ<ph name="IDS_SHORT_PRODUCT_NAME" /> ကိရိယာပေါ်တွင် ချို့ယွင်းချက်ရှာဖွေပြင်ဆင်ခြင်း အင်္ဂါရပ်အား အပြည့်အဝ မဖွင့်ထားပါ။</translation> <translation id="894763922177556086">ကောင်း</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 8429b11..ece94d6 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -158,6 +158,7 @@ <translation id="1152346050262092795">आफ्नो खाता पुष्टि गर्न कृपया फेरि पासवर्ड हाल्नुहोस्।</translation> <translation id="1153356358378277386">कनेक्ट गरिएका डिभाइस</translation> <translation id="1153636665119721804">Google को सुरक्षासम्बन्धी उन्नत सुविधा कार्यक्रम</translation> +<translation id="1155545602507378023">अहँ, यो डिभाइसमा मात्र</translation> <translation id="1155816283571436363">तपाईंको फोनसँग कनेक्ट गरिँदै छ</translation> <translation id="1158080958325422608">सानो अक्षरमा बदल्नुहोस्</translation> <translation id="1158238185437008462">स्मरणमाहरू हेर्नुहोस्</translation> @@ -392,6 +393,7 @@ <translation id="1410197035576869800">एपको आइकन</translation> <translation id="1410616244180625362">तपाईंको क्यामेरा पहुँचका लागि <ph name="HOST" /> लाई अनुमति दिन जारी राख्नुहोस्</translation> <translation id="1410806973194718079">नीतिहरू जाँच गर्न सकिएन</translation> +<translation id="1412681350727866021">थप एक्स्टेन्सनहरू</translation> <translation id="1414315029670184034">साइटहरूलाई मेरो क्यामेरा प्रयोग गर्ने अनुमति नदिइयोस्</translation> <translation id="1414648216875402825">तपाईं <ph name="PRODUCT_NAME" /> को अस्थिर संस्करणमा अपडेट गर्दै हुनुहुन्छ जुनमा सुविधाहरू हुन्छ जो प्रगतिमा छ। क्रयासहरू र नसोचिएका बगहरू आउनेछ। कृपया सतर्कता सहित जारी राख्नुहोस्।</translation> <translation id="1415708812149920388">क्लिपबोर्ड पढ्ने पहुँच अस्वीकार गरियो</translation> @@ -530,6 +532,7 @@ <translation id="1549275686094429035">ARC सक्षम पारिएको छ</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> ले <ph name="VOLUME_NAME" /> पहुँच गर्न चाहन्छ। यसले तपाईँका फाइलहरू परिमार्जन गर्न वा मेटाउन सक्छ।</translation> <translation id="1552301827267621511">"<ph name="EXTENSION_NAME" />" एक्सटेन्सनले सर्च इन्जिन परिवर्तन गरी <ph name="SEARCH_PROVIDER_DOMAIN" /> बनाएको छ</translation> +<translation id="1552752544932680961">एक्सटेन्सन व्यवस्थित गर्नुहोस्</translation> <translation id="1553538517812678578">असीमित</translation> <translation id="1555130319947370107">निलो</translation> <translation id="1556537182262721003">प्रोफाइलमा एक्स्टेन्शन निर्देशिका सार्न सकिएन।</translation> @@ -934,6 +937,7 @@ <translation id="1937774647013465102">यस यन्त्रमार्फत <ph name="ARCHITECTURE_DEVICE" />प्रकारको कन्टेनरसम्बन्धी वास्तुकला <ph name="ARCHITECTURE_CONTAINER" /> आयात गर्न सकिएन। तपाईं यो कन्टेनरलाई फरक यन्त्रमा पुनर्स्थापना गरी हेर्न सक्नुहुन्छ अथवा तपाईं Files अनुप्रयोगमार्फत खोलेर यस कन्टेनरसम्बन्धी छविभित्रका फाइलहरूमाथि पहुँच राख्न सक्नुहुन्छ।</translation> <translation id="1938351510777341717">बाह्य आदेश</translation> <translation id="1940546824932169984">कनेक्ट गरिएका डिभाइस</translation> +<translation id="1941410638996203291">सुरु हुने समय: <ph name="TIME" /></translation> <translation id="1942128823046546853">सबै वेबसाइटमा भएका तपाईंका सबै डेटा पढ्न तथा बदल्न</translation> <translation id="1942600407708803723">कभर बन्द गरिएको बेला बन्द गर्नुहोस्</translation> <translation id="1944528062465413897">ब्लुटुथबाट जोडा बनाउन प्रयोग गर्नु पर्ने कोड:</translation> @@ -1309,6 +1313,7 @@ <translation id="2320295602967756579">उज्यालो थिम अन गर्नुहोस्</translation> <translation id="2322193970951063277">हेडर तथा फुटरहरू</translation> <translation id="2322318151094136999">कुनै साइटले सिरियल पोर्टहरूमाथि पहुँच गर्न खोज्दा सोध्नुहोस् (सिफारिस गरिएको)</translation> +<translation id="2322622365472107569">अन्त्य हुने समय: <ph name="TIME" /></translation> <translation id="2323018538045954000">सुरक्षित गरिएका Wi-Fi नेटवर्कहरू</translation> <translation id="2325444234681128157">पासवर्ड सम्झनुहोस्</translation> <translation id="2326188115274135041">स्वतः अनलक हुने सुविधा सक्षम पार्न PIN पुष्टि गर्नुहोस्</translation> @@ -1414,6 +1419,7 @@ <translation id="2435248616906486374">सञ्जाल विच्छेद गरियो</translation> <translation id="2435457462613246316">पासवर्ड देखाउनुहोस्</translation> <translation id="2436186046335138073"><ph name="HANDLER_HOSTNAME" /> लाई सबै <ph name="PROTOCOL" /> लिङ्कहरू खोल्ने अनुमति दिने?</translation> +<translation id="2439626940657133600"><ph name="WINDOW_TITLE" /> लोड गरिँदै छ</translation> <translation id="2440604414813129000">स्रो&त हेर्नुहोस्</translation> <translation id="244231003699905658">अमान्य ठेगाना कृपया उक्त ठेगानाको जाँच गरी फेरि प्रयास गर्नुहोस्।</translation> <translation id="2442916515643169563">पाठको छायाँ</translation> @@ -1920,6 +1926,7 @@ <translation id="2935654492420446828">पछि विद्यालयको खाता हाल्नुहोस्</translation> <translation id="2936851848721175671">ब्याकअप तथा पुनर्स्थापना</translation> <translation id="2938225289965773019"><ph name="PROTOCOL" /> लिंकहरू खोल्नुहोस्</translation> +<translation id="2939908794993783865">थप निष्क्रिय साइटहरू</translation> <translation id="2939938020978911855">उपलब्ध ब्लुटुथ यन्त्रहरू देखाउनुहोस्</translation> <translation id="2941112035454246133">निम्न</translation> <translation id="2942279350258725020">Android Messages का सेटिङ</translation> @@ -2065,6 +2072,7 @@ <translation id="3090589793601454425">नसारियोस्</translation> <translation id="3090819949319990166">बाह्य सिआरएक्स फाइललाई <ph name="TEMP_CRX_FILE" /> मा प्रतिलिपि गर्न सकिएन।</translation> <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" जोडि मिलाईयो</translation> +<translation id="3093362725605442088">Chrome OS डिभाइस र त्यसका कम्पोनेन्टका क्रम सङ्ख्या रिड गर्ने।</translation> <translation id="3093714882666365141">साइटहरूलाई भुक्तानी ह्यान्ड्लर इन्स्टल गर्ने अनुमति नदिइयोस्</translation> <translation id="3094141017404513551">तपाईंले नयाँ Chromium प्रोफाइल प्रयोग गर्नुभयो भने तपाईंको ब्राउजिङ इतिहास र <ph name="EXISTING_USER" /> को ब्राउजिङ इतिहास छुट्टाछुट्टै सुरक्षित गरिने छ</translation> <translation id="3095871294753148861">बुकमार्क, पासवर्ड र ब्राउजरसम्बन्धी अन्य डेटा प्राथमिक खातामा सिंक गरिन्छन्।</translation> @@ -2252,6 +2260,7 @@ <translation id="3308852433423051161">Google सहायक लोड गर्दै...</translation> <translation id="3309330461362844500">सर्टिफिकेट प्रोफाइलको ID</translation> <translation id="3311445899360743395">यो यन्त्रबाट यस अनुप्रयोगसँग सम्बन्धित डेटा हटाइन सक्छ।</translation> +<translation id="3312883087018430408">तपाईं कुनै निश्चित साइट वा Chrome को कुनै निश्चित भागमा भएका कुराहरू खोज्न चाहनुहुन्छ भने एड्रेस बारमा त्यसको सर्टकट टाइप गर्नुहोस् अनि आफ्नो रोजाइको किबोर्ड सर्टकट थिच्नुहोस्। उदाहरणका लागि, तपाईं बुकमार्कमा भएका कुराहरू मात्र खोज्न चाहनुहुन्छ भने "@bookmarks" टाइप गर्नुहोस् अनि Tab वा Space की थिच्नुहोस्।</translation> <translation id="3313622045786997898">प्रमाणपत्र हस्ताक्षर मूल्य</translation> <translation id="3313950410573257029">इन्टरनेट जाँच्नुहोस्</translation> <translation id="3315158641124845231"><ph name="PRODUCT_NAME" /> लाई लुकाउनुहोस्</translation> @@ -2671,6 +2680,7 @@ <translation id="3747077776423672805">एप हटाउन, सेटिङहरू > Google Play स्टोर > Android का प्राथमिकताहरू व्यवस्थापन गर्नुहोस् > एपहरू वा एप प्रबन्धक नामक विकल्पमा जानुहोस्। त्यसपछि आफूले स्थापना रद्द गर्न चाहेको एपमा ट्याप गर्नुहोस् (उक्त एप फेला पार्न तपाईंले दायाँ वा बायाँतिर स्वाइप गर्नु पर्ने हुन सक्छ)। त्यसपछि स्थापना रद्द गर्नुहोस् वा असक्षम पार्नुहोस् नामक बटनमा ट्याप गर्नुहोस्।</translation> <translation id="3747220812138541072">मैले टाइप गर्दै जाँदा लेखनसम्बन्धी इनलाइन सुझावहरू देखाइयोस्</translation> <translation id="3748706263662799310">बगका बारेमा रिपोर्ट गर्नुहोस्</translation> +<translation id="3750562496035670393">Chrome ले तपाईंको पासवर्ड यो डिभाइसमा सेभ गरेको छ तर तपाईं उक्त पासवर्ड यो डिभाइसको साटो आफ्नो Google खातामा सेभ गर्न सक्नुहुन्छ। तपाईंले त्यसो गर्नुभयो भने तपाईं साइन इन भएका बेला पनि तपाईंको Google खातामा भएका सबै पासवर्डहरू उपलब्ध हुने छन्।</translation> <translation id="3752253558646317685">फिंगरप्रिन्ट सेभ गर्न आफ्ना बच्चालाई उनको औँला उठाउँदै राख्दै गर्न लगाउनुहोस्</translation> <translation id="3752582316358263300">ठिक छ...</translation> <translation id="3753033997400164841">एक पटक भण्डारण गर्नुहोस्। सबैतिर प्रयोग गर्नुहोस्</translation> @@ -2777,7 +2787,6 @@ <translation id="3842552989725514455">सेरिफ फन्ट</translation> <translation id="3843464315703645664">आन्तरिक रूपमा श्वेतसूचीमा राखिएको</translation> <translation id="3844888638014364087">इमोजी इन्सर्ट गरियो</translation> -<translation id="384513009320852920">ब्लुटुथ डिभाइसमा कनेक्ट गर्ने मोड अन गरिएको छ र सो डिभाइस तपाईंको वरपर छ भन्ने कुरा सुनिश्चित गर्नुहोस्। <ph name="BEGIN_LINK_LEARN_MORE" />थप जान्नुहोस्<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">वेबसाइट, Android एप र थप कुराहरू विकास गर्ने उपकरणहरू प्राप्त गर्नुहोस्। Linux स्थापना गर्नुले <ph name="DOWNLOAD_SIZE" /> डेटा डाउनलोड हुने छ।</translation> <translation id="3847319713229060696">वेब प्रयोग गर्ने सम्पूर्ण प्रयोगकर्ताहरूलाई सुरक्षित रहन मद्दत गर्नुहोस्</translation> <translation id="3848547754896969219">&इन्कोग्निटो विन्डोमा खोलियोस्</translation> @@ -3111,6 +3120,7 @@ <translation id="4194570336751258953">क्लिक-गर्न-ट्याप गर्नुहोस् सक्षम गर्नुहोस्</translation> <translation id="4195643157523330669">नयाँ ट्याबमा खोल्नुहोस्</translation> <translation id="4195814663415092787">तपाइँले छोड्नुभएको स्थान देखि जारी राख्नुहोस्</translation> +<translation id="4198268995694216131">थप साइटहरू</translation> <translation id="4200689466366162458">आफू अनुकूल गर्न मिल्ने शब्दहरू</translation> <translation id="4200983522494130825">नयाँ &ट्याब</translation> <translation id="4201546031411513170">तपाईं जुनसुकै बेला सेटिङहरूमा गई सिंक गर्ने कुरा छनौट गर्न सक्नुहुन्छ।</translation> @@ -3232,6 +3242,7 @@ <translation id="4341577178275615435">सर्टकट तरिकाले क्यारेट ब्राउजिङ अन वा अफ गर्न F7 थिच्नुहोस्</translation> <translation id="4341905082470253054">TPM को स्थिति जाँचिदै छ...</translation> <translation id="434198521554309404">छिटो। सुरक्षित। सजिलो।</translation> +<translation id="4343250402091037179">तपाईं कुनै निश्चित साइट वा Chrome को कुनै निश्चित भागमा भएका कुराहरू खोज्न चाहनुहुन्छ भने एड्रेस बारमा त्यसको सर्टकट टाइप गर्नुहोस् अनि आफ्नो रोजाइको किबोर्ड सर्टकट थिच्नुहोस्।</translation> <translation id="434404122609091467">तपाईंको हालको सेवा प्रदायकमार्फत</translation> <translation id="4345587454538109430">विन्यास गर्नुहोस्...</translation> <translation id="4345732373643853732">सर्भरले नचिन्ने युजरनेम</translation> @@ -3983,6 +3994,7 @@ <translation id="5153234146675181447">फोन बिर्सनुहोस्</translation> <translation id="5154108062446123722"><ph name="PRINTING_DESTINATION" /> को लागि उन्नत सेटिङहरू</translation> <translation id="5154702632169343078">विषय</translation> +<translation id="5155327081870541046">एड्रेस बारमा आफूले जुन साइटमा खोज्न चाहेको हो सो साइटको सर्टकट (जस्तै "@bookmarks") टाइप गर्नुहोस्। अनि किबोर्डमा आफ्नो रोजाइको सर्टकट थिचेर खोज पद हाल्नुहोस्।</translation> <translation id="5157635116769074044">यस पृष्ठलाई सुरुवात स्क्रिनमा पिन गर्नुहोस्...</translation> <translation id="5159094275429367735">Crostini सेटअप गर्नुहोस्</translation> <translation id="5159419673777902220">तपाईंका अभिभावकले तपाईंलाई एक्स्टेन्सन प्रयोग गर्ने अनुमति दिनुभएको छैन</translation> @@ -4284,7 +4296,6 @@ <translation id="5485102783864353244">एप थप्नुहोस्</translation> <translation id="5485754497697573575">सबै ट्याबहरू पुनर्स्थापित गर्नुहोस्</translation> <translation id="5486261815000869482">पासवर्ड पुष्टि गर्नुहोस्</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> ले तपाईंको स्क्रिन <ph name="TAB_NAME" /> सँग साझा गर ।</translation> <translation id="5486561344817861625">ब्राउजर पुन: सुरुवात नक्कल गर्नुहोस्</translation> <translation id="5487460042548760727">प्रोफाइलको नाम बदलेर <ph name="PROFILE_NAME" /> बनाउनुहोस्</translation> <translation id="5487521232677179737">डेटा मेटाउनुहोस्</translation> @@ -4346,6 +4357,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> निम्न कुराका लागि अनुमति चाहन्छ</translation> <translation id="5534304873398226603">तस्बिर वा भिडियो खारेज गर्नुहोस्</translation> <translation id="5535941515421698170">यस डिभाइसबाट तपाईंको विद्यमान डेटा पनि हटाउनुहोस्</translation> +<translation id="5537725057119320332">कास्ट गर्नु</translation> <translation id="5539221284352502426">तपाईंले प्रविष्ट गर्नुभएको पासवर्ड सर्भरद्वारा अस्वीकार गरियो। यसका सम्भावित कारणहरू निम्न हुन सक्छन्: पासवर्ड निकै छोटो छ। पासवर्डमा अनिवार्य रूपमा सङ्ख्या वा चिन्हहरू समावेश हुनु पर्छ। पासवर्ड अनिवार्य रूपमा अघिल्ला पासवर्डहरूभन्दा फरक हुनु पर्छ।</translation> <translation id="5541694225089836610">तपाईंका प्रशासकले कारबाहीसम्बन्धी सुविधा असक्षम पार्नुभएको छ</translation> <translation id="5542132724887566711">प्रोफाइल</translation> @@ -4576,6 +4588,7 @@ <translation id="5787146423283493983">प्रमुख सम्झौता</translation> <translation id="5787420647064736989">डिभाइसको नाम</translation> <translation id="5788367137662787332">माफ गर्नुहोस्, यन्त्रमा कम्तीमा एउटा विभाजन <ph name="DEVICE_LABEL" /> माउन्ट हुन सकेन।</translation> +<translation id="5789643057113097023">।</translation> <translation id="5790085346892983794">सफलता</translation> <translation id="5790651917470750848">यो पोर्टमा पहिलेदेखि नै फरवार्ड गरिँदै छ</translation> <translation id="5792728279623964091">कृपया आफ्नो पावर बटनमा ट्याप गर्नुहोस्</translation> @@ -4601,6 +4614,7 @@ <translation id="5816434091619127343">अनुरोध गरिएका प्रिन्टरसम्बन्धी परिवर्तनहरूले यस प्रिन्टरलाई काम नलाग्ने बनाउने छ।</translation> <translation id="5817069030404929329">यो डिभाइसमा सेभ गरिएका पासवर्डहरू सारेर तपाईंको Google खातामा लैजाने हो?</translation> <translation id="5817918615728894473">जोडा बनाउनुहोस्</translation> +<translation id="581840385858998009">वालपेपर, अवतार, स्क्रिनसेभर र अन्य कुराहरू कस्टमाइज गर्नुहोस्</translation> <translation id="5821565227679781414">सर्टकट सिर्जना गर्नुहोस्</translation> <translation id="5822095611691580107">बायाँपट्टिको बडमा <ph name="BATTERY_PERCENTAGE" />% ब्याट्री बाँकी छ।</translation> <translation id="5825412242012995131">सक्रिय (सिफारिस गरिएको)</translation> @@ -4806,10 +4820,8 @@ <ph name="BEGIN_PARAGRAPH2" />तपाईं आफ्नो यन्त्रमा रहेको स्थानसम्बन्धी मुख्य सेटिङलाई निष्क्रिय पारेर लोकेसन सर्भिस निष्क्रिय पार्न सक्नुहुन्छ। तपाईं लोकेसन सेटिङमा गई स्थान पत्ता लगाउने प्रयोजनका लागि Wi-Fi, मोबाइल नेटवर्क र सेन्सरहरूको प्रयोग निष्क्रिय पार्न पनि सक्नुहुन्छ।<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">पूर्ण स्क्रिनबाट बाहिरिनुहोस्</translation> <translation id="6042308850641462728">थप</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> सँग Chrome को एउटा ट्याबलाई साझेदारी गर्दैछ।</translation> <translation id="604388835206766544">कन्फिगुरेसन पार्स गर्न सकिएन</translation> <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="6049797270917061226">ह्याकरहरू यो फाइलमार्फत तपाईंको व्यक्तिगत जानकारी चोरी गर्न सक्छन्।</translation> @@ -4889,6 +4901,7 @@ <translation id="6116921718742659598">भाषा र इनपुट सेटिङहरू परिवर्तन गर्नुहोस्</translation> <translation id="6119927814891883061">यो डिभाइसको नाम <ph name="DEVICE_NAME" /> राख्नुहोस्</translation> <translation id="6120205520491252677">यस पृष्ठलाई सुरुवात स्क्रिनमा पिन गर्नुहोस्...</translation> +<translation id="6121773125605585883"><ph name="WEBSITE" /> मा <ph name="USERNAME" /> युजरनेमको पासवर्ड हेर्नुहोस्</translation> <translation id="6122081475643980456">तपाईंको इन्टरनेट जडान नियन्त्रणमा रहेको छ</translation> <translation id="6122093587541546701">इमेल (वैकल्पिक):</translation> <translation id="6122095009389448667">यो साइटलाई क्लिपबोर्ड हेर्न लगाइएको रोक जारी राख्नुहोस्</translation> @@ -4965,6 +4978,7 @@ <translation id="6208725777148613371"><ph name="WEB_DRIVE" /> मा सेभ गर्न सकिएन - <ph name="INTERRUPT_REASON" /></translation> <translation id="6209838773933913227">कम्पोनेन्टहरू अपडेट हुँदै छन्</translation> <translation id="6209908325007204267">तपाईंको डिभाइसमा स्तरवृद्धि गरी Chrome Enterprise बनाउने सुविधा उपलब्ध छ तर तपाईंको प्रयोगकर्ता नाम भने कुनै पनि इन्टरप्राइजको खातासँग सम्बन्धित छैन। कृपया कुनै सहायक यन्त्रमार्फत g.co/ChromeEnterpriseAccount मा गई इन्टरप्राइज खाता सिर्जना गर्नुहोस्।</translation> +<translation id="6210282067670792090">एड्रेस बारमा सर्च इन्जिन र साइटमा खोज्ने विभिन्न सर्टकट समावेश भएको यो किबोर्ड सर्टकट प्रयोग गर्नुहोस्</translation> <translation id="621172521139737651">{COUNT,plural, =0{सबै URL नयाँ ट्याब समूहमा खोल्नुहोस्}=1{एउटा URL नयाँ ट्याब समूहमा खोल्नुहोस्}other{सबै ({COUNT}) वटा URL नयाँ ट्याब समूहमा खोल्नुहोस्}}</translation> <translation id="6212039847102026977">नेटवर्कका उन्नत गुणहरू देखाउनुहोस्</translation> <translation id="6212168817037875041">प्रदर्शन निष्क्रिय पार्नुहोस्</translation> @@ -5448,6 +5462,7 @@ <translation id="6709357832553498500"><ph name="EXTENSIONNAME" /> प्रयोग गरेर कनेक्ट गर्नुहोस्</translation> <translation id="6710213216561001401">अघिल्लो</translation> <translation id="6711146141291425900">डाउनलोड गर्नका निम्ति <ph name="WEB_DRIVE" /> खाता लिंक गर्नुहोस्</translation> +<translation id="6712943853047024245">तपाईंले <ph name="WEBSITE" /> मा यो युजरनेमको पासवर्ड सेभ गरिसक्नुभएको छ</translation> <translation id="6713233729292711163">कार्य प्रोफाइल हाल्नुहोस्</translation> <translation id="6715803357256707211">तपाईंको Linux एप स्थापना गर्ने क्रममा कुनै त्रुटि भयो। विस्तृत विवरणका लागि सूचनामा क्लिक गर्नुहोस्।</translation> <translation id="671619610707606484">यस कार्यले साइटहरूले भण्डारण गरेको <ph name="TOTAL_USAGE" /> डेटा मेटाउने छ</translation> @@ -6073,6 +6088,7 @@ <translation id="7385854874724088939">छाप्ने प्रयास गर्दा केही गलत भयो। कृपया तपाइँको मुद्रक जाँच गरि पुण; प्रयास गर्नुहोस्।</translation> <translation id="7385896526023870365">यो विस्तारले कुनै अतिरिक्त साइटमाथि पहुँच राख्न सक्दैन।</translation> <translation id="7387273928653486359">स्वीकार्य</translation> +<translation id="7387951778417998929">तपाईं डिफल्ट सर्च इन्जिन नभई कुनै अर्को सर्च इन्जिन प्रयोग गर्न चाहनुहुन्छ भने एड्रेस बारमा उक्त सर्च इन्जिनको सर्टकट टाइप गर्नुहोस् अनि आफ्नो रोजाइको किबोर्ड सर्टकट थिच्नुहोस्। तपाईं यहाँबाट आफ्नो डिफल्ट सर्च इन्जिन परिवर्तन गर्न पनि सक्नुहुन्छ।</translation> <translation id="7388209873137778229">यो सुविधा उपलब्ध डिभाइस मात्र देखाइएका छन्।</translation> <translation id="7392118418926456391">भाइरस स्क्यान असफल भयो</translation> <translation id="7392915005464253525">बन्द विण्डोलाई पुन: खो&ल्नुहोस्</translation> @@ -6250,6 +6266,7 @@ <translation id="7559719679815339381">कृपया प्रतीक्षा गर्नुहोस्....Kiosk एप अद्यावधिक हुने प्रक्रियामा छ। USB स्टिक नहटाउनुहोस्।</translation> <translation id="7560756177962144929">आफ्नो <ph name="DEVICE_TYPE" /> सिंक गर्नुहोस्</translation> <translation id="7561196759112975576">सधैं</translation> +<translation id="7562099761826673163">आफ्नो डिभाइस आफू अनुकुल बनाउनुहोस्</translation> <translation id="756445078718366910">खुल्ला ब्राउजर सन्झ्याल</translation> <translation id="7564847347806291057">प्रक्रियालाई अन्त गर्नुहोस्</translation> <translation id="756503097602602175">तपाईं <ph name="LINK_BEGIN" />सेटिङ<ph name="LINK_END" />मा गई साइन इन गरिएका Google खाताहरू व्यवस्थापन गर्न सक्नुहुन्छ। तपाईंले वेबसाइट तथा एपहरूलाई दिनुभएका अनुमति सबै खाताहरूमा लागू हुन सक्छन्। तपाईं साइट वा एपहरूलाई तपाईंको खातासम्बन्धी जानकारी हेर्न तथा प्रयोग गर्न दिन चाहनुहुन्न भने तपाईं आफ्नो <ph name="DEVICE_TYPE" /> मा अतिथिका रूपमा साइन इन गर्न सक्नुहुन्छ वा <ph name="LINK_2_BEGIN" />इन्कोग्निटो विन्डो<ph name="LINK_2_END" />मा वेब प्रयोग गरी ब्राउज गर्न सक्नुहुन्छ।</translation> @@ -6567,6 +6584,7 @@ <translation id="78526636422538552">योभन्दा बढी Google खाताहरू थप्ने सुविधा असक्षम पारिएको छ</translation> <translation id="7853747251428735">थप उपकरणहरू</translation> <translation id="7855678561139483478">ट्याब नयाँ विन्डोमा सार्नुहोस्</translation> +<translation id="7856654138655787862">Chrome OS का डाइग्नोस्टिक परीक्षणहरू गर्ने।</translation> <translation id="7857093393627376423">पाठसम्बन्धी सुझावहरू</translation> <translation id="7857949311770343000">के यो नै तपाईंले अपेक्षा गर्नुभएको नयाँ ट्याब पृष्ठ हो?</translation> <translation id="7858328180167661092"><ph name="APP_NAME" /> (Windows)</translation> @@ -7215,6 +7233,7 @@ <translation id="8551588720239073785">मिति र समयसम्बन्धी सेटिङ</translation> <translation id="8553342806078037065">अन्य व्यक्तिहरूलाई व्यवस्थापन गर्नुहोस्</translation> <translation id="8554899698005018844">कुनै पनि भाषा छैन</translation> +<translation id="855604308879080518">Android एपहरूलाई यो Chromebook मा भएका USB डिभाइसहरू प्रयोग गर्न दिनुहोस्। तपाईंले हरेक पटक कुनै USB डिभाइस छिराउँदा तपाईंसँग अनुमति मागिने छ। प्रत्येक Android एपहरूले अतिरिक्त अनुमति माग्ने छन्।</translation> <translation id="8557022314818157177">तपाईंको फिंगरप्रिन्ट नथपिँदासम्म आफ्नो सुरक्षा साँचोमा छोइरहनुहोस्</translation> <translation id="8557180006508471423">Mac को लोकेसन सेवाहरूमा गई "Google Chrome" अन गर्नुहोस्</translation> <translation id="8560327176991673955">{COUNT,plural, =0{सबै URL &नयाँ विन्डोमा खोल्नुहोस्}=1{&नयाँ विन्डोमा खोल्नुहोस्}other{सबै URL ({COUNT}) &नयाँ विन्डोमा खोल्नुहोस्}}</translation> @@ -7305,7 +7324,6 @@ <translation id="8655295600908251630">च्यानल</translation> <translation id="8655972064210167941">साइन इन असफल भयो किनभने तपाईँको पासवर्ड प्रमाणित गर्न सकिएन। कृपया तपाईँको प्रशासकलाई सम्पर्क गर्नुहोस् वा फेरि प्रयास गर्नुहोस्।</translation> <translation id="8657393004602556571">तपाईं प्रतिक्रिया हटाउन चाहनुहुन्छ?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> सँग तपाईँको स्क्रिन र अडियोलाई साझेदारी गर्दैछ।</translation> <translation id="8661290697478713397">लिङ्कलाई इन्क&ग्निटो सन्झ्यालमा खोल्नुहोस्</translation> <translation id="8662671328352114214"><ph name="TYPE" /> नेटवर्कमा सामेल हुनुहोस्</translation> <translation id="8662733268723715832">यो कार्य गर्न अपेक्षा गरेभन्दा बढी समय लागिरहेको छ। तपाईं यो कार्य स्किप गर्न वा यो कार्य पूरा नहुन्जेल पर्खन सक्नुहुन्छ।</translation> @@ -7600,7 +7618,6 @@ <translation id="8941173171815156065">अनुमति '<ph name="PERMISSION" />' उल्टाउँनुहोस्</translation> <translation id="894360074127026135">नेटस्केप इन्टरनेश्नल स्टेप-अप</translation> <translation id="8944099748578356325">अझ छिटो उक्त ब्याट्री प्रयोग गर्नुहोस् (हाल <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> सँग एउटा विन्डोलाई साझेदारी गर्दैछ।</translation> <translation id="8945274638472141382">आइकनको आकार</translation> <translation id="8946359700442089734">डिबग सुविधाहरु पूर्ण तरिकाले यस <ph name="IDS_SHORT_PRODUCT_NAME" /> उपकरणमा सक्षम थिएनन्।</translation> <translation id="894763922177556086">राम्रो</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index d69ad15e..9a365b7 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -160,6 +160,7 @@ <translation id="1152346050262092795">Geef je wachtwoord opnieuw op om je account te verifiëren.</translation> <translation id="1153356358378277386">Gekoppelde apparaten</translation> <translation id="1153636665119721804">Het Google-programma 'Geavanceerde beveiliging'</translation> +<translation id="1155545602507378023">Nee, alleen dit apparaat</translation> <translation id="1155816283571436363">Verbinding maken met je telefoon</translation> <translation id="1158080958325422608">Hoofdletters van maken</translation> <translation id="1158238185437008462">Herinneringen bekijken</translation> @@ -394,6 +395,7 @@ <translation id="1410197035576869800">App-icoon</translation> <translation id="1410616244180625362"><ph name="HOST" /> toegang tot je camera blijven geven</translation> <translation id="1410806973194718079">Kan de beleidsregels niet checken</translation> +<translation id="1412681350727866021">Aanvullende extensies</translation> <translation id="1414315029670184034">Niet toestaan dat sites je camera gebruiken</translation> <translation id="1414648216875402825">Je voert een upgrade uit naar een instabiele versie van <ph name="PRODUCT_NAME" />, die opties bevat die nog in ontwikkeling zijn. Crashes en onverwachte fouten zullen optreden. Ga voorzichtig te werk.</translation> <translation id="1415708812149920388">Leestoegang voor klembord geweigerd</translation> @@ -531,6 +533,7 @@ <translation id="1549275686094429035">ARC staat aan</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> wil toegang tot <ph name="VOLUME_NAME" />. Hierdoor worden je bestanden mogelijk aangepast of verwijderd.</translation> <translation id="1552301827267621511">De extensie '<ph name="EXTENSION_NAME" />' heeft ingesteld dat <ph name="SEARCH_PROVIDER_DOMAIN" /> wordt gebruikt voor zoekopdrachten</translation> +<translation id="1552752544932680961">Extensie beheren</translation> <translation id="1553538517812678578">onbeperkt</translation> <translation id="1555130319947370107">Blauw</translation> <translation id="1556537182262721003">Kan extensiedirectory niet verplaatsen naar profiel.</translation> @@ -937,6 +940,7 @@ <translation id="1937774647013465102">Kan type containerarchitectuur <ph name="ARCHITECTURE_CONTAINER" /> niet importeren met dit apparaat. Dit apparaat is <ph name="ARCHITECTURE_DEVICE" />. Je kunt proberen deze container te herstellen op een ander apparaat of je kunt toegang krijgen tot bestanden in deze containerimage door ze te openen in de app Bestanden.</translation> <translation id="1938351510777341717">Externe opdracht</translation> <translation id="1940546824932169984">Verbonden apparaten</translation> +<translation id="1941410638996203291">Begintijd: <ph name="TIME" /></translation> <translation id="1942128823046546853">Al je gegevens op alle websites lezen en wijzigen</translation> <translation id="1942600407708803723">Uitzetten als de klep wordt gesloten</translation> <translation id="1944528062465413897">Bluetooth-koppelingscode:</translation> @@ -1312,6 +1316,7 @@ <translation id="2320295602967756579">Licht thema aanzetten</translation> <translation id="2322193970951063277">Kop- en voettekst</translation> <translation id="2322318151094136999">Goedkeuring vragen wanneer een site toegang wil tot seriële poorten (aanbevolen)</translation> +<translation id="2322622365472107569">Eindtijd: <ph name="TIME" /></translation> <translation id="2323018538045954000">Opgeslagen wifi-netwerken</translation> <translation id="2325444234681128157">Wachtwoord onthouden</translation> <translation id="2326188115274135041">Bevestig je pincode om automatisch ontgrendelen aan te zetten</translation> @@ -1417,6 +1422,7 @@ <translation id="2435248616906486374">Geen verbinding met netwerk</translation> <translation id="2435457462613246316">Wachtwoord bekijken</translation> <translation id="2436186046335138073"><ph name="HANDLER_HOSTNAME" /> toestaan alle links voor <ph name="PROTOCOL" /> te openen?</translation> +<translation id="2439626940657133600"><ph name="WINDOW_TITLE" /> laden</translation> <translation id="2440604414813129000">Br&on bekijken</translation> <translation id="244231003699905658">Ongeldig adres. Controleer het adres en probeer het opnieuw.</translation> <translation id="2442916515643169563">Tekstschaduw</translation> @@ -1921,6 +1927,7 @@ <translation id="2935654492420446828">Later een schoolaccount toevoegen</translation> <translation id="2936851848721175671">Back-up en herstel</translation> <translation id="2938225289965773019">Links voor <ph name="PROTOCOL" /> openen</translation> +<translation id="2939908794993783865">Meer inactieve sites</translation> <translation id="2939938020978911855">Beschikbare Bluetooth-apparaten bekijken</translation> <translation id="2941112035454246133">Laag</translation> <translation id="2942279350258725020">Android Berichten</translation> @@ -2066,6 +2073,7 @@ <translation id="3090589793601454425">Niet verplaatsen</translation> <translation id="3090819949319990166">Kan extern crx-bestand niet kopiëren naar <ph name="TEMP_CRX_FILE" />.</translation> <translation id="3090871774332213558">'<ph name="DEVICE_NAME" />' gekoppeld</translation> +<translation id="3093362725605442088">Serienummers van Chrome OS-apparaat en component lezen.</translation> <translation id="3093714882666365141">Niet toestaan dat sites betalingshandlers installeren</translation> <translation id="3094141017404513551">Hierdoor worden je browsegegevens gescheiden van <ph name="EXISTING_USER" /></translation> <translation id="3095871294753148861">Bookmarks, wachtwoorden en andere browsegegevens worden gesynchroniseerd met het primaire account.</translation> @@ -2253,6 +2261,7 @@ <translation id="3308852433423051161">Google Assistent laden...</translation> <translation id="3309330461362844500">ID van certificaatprofiel</translation> <translation id="3311445899360743395">Gegevens die zijn gekoppeld aan deze app, worden mogelijk verwijderd van dit apparaat.</translation> +<translation id="3312883087018430408">Als je een specifieke site of een deel van Chrome wilt doorzoeken, typ je de bijbehorende snelkoppeling in de adresbalk gevolgd door de gewenste sneltoets. Als je bijvoorbeeld alleen Bookmarks wilt doorzoeken, typ je '@bookmarks' en druk je op Tab of de spatiebalk.</translation> <translation id="3313622045786997898">Handtekeningwaarde van certificaat</translation> <translation id="3313950410573257029">Verbinding checken</translation> <translation id="3315158641124845231">Verberg <ph name="PRODUCT_NAME" /></translation> @@ -2672,6 +2681,7 @@ <translation id="3747077776423672805">Als je apps wilt verwijderen, ga je naar Instellingen > Google Play Store > Android-voorkeuren beheren > Apps of App-beheer. Tik op de app die je wilt verwijderen (je moet mogelijk naar rechts of links swipen om de app te vinden). Tik vervolgens op Verwijderen of Uitzetten.</translation> <translation id="3747220812138541072">Inline schrijfsuggesties laten zien terwijl je typt</translation> <translation id="3748706263662799310">Een fout melden</translation> +<translation id="3750562496035670393">Chrome heeft je wachtwoord opgeslagen op dit apparaat, maar in plaats daarvan kun je het wachtwoord ook opslaan in je Google-account. Dan zijn alle wachtwoorden in je Google-account ook beschikbaar als je bent ingelogd.</translation> <translation id="3752253558646317685">Laat je kind de vinger steeds optillen om de vingerafdruk te bewaren</translation> <translation id="3752582316358263300">OK...</translation> <translation id="3753033997400164841">Eén keer opslaan, Overal gebruiken</translation> @@ -2778,7 +2788,6 @@ <translation id="3842552989725514455">Serif-lettertype</translation> <translation id="3843464315703645664">Intern op de toelatingslijst gezet</translation> <translation id="3844888638014364087">Emoji ingevoegd</translation> -<translation id="384513009320852920">Zorg dat je bluetooth-apparaat in de koppelingsstand staat en in de buurt is. <ph name="BEGIN_LINK_LEARN_MORE" />Meer informatie<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Ontvang tools voor het ontwikkelen van websites, Android-apps en meer. Als je Linux installeert, wordt <ph name="DOWNLOAD_SIZE" /> aan data gedownload.</translation> <translation id="3847319713229060696">Helpen om het internet voor iedereen veiliger te maken</translation> <translation id="3848547754896969219">Openen in &incognitovenster</translation> @@ -3113,6 +3122,7 @@ <translation id="4194570336751258953">Tikken-om-te-klikken aanzetten</translation> <translation id="4195643157523330669">Openen op nieuw tabblad</translation> <translation id="4195814663415092787">Doorgaan waar je gebleven was</translation> +<translation id="4198268995694216131">Meer sites</translation> <translation id="4200689466366162458">Aangepaste woorden</translation> <translation id="4200983522494130825">Nieuw &tabblad</translation> <translation id="4201546031411513170">Je kunt altijd in de instellingen bepalen wat je wilt synchroniseren.</translation> @@ -3234,6 +3244,7 @@ <translation id="4341577178275615435">Gebruik de sneltoets F7 om browsen met navigatietoetsen aan of uit te zetten</translation> <translation id="4341905082470253054">TPM-status checken...</translation> <translation id="434198521554309404">Snel, beveiligd, makkelijk.</translation> +<translation id="4343250402091037179">Als je een specifieke site of een deel van Chrome wilt doorzoeken, typ je de bijbehorende snelkoppeling in de adresbalk gevolgd door de gewenste sneltoets.</translation> <translation id="434404122609091467">Met je huidige serviceprovider</translation> <translation id="4345587454538109430">Configureren...</translation> <translation id="4345732373643853732">Gebruikersnaam niet bekend bij server</translation> @@ -3983,6 +3994,7 @@ <translation id="5153234146675181447">Telefoon vergeten</translation> <translation id="5154108062446123722">Geavanceerde instellingen voor <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Onderwerp</translation> +<translation id="5155327081870541046">Geef in de adresbalk de snelkoppeling op voor de website die je wilt doorzoeken, zoals '@bookmarks'. Druk op de gewenste sneltoets en geef de zoekterm op.</translation> <translation id="5157635116769074044">Deze pagina vastzetten op het startscherm…</translation> <translation id="5159094275429367735">Crostini instellen</translation> <translation id="5159419673777902220">Je ouder heeft extensierechten uitgezet</translation> @@ -4284,7 +4296,6 @@ <translation id="5485102783864353244">App toevoegen</translation> <translation id="5485754497697573575">Herstel alle tabbladen</translation> <translation id="5486261815000869482">Wachtwoord bevestigen</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> deelt je scherm met <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Opnieuw starten van browser simuleren</translation> <translation id="5487460042548760727">Naam van profiel wijzigen in <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Gegevens wissen</translation> @@ -4346,6 +4357,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> wil het volgende</translation> <translation id="5534304873398226603">Foto of video verwijderen</translation> <translation id="5535941515421698170">Ook je bestaande gegevens verwijderen van dit apparaat</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">Het wachtwoord dat je hebt opgegeven, is afgewezen door de server. Mogelijke redenen zijn: Het wachtwoord is te kort. Het wachtwoord moet cijfers of symbolen bevatten. Het wachtwoord moet verschillen van eerdere wachtwoorden.</translation> <translation id="5541694225089836610">Actie is door de beheerder uitgezet</translation> <translation id="5542132724887566711">Profiel</translation> @@ -4576,6 +4588,7 @@ <translation id="5787146423283493983">Sleutelovereenkomst</translation> <translation id="5787420647064736989">Apparaatnaam</translation> <translation id="5788367137662787332">Ten minste één partitie op het apparaat <ph name="DEVICE_LABEL" /> kan niet worden gekoppeld.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Geslaagd</translation> <translation id="5790651917470750848">Poortdoorschakeling bestaat al</translation> <translation id="5792728279623964091">Tik op de aan/uit-knop</translation> @@ -4601,6 +4614,7 @@ <translation id="5816434091619127343">Met de aangevraagde printerwijzigingen wordt de printer wordt onbruikbaar.</translation> <translation id="5817069030404929329">Wachtwoorden op dit apparaat verplaatsen naar je Google-account?</translation> <translation id="5817918615728894473">Koppelen</translation> +<translation id="581840385858998009">Achtergrond, avatar, screensaver en meer aanpassen</translation> <translation id="5821565227679781414">Snelle link maken</translation> <translation id="5822095611691580107">Batterijniveau linkeroordopje: <ph name="BATTERY_PERCENTAGE" />%.</translation> <translation id="5825412242012995131">Aan (aanbevolen)</translation> @@ -4807,10 +4821,8 @@ <ph name="BEGIN_PARAGRAPH2" />Je kunt Locatie uitzetten door de hoofdinstelling Locatie op je apparaat uit te zetten. Je kunt het gebruik van wifi, mobiele netwerken en sensoren voor locatie ook uitzetten via de locatie-instellingen.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Volledig scherm sluiten</translation> <translation id="6042308850641462728">Meer</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> deelt een Chrome-tabblad met <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Parseren van configuratie mislukt</translation> <translation id="6043994281159824495">Nu uitloggen</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> deelt een Chrome-tabblad en audio met <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Primaire TrackPoint-knop</translation> <translation id="6047632800149092791">Synchronisatie werkt niet. Probeer uit en weer in te loggen.</translation> <translation id="6049797270917061226">Aanvallers kunnen dit bestand gebruiken om je persoonlijke informatie te stelen.</translation> @@ -4890,6 +4902,7 @@ <translation id="6116921718742659598">Taal- en invoerinstellingen wijzigen</translation> <translation id="6119927814891883061">Naam van apparaat wijzigen in <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Deze pagina vastzetten op het startscherm...</translation> +<translation id="6121773125605585883">Wachtwoord met gebruikersnaam <ph name="USERNAME" /> voor <ph name="WEBSITE" /> bekijken</translation> <translation id="6122081475643980456">Je internetverbinding wordt beheerd</translation> <translation id="6122093587541546701">E-mailadres (optioneel):</translation> <translation id="6122095009389448667">Bekijken van het klembord door deze site blijven blokkeren</translation> @@ -4966,6 +4979,7 @@ <translation id="6208725777148613371">Kan niet opslaan in <ph name="WEB_DRIVE" /> - <ph name="INTERRUPT_REASON" /></translation> <translation id="6209838773933913227">Component wordt geüpdatet</translation> <translation id="6209908325007204267">Je apparaat omvat een Chrome Enterprise Upgrade, maar je gebruikersnaam is niet gekoppeld aan een Enterprise-account. Ga op een secundair apparaat naar g.co/ChromeEnterpriseAccount om een Enterprise-account te maken.</translation> +<translation id="6210282067670792090">Je kunt in de adresbalk deze sneltoetsen met snelkoppelingen voor zoekmachines en het doorzoeken van sites gebruiken.</translation> <translation id="621172521139737651">{COUNT,plural, =0{Alles openen in &nieuwe tabbladgroep}=1{Openen in &nieuwe tabbladgroep}other{Alles ({COUNT}) openen in &nieuwe tabbladgroep}}</translation> <translation id="6212039847102026977">Geavanceerde netwerkeigenschappen bekijken</translation> <translation id="6212168817037875041">Scherm uitzetten</translation> @@ -5449,6 +5463,7 @@ <translation id="6709357832553498500">Verbinding maken via <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Vorige</translation> <translation id="6711146141291425900"><ph name="WEB_DRIVE" />-account koppelen voor downloads</translation> +<translation id="6712943853047024245">Je hebt al een wachtwoord met deze gebruikersnaam opgeslagen voor <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Werkprofiel toevoegen</translation> <translation id="6715803357256707211">Er is een fout opgetreden tijdens de installatie van je Linux-app. Klik op de melding voor meer informatie.</translation> <translation id="671619610707606484">Hiermee wis je <ph name="TOTAL_USAGE" /> aan gegevens die zijn opgeslagen door sites</translation> @@ -6074,6 +6089,7 @@ <translation id="7385854874724088939">Er is iets misgegaan bij het afdrukken. Controleer je printer en probeer het opnieuw.</translation> <translation id="7385896526023870365">Deze extensie heeft geen extra sitetoegang.</translation> <translation id="7387273928653486359">Acceptabel</translation> +<translation id="7387951778417998929">Als je een andere zoekmachine dan de standaard zoekmachine wilt gebruiken, typ je de bijbehorende snelkoppeling in de adresbalk gevolgd door de gewenste sneltoets. Je kunt ook hier je standaard zoekmachine wijzigen.</translation> <translation id="7388209873137778229">Alleen ondersteunde apparaten worden getoond.</translation> <translation id="7392118418926456391">Virusscan is mislukt</translation> <translation id="7392915005464253525">G&esloten venster opnieuw openen</translation> @@ -6251,6 +6267,7 @@ <translation id="7559719679815339381">Een ogenblik geduld. De Kiosk-app wordt geüpdatet. Verwijder de USB-stick niet.</translation> <translation id="7560756177962144929">Je <ph name="DEVICE_TYPE" /> synchroniseren</translation> <translation id="7561196759112975576">Altijd</translation> +<translation id="7562099761826673163">Je apparaat personaliseren</translation> <translation id="756445078718366910">Browservenster openen</translation> <translation id="7564847347806291057">Proces beëindigen</translation> <translation id="756503097602602175">Je kunt ingelogde Google-accounts beheren via <ph name="LINK_BEGIN" />Instellingen<ph name="LINK_END" />. Rechten die je hebt gegeven aan websites en apps kunnen van toepassing zijn op alle accounts. Als je niet wilt dat sites of apps toegang tot je accountgegevens hebben, kun je als gast inloggen op je <ph name="DEVICE_TYPE" /> of in een <ph name="LINK_2_BEGIN" />incognitovenster<ph name="LINK_2_END" /> op internet browsen.</translation> @@ -6567,6 +6584,7 @@ <translation id="78526636422538552">Toevoegen van meer Google-accounts staat uit</translation> <translation id="7853747251428735">Meer hu&lpprogramma's</translation> <translation id="7855678561139483478">Tabblad verplaatsen naar nieuw venster</translation> +<translation id="7856654138655787862">Diagnostische tests voor Chrome OS uitvoeren.</translation> <translation id="7857093393627376423">Tekstsuggesties</translation> <translation id="7857949311770343000">Is dit de nieuwe pagina met tabbladen die je had verwacht?</translation> <translation id="7858328180167661092"><ph name="APP_NAME" /> (Windows)</translation> @@ -7215,6 +7233,7 @@ <translation id="8551588720239073785">Instellingen voor datum en tijd</translation> <translation id="8553342806078037065">Andere mensen beheren</translation> <translation id="8554899698005018844">Geen taal</translation> +<translation id="855604308879080518">Geef Android-apps toegang tot USB-apparaten op deze Chromebook. Telkens als je een USB-apparaat aansluit, wordt er toestemming gevraagd. Afzonderlijke Android-apps vragen om aanvullende rechten.</translation> <translation id="8557022314818157177">Blijf je beveiligingssleutel aanraken totdat je vingerafdruk is geregistreerd</translation> <translation id="8557180006508471423">Zet Google Chrome aan in Locatievoorzieningen op je Mac</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Alles openen in &nieuw venster}=1{Openen in &nieuw venster}other{Alles ({COUNT}) openen in &nieuw venster}}</translation> @@ -7305,7 +7324,6 @@ <translation id="8655295600908251630">Kanaal</translation> <translation id="8655972064210167941">Het inloggen is mislukt omdat je wachtwoord niet kan worden geverifieerd. Neem contact op met je beheerder of probeer het opnieuw.</translation> <translation id="8657393004602556571">Wil je de feedback verwijderen?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> deelt je scherm en audio met <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Link openen in inco&gnitovenster</translation> <translation id="8662671328352114214">Deelnemen aan <ph name="TYPE" />-netwerk</translation> <translation id="8662733268723715832">Dit duurt langer dan verwacht. Je kunt dit overslaan of wachten tot het klaar is.</translation> @@ -7601,7 +7619,6 @@ <translation id="8941173171815156065">Het recht '<ph name="PERMISSION" />' intrekken</translation> <translation id="894360074127026135">Internationale Netscape-step-up</translation> <translation id="8944099748578356325">De batterij sneller gebruiken (momenteel <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> deelt een venster met <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Icoonformaat</translation> <translation id="8946359700442089734">Foutopsporingsfuncties zijn niet volledig aangezet op dit <ph name="IDS_SHORT_PRODUCT_NAME" />-apparaat.</translation> <translation id="894763922177556086">Goed</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 8f66128b..628614b 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -403,6 +403,7 @@ <translation id="1418954524306642206">Bla gjennom for å spesifisere PPD for skriveren</translation> <translation id="1420834118113404499">Medielisenser</translation> <translation id="1420920093772172268"><ph name="TURN_ON_BLUETOOTH_LINK" /> for å tillate sammenkobling.</translation> +<translation id="1421934779300263861">Bidra til å gjøre funksjonene og ytelsen til Chrome og ChromeOS bedre ved å sende programstopprapporter, diagnostikk og bruksdata automatisk til Google. Noen samlede data hjelper også Android-apper og Google-partnere. Hvis innstillingen for Nett- og appaktivitet er påslått for Google-kontoen din, kan Android-data bli lagret i Google-kontoen.</translation> <translation id="1422159345171879700">Last inn usikre skripter</translation> <translation id="1423716227250567100">Denne handlingen <ph name="LINE_BREAKS" /> @@ -530,6 +531,7 @@ <translation id="1549275686094429035">ARC er påslått</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> vil ha tilgang til <ph name="VOLUME_NAME" />. Det kan føre til at filene dine endres eller slettes.</translation> <translation id="1552301827267621511">Utvidelsen «<ph name="EXTENSION_NAME" />» endret søkemotoren til <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Administrer utvidelsen</translation> <translation id="1553538517812678578">ubegrenset</translation> <translation id="1555130319947370107">Blå</translation> <translation id="1556537182262721003">Katalogen over utvidelser kan ikke flyttes til profilen.</translation> @@ -625,6 +627,8 @@ <translation id="163309982320328737">Opprinnelig karakterbredde er satt til Full</translation> <translation id="1633947793238301227">Slå av Google-assistenten</translation> <translation id="1634783886312010422">Har du allerede endret dette passordet på <ph name="WEBSITE" />?</translation> +<translation id="163712950892155760"><ph name="BEGIN_PARAGRAPH1" />Appdata kan være alle slags data som er lagret i en app (basert på utviklerinnstillingene), inkludert data som kontakter, meldinger og bilder. De sikkerhetskopierte dataene teller ikke med i Disk-lagringskvoten din.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan slå av denne tjenesten i innstillingene.<ph name="END_PARAGRAPH2" /></translation> <translation id="1637224376458524414">Få dette bokmerket på iPhone</translation> <translation id="1637350598157233081">Passordet er lagret på denne enheten</translation> <translation id="1637765355341780467">Det oppsto en feil ved åpning av profilen din. Det kan hende at enkelte funksjoner ikke er tilgjengelige.</translation> @@ -762,6 +766,7 @@ <translation id="1768212860412467516">Send tilbakemelding om <ph name="EXPERIMENT_NAME" />.</translation> <translation id="1768278914020124551">Beklager. Det oppsto et problem ved forsøket på å kontakte påloggingstjeneren. Sjekk nettverkstilkoblingen din og domenenavnet, og prøv på nytt.</translation> <translation id="1769104665586091481">&Åpne link i nytt vindu</translation> +<translation id="177053719077591686">Sikkerhetskopiér Android-apper til Google Disk.</translation> <translation id="177336675152937177">Appdata på vertstjener</translation> <translation id="1775706469381199282">Ikke la nettsteder bruke JavaScript</translation> <translation id="1776712937009046120">Legg til bruker</translation> @@ -868,6 +873,7 @@ <translation id="186612162884103683">«<ph name="EXTENSION" />» kan lese og redigere bilder, videofiler og lydfiler i de avmerkede mappene.</translation> <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> er klar til å fullføre installasjonen</translation> <translation id="1868553836791672080">Passordsjekking er ikke tilgjengelig i Chromium</translation> +<translation id="1868617395637139709">Bruk posisjon i Android-apper og -tjenester.</translation> <translation id="1869433484041798909">Bokmerkeknapp</translation> <translation id="1871098866036088250">Åpne i Chrome-nettleseren</translation> <translation id="187145082678092583">Færre apper</translation> @@ -1327,6 +1333,7 @@ <translation id="2332192922827071008">Åpne Innstillinger</translation> <translation id="2332515770639153015">Safe Browsing med økt beskyttelse er påslått</translation> <translation id="2332742915001411729">Tilbakestill til standard</translation> +<translation id="2332948465534020594">Ikke forstyrr er slått på</translation> <translation id="2335111415680198280">{0,plural, =1{Lukk # vindu}other{Lukk # vinduer}}</translation> <translation id="2335122562899522968">Denne siden plasserer informasjonskapsler på datamaskinen.</translation> <translation id="2336228925368920074">Legg inn bokmerke for alle åpne faner</translation> @@ -1472,6 +1479,7 @@ <translation id="2484959914739448251">For å slette nettleserdata på alle synkroniserte enheter og Google-kontoen din må du <ph name="BEGIN_LINK" />skrive inn passordfrasen din<ph name="END_LINK" />.</translation> <translation id="2485394160472549611">Toppvalg for deg</translation> <translation id="2485422356828889247">Avinstaller</translation> +<translation id="2485681265915754872">Vilkår for bruk av Google Play</translation> <translation id="2487067538648443797">Legg til nytt bokmerke</translation> <translation id="2487268545026948104">For å gjenopprette dataene dine, koble til internett</translation> <translation id="2489686758589235262">Tilordne to brytere til</translation> @@ -2138,6 +2146,7 @@ <translation id="3162899666601560689">Nettsteder kan bruke informasjonskapsler for å gi deg en bedre surfeopplevelse, for eksempel for å holde deg pålogget eller huske varene i handlekurven din</translation> <translation id="3163201441334626963">Ukjent produkt, <ph name="PRODUCT_ID" />, fra leverandøren <ph name="VENDOR_ID" /></translation> <translation id="3163254451837720982">Disse tjenestene bidrar til å holde dataene dine trygge og sikre. Du kan når som helst slå av disse funksjonene.</translation> +<translation id="3163511056918491211">Gjenopprett data eller bytt enhet enkelt når som helst. Sikkerhetskopiene dine lastes opp til Google og krypteres med passordet for Google-kontoen din.</translation> <translation id="3164329792803560526">Deler denne fanen med <ph name="APP_NAME" /></translation> <translation id="3165390001037658081">Det kan hende at enkelte operatører blokkerer denne funksjonen.</translation> <translation id="316652501498554287">G Suite for utdanning-kontoer</translation> @@ -2697,6 +2706,7 @@ <translation id="3771290962915251154">Denne innstillingen er avslått fordi foreldrekontroll er på</translation> <translation id="3771294271822695279">Videofiler</translation> <translation id="3771851622616482156">Du blir logget av dette nettstedet, også på faner som er åpne</translation> +<translation id="3772046291955677288">Jeg har lest og samtykker i <ph name="BEGIN_LINK1" />Googles vilkår for bruk<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />tilleggsvilkårene for bruk av Chrome og ChromeOS<ph name="END_LINK2" />.</translation> <translation id="3775432569830822555">SSL-tjenersertifikat</translation> <translation id="3775705724665058594">Send til enhetene dine</translation> <translation id="3776508619697147021">Nettsteder kan be om å få laste ned flere filer automatisk</translation> @@ -2729,6 +2739,7 @@ <translation id="3798449238516105146">Versjon</translation> <translation id="3799128412641261490">Innstillinger for brytertilgang</translation> <translation id="3800806661949714323">Vis alle (anbefales)</translation> +<translation id="3800828618615365228">Tilleggsvilkår for Google Chrome og ChromeOS</translation> <translation id="380329542618494757">Navn</translation> <translation id="3803345858388753269">Videokvalitet</translation> <translation id="380408572480438692">Aktivering av innsamling av ytelsesdata hjelper Google med å bekrefte systemet over tid, Data sendes ikke inn før du fyller ut en tilbakemeldingsrapport (Alt-Shift-I) og legger ved ytelsesdata. Du kan deaktivere innsamlingen når som helst via denne skjermen.</translation> @@ -2761,6 +2772,7 @@ <translation id="3826440694796503677">Administratoren har slått av muligheten for å legge til flere Google-kontoer</translation> <translation id="3827774300009121996">&Full skjerm</translation> <translation id="3828029223314399057">Søk i bokmerker</translation> +<translation id="3828953470056652895">Jeg har lest og samtykker i <ph name="BEGIN_LINK1" />Googles vilkår for bruk<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />tilleggsvilkårene for bruk av Chrome og ChromeOS<ph name="END_LINK2" /> og <ph name="BEGIN_LINK3" />vilkårene for bruk av Play<ph name="END_LINK3" />.</translation> <translation id="3829765597456725595">SMB-fildeling</translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Administratoren din har slått på igjen én potensielt skadelig utvidelse}other{Administratoren din har slått på igjen {NUM_EXTENSIONS} potensielt skadelige utvidelser}}</translation> <translation id="3831436149286513437">Søkeforslag fra Google Disk</translation> @@ -2777,7 +2789,6 @@ <translation id="3842552989725514455">Med seriffer</translation> <translation id="3843464315703645664">Står på intern godkjenningsliste</translation> <translation id="3844888638014364087">Emojien ble satt inn</translation> -<translation id="384513009320852920">Sørg for at Bluetooth-enheten din er i tilkoblingsmodus og i nærheten. <ph name="BEGIN_LINK_LEARN_MORE" />Finn ut mer<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Skaff deg verktøy for å utvikle nettsteder, Android-apper med mer. Linux laster ned <ph name="DOWNLOAD_SIZE" /> med data.</translation> <translation id="3847319713229060696">Bidra til å gjøre nettet sikrere for alle</translation> <translation id="3848547754896969219">Åpne i &inkognitovindu</translation> @@ -2937,6 +2948,9 @@ <translation id="3984431586879874039">Vil du la dette nettstedet se sikkerhetsnøkkelen din?</translation> <translation id="398477389655464998">Kopiér link til markert tekst</translation> <translation id="3984862166739904574">Hurtiginfo-definisjon</translation> +<translation id="3986164906089840270"><ph name="BEGIN_PARAGRAPH1" />Ved å gi ChromeOS-enheter lov til å sende oss automatiske rapporter hjelper du oss med å prioritere hva vi skal fikse og gjøre bedre i ChromeOS. Disse rapportene kan blant annet inneholde informasjon om når ChromeOS krasjer, hvilke funksjoner som var i bruk, og hvor mye minne som vanligvis var i bruk.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan når som helst velge om du vil tillate slike rapporter eller ikke, i innstillingene for Chrome-enheten. Hvis du er en domeneadministrator, kan du endre denne innstillingen i administrasjonskonsollen.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Enhetens evne til å sende informasjonen som kreves for nødvendige tjenester, for eksempel systemoppdateringer og sikkerhet, påvirkes ikke hvis du slår av denne funksjonen.<ph name="END_PARAGRAPH3" /></translation> <translation id="3987544746655539083">Fortsett å blokkere dette nettstedet fra å få tilgang til posisjonen din</translation> <translation id="3987938432087324095">Det fikk jeg ikke med meg.</translation> <translation id="3987993985790029246">Kopiér link</translation> @@ -3102,6 +3116,7 @@ <translation id="4184885522552335684">Dra i skjermene for å flytte dem</translation> <translation id="4187424053537113647">Konfigurerer <ph name="APP_NAME" /> …</translation> <translation id="4190828427319282529">Fremhev tastaturfokuset</translation> +<translation id="4193836101014293726">Kan ikke slette denne profilen</translation> <translation id="419427585139779713">Skriv én stavelse om gangen</translation> <translation id="4194570336751258953">Aktiver berøringsklikk</translation> <translation id="4195643157523330669">Åpne i ny fane</translation> @@ -3191,12 +3206,16 @@ <translation id="4297219207642690536">Start på nytt og tilbakestill</translation> <translation id="4297813521149011456">Skjermrotasjon</translation> <translation id="4299022904780065004">Nytt &inkognitovindu</translation> +<translation id="4301011537467809690"><ph name="BEGIN_PARAGRAPH1" />Ved å gi ChromeOS-enheter lov til å sende oss automatiske rapporter hjelper du oss med å prioritere hva vi skal fikse og gjøre bedre i ChromeOS. Disse rapportene kan blant annet inneholde informasjon om når ChromeOS krasjer, hvilke funksjoner som var i bruk, og hvor mye minne som vanligvis var i bruk.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan når som helst velge om du vil tillate slike rapporter eller ikke, i innstillingene for barnets ChromeOS-enhet. Hvis du er en domeneadministrator, kan du endre denne innstillingen i administrasjonskonsollen.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Enhetens evne til å sende informasjonen som kreves for nødvendige tjenester, for eksempel systemoppdateringer og sikkerhet, påvirkes ikke hvis du slår av denne funksjonen.<ph name="END_PARAGRAPH3" /></translation> <translation id="4301671483919369635">Denne siden har lov til å redigere filer</translation> <translation id="4303079906735388947">Angi en ny PIN-kode for sikkerhetsnøkkelen din</translation> <translation id="4305402730127028764">Kopiér til <ph name="DEVICE_NAME" /></translation> <translation id="4305817255990598646">Bytt</translation> <translation id="4306119971288449206">Apper må leveres med innholdstypen «<ph name="CONTENT_TYPE" />»</translation> <translation id="4307992518367153382">Generelt</translation> +<translation id="4309165024397827958">Tillat at Android-apper og -tjenester med posisjonstillatelse bruker enhetens posisjon. Google kan samle inn posisjonsdata med jevne mellomrom og bruke disse dataene til å forbedre posisjonsnøyaktigheten og posisjonsbaserte tjenester på en anonym måte.</translation> <translation id="4309420042698375243"><ph name="NUM_KILOBYTES" /> kB (<ph name="NUM_KILOBYTES_LIVE" /> kB ubrukt)</translation> <translation id="4310139701823742692">Filen har feil format. Sjekk PPD-filen og prøv på nytt.</translation> <translation id="431076611119798497">&Detaljer</translation> @@ -3276,6 +3295,7 @@ <translation id="4400632832271803360">Hold Appoversikt-tasten inne for å endre funksjonene for tastene på øverste rad</translation> <translation id="4400963414856942668">Du kan klikke på stjernen for å bokmerke en fane</translation> <translation id="4402755511846832236">Blokkér nettsteder fra å vite når du bruker denne enheten aktivt</translation> +<translation id="4403266582403435904">Gjenopprett data eller bytt enhet enkelt når som helst. Sikkerhetskopier lastes opp til Google og krypteres med passordet for barnets Google-konto.</translation> <translation id="4403775189117163360">Velg en annen mappe</translation> <translation id="4404136731284211429">Gjennomsøk på nytt</translation> <translation id="4404843640767531781"><ph name="APP_NAME" /> er blokkert av forelderen din. Spør forelderen din om tillatelse til å bruke denne appen.</translation> @@ -3614,6 +3634,7 @@ <translation id="4768332406694066911">Du har sertifikater som identifiserer deg, fra disse organisasjonene</translation> <translation id="4770119228883592393">Nettstedet ber om tillatelse. Trykk på ⌘ + Tilvalg + nedoverpilen for å svare</translation> <translation id="4773112038801431077">Oppgrader Linux</translation> +<translation id="4775142426314270551">Bidra til å gjøre funksjonene og ytelsen til Chrome og ChromeOS bedre ved å sende programstopprapporter, diagnostikk og bruksdata automatisk til Google. Noen samlede data hjelper også Android-apper og Google-partnere. Hvis innstillingen for Nett- og appaktivitet er påslått for barnets Google-konto, kan barnets Android-data bli lagret i barnets Google-konto.</translation> <translation id="477647109558161443">Opprett en snarvei på skrivebordet</translation> <translation id="4776594120007763294">For å legge til en side for senere lesning, klikk på knappen</translation> <translation id="4777458362738635055">Andre brukere av denne enheten kan bruke dette nettverket</translation> @@ -3641,6 +3662,7 @@ <translation id="4801512016965057443">Tillat mobildatabruk på andre nettverk</translation> <translation id="4804818685124855865">Koble fra</translation> <translation id="4804827417948292437">Avokado</translation> +<translation id="4806457879608775995">Gjennomgå disse vilkårene, og kontrollér dataene dine</translation> <translation id="4807098396393229769">Navn som er oppført på kortet</translation> <translation id="4808024018088054533">Chrome fant ingen skadelig programvare på datamaskinen • sjekket nettopp</translation> <translation id="4808667324955055115">Blokkerte forgrunnsvinduer:</translation> @@ -4006,6 +4028,8 @@ <translation id="5192062846343383368">Åpne Family Link-appen for å se tilsynsinnstillingene dine</translation> <translation id="5193988420012215838">Kopiert til utklippstavlen</translation> <translation id="5194256020863090856">Dette berører kun inkognitovinduer</translation> +<translation id="5195863934285556588"><ph name="BEGIN_PARAGRAPH1" />Googles posisjonstjeneste bruker kilder som Wi-Fi, mobilnettverk og sensorer til å estimere enhetens posisjon.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan når som helst slå av posisjonen på denne Android-enheten ved å gå til Innstillinger > Apper > Google Play Butikk > Administrer Android-innstillinger > Sikkerhet og posisjon > Posisjon. Du kan også slå av bruken av Wi-Fi, mobilnettverk og sensorer for Android-posisjonen ved å slå av «Google Posisjonsnøyaktighet» på den samme menyen.<ph name="END_PARAGRAPH2" /></translation> <translation id="5197255632782567636">Internett</translation> <translation id="5198430103906431024">Send bruks- og diagnostikkdata. Denne enheten sender for øyeblikket diagnostikk-, enhets- og appbruksdata til Google automatisk. Dette bidrar til å gjøre systemet og appene bedre og mer stabile. Noen aggregerte data hjelper også Google-apper og -partnere, for eksempel Android-utviklere. Hvis du har slått på innstillingen for annen nett- og appaktivitet, kan disse dataene bli lagret i Google-kontoen din.</translation> <translation id="5199729219167945352">Eksperimenter</translation> @@ -4134,6 +4158,7 @@ <translation id="5331069282670671859">Du har ingen sertifikater i denne kategorien</translation> <translation id="5331425616433531170">«<ph name="CHROME_EXTENSION_NAME" />» vil koble til</translation> <translation id="5331975486040154427">USB-C-enhet (porten bak på venstre side)</translation> +<translation id="5333896723098573627">For å fjerne apper, gå til Innstillinger > Apper > Google Play Butikk > Administrer Android-innstillinger > Apper eller Appstyring. Trykk på appen du vil avinstallere (du må kanskje sveipe til høyre eller venstre for å finne den). Trykk deretter på Avinstaller eller Slå av.</translation> <translation id="5334142896108694079">Skriptbuffer</translation> <translation id="5336126339807372270">Ikke gi noen nettsteder tilgang til USB-enheter</translation> <translation id="5336688142483283574">Denne siden blir også fjernet fra loggen og <ph name="SEARCH_ENGINE" />-aktiviteten.</translation> @@ -4213,6 +4238,7 @@ <translation id="5425863515030416387">Logg på enkelt på ulike enheter</translation> <translation id="5427278936122846523">Oversett alltid</translation> <translation id="5427459444770871191">Rotér &med klokken</translation> +<translation id="542750953150239272">Ved å fortsette godtar du at denne enheten også kan laste ned og installere oppdateringer automatisk fra Google, operatøren din og enhetens produsent. Dette bruker muligens mobildata. Noen av disse appene kan tilby kjøp i appen.</translation> <translation id="5428850089342283580"><ph name="ACCNAME_APP" /> (oppdatering er tilgjengelig)</translation> <translation id="5429373054983029602">Søk på skjermen med <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="542948651837270806">En oppdatering for Trusted Platform Module-fastvaren må installeres. Se <ph name="TPM_FIRMWARE_UPDATE_LINK" /></translation> @@ -4256,6 +4282,7 @@ <translation id="5471768120198416576">Heisann! Jeg er tekst til tale-stemmen din.</translation> <translation id="5472627187093107397">Lagre passord for dette nettstedet</translation> <translation id="5473075389972733037">IBM</translation> +<translation id="5473099001878321374">Hvis du fortsetter, godtar du at apper og oppdateringer fra Google, barnets operatør og enhetsprodusenten også kan lastes ned og installeres på enheten automatisk – muligens via mobildata. Noen av disse appene kan tilby kjøp i appen.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN-koden må bestå av minst ett tegn}other{PIN-koden må bestå av minst # tegn}}</translation> <translation id="5474859849784484111"><ph name="MANAGER" /> krever at du kobler til Wi-Fi nå og laster ned en oppdatering. Eller last ned via en tilkobling med datamåling (kostnader kan påløpe).</translation> <translation id="5481273127572794904">Nettsteder som ikke har lov til å laste ned flere filer automatisk</translation> @@ -4266,7 +4293,6 @@ <translation id="5485102783864353244">Legg til appen</translation> <translation id="5485754497697573575">Gjenopprett alle faner</translation> <translation id="5486261815000869482">Bekreft passordet</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> deler skjermen din med <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simuler omstart av nettleseren</translation> <translation id="5487460042548760727">Endre profilnavnet til <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Slett data</translation> @@ -4328,6 +4354,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> vil</translation> <translation id="5534304873398226603">Forkast bilde eller video</translation> <translation id="5535941515421698170">Fjern også de eksisterende dataene dine fra denne enheten</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">Passordet du skrev inn, ble avvist av tjeneren. Mulige grunner kan være: Passordet er for kort. Passordet må inneholde tall eller symboler. Passordet må være forskjellig fra tidligere passord.</translation> <translation id="5541694225089836610">Administratoren din har slått av handlingen</translation> <translation id="5542132724887566711">Profil</translation> @@ -4434,6 +4461,10 @@ <translation id="5642508497713047">Signatar for sertifikatopphevelsesliste</translation> <translation id="5643321261065707929">Nettverk med datamåling</translation> <translation id="5643620609347735571">Slett og fortsett</translation> +<translation id="5644722238761632789"><ph name="BEGIN_PARAGRAPH1" />Bidra til å gjøre funksjonene og ytelsen til Chrome og ChromeOS bedre ved å sende programstopprapporter, diagnostikk og bruksdata automatisk til Google.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan når som helst velge om du vil tillate slike rapporter eller ikke, i innstillingene for ChromeOS-enheten. Hvis du er en domeneadministrator, kan du endre denne innstillingen i administrasjonskonsollen.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Enhetens evne til å sende informasjonen som kreves for nødvendige tjenester, for eksempel systemoppdateringer og sikkerhet, påvirkes ikke hvis du slår av denne funksjonen.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" />Hvis innstillingen for Nett- og appaktivitet er påslått for Google-kontoen din, kan Android-data bli lagret i Google-kontoen. Du kan se og slette dataene dine samt endre kontoinnstillingene dine på account.google.com.<ph name="END_PARAGRAPH4" /></translation> <translation id="5646376287012673985">Posisjon</translation> <translation id="5646558797914161501">Forretningsmann</translation> <translation id="5648166631817621825">Siste 7 dager</translation> @@ -4554,6 +4585,7 @@ <translation id="5787146423283493983">Nøkkelavtale</translation> <translation id="5787420647064736989">Enhetsnavn</translation> <translation id="5788367137662787332">Beklager, men minst én partisjon på enheten <ph name="DEVICE_LABEL" /> kunne ikke tilkobles.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Fullført</translation> <translation id="5790651917470750848">Porten er allerede viderekoblet</translation> <translation id="5792728279623964091">Trykk på av/på-knappen</translation> @@ -4785,14 +4817,16 @@ <ph name="BEGIN_PARAGRAPH2" />Du kan slå av Posisjon ved å slå av hovedinnstillingen for Posisjon på enheten. Du kan også slå av bruken av Wi-Fi, mobilnettverk og sensorer for posisjon fra posisjonsinnstillingene.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Avslutt fullskjermmodus</translation> <translation id="6042308850641462728">Mer</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> deler en Chrome-fane med <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Kunne ikke parse konfigurasjonen</translation> <translation id="6043994281159824495">Logg av nå</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> deler lyd og en fane fra Chrome med <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Primær TrackPoint-knapp</translation> <translation id="6047632800149092791">Synkroniseringen fungerer ikke. Prøv å logge ut og inn igjen.</translation> <translation id="6049797270917061226">Denne filen kan la angripere stjele personopplysningene dine.</translation> <translation id="6051354611314852653">Beklager. Systemet kunne ikke godkjenne API-tilgang for denne enheten.</translation> +<translation id="6051638103735819069"><ph name="BEGIN_PARAGRAPH1" />Ved å gi ChromeOS-enheter lov til å sende oss automatiske rapporter hjelper du oss med å prioritere hva vi skal fikse og gjøre bedre i ChromeOS. Disse rapportene kan blant annet inneholde informasjon om når ChromeOS krasjer, hvilke funksjoner som var i bruk, hvor mye minne som vanligvis var i bruk, samt Android-appdiagnostikk og -bruksdata. Noen samlede data hjelper også Google-apper og -partnere, for eksempel Android-utviklere.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan når som helst velge om du vil tillate slike rapporter eller ikke, i innstillingene for barnets ChromeOS-enhet. Hvis du er en domeneadministrator, kan du endre denne innstillingen i administrasjonskonsollen.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Enhetens evne til å sende informasjonen som kreves for nødvendige tjenester, for eksempel systemoppdateringer og sikkerhet, påvirkes ikke hvis du slår av denne funksjonen.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" />Hvis innstillingen for Nett- og appaktivitet er påslått for barnets Google-konto, kan barnets data bli lagret i Google-kontoen. Finn ut mer om disse innstillingene og hvordan du endrer dem, på families.google.com.<ph name="END_PARAGRAPH4" /></translation> <translation id="6052976518993719690">SSL-sertifiseringsinstans</translation> <translation id="6053401458108962351">&Tøm logg</translation> <translation id="6054284857788651331">Nylig lukket fanegruppe</translation> @@ -5266,6 +5300,8 @@ <translation id="6545665334409411530">Gjentakelsesfrekvens</translation> <translation id="6545867563032584178">Mikrofonen er slått av i Mac-systemvalgene</translation> <translation id="6547354035488017500">Frigjør minst 512 MB lagringsplass for å unngå at enheten slutter å reagere. For å frigjøre plass, slett filer fra enhetslagringen.</translation> +<translation id="6547854317475115430"><ph name="BEGIN_PARAGRAPH1" />Googles posisjonstjeneste bruker kilder som Wi-Fi, mobilnettverk og sensorer til å estimere enhetens posisjon.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan når som helst slå av posisjonen på Android-enheten din ved å gå til Innstillinger > Apper > Google Play Butikk > Administrer Android-innstillinger > Sikkerhet og posisjon > Posisjon. Du kan også slå av bruken av Wi-Fi, mobilnettverk og sensorer for Android-posisjonen ved å slå av «Google Posisjonsnøyaktighet» på den samme menyen.<ph name="END_PARAGRAPH2" /></translation> <translation id="654871471440386944">Vil du slå på markørsurfing?</translation> <translation id="6549038875972762904">Gjør om konfigurering</translation> <translation id="6550675742724504774">Alternativer</translation> @@ -5451,6 +5487,7 @@ <translation id="6746124502594467657">Flytt ned</translation> <translation id="674632704103926902">Slå på trykk og dra</translation> <translation id="6748465660675848252">Du kan fortsette, men bare synkroniserte data og innstillinger blir gjenopprettet. Alle lokale data går tapt.</translation> +<translation id="6748980958975836188">Jeg har lest og samtykker i <ph name="BEGIN_LINK1" />Googles vilkår for bruk<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />tilleggsvilkårene for bruk av Chrome og ChromeOS<ph name="END_LINK2" />.</translation> <translation id="6750757184909117990">Slå av mobildata</translation> <translation id="6750946710563435348">Bruk et annet brukernavn</translation> <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Inkognito)</translation> @@ -5472,6 +5509,8 @@ <translation id="677965093459947883">Veldig liten</translation> <translation id="6781005693196527806">Ad&ministrer søkemotorer</translation> <translation id="6781284683813954823">Doodle-link</translation> +<translation id="6781658011335120230"><ph name="BEGIN_PARAGRAPH1" />Appdata kan være alle slags data som er lagret i en app (basert på utviklerinnstillingene), inkludert data som kontakter, meldinger og bilder. De sikkerhetskopierte dataene teller ikke med i barnets Disk-lagringskvote.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan slå av denne tjenesten i innstillingene.<ph name="END_PARAGRAPH2" /></translation> <translation id="6781978626986383437">Sikkerhetskopieringen av Linux er avbrutt</translation> <translation id="6782067259631821405">Ugyldig PIN-kode</translation> <translation id="6784523122863989144">Profilen støttes</translation> @@ -5820,6 +5859,7 @@ <translation id="7125148293026877011">Slett Crostini</translation> <translation id="7127980134843952133">Nedlastingslogg</translation> <translation id="7128151990937044829">Vis en indikator i adressefeltet når varsler blokkeres</translation> +<translation id="7130890260487814974">Send bruks- og diagnostikkdata.</translation> <translation id="7131040479572660648">Lesing av dataene dine på <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og <ph name="WEBSITE_3" /></translation> <translation id="713122686776214250">Legg til si&de</translation> <translation id="7134098520442464001">Forminsk teksten</translation> @@ -6067,10 +6107,12 @@ <translation id="7409735910987429903">Nettsteder kan sende forgrunnsvinduer for å vise annonser, eller de kan bruke viderekoblinger for å føre deg til nettsteder du kanskje ikke ønsker å besøke</translation> <translation id="7409854300652085600">Bokmerkene er importert.</translation> <translation id="7410344089573941623">Spør om <ph name="HOST" /> ønsker å bruke kameraet og mikrofonen din</translation> +<translation id="7410852728357935715">Cast til en enhet</translation> <translation id="741204030948306876">Ja, jeg er med</translation> <translation id="7412226954991670867">GPU-minne</translation> <translation id="7414464185801331860">18x</translation> <translation id="7415454883318062233">Konfigureringen er fullført</translation> +<translation id="7416263748877373774">Vilkårene for bruk kan ikke lastes inn. Kontrollér nettverkstilkoblingen, og prøv på nytt.</translation> <translation id="7416362041876611053">Ukjent nettverksfeil.</translation> <translation id="741906494724992817">Denne appen krever ingen spesielle tillatelser.</translation> <translation id="7419565702166471774">Bruk alltid sikre tilkoblinger</translation> @@ -6826,6 +6868,7 @@ <translation id="8146177459103116374">Hvis du allerede er registrert på denne enheten, kan du <ph name="LINK2_START" />logge deg på som en eksisterende bruker<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Legg til og rangér språkene du foretrekker. Nettsteder vises på språkene du foretrekker, når det er mulig. Disse preferansene synkroniseres med nettleserinnstillingene dine. <ph name="BEGIN_LINK_LEARN_MORE" />Finn ut mer<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Påloggingen mislyktes. Kontakt administratoren din, eller prøv på nytt.</translation> +<translation id="8147346945017130012">Bidra til å gjøre funksjonene og ytelsen til Chrome og ChromeOS bedre ved å sende programstopprapporter, diagnostikk og bruksdata automatisk til Google.</translation> <translation id="8147900440966275470">Fant <ph name="NUM" /> fane</translation> <translation id="8148760431881541277">Begrens pålogging</translation> <translation id="8149564499626272569">Bekreft via telefonen din med USB-kabel</translation> @@ -7055,6 +7098,7 @@ <translation id="8404893580027489425">Fingeravtrykkssensoren er på høyre side av <ph name="DEVICE_TYPE" />. Trykk forsiktig på den med hvilken som helst finger.</translation> <translation id="8405046151008197676">Se høydepunktene i den nyeste oppdateringen</translation> <translation id="8407199357649073301">Loggnivå:</translation> +<translation id="8408270600235826886">Du kan kontrollere hvilke data som deles med Google. Du kan når som helst endre dette i innstillingene. Dataene brukes i henhold til Googles <ph name="BEGIN_LINK" />personvernregler<ph name="END_LINK" />.</translation> <translation id="8410775397654368139">Google Play</translation> <translation id="8412136526970428322">Tillot <ph name="PERMISSION" /> og <ph name="COUNT" /> til</translation> <translation id="8413385045638830869">Spør først (anbefales)</translation> @@ -7237,6 +7281,7 @@ <translation id="862727964348362408">Stanset</translation> <translation id="862750493060684461">CSS-buffer</translation> <translation id="8627795981664801467">Bare sikre tilkoblinger</translation> +<translation id="8627804903623428808">Gjennomgå disse vilkårene, og kontrollér dataene til barnet ditt</translation> <translation id="8630338733867813168">Hvilemodus ved lading</translation> <translation id="8631032106121706562">Tusenfryd</translation> <translation id="863109444997383731">Nettsteder blir blokkert fra å spørre om å få vise deg varsler. Hvis nettsteder spør om varsler, vises en blokkert-indikator i adressefeltet.</translation> @@ -7269,7 +7314,6 @@ <translation id="8655295600908251630">Kanal</translation> <translation id="8655972064210167941">Påloggingen mislyktes fordi passordet ditt ikke kunne bekreftes. Kontakt administratoren din, eller prøv på nytt.</translation> <translation id="8657393004602556571">Vil du forkaste tilbakemeldingen?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> deler lyden og skjermen din med <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Åpne linken i inko&gnitovindu</translation> <translation id="8662671328352114214">Koble til <ph name="TYPE" />-nettverket</translation> <translation id="8662733268723715832">Dette tar lengre tid enn forventet. Du kan hoppe over prosessen eller vente til den er ferdig.</translation> @@ -7499,6 +7543,7 @@ <translation id="8872155268274985541">Fant ugyldig ekstern manifestfil for Kiosk-oppdatering. Kunne ikke oppdatere Kiosk-appen. Ta ut USB-pinnen.</translation> <translation id="8872777911145321141">Spør når nettsteder vil bruke virtuell virkelighet-enhetene eller -dataene dine (anbefales)</translation> <translation id="8874184842967597500">Ikke tilkoblet</translation> +<translation id="8874341931345877644">Cast til en enhet:</translation> <translation id="8875520811099717934">Linux-oppgradering</translation> <translation id="8875736897340638404">Velg synligheten din</translation> <translation id="8876307312329369159">Denne innstillingen kan ikke endres under en demonstrasjonsøkt.</translation> @@ -7563,7 +7608,6 @@ <translation id="8941173171815156065">Opphev tillatelsen «<ph name="PERMISSION" />»</translation> <translation id="894360074127026135">Internasjonal oppgradering av Netscape</translation> <translation id="8944099748578356325">bruke opp batteriet raskere (for øyeblikket <ph name="BATTERY_PERCENTAGE" /> %)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> deler et vindu med <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Ikonstørrelse</translation> <translation id="8946359700442089734">Feilsøkingsfunksjonene ble ikke påslått på denne <ph name="IDS_SHORT_PRODUCT_NAME" />-enheten.</translation> <translation id="894763922177556086">God</translation> @@ -7689,6 +7733,7 @@ Finn ut hvilke data Google samler inn, og hvorfor, på <ph name="BEGIN_LINK2" />policies.google.com<ph name="END_LINK2" />.</translation> <translation id="9066777626153702300">Inaktive nettsteder</translation> <translation id="9066782832737749352">Tekst til tale</translation> +<translation id="9068298336633421551">Tillat at Android-apper og tjenester med posisjonstillatelse bruker enhetens posisjon. Google kan samle inn posisjonsdata med jevne mellomrom og bruke disse dataene til å forbedre posisjonsnøyaktigheten og posisjonsbaserte tjenester på en anonym måte.</translation> <translation id="9068878141610261315">Filtypen støttes ikke</translation> <translation id="9070342919388027491">Fanen er flyttet til venstre</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index edc25463..813a255 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -163,6 +163,7 @@ <translation id="1153356358378277386">ପେୟାର୍ ହୋଇଥିବା ଡିଭାଇସ୍</translation> <translation id="1153636665119721804">Google ଆଡଭାନ୍ସଡ ପ୍ରୋଟେକସନ୍ ପ୍ରୋଗ୍ରାମ୍</translation> <translation id="1155816283571436363">ଆପଣଙ୍କ ଫୋନ୍ ସହ ସଂଯୋଗ କରାଯାଉଛି</translation> +<translation id="1158080958325422608">ଅପରକେସ କରନ୍ତୁ</translation> <translation id="1158238185437008462">ମେମୋରୀଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ</translation> <translation id="1161575384898972166">କ୍ଲାଏଣ୍ଟ ସାର୍ଟିଫିକେଟ୍ ଏକ୍ସପୋର୍ଟ କରିବାକୁ ଦୟାକରି <ph name="TOKEN_NAME" />କୁ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ।</translation> <translation id="116173250649946226">ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟର୍ ଏକ ଡିଫଲ୍ଟ ଥିମ୍ ସେଟ୍ କରିଛନ୍ତି ଯାହାକୁ ପରିବର୍ତ୍ତନ କରାଯାଇପାରିବ ନାହିଁ।</translation> @@ -691,6 +692,7 @@ <translation id="1700079447639026019">କୁକୀଗୁଡ଼ିକୁ କେବେ ବି ବ୍ୟବହାର କରିପାରୁନଥିବା ସାଇଟଗୁଡ଼ିକ</translation> <translation id="1703331064825191675">ଆପଣଙ୍କର ପାସ୍ୱାର୍ଡଗୁଡ଼ିକ ବିଷୟରେ କେବେ ବି ଚିନ୍ତା କରନ୍ତୁ ନାହିଁ</translation> <translation id="1703666494654169921">ଭର୍ଚୁଆଲ୍ ରିଆଲିଟୀ ଡିଭାଇସ୍ କିମ୍ବା ଡାଟା ବ୍ୟବହାର କରିବାକୁ ସାଇଟଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ ନାହିଁ</translation> +<translation id="1704097193565924901">କ୍ୟାପିଟାଲାଇଜ କରନ୍ତୁ</translation> <translation id="1704230497453185209">ସାଉଣ୍ଡ ଚଲାଇବା ପାଇଁ ସାଇଟଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ ନାହିଁ</translation> <translation id="1704970325597567340">ସୁରକ୍ଷା ଯାଞ୍ଚ <ph name="DATE" />ରେ ଚାଲିଥିଲା</translation> <translation id="1706586824377653884">ଆପଣଙ୍କର ଆଡମିନିଷ୍ଟ୍ରେଟର୍ଙ୍କ ଦ୍ୱାରା ଯୋଗ କରାଯାଇଛି</translation> @@ -2775,7 +2777,6 @@ <translation id="3842552989725514455">ସେରିଫ୍ ଫଣ୍ଟ</translation> <translation id="3843464315703645664">ଆଭ୍ୟନ୍ତରୀଣ ଭାବେ ଆଲାଉଲିଷ୍ଟ କରାଯାଇଛି</translation> <translation id="3844888638014364087">ଇମୋଜି ଭର୍ତ୍ତି କରାଯାଇଛି</translation> -<translation id="384513009320852920">ଆପଣଙ୍କ ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସ୍ ପେୟାରିଂ ମୋଡରେ ଏବଂ ଆଖପାଖରେ ଅଛି ବୋଲି ସୁନିଶ୍ଚିତ କରନ୍ତୁ। <ph name="BEGIN_LINK_LEARN_MORE" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">ୱେବ୍ସାଇଟ୍, Android ଆପ୍ସ ଏବଂ ଆହୁରି ଅନେକ କିଛିକୁ ଡେଭଲପ୍ କରିବା ପାଇଁ ଟୁଲ୍ଗୁଡ଼ିକୁ ପ୍ରାପ୍ତ କରନ୍ତୁ। Linuxକୁ ଇନ୍ଷ୍ଟଲ୍ କରିବା ଦ୍ଵାରା <ph name="DOWNLOAD_SIZE" /> ପରିମାଣର ଡାଟା ଡାଉନ୍ଲୋଡ୍ ହେବ।</translation> <translation id="3847319713229060696">ୱେବରେ ସମସ୍ତଙ୍କ ପାଇଁ ସୁରକ୍ଷାକୁ ଉନ୍ନତ କରିବାରେ ସାହାଯ୍ୟ କରନ୍ତୁ</translation> <translation id="3848547754896969219">&ଇନକଗ୍ନିଟୋ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ</translation> @@ -3560,6 +3561,7 @@ <translation id="4681453295291708042">Nearby Share ଅକ୍ଷମ କରନ୍ତୁ</translation> <translation id="4681930562518940301">ନୂଆ ଟାବ୍ରେ ମୂଳ &ଛବି ଖୋଲନ୍ତୁ</translation> <translation id="4682551433947286597">ସାଇନ୍ ଇନ୍ ସ୍କ୍ରିନ୍ରେ ୱାଲ୍ପେପର୍ଗୁଡ଼ିକ ଦେଖାଯିବ।</translation> +<translation id="4683629100208651599">ଲୋୟରକେସ କରନ୍ତୁ</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />% (ଡିଫଲ୍ଟ)</translation> <translation id="4684427112815847243">ସବୁକିଛି ସିଙ୍କ୍ କରନ୍ତୁ</translation> <translation id="4684471265911890182"><ph name="APP_NAME" /> କ୍ୟାମେରାକୁ ଆକ୍ସେସ୍ କରିବାକୁ ଚେଷ୍ଟା କରୁଛି। ଆକ୍ସେସ୍ କରିବାକୁ ଅନୁମତି ଦେବାକୁ କ୍ୟାମେରାର ଗୋପନୀୟତା ସ୍ୱିଚକୁ ବନ୍ଦ କରନ୍ତୁ।</translation> @@ -4282,7 +4284,6 @@ <translation id="5485102783864353244">ଆପ୍ ଯୋଗ କରନ୍ତୁ</translation> <translation id="5485754497697573575">ସମସ୍ତ ଟାବ୍ ପୁନଃସ୍ଥାପନ କରନ୍ତୁ</translation> <translation id="5486261815000869482">ପାସ୍ୱାର୍ଡ ସୁନିଶ୍ଚିତ କରନ୍ତୁ</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> ଆପଣଙ୍କର ସ୍କ୍ରିନ୍ <ph name="TAB_NAME" /> ସହ ସେୟାର୍ କରୁଛି।</translation> <translation id="5486561344817861625">ବ୍ରାଉଜର୍ ରିଷ୍ଟାର୍ଟ ଅନୁକରଣ କରନ୍ତୁ</translation> <translation id="5487460042548760727">ପ୍ରୋଫାଇଲର ନାମକୁ <ph name="PROFILE_NAME" />ରେ ବଦଳାନ୍ତୁ</translation> <translation id="5487521232677179737">ଡାଟା ଖାଲି କରନ୍ତୁ</translation> @@ -4344,6 +4345,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ଏହା କରିବାକୁ ଚାହେଁ</translation> <translation id="5534304873398226603">ଫଟୋ କିମ୍ବା ଭିଡିଓ ଖାରଜ କରନ୍ତୁ</translation> <translation id="5535941515421698170">ଏହି ଡିଭାଇସ୍ରୁ ଆପଣଙ୍କର ବିଦ୍ୟମାନଥିବା ଡାଟାକୁ ମଧ୍ୟ କାଢ଼ନ୍ତୁ</translation> +<translation id="5537725057119320332">କାଷ୍ଟ</translation> <translation id="5539221284352502426">ସର୍ଭର୍ ଦ୍ୱାରା ଆପଣ ଲେଖିଥିବା ପାସ୍ୱାର୍ଡ ଅଗ୍ରାହ୍ୟ କରିଦିଆଯାଇଛି। ଏହି ସମ୍ଭାବ୍ୟ କାରଣଗୁଡ଼ିକ ଅନ୍ତର୍ଭୁକ୍ତ: ପାସ୍ୱର୍ଡଟି ଅତି ଛୋଟ ଅଟେ। ପାସ୍ୱାର୍ଡରେ ସଂଖ୍ୟା କିମ୍ବା ଚିହ୍ନଗୁଡ଼ିକ ଅନ୍ତର୍ଭୁକ୍ତ ହେବା ଜରୁରୀ ଅଟେ। ପାସ୍ୱାର୍ଡଟି ପୂର୍ବ ପାସ୍ୱାର୍ଡ ଠାରୁ ଭିନ୍ନ ହୋଇଥିବା ଆବଶ୍ୟକ।</translation> <translation id="5541694225089836610">ଆପଣଙ୍କର ଆଡ୍ମିନିଷ୍ଟ୍ରେଟର୍ଙ୍କ ଦ୍ଵାରା ଏହି କାର୍ଯ୍ୟ ଅକ୍ଷମ କରାଯାଇଛି</translation> <translation id="5542132724887566711">ପ୍ରୋଫାଇଲ୍</translation> @@ -4574,6 +4576,7 @@ <translation id="5787146423283493983">କୀ ସହମତି</translation> <translation id="5787420647064736989">ଡିଭାଇସର ନାମ</translation> <translation id="5788367137662787332">କ୍ଷମା କରିବେ, ଅତିକମ୍ରେ ଡିଭାଇସ୍<ph name="DEVICE_LABEL" />ରେ ଗୋଟିଏ ବିଭାଜନ ଖଞ୍ଜାଯାଇପାରିଲା ନାହିଁ।</translation> +<translation id="5789643057113097023">।</translation> <translation id="5790085346892983794">ସଫଳ ହୋଇଛି</translation> <translation id="5790651917470750848">ପୋର୍ଟ ଫରୱାର୍ଡ ପୂର୍ବରୁ ବିଦ୍ୟମାନ ଅଛି</translation> <translation id="5792728279623964091">ଦୟାକରି ଆପଣଙ୍କର ପାୱର୍ ବଟନ୍କୁ ଟାପ୍ କରନ୍ତୁ</translation> @@ -4805,10 +4808,8 @@ <ph name="BEGIN_PARAGRAPH2" />ଆପଣ ନିଜ ଡିଭାଇସ୍ରେ ମୁଖ୍ୟ ଲୋକେସନ୍ ସେଟିଂକୁ ବନ୍ଦ କରି ଲୋକେସନ୍କୁ ବନ୍ଦ କରିପାରିବେ। ଆପଣ ଲୋକେସନ୍ ସେଟିଂସ୍ରେ ୱାଇ-ଫାଇ, ମୋବାଇଲ୍ ନେଟ୍ୱର୍କ ଓ ଲୋକେସନ୍ ପାଇଁ ସେନ୍ସର୍ଗୁଡ଼ିକର ବ୍ୟବହାର ମଧ୍ୟ ବନ୍ଦ କରିପାରିବେ।<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">ଫୁଲ୍ସ୍କ୍ରିନ୍ରୁ ବାହାରି ଆସନ୍ତୁ</translation> <translation id="6042308850641462728">ଅଧିକ</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> ସହିତ ଏକ Chrome ଟାବ୍ ସେୟାର୍ କରୁଛି।</translation> <translation id="604388835206766544">କନଫିଗ୍ରେସନ୍ ବିଶ୍ଳେଷଣ କରିବାରେ ବିଫଳ ହେଲା</translation> <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="6049797270917061226">ଏହି ଫାଇଲ୍ ଦ୍ୱାରା ଆକ୍ରମଣକାରୀମାନେ ଆପଣଙ୍କ ବ୍ୟକ୍ତିଗତ ସୂଚନା ଚୋରି କରିପାରିବେ।</translation> @@ -5954,6 +5955,7 @@ <translation id="7257173066616499747">ୱାଇ-ଫାଇ ନେଟ୍ୱାର୍କଗୁଡ଼ିକ</translation> <translation id="725758059478686223">ପ୍ରିଣ୍ଟିଂ ସେବା</translation> <translation id="7257666756905341374">ଆପଣ କପି ଏବଂ ପେଷ୍ଟ କରୁଥିବା ଡାଟା ପଢ଼ନ୍ତୁ</translation> +<translation id="7258192266780953209">ରୂପାନ୍ତରଣଗୁଡ଼ିକ</translation> <translation id="7258225044283673131">ଆପ୍ଲିକେସନ୍ଟି ପ୍ରତିକ୍ରିୟା କରୁନାହିଁ। ଆପ୍କୁ ବନ୍ଦ କରିବା ପାଇଁ "ବଳପୂର୍ବକ ବନ୍ଦ କରନ୍ତୁ"କୁ ଚୟନ କରନ୍ତୁ।</translation> <translation id="7262004276116528033">ଏହି ସାଇନ୍ ଇନ୍ ସର୍ଭର୍ <ph name="SAML_DOMAIN" /> ଦ୍ଵାରା ହୋଷ୍ଟ କରାଯାଇଛି</translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />ଏହି ଟ୍ରବୁଲସୁଟିଂ ଷ୍ଟେପଗୁଡ଼ିକୁ ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ: @@ -7303,7 +7305,6 @@ <translation id="8655295600908251630">ଚ୍ୟାନେଲ୍</translation> <translation id="8655972064210167941">ଆପଣଙ୍କର ପାସ୍ୱର୍ଡ ଯାଞ୍ଚ ହୋଇନଥିବାରୁ ସାଇନ୍ ଇନ୍ ବିଫଳ ହୋଇଛି। ଦୟାକରି ଆପଣଙ୍କ ବ୍ୟବସ୍ଥାପକଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ ବା ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="8657393004602556571">ଆପଣ ମତାମତକୁ ଖାରଜ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" />,<ph name="TAB_NAME" />ସହ ଆପଣଙ୍କର ସ୍କ୍ରିନ୍ ଓ ଅଡିଓ ସେୟାର୍ କରୁଛନ୍ତି।</translation> <translation id="8661290697478713397">ଇନ୍କ&ଗ୍ନିଟୋ ୱିଣ୍ଡୋରେ ଲିଙ୍କ ଖୋଲନ୍ତୁ</translation> <translation id="8662671328352114214"><ph name="TYPE" />ନେଟ୍ୱର୍କରେ ଯୋଗ ଦିଅନ୍ତୁ</translation> <translation id="8662733268723715832">ଏହା ଆଶା କରାଯାଉଥିବା ସମୟଠାରୁ ଅଧିକ ସମୟ ନେଉଛି, ଆପଣ ବାଦ୍ ଦେଇପାରିବେ କିମ୍ବା ଏହା ସମ୍ପୂର୍ଣ୍ଣ ହେବା ପର୍ଯ୍ୟନ୍ତ ଅପେକ୍ଷା କରିପାରିବେ।</translation> @@ -7598,7 +7599,6 @@ <translation id="8941173171815156065">'<ph name="PERMISSION" />' ଅନୁମତି ପ୍ରତ୍ୟାହାର କରନ୍ତୁ</translation> <translation id="894360074127026135">Netscape ଆନ୍ତର୍ଜାତିକ ଷ୍ଟେପ୍ ଅପ୍</translation> <translation id="8944099748578356325">ଆପଣଙ୍କ ବ୍ୟାଟେରୀକୁ ଖୁବ ଶୀଘ୍ର ବ୍ୟବହାର କରିଥାଏ। (ବର୍ତ୍ତମାନ <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> ସହ ଏକ ୱିଣ୍ଡୋ ସେୟାର୍ କରୁଛି।</translation> <translation id="8945274638472141382">ଆଇକନର ଆକାର</translation> <translation id="8946359700442089734">ଏହି <ph name="IDS_SHORT_PRODUCT_NAME" /> ଡିଭାଇସ୍ରେ ଡିବଗିଂ ବୈଶିଷ୍ଟ୍ୟ ସମ୍ପୂର୍ଣ୍ଣ ଭାବେ ସକ୍ଷମ ହୋଇନାହିଁ।</translation> <translation id="894763922177556086">ଭଲ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 7f1ae04..681749d 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -163,6 +163,7 @@ <translation id="1153356358378277386">ਜੋੜਾਬੱਧ ਕੀਤੀਆਂ ਡੀਵਾਈਸਾਂ</translation> <translation id="1153636665119721804">Google ਉੱਨਤ ਸੁਰੱਖਿਆ ਪ੍ਰੋਗਰਾਮ</translation> <translation id="1155816283571436363">ਤੁਹਾਡੇ ਫ਼ੋਨ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> +<translation id="1158080958325422608">ਵੱਡੇ ਅੱਖਰਾਂ ਵਿੱਚ ਬਦਲੋ</translation> <translation id="1158238185437008462">ਯਾਦਾਂ ਦੇਖੋ</translation> <translation id="1161575384898972166">ਕਿਰਪਾ ਕਰਕੇ ਕਲਾਇੰਟ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਨਿਰਯਾਤ ਕਰਨ ਲਈ <ph name="TOKEN_NAME" /> 'ਤੇ ਸਾਈਨ-ਇਨ ਕਰੋ।</translation> <translation id="116173250649946226">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਇੱਕ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਥੀਮ ਸੈੱਟ ਕੀਤਾ ਹੈ ਜਿਸਨੂੰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।</translation> @@ -534,6 +535,7 @@ <translation id="1549275686094429035">ARC ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> <ph name="VOLUME_NAME" /> ਤੱਕ ਪਹੁੰਚ ਕਰਨਾ ਚਾਹੁੰਦੀ ਹੈ। ਇਹ ਤੁਹਾਡੀਆਂ ਫਾਈਲਾਂ ਨੂੰ ਸੰਸ਼ੋਧਿਤ ਕਰ ਜਾਂ ਮਿਟਾ ਸਕਦੀ ਹੈ।</translation> <translation id="1552301827267621511">"<ph name="EXTENSION_NAME" />" ਐਕਸਟੈਂਸ਼ਨ ਨੇ <ph name="SEARCH_PROVIDER_DOMAIN" /> ਨੂੰ ਵਰਤਣ ਲਈ ਖੋਜ ਇੰਜਣ ਨੂੰ ਬਦਲਿਆ</translation> +<translation id="1552752544932680961">ਐਕਸਟੈਂਸ਼ਨ ਵਿਵਸਥਿਤ ਕਰੋ</translation> <translation id="1553538517812678578">ਅਸੀਮਿਤ</translation> <translation id="1555130319947370107">ਨੀਲਾ</translation> <translation id="1556537182262721003">ਐਕਸਟੈਂਸ਼ਨ ਡਾਇਰੈਕਟਰੀ 'ਚ ਪ੍ਰੋਫਾਈਲ ਦੀ ਹਲਚਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</translation> @@ -696,6 +698,7 @@ <translation id="1700079447639026019">ਉਹ ਸਾਈਟਾਂ ਜੋ ਕਦੇ ਵੀ ਕੁਕੀਜ਼ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰ ਸਕਦੀਆਂ</translation> <translation id="1703331064825191675">ਕਦੇ ਆਪਣੇ ਪਾਸਵਰਡਾਂ ਦਾ ਫ਼ਿਕਰ ਨਾ ਕਰੋ</translation> <translation id="1703666494654169921">ਸਾਈਟਾਂ ਨੂੰ ਆਭਾਸੀ ਵਾਸਤਵਿਕਤਾ ਵਾਲੇ ਡੀਵਾਈਸ ਜਾਂ ਡਾਟੇ ਨੂੰ ਵਰਤਣ ਦੀ ਇਜਾਜ਼ਤ ਨਾ ਦਿਓ</translation> +<translation id="1704097193565924901">ਵੱਡੇ ਅੱਖਰਾਂ ਵਿੱਚ ਲਿਖੋ</translation> <translation id="1704230497453185209">ਸਾਈਟਾਂ ਨੂੰ ਧੁਨੀ ਚਲਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਾ ਦਿਓ</translation> <translation id="1704970325597567340">ਸੁਰੱਖਿਆ ਜਾਂਚ <ph name="DATE" /> ਨੂੰ ਚਲਾਈ ਗਈ</translation> <translation id="1706586824377653884">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਸ਼ਾਮਲ ਕੀਤਾ</translation> @@ -2792,7 +2795,6 @@ <translation id="3842552989725514455">Serif ਫੌਂਟ</translation> <translation id="3843464315703645664">ਅੰਦਰੂਨੀ ਤੌਰ 'ਤੇ ਪ੍ਰਵਾਨਗੀ ਲਈ ਸੂਚੀਬੱਧ</translation> <translation id="3844888638014364087">ਇਮੋਜੀ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ</translation> -<translation id="384513009320852920">ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਹਾਡਾ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਜੋੜਾਬੱਧਕਰਨ ਮੋਡ ਵਿੱਚ ਹੈ ਅਤੇ ਨਜ਼ਦੀਕ ਹੈ। <ph name="BEGIN_LINK_LEARN_MORE" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">ਵੈੱਬਸਾਈਟਾਂ, Android ਐਪਾਂ ਦਾ ਵਿਕਾਸ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਕਰਨ ਲਈ ਟੂਲ ਪ੍ਰਾਪਤ ਕਰੋ। Linux ਸਥਾਪਤ ਕਰਨ ਲਈ <ph name="DOWNLOAD_SIZE" /> ਡਾਟਾ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="3847319713229060696">ਵੈੱਬ 'ਤੇ ਸੁਰੱਖਿਆ ਨੂੰ ਹਰੇਕ ਲਈ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰੋ</translation> <translation id="3848547754896969219">&ਇਨਕੋਗਨਿਟੋ ਵਿੰਡੋ ਵਿੱਚ ਖੋਲ੍ਹੋ</translation> @@ -3578,6 +3580,7 @@ <translation id="4681453295291708042">ਨਜ਼ਦੀਕੀ ਸਾਂਝ ਬੰਦ ਕਰੋ</translation> <translation id="4681930562518940301">ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਮੂਲ &ਚਿੱਤਰ ਖੋਲ੍ਹੋ</translation> <translation id="4682551433947286597">ਵਾਲਪੇਪਰ ਸਾਈਨ-ਇਨ ਸਕ੍ਰੀਨ 'ਤੇ ਦਿਖਾਈ ਦਿੰਦੇ ਹਨ।</translation> +<translation id="4683629100208651599">ਛੋਟੇ ਅੱਖਰਾਂ ਵਿੱਚ ਬਦਲੋ</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />% (ਪੂਰਵ-ਨਿਰਧਾਰਤ)</translation> <translation id="4684427112815847243">ਸਭ ਕੁਝ ਸਿੰਕ ਕਰੋ</translation> <translation id="4684471265911890182"><ph name="APP_NAME" /> ਕੈਮਰੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੀ ਹੈ। ਪਹੁੰਚ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ ਕੈਮਰਾ ਪਰਦੇਦਾਰੀ ਸਵਿੱਚ ਨੂੰ ਬੰਦ ਕਰੋ।</translation> @@ -4300,7 +4303,6 @@ <translation id="5485102783864353244">ਐਪ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="5485754497697573575">ਸਾਰੀਆਂ ਟੈਬਸ ਰੀਸਟੋਰ ਕਰੋ</translation> <translation id="5486261815000869482">ਪਾਸਵਰਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਨੂੰ <ph name="TAB_NAME" /> ਨਾਲ ਸ਼ੇਅਰ ਕਰ ਰਿਹਾ ਹੈ।</translation> <translation id="5486561344817861625">ਬ੍ਰਾਊਜ਼ਰ ਰੀਸਟਾਰਟ ਦੀ ਨਕਲ ਕਰੋ</translation> <translation id="5487460042548760727">ਪ੍ਰੋਫਾਈਲ ਦਾ ਨਾਮ ਬਦਲ ਕੇ <ph name="PROFILE_NAME" /> ਕਰੋ</translation> <translation id="5487521232677179737">ਡਾਟਾ ਕਲੀਅਰ ਕਰੋ</translation> @@ -4362,6 +4364,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ਇਹ ਕਰਨਾ ਚਾਹੁੰਦੀ ਹੈ</translation> <translation id="5534304873398226603">ਫ਼ੋਟੋ ਜਾਂ ਵੀਡੀਓ ਰੱਦ ਕਰੋ</translation> <translation id="5535941515421698170">ਇਸ ਡੀਵਾਈਸ ਤੋਂ ਆਪਣਾ ਮੌਜੂਦਾ ਡਾਟਾ ਵੀ ਹਟਾਓ</translation> +<translation id="5537725057119320332">ਕਾਸਟ ਕਰੋ</translation> <translation id="5539221284352502426">ਤੁਹਾਡੇ ਵੱਲੋਂ ਦਾਖਲ ਕੀਤੇ ਪਾਸਵਰਡ ਨੂੰ ਸਰਵਰ ਨੇ ਅਸਵੀਕਾਰ ਕੀਤਾ। ਸੰਭਾਵਿਤ ਕਾਰਨਾਂ ਵਿੱਚ ਇਹ ਸ਼ਾਮਲ ਹੈ: ਪਾਸਵਰਡ ਬਹੁਤ ਛੋਟਾ ਹੈ। ਪਾਸਵਰਡ ਵਿੱਚ ਨੰਬਰ ਜਾਂ ਚਿੰਨ੍ਹ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ। ਪਾਸਵਰਡ ਲਾਜ਼ਮੀ ਤੌਰ 'ਤੇ ਪਿਛਲੇ ਪਾਸਵਰਡਾਂ ਤੋਂ ਵੱਖਰਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।</translation> <translation id="5541694225089836610">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਕਾਰਵਾਈ ਨੂੰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ</translation> <translation id="5542132724887566711">ਪ੍ਰੋਫਾਈਲ</translation> @@ -4592,6 +4595,7 @@ <translation id="5787146423283493983">ਕੁੰਜੀ ਇਕਰਾਰਨਾਮਾ</translation> <translation id="5787420647064736989">ਡੀਵਾਈਸ ਦਾ ਨਾਮ</translation> <translation id="5788367137662787332">ਮਾਫ਼ ਕਰਨਾ, ਡੀਵਾਈਸ <ph name="DEVICE_LABEL" /> 'ਤੇ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਭਾਗ ਮਾਉਂਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">ਸਫਲਤਾ</translation> <translation id="5790651917470750848">ਪੋਰਟ ਫਾਰਵਰਡ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਮੌਜੂਦ ਹੈ</translation> <translation id="5792728279623964091">ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਪਾਵਰ ਬਟਨ 'ਤੇ ਟੈਪ ਕਰੋ</translation> @@ -4823,10 +4827,8 @@ <ph name="BEGIN_PARAGRAPH2" />ਤੁਸੀਂ ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ ਮੁੱਖ ਟਿਕਾਣਾ ਸੈਟਿੰਗ ਨੂੰ ਬੰਦ ਕਰਕੇ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਨੂੰ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ। ਤੁਸੀਂ ਟਿਕਾਣਾ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਲਈ ਵਾਈ-ਫਾਈ, ਮੋਬਾਈਲ ਨੈੱਟਵਰਕਾਂ ਅਤੇ ਸੈਂਸਰਾਂ ਦੀ ਵਰਤੋਂ ਨੂੰ ਵੀ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ।<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">ਪੂਰੀ ਸਕ੍ਰੀਨ ਤੋਂ ਬਾਹਰ ਜਾਓ</translation> <translation id="6042308850641462728">ਹੋਰ</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /><ph name="TAB_NAME" /> ਦੇ ਨਾਲ Chrome ਟੈਬ ਨੂੰ ਸਾਂਝਾ ਕਰ ਰਹੀ ਹੈ।</translation> <translation id="604388835206766544">ਸੰਰੂਪਣ ਨੂੰ ਪਾਰਸ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ</translation> <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="6049797270917061226">ਇਹ ਫ਼ਾਈਲ ਹਮਲਾਵਰਾਂ ਨੂੰ ਤੁਹਾਡੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਚੋਰੀ ਕਰਨ ਦੇ ਸਕਦੀ ਹੈ।</translation> @@ -5971,6 +5973,7 @@ <translation id="7257173066616499747">Wi-Fi ਨੈਟਵਰਕ</translation> <translation id="725758059478686223">ਪ੍ਰਿੰਟਿੰਗ ਸੇਵਾ</translation> <translation id="7257666756905341374">ਉਹ ਡਾਟਾ ਪੜ੍ਹੋ ਜੋ ਤੁਸੀਂ ਕਾਪੀ ਅਤੇ ਪੇਸਟ ਕਰਦੇ ਹੋ</translation> +<translation id="7258192266780953209">ਰੁਪਾਂਤਰਣ</translation> <translation id="7258225044283673131">ਇਹ ਐਪਲੀਕੇਸ਼ਨ ਪ੍ਰਤੀਕਿਰਿਆ ਨਹੀਂ ਦੇ ਰਹੀ ਹੈ। ਐਪ ਬੰਦ ਕਰਨ ਲਈ "ਜ਼ਬਰਦਸਤੀ ਬੰਦ ਕਰੋ" ਨੂੰ ਚੁਣੋ।</translation> <translation id="7262004276116528033">ਇਹ ਸਾਈਨ-ਇਨ ਸੇਵਾ <ph name="SAML_DOMAIN" /> ਵੱਲੋਂ ਹੋਸਟ ਕੀਤੀ ਜਾਂਦੀ ਹੈ</translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />ਸਮੱਸਿਆ-ਨਿਪਟਾਰਾ ਸੰਬੰਧੀ ਇਨ੍ਹਾਂ ਪੜਾਵਾਂ ਨੂੰ ਅਜ਼ਮਾਓ: @@ -7321,7 +7324,6 @@ <translation id="8655295600908251630">ਚੈਨਲ</translation> <translation id="8655972064210167941">ਸਾਈਨ-ਇਨ ਅਸਫਲ ਹੋ ਗਿਆ ਕਿਉਂਕਿ ਤੁਹਾਡੇ ਪਾਸਵਰਡ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ ਜਾਂ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="8657393004602556571">ਕੀ ਤੁਸੀਂ ਵਿਚਾਰ ਨੂੰ ਬਰਖਾਸਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> ਦੇ ਨਾਲ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਅਤੇ ਆਡੀਓ ਸਾਂਝਾ ਕਰ ਰਹੀ ਹੈ।</translation> <translation id="8661290697478713397">ਗੁਮ&ਨਾਮ window ਵਿੱਚ ਲਿੰਕ ਖੋਲ੍ਹੋ</translation> <translation id="8662671328352114214"><ph name="TYPE" /> ਨੈੱਟਵਰਕ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ</translation> <translation id="8662733268723715832">ਇਸ ਵਿੱਚ ਉਮੀਦ ਨਾਲੋਂ ਵੱਧ ਸਮਾਂ ਲੱਗ ਰਿਹਾ ਹੈ, ਤੁਸੀਂ ਛੱਡ ਸਕਦੇ ਹੋ ਜਾਂ ਤੁਸੀਂ ਇਸਦੇ ਪੂਰਾ ਹੋਣ ਤੱਕ ਉਡੀਕ ਕਰ ਸਕਦੇ ਹੋ।</translation> @@ -7617,7 +7619,6 @@ <translation id="8941173171815156065">ਅਨੁਮਤੀ '<ph name="PERMISSION" />' ਰੱਦ ਕਰੋ</translation> <translation id="894360074127026135">Netscape ਅੰਤਰਰਾਸ਼ਟਰੀ ਸਟੈਪ-ਅਪ</translation> <translation id="8944099748578356325">ਵਧੇਰੇ ਤੇਜ਼ੀ ਨਾਲ ਬੈਟਰੀ ਵਰਤੇਗਾ (ਇਸ ਸਮੇਂ <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> ਦੇ ਨਾਲ ਵਿੰਡੋ ਸਾਂਝਾ ਕਰ ਰਹੀ ਹੈ।</translation> <translation id="8945274638472141382">ਪ੍ਰਤੀਕ ਆਕਾਰ</translation> <translation id="8946359700442089734">ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਡੀਬੱਗ ਕਰਨਾ ਇਸ <ph name="IDS_SHORT_PRODUCT_NAME" /> ਡੀਵਾਈਸ 'ਤੇ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਮਰਥਿਤ ਨਹੀਂ ਸੀ।</translation> <translation id="894763922177556086">ਵਧੀਆ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 18a5eb6..b3ef3b3 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -535,6 +535,7 @@ <translation id="1549275686094429035">Włączono ARC</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> chce uzyskać dostęp do dysku <ph name="VOLUME_NAME" />. Będzie mogła tam zmieniać i usuwać pliki.</translation> <translation id="1552301827267621511">Rozszerzenie „<ph name="EXTENSION_NAME" />” zmieniło domenę wyszukiwania na <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Zarządzaj rozszerzeniem</translation> <translation id="1553538517812678578">nieograniczona</translation> <translation id="1555130319947370107">Niebieski</translation> <translation id="1556537182262721003">Nie można przenieść katalogu rozszerzenia do profilu.</translation> @@ -2785,7 +2786,6 @@ <translation id="3842552989725514455">Czcionka szeryfowa</translation> <translation id="3843464315703645664">Dozwolone wewnętrznie</translation> <translation id="3844888638014364087">Wstawiono emotikon</translation> -<translation id="384513009320852920">Sprawdź czy urządzenie Bluetooth znajduje się w pobliżu i ma włączony tryb parowania. <ph name="BEGIN_LINK_LEARN_MORE" />Więcej informacji<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Pobierz narzędzia do tworzenia stron internetowych, aplikacji na Androida itp. Instalacja Linuksa spowoduje pobranie <ph name="DOWNLOAD_SIZE" /> danych.</translation> <translation id="3847319713229060696">Pomóż poprawić bezpieczeństwo wszystkich użytkowników internetu</translation> <translation id="3848547754896969219">Otwórz w oknie &incognito</translation> @@ -4295,7 +4295,6 @@ <translation id="5485102783864353244">Dodaj aplikację</translation> <translation id="5485754497697573575">Przywróć wszystkie karty</translation> <translation id="5486261815000869482">Potwierdź hasło</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> udostępnia Twój ekran karcie <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Symuluj ponowne uruchomienie przeglądarki</translation> <translation id="5487460042548760727">Zmień nazwę profilu na <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Wyczyść dane</translation> @@ -4357,6 +4356,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> prosi o pozwolenie na:</translation> <translation id="5534304873398226603">Odrzuć zdjęcie lub film</translation> <translation id="5535941515421698170">Usuń też swoje dane z tego urządzenia</translation> +<translation id="5537725057119320332">Przesyłaj</translation> <translation id="5539221284352502426">Podane hasło zostało odrzucone przez serwer. Możliwe, że jest ono za krótkie, musi zawierać cyfry lub symbole albo musi się różnić od poprzednich haseł.</translation> <translation id="5541694225089836610">Administrator wyłączył to działanie</translation> <translation id="5542132724887566711">Profil</translation> @@ -4587,6 +4587,7 @@ <translation id="5787146423283493983">Uzgadnianie klucza</translation> <translation id="5787420647064736989">Nazwa urządzenia</translation> <translation id="5788367137662787332">Niestety, nie można podłączyć co najmniej jednej partycji na urządzeniu <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Udało się</translation> <translation id="5790651917470750848">Przekierowanie portu już istnieje</translation> <translation id="5792728279623964091">Naciśnij przycisk zasilania</translation> @@ -4819,10 +4820,8 @@ <ph name="BEGIN_PARAGRAPH2" />Aby wyłączyć tę usługę, wyłącz główne ustawienie Lokalizacja na urządzeniu. Możesz też wyłączyć w ustawieniach lokalizacji korzystanie z sieci Wi‑Fi, sieci komórkowych i czujników przy określaniu lokalizacji.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Zamknij pełny ekran</translation> <translation id="6042308850641462728">Więcej</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> udostępnia kartę Chrome karcie <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Nie udało się przeanalizować konfiguracji</translation> <translation id="6043994281159824495">Wyloguj się teraz</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> udostępnia kartę i dźwięk z Chrome karcie <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Podstawowy przycisk TrackPointa</translation> <translation id="6047632800149092791">Synchronizacja nie działa. Wyloguj się i zaloguj ponownie.</translation> <translation id="6049797270917061226">Ten plik może umożliwiać osobom przeprowadzającym atak kradzież Twoich danych osobowych.</translation> @@ -7326,7 +7325,6 @@ <translation id="8655295600908251630">Kanał</translation> <translation id="8655972064210167941">Nie udało się zalogować, bo nie można zweryfikować hasła. Skontaktuj się z administratorem lub spróbuj ponownie.</translation> <translation id="8657393004602556571">Rezygnujesz z przesłania opinii?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> udostępnia ekran i dźwięk karcie <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Otwórz link w oknie inco&gnito</translation> <translation id="8662671328352114214">Połącz z siecią <ph name="TYPE" /></translation> <translation id="8662733268723715832">Aktualizacja trwa dłużej niż powinna. Możesz ją pominąć lub poczekać, aż się zakończy.</translation> @@ -7623,7 +7621,6 @@ <translation id="8941173171815156065">Cofnij uprawnienie „<ph name="PERMISSION" />”</translation> <translation id="894360074127026135">Dostęp międzynarodowy firmy Netscape</translation> <translation id="8944099748578356325">szybciej zużyje baterię (obecnie <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> udostępnia okno karcie <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Rozmiar ikon</translation> <translation id="8946359700442089734">Funkcje debugowania nie zostały w pełni włączone na urządzeniu <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Dobra</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index dce161c..4de711e 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -162,6 +162,7 @@ <translation id="1152346050262092795">Insira sua senha novamente para verificar a conta.</translation> <translation id="1153356358378277386">Dispositivos pareados</translation> <translation id="1153636665119721804">Programa Proteção Avançada do Google</translation> +<translation id="1155545602507378023">Não, apenas neste dispositivo</translation> <translation id="1155816283571436363">Conectando ao seu smartphone</translation> <translation id="1158080958325422608">Letra maiúscula</translation> <translation id="1158238185437008462">Ver recordações</translation> @@ -397,6 +398,7 @@ <translation id="1410197035576869800">Ícone do app</translation> <translation id="1410616244180625362">Continuar permitindo que <ph name="HOST" /> acesse sua câmera</translation> <translation id="1410806973194718079">Não foi possível verificar as políticas</translation> +<translation id="1412681350727866021">Outras extensões</translation> <translation id="1414315029670184034">Não permitir que os sites usem sua câmera</translation> <translation id="1414648216875402825">Você está atualizando para uma versão instável do <ph name="PRODUCT_NAME" /> que contém recursos que estão em fase de teste. Falhas e erros inesperados ocorrerão. Continue com cautela.</translation> <translation id="1415708812149920388">Acesso de leitura para a área de transferência negado</translation> @@ -535,6 +537,7 @@ <translation id="1549275686094429035">ARC ativado</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> deseja acessar <ph name="VOLUME_NAME" />. Ele pode modificar ou excluir seus arquivos.</translation> <translation id="1552301827267621511">A extensão <ph name="EXTENSION_NAME" /> mudou o mecanismo de pesquisa para <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Gerenciar extensão</translation> <translation id="1553538517812678578">ilimitado</translation> <translation id="1555130319947370107">Azul</translation> <translation id="1556537182262721003">Não foi possível mover o diretório de extensões para o perfil.</translation> @@ -950,6 +953,7 @@ <translation id="1937774647013465102">Não é possível importar o tipo de arquitetura de contêiner <ph name="ARCHITECTURE_CONTAINER" /> com este dispositivo, que é <ph name="ARCHITECTURE_DEVICE" />. Tente restaurar esse contêiner em um dispositivo diferente ou acesse os arquivos que estão dentro desta imagem do contêiner abrindo-os no app Arquivos.</translation> <translation id="1938351510777341717">Comando externo</translation> <translation id="1940546824932169984">Dispositivos conectados</translation> +<translation id="1941410638996203291">Horário de início: <ph name="TIME" /></translation> <translation id="1942128823046546853">Ler e mudar seus dados em qualquer site</translation> <translation id="1942600407708803723">Desligar quando a capa for fechada</translation> <translation id="1944528062465413897">Código de pareamento Bluetooth:</translation> @@ -1328,6 +1332,7 @@ <translation id="2320295602967756579">Ativar o tema claro</translation> <translation id="2322193970951063277">Cabeçalhos e rodapés</translation> <translation id="2322318151094136999">Perguntar quando um site quiser acessar portas seriais (recomendado)</translation> +<translation id="2322622365472107569">Horário de término: <ph name="TIME" /></translation> <translation id="2323018538045954000">Redes Wi-Fi salvas</translation> <translation id="2325444234681128157">Lembrar senha</translation> <translation id="2326188115274135041">Confirme o PIN para ativar o desbloqueio automático</translation> @@ -1433,6 +1438,7 @@ <translation id="2435248616906486374">Rede desconectada</translation> <translation id="2435457462613246316">Mostrar senha</translation> <translation id="2436186046335138073">Permitir que <ph name="HANDLER_HOSTNAME" /> abra todos os links de <ph name="PROTOCOL" />?</translation> +<translation id="2439626940657133600">Carregando <ph name="WINDOW_TITLE" /></translation> <translation id="2440604414813129000">Exibir &código fonte</translation> <translation id="244231003699905658">Endereço inválido. Verifique o endereço e tente novamente.</translation> <translation id="2442916515643169563">Sombra do texto</translation> @@ -1938,6 +1944,7 @@ <translation id="2935654492420446828">Adicionar uma conta escolar mais tarde</translation> <translation id="2936851848721175671">Backup e restauração</translation> <translation id="2938225289965773019">Abrir links de <ph name="PROTOCOL" /></translation> +<translation id="2939908794993783865">Outros sites inativos</translation> <translation id="2939938020978911855">Mostrar dispositivos Bluetooth disponíveis</translation> <translation id="2941112035454246133">Baixa</translation> <translation id="2942279350258725020">Android Mensagens</translation> @@ -2083,6 +2090,7 @@ <translation id="3090589793601454425">Não mover</translation> <translation id="3090819949319990166">Não foi possível copiar o arquivo externo crx em <ph name="TEMP_CRX_FILE" />.</translation> <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" pareado</translation> +<translation id="3093362725605442088">Ler números de série do componente e do dispositivo Chrome OS.</translation> <translation id="3093714882666365141">Não permitir que os sites instalem gerenciadores de pagamento</translation> <translation id="3094141017404513551">Sua navegação será separada de <ph name="EXISTING_USER" /></translation> <translation id="3095871294753148861">Favoritos, senhas e outros dados de navegação são sincronizados com a conta principal.</translation> @@ -2270,6 +2278,7 @@ <translation id="3308852433423051161">Carregando o Google Assistente…</translation> <translation id="3309330461362844500">ID do perfil de certificado</translation> <translation id="3311445899360743395">Os dados associados a esse app poderão ser removidos deste dispositivo.</translation> +<translation id="3312883087018430408">Para pesquisar em um site específico ou em uma parte do Chrome, digite o atalho dele na barra de endereço, seguido da tecla de atalho da sua preferência. Por exemplo, para pesquisar apenas nos Favoritos, digite "@favoritos" e depois pressione Tab ou a barra de espaço.</translation> <translation id="3313622045786997898">Valor da assinatura do certificado</translation> <translation id="3313950410573257029">Verificar conexão</translation> <translation id="3315158641124845231">Ocultar <ph name="PRODUCT_NAME" /></translation> @@ -2690,6 +2699,7 @@ <translation id="3747077776423672805">Para remover apps, acesse "Configurações" > "Google Play Store" > "Gerenciar preferências do Android" > "Apps" ou "Gerenciador de aplicativos". Depois, toque no app que você quer desinstalar (talvez seja necessário deslizar para a direita ou esquerda para encontrar o app). Em seguida, toque em "Desinstalar" ou "Desativar".</translation> <translation id="3747220812138541072">Mostrar sugestões de escrita in-line enquanto você digita</translation> <translation id="3748706263662799310">Informar um bug</translation> +<translation id="3750562496035670393">O Chrome salvou sua senha neste dispositivo, mas ela pode ser salva na sua Conta do Google, se preferir. Assim, todas as senhas na sua conta ficarão disponíveis quando ela estiver conectada.</translation> <translation id="3752253558646317685">Peça para a criança levantar o dedo algumas vezes para salvar a impressão digital</translation> <translation id="3752582316358263300">OK...</translation> <translation id="3753033997400164841">Salve uma vez. Use em qualquer lugar</translation> @@ -2796,7 +2806,6 @@ <translation id="3842552989725514455">Fonte Serif</translation> <translation id="3843464315703645664">Na lista de permissões interna</translation> <translation id="3844888638014364087">Emoji inserido</translation> -<translation id="384513009320852920">Confira se o dispositivo Bluetooth está por perto e no modo de pareamento. <ph name="BEGIN_LINK_LEARN_MORE" />Saiba mais<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Tenha ferramentas para desenvolver sites, apps Android e muito mais. A instalação do Linux causará o download de <ph name="DOWNLOAD_SIZE" /> de dados.</translation> <translation id="3847319713229060696">Ajudar a melhorar a segurança para todos na Web</translation> <translation id="3848547754896969219">Abrir em &uma janela anônima</translation> @@ -3131,6 +3140,7 @@ <translation id="4194570336751258953">Ativar toque para clicar</translation> <translation id="4195643157523330669">Abrir em uma nova guia</translation> <translation id="4195814663415092787">Continuar de onde você parou</translation> +<translation id="4198268995694216131">Outros sites</translation> <translation id="4200689466366162458">Palavras personalizadas</translation> <translation id="4200983522494130825">Nova &guia</translation> <translation id="4201546031411513170">Nas configurações, é possível escolher a qualquer momento o que é sincronizado.</translation> @@ -3252,6 +3262,7 @@ <translation id="4341577178275615435">Para ativar ou desativar a Caret Browsing, use o atalho F7</translation> <translation id="4341905082470253054">Verificando status do TPM...</translation> <translation id="434198521554309404">Rápido. Seguro. Fácil de usar.</translation> +<translation id="4343250402091037179">Para pesquisar em um site específico ou em uma parte do Chrome, digite o atalho dele na barra de endereço, seguido da tecla de atalho da sua preferência.</translation> <translation id="434404122609091467">Com seu provedor de serviços atual</translation> <translation id="4345587454538109430">Configurar...</translation> <translation id="4345732373643853732">Nome de usuário desconhecido pelo servidor</translation> @@ -4004,6 +4015,7 @@ <translation id="5153234146675181447">Esquecer o smartphone</translation> <translation id="5154108062446123722">Configurações avançadas para <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Assunto</translation> +<translation id="5155327081870541046">Na barra de endereço, digite o atalho do site em que você quer pesquisar, como "@favoritos". Depois, pressione o atalho de teclado que preferir e digite o termo de pesquisa.</translation> <translation id="5157635116769074044">Fixar guia dessa página na tela inicial.</translation> <translation id="5159094275429367735">Configurar o Crostini</translation> <translation id="5159419673777902220">Seu pai/mãe desativou as permissões da extensão</translation> @@ -4305,7 +4317,6 @@ <translation id="5485102783864353244">Adicionar aplicativo</translation> <translation id="5485754497697573575">Restaurar todas as guias</translation> <translation id="5486261815000869482">Confirmar senha</translation> -<translation id="5486275809415469523">O <ph name="APP_NAME" /> está compartilhando sua tela com <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simular reinicialização do navegador</translation> <translation id="5487460042548760727">Renomear perfil para <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Limpar dados</translation> @@ -4367,6 +4378,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> quer</translation> <translation id="5534304873398226603">Descartar foto ou vídeo</translation> <translation id="5535941515421698170">Remover também deste dispositivo os dados já existentes</translation> +<translation id="5537725057119320332">Transmitir</translation> <translation id="5539221284352502426">A senha inserida foi recusada pelo servidor. Entre os possíveis motivos estão: a senha é muito curta, não inclui números ou símbolos ou é igual a senhas anteriores.</translation> <translation id="5541694225089836610">Ação desativada pelo administrador</translation> <translation id="5542132724887566711">Perfil</translation> @@ -4598,6 +4610,7 @@ <translation id="5787146423283493983">Acordo de chave</translation> <translation id="5787420647064736989">Nome do dispositivo</translation> <translation id="5788367137662787332">Ao menos uma partição no dispositivo <ph name="DEVICE_LABEL" /> não pôde ser montada.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Sucesso</translation> <translation id="5790651917470750848">O encaminhamento de portas já existe</translation> <translation id="5792728279623964091">Toque no botão liga/desliga</translation> @@ -4623,6 +4636,7 @@ <translation id="5816434091619127343">As alterações solicitadas inutilizariam a impressora.</translation> <translation id="5817069030404929329">Mover senhas deste dispositivo para a Conta do Google?</translation> <translation id="5817918615728894473">Parear</translation> +<translation id="581840385858998009">Personalize o plano de fundo, o avatar, o protetor de tela e muito mais</translation> <translation id="5821565227679781414">Criar atalho</translation> <translation id="5822095611691580107">Nível da bateria do fone esquerdo: <ph name="BATTERY_PERCENTAGE" />%.</translation> <translation id="5825412242012995131">Ativado (recomendado)</translation> @@ -4829,10 +4843,8 @@ <ph name="BEGIN_PARAGRAPH2" />É possível desativar esse serviço desativando a configuração de localização principal no dispositivo. Nessa configuração, você também pode desativar o uso de redes móveis, Wi‑Fi e sensores de local.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Sair da Tela inteira</translation> <translation id="6042308850641462728">Mais</translation> -<translation id="6043317578411397101">O app <ph name="APP_NAME" /> está compartilhando uma guia do Chrome com <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Falha ao analisar configuração</translation> <translation id="6043994281159824495">Sair agora</translation> -<translation id="6044805581023976844">O app <ph name="APP_NAME" /> está compartilhando áudio e uma guia do Chrome com <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Botão do TrackPoint principal</translation> <translation id="6047632800149092791">A sincronização não está funcionando. Tente sair e fazer login novamente.</translation> <translation id="6049797270917061226">Esse arquivo pode permitir que invasores roubem suas informações pessoais.</translation> @@ -4912,6 +4924,7 @@ <translation id="6116921718742659598">Alterar configurações de idioma e de entrada</translation> <translation id="6119927814891883061">Nomear dispositivo como <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Fixar esta página na tela inicial...</translation> +<translation id="6121773125605585883">Ver senha com o nome de usuário <ph name="USERNAME" /> do site <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">Sua conexão com a Internet está sendo controlada</translation> <translation id="6122093587541546701">E-mail (opcional):</translation> <translation id="6122095009389448667">Continuar impedindo que esse site veja a área de transferência</translation> @@ -4988,6 +5001,7 @@ <translation id="6208725777148613371">Falha ao salvar no <ph name="WEB_DRIVE" />: <ph name="INTERRUPT_REASON" /></translation> <translation id="6209838773933913227">Atualizando componente</translation> <translation id="6209908325007204267">Seu dispositivo inclui um Upgrade do Chrome Enterprise, mas seu nome de usuário não está associado a uma conta corporativa. Acesse g.co/ChromeEnterpriseAccount em outro dispositivo para criar uma conta corporativa.</translation> +<translation id="6210282067670792090">Na barra de endereço, use essa tecla com atalhos de mecanismos de pesquisa e da pesquisa em sites</translation> <translation id="621172521139737651">{COUNT,plural, =0{Abrir tudo em &um novo grupo de guias}=1{Abrir em &um novo grupo de guias}one{Abrir tudo ({COUNT}) em &um novo grupo de guias}other{Abrir tudo ({COUNT}) em &um novo grupo de guias}}</translation> <translation id="6212039847102026977">Mostrar propriedades de rede avançadas</translation> <translation id="6212168817037875041">Desligar a tela</translation> @@ -5471,6 +5485,7 @@ <translation id="6709357832553498500">Conectar usando <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6711146141291425900">Vincular conta do <ph name="WEB_DRIVE" /> para downloads</translation> +<translation id="6712943853047024245">Você já salvou uma senha relacionada a esse nome de usuário em <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Adicionar perfil de trabalho</translation> <translation id="6715803357256707211">Ocorreu um erro durante a instalação do aplicativo Linux. Clique na notificação para ver mais detalhes.</translation> <translation id="671619610707606484">Essa ação apagará <ph name="TOTAL_USAGE" /> de dados armazenados por sites</translation> @@ -6096,6 +6111,7 @@ <translation id="7385854874724088939">Ocorreu um erro durante a impressão. Verifique a sua impressora e tente novamente.</translation> <translation id="7385896526023870365">Essa extensão não tem nenhum acesso ao site.</translation> <translation id="7387273928653486359">Aceitável</translation> +<translation id="7387951778417998929">Para usar outro mecanismo de pesquisa diferente do padrão, digite o atalho dele na barra de endereço seguido pelo atalho de teclado da sua preferência Também é possível mudar seu mecanismo de pesquisa padrão nesta página.</translation> <translation id="7388209873137778229">Apenas os dispositivos compatíveis são exibidos.</translation> <translation id="7392118418926456391">Falha na verificação de vírus</translation> <translation id="7392915005464253525">R&eabrir janela fechada</translation> @@ -6273,6 +6289,7 @@ <translation id="7559719679815339381">Aguarde. O aplicativo de quiosque está sendo atualizado. Não retire o pendrive.</translation> <translation id="7560756177962144929">Sincronizar seu <ph name="DEVICE_TYPE" /></translation> <translation id="7561196759112975576">Sempre</translation> +<translation id="7562099761826673163">Personalize seu dispositivo</translation> <translation id="756445078718366910">Abrir janela do navegador</translation> <translation id="7564847347806291057">Encerrar processo</translation> <translation id="756503097602602175">Acesse <ph name="LINK_BEGIN" />Configurações<ph name="LINK_END" /> para gerenciar as Contas do Google conectadas. As permissões concedidas a sites e apps podem ser aplicadas a todas as contas. Se você não quer que sites ou apps tenham acesso às informações da sua conta, faça login no <ph name="DEVICE_TYPE" /> como visitante ou navegue na Web usando uma <ph name="LINK_2_BEGIN" />janela anônima<ph name="LINK_2_END" />.</translation> @@ -6590,6 +6607,7 @@ <translation id="78526636422538552">A adição de mais Contas do Google está desativada</translation> <translation id="7853747251428735">Mais &ferramentas</translation> <translation id="7855678561139483478">Mover guia para uma nova janela</translation> +<translation id="7856654138655787862">Executar testes de diagnóstico no Chrome OS.</translation> <translation id="7857093393627376423">Sugestões de texto</translation> <translation id="7857949311770343000">Esta é a página "Nova guia" que você esperava?</translation> <translation id="7858328180167661092"><ph name="APP_NAME" /> (Windows)</translation> @@ -7239,6 +7257,7 @@ <translation id="8551588720239073785">Configurações de data e hora</translation> <translation id="8553342806078037065">Gerenciar outras pessoas</translation> <translation id="8554899698005018844">Sem idioma</translation> +<translation id="855604308879080518">Permitir que apps Android acessem dispositivos USB neste Chromebook. A permissão será solicitada sempre que você conectar um dispositivo USB. Apps Android individuais vão solicitar outras permissões.</translation> <translation id="8557022314818157177">Continue tocando na sua chave de segurança até capturar sua impressão digital</translation> <translation id="8557180006508471423">Ativar o Google Chrome nos Serviços de localização do Mac</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Abrir tudo em &uma nova janela}=1{Abrir em &uma nova janela}one{Abrir tudo ({COUNT}) em &uma nova janela}other{Abrir tudo ({COUNT}) em &uma nova janela}}</translation> @@ -7329,7 +7348,6 @@ <translation id="8655295600908251630">Canal</translation> <translation id="8655972064210167941">O login falhou porque não foi possível confirmar sua senha. Entre em contato com o administrador ou tente novamente.</translation> <translation id="8657393004602556571">Quer descartar o feedback?</translation> -<translation id="8658645149275195032">O app <ph name="APP_NAME" /> está compartilhando sua tela e áudio com <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Abrir link na janela &anônima</translation> <translation id="8662671328352114214">Entrar na rede <ph name="TYPE" /></translation> <translation id="8662733268723715832">Isso está demorando mais do que o esperado. Você pode pular ou esperar a conclusão.</translation> @@ -7625,7 +7643,6 @@ <translation id="8941173171815156065">Revogar a permissão "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Consumir a bateria mais rapidamente (no momento com <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280">O app <ph name="APP_NAME" /> está compartilhando uma janela com <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Tamanho do ícone</translation> <translation id="8946359700442089734">Os recursos de depuração não foram completamente ativados neste dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Boa</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 4c475744..9b163177 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -534,6 +534,7 @@ <translation id="1549275686094429035">ARC ativado</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> pretende aceder a <ph name="VOLUME_NAME" />. Pode modificar ou eliminar os seus ficheiros.</translation> <translation id="1552301827267621511">A extensão "<ph name="EXTENSION_NAME" />" alterou a pesquisa para utilizar <ph name="SEARCH_PROVIDER_DOMAIN" />.</translation> +<translation id="1552752544932680961">Gerir extensão</translation> <translation id="1553538517812678578">ilimitado</translation> <translation id="1555130319947370107">Azul</translation> <translation id="1556537182262721003">Não foi possível mover o directório da extensão para o perfil.</translation> @@ -2790,7 +2791,6 @@ <translation id="3842552989725514455">Tipo de letra Serif</translation> <translation id="3843464315703645664">Na lista de autorizações internamente</translation> <translation id="3844888638014364087">Emoji inserido</translation> -<translation id="384513009320852920">Certifique-se de que o dispositivo Bluetooth está no modo de sincronização e nas proximidades. <ph name="BEGIN_LINK_LEARN_MORE" />Saiba mais<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Obtenha ferramentas para programar Websites, aplicações para Android e muito mais. A instalação do Linux vai transferir <ph name="DOWNLOAD_SIZE" /> de dados.</translation> <translation id="3847319713229060696">Ajudar a melhorar a segurança na Web para todos</translation> <translation id="3848547754896969219">Abra numa &janela de navegação anónima</translation> @@ -4301,7 +4301,6 @@ <translation id="5485102783864353244">Adicionar aplicação</translation> <translation id="5485754497697573575">Restaurar todos os separadores</translation> <translation id="5486261815000869482">Confirmar palavra-passe</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> está a partilhar o seu ecrã com <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simular Reinício do Navegador</translation> <translation id="5487460042548760727">Mudar o nome do perfil para <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Limpar dados</translation> @@ -4363,6 +4362,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> pretende</translation> <translation id="5534304873398226603">Rejeitar foto ou vídeo</translation> <translation id="5535941515421698170">Remover também os dados existentes deste dispositivo</translation> +<translation id="5537725057119320332">Transmitir</translation> <translation id="5539221284352502426">A palavra-passe introduzida foi rejeitada pelo servidor. Motivos possíveis: a palavra-passe é demasiado curta; a palavra-passe tem de incluir números ou símbolos; a palavra-passe tem de ser diferente das palavras-passe antigas.</translation> <translation id="5541694225089836610">A ação foi desativada pelo administrador.</translation> <translation id="5542132724887566711">Perfil</translation> @@ -4594,6 +4594,7 @@ <translation id="5787146423283493983">Acordo de chaves</translation> <translation id="5787420647064736989">Nome do dispositivo</translation> <translation id="5788367137662787332">Lamentamos, mas não foi possível montar, pelo menos, uma partição no aparelho <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Sucesso</translation> <translation id="5790651917470750848">O encaminhamento de porta já existe.</translation> <translation id="5792728279623964091">Toque no botão ligar/desligar</translation> @@ -4826,10 +4827,8 @@ <ph name="BEGIN_PARAGRAPH2" />Pode desativar a Localização ao desativar a definição de Localização principal no dispositivo. Também pode desativar a utilização das redes Wi-Fi, das redes móveis e dos sensores para fins de localização nas definições de localização.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Sair do ecrã inteiro</translation> <translation id="6042308850641462728">Mais</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> está a partilhar um separador do Chrome com <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Falha ao analisar a configuração.</translation> <translation id="6043994281159824495">Terminar sessão agora</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> está a partilhar um separador do Chrome e o áudio com <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Botão do TrackPoint principal</translation> <translation id="6047632800149092791">A sincronização não está a funcionar. Experimente terminar e iniciar sessão novamente.</translation> <translation id="6049797270917061226">Este ficheiro pode permitir que atacantes roubem as suas informações pessoais.</translation> @@ -7333,7 +7332,6 @@ <translation id="8655295600908251630">Canal</translation> <translation id="8655972064210167941">O início de sessão falhou porque não foi possível validar a sua palavra-passe. Contacte o gestor ou tente novamente.</translation> <translation id="8657393004602556571">Pretende rejeitar o feedback?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> está a partilhar o ecrã e o áudio com <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Abrir Link numa Janela de Nave&gação Anónima</translation> <translation id="8662671328352114214">Ligar à rede <ph name="TYPE" /></translation> <translation id="8662733268723715832">Este processo está a demorar mais tempo do que o previsto. Pode ignorar ou aguardar que seja concluído.</translation> @@ -7629,7 +7627,6 @@ <translation id="8941173171815156065">Revogar a autorização "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Step-Up Internacional Netscape</translation> <translation id="8944099748578356325">Utilizar a bateria mais rapidamente (atualmente, <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> está a partilhar uma janela com <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Tamanho do ícone</translation> <translation id="8946359700442089734">As funcionalidades de depuração não foram totalmente ativadas neste dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Boa</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 717df8a3..4d1b8da 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -160,6 +160,7 @@ <translation id="1152346050262092795">Introdu din nou parola pentru a confirma contul.</translation> <translation id="1153356358378277386">Dispozitive asociate</translation> <translation id="1153636665119721804">Programul Protecție avansată Google</translation> +<translation id="1155545602507378023">Nu, numai pe acest dispozitiv</translation> <translation id="1155816283571436363">Se conectează la telefon</translation> <translation id="1158080958325422608">Schimbă în majuscule</translation> <translation id="1158238185437008462">Vezi amintirile</translation> @@ -395,6 +396,7 @@ <translation id="1410197035576869800">Pictograma aplicației</translation> <translation id="1410616244180625362">Permiteți în continuare accesul <ph name="HOST" /> la camera dvs.</translation> <translation id="1410806973194718079">Nu s-au putut verifica politicile</translation> +<translation id="1412681350727866021">Extensii suplimentare</translation> <translation id="1414315029670184034">Nu permite site-urilor să utilizeze camera</translation> <translation id="1414648216875402825">Faceți actualizarea la o versiune <ph name="PRODUCT_NAME" /> instabilă. Aceasta conține funcții nefinalizate. Vor apărea blocări și erori neașteptate. Continuați cu atenție.</translation> <translation id="1415708812149920388">Accesul de citire la clipboard este interzis</translation> @@ -532,6 +534,7 @@ <translation id="1549275686094429035">ARC activat</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> dorește să acceseze <ph name="VOLUME_NAME" />. Poate modifica sau șterge fișierele.</translation> <translation id="1552301827267621511">Extensia „<ph name="EXTENSION_NAME" />” a modificat căutarea, astfel încât să folosească <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Gestionați extensia</translation> <translation id="1553538517812678578">nelimitat</translation> <translation id="1555130319947370107">Albastru</translation> <translation id="1556537182262721003">Directorul extensiei nu se poate muta în profil.</translation> @@ -938,6 +941,7 @@ <translation id="1937774647013465102">Nu se poate importa tipul de arhitectură de container <ph name="ARCHITECTURE_CONTAINER" /> cu acest dispozitiv <ph name="ARCHITECTURE_DEVICE" />. Poți încerca să restabilești acest container într-un dispozitiv diferit sau poți accesa fișierele din această imagine de container deschizându-le în aplicația Files.</translation> <translation id="1938351510777341717">Comandă externă</translation> <translation id="1940546824932169984">Dispozitive conectate</translation> +<translation id="1941410638996203291">Ora de începere: <ph name="TIME" /></translation> <translation id="1942128823046546853">să citească și să modifice toate datele de pe toate site-urile</translation> <translation id="1942600407708803723">Când capacul este închis: oprire</translation> <translation id="1944528062465413897">Cod de asociere prin Bluetooth:</translation> @@ -1313,6 +1317,7 @@ <translation id="2320295602967756579">Activează tema luminoasă</translation> <translation id="2322193970951063277">Anteturi și subsoluri</translation> <translation id="2322318151094136999">Anunță-mă dacă un site vrea să acceseze porturile seriale (recomandat)</translation> +<translation id="2322622365472107569">Ora de încheiere: <ph name="TIME" /></translation> <translation id="2323018538045954000">Rețele Wi-Fi salvate</translation> <translation id="2325444234681128157">Reține parola</translation> <translation id="2326188115274135041">Confirmă codul PIN pentru a activa deblocarea automată</translation> @@ -1418,6 +1423,7 @@ <translation id="2435248616906486374">Rețea deconectată</translation> <translation id="2435457462613246316">Afișați parola</translation> <translation id="2436186046335138073">Permiteți ca <ph name="HANDLER_HOSTNAME" /> să deschidă toate linkurile <ph name="PROTOCOL" />?</translation> +<translation id="2439626940657133600">Se încarcă <ph name="WINDOW_TITLE" /></translation> <translation id="2440604414813129000">Afișează s&ursa</translation> <translation id="244231003699905658">Adresa nu este validă. Verifică adresa și încearcă din nou.</translation> <translation id="2442916515643169563">Umbrirea textului</translation> @@ -1923,6 +1929,7 @@ <translation id="2935654492420446828">Adaugă mai târziu un cont de la școală</translation> <translation id="2936851848721175671">Backup și restabilire</translation> <translation id="2938225289965773019">Deschide linkurile <ph name="PROTOCOL" /></translation> +<translation id="2939908794993783865">Site-uri inactive suplimentare</translation> <translation id="2939938020978911855">Afișează dispozitivele Bluetooth disponibile</translation> <translation id="2941112035454246133">Redusă</translation> <translation id="2942279350258725020">Mesaje în Android</translation> @@ -2068,6 +2075,7 @@ <translation id="3090589793601454425">Nu le muta</translation> <translation id="3090819949319990166">Fișierul crx extern nu se poate copia în <ph name="TEMP_CRX_FILE" />.</translation> <translation id="3090871774332213558">„<ph name="DEVICE_NAME" />” conectată</translation> +<translation id="3093362725605442088">Citește numerele de serie ale dispozitivului cu sistemul de operare Chrome și ale componentelor.</translation> <translation id="3093714882666365141">Nu permite site-urilor să instaleze handlere pentru plăți</translation> <translation id="3094141017404513551">Astfel, vei separa navigarea de cea asociată contului <ph name="EXISTING_USER" /></translation> <translation id="3095871294753148861">Marcajele, parolele și alte date ale browserului sunt sincronizate cu contul principal.</translation> @@ -2255,6 +2263,7 @@ <translation id="3308852433423051161">Se încarcă Asistentul Google...</translation> <translation id="3309330461362844500">Codul profilului cu certificat</translation> <translation id="3311445899360743395">Datele asociate acestei aplicații pot fi eliminate de pe dispozitiv.</translation> +<translation id="3312883087018430408">Pentru a căuta un anumit site sau o anumită parte din Chrome, introdu comanda rapidă respectivă în bara de adrese, urmată de comanda rapidă de la tastatură preferată. De exemplu, pentru a căuta numai Marcaje, tastează „@marcaje”, apoi apasă pe Tab sau pe tasta de spațiu.</translation> <translation id="3313622045786997898">Valoare a semnăturii certificatului</translation> <translation id="3313950410573257029">Verifică starea conexiunii</translation> <translation id="3315158641124845231">Ascunde <ph name="PRODUCT_NAME" /></translation> @@ -2674,6 +2683,7 @@ <translation id="3747077776423672805">Pentru a elimina aplicații, accesează Setări > Magazin Google Play > Gestionează preferințele Android > Aplicații sau Manager de aplicații. Apoi atinge aplicația pe care dorești să o dezinstalezi (poate fi necesar să glisezi la dreapta sau la stânga pentru a găsi aplicația). Apoi, atinge Dezinstalează sau Dezactivează.</translation> <translation id="3747220812138541072">Afișează sugestii de scriere inline care apar pe măsură ce introduci text</translation> <translation id="3748706263662799310">Raportați o eroare</translation> +<translation id="3750562496035670393">Chrome a salvat parola pe acest dispozitiv, dar o poți salva în Contul tău Google. Apoi toate parolele din Contul Google vor fi disponibile după ce te conectezi.</translation> <translation id="3752253558646317685">Solicită-i copilului să ridice degetul și să atingă din nou pentru a salva amprenta</translation> <translation id="3752582316358263300">OK...</translation> <translation id="3753033997400164841">Stocheaz-o o singură dată. Folosește-o peste tot</translation> @@ -2780,7 +2790,6 @@ <translation id="3842552989725514455">Font Serif</translation> <translation id="3843464315703645664">Pe lista cu acces permis la nivel intern</translation> <translation id="3844888638014364087">S-a inserat emoji-ul</translation> -<translation id="384513009320852920">Verifică dacă dispozitivul Bluetooth este în modul de asociere și în apropiere. <ph name="BEGIN_LINK_LEARN_MORE" />Află mai multe<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Obține instrumente pentru dezvoltarea site-urilor, aplicații Android și multe altele. Instalarea Linux va descărca <ph name="DOWNLOAD_SIZE" /> de date.</translation> <translation id="3847319713229060696">Contribuie la îmbunătățirea securității pe web pentru toți utilizatorii</translation> <translation id="3848547754896969219">Deschide într-o fereastră &incognito</translation> @@ -3115,6 +3124,7 @@ <translation id="4194570336751258953">Activează funcția „atinge pentru clic”</translation> <translation id="4195643157523330669">Deschide în filă nouă</translation> <translation id="4195814663415092787">Continuați de unde ați rămas</translation> +<translation id="4198268995694216131">Site-uri suplimentare</translation> <translation id="4200689466366162458">Cuvinte personalizate</translation> <translation id="4200983522494130825">Filă &nouă</translation> <translation id="4201546031411513170">Poți să alegi oricând ce să sincronizezi în setări.</translation> @@ -3236,6 +3246,7 @@ <translation id="4341577178275615435">Pentru a activa sau a dezactiva navigarea cu tastatura, folosește comanda rapidă F7</translation> <translation id="4341905082470253054">Se verifică starea TPM...</translation> <translation id="434198521554309404">Rapid. Securizat. Fără efort.</translation> +<translation id="4343250402091037179">Pentru a căuta un anumit site sau o anumită parte din Chrome, introdu comanda rapidă respectivă în bara de adrese, urmată de comanda rapidă de la tastatură preferată.</translation> <translation id="434404122609091467">Cu furnizorul de servicii actual</translation> <translation id="4345587454538109430">Configurează...</translation> <translation id="4345732373643853732">Numele de utilizator nu este cunoscut serverului</translation> @@ -3987,6 +3998,7 @@ <translation id="5153234146675181447">Elimină telefonul</translation> <translation id="5154108062446123722">Setări avansate pentru <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Subiect</translation> +<translation id="5155327081870541046">În bara de adrese, introdu comanda rapidă pentru site-ul pe care vrei să-l cauți, de exemplu, „@marcaje”. Apoi introdu comanda rapidă de la tastatură preferată și termenul de căutare.</translation> <translation id="5157635116769074044">Fixați această pagină pe ecranul de pornire...</translation> <translation id="5159094275429367735">Configurează Crostini</translation> <translation id="5159419673777902220">Părintele tău a dezactivat permisiunile pentru extensii</translation> @@ -4288,7 +4300,6 @@ <translation id="5485102783864353244">Adaugă o aplicație</translation> <translation id="5485754497697573575">Restabilește toate filele</translation> <translation id="5486261815000869482">Confirmați parola</translation> -<translation id="5486275809415469523">Aplicația <ph name="APP_NAME" /> trimite conținutul de pe ecran către <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simulați repornirea browserului</translation> <translation id="5487460042548760727">Redenumește profilul în <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Șterge datele</translation> @@ -4350,6 +4361,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> dorește să</translation> <translation id="5534304873398226603">Șterge fotografia sau videoclipul</translation> <translation id="5535941515421698170">De asemenea, elimină datele existente de pe acest dispozitiv</translation> +<translation id="5537725057119320332">Proiectează</translation> <translation id="5539221284352502426">Parola pe care ai introdus-o a fost respinsă de server. Motivele posibile includ: parola este prea scurtă; parola trebuie să includă cifre sau simboluri; parola trebuie să fie diferită de parolele anterioare.</translation> <translation id="5541694225089836610">Acțiunea este dezactivată de administrator</translation> <translation id="5542132724887566711">Profil</translation> @@ -4580,6 +4592,7 @@ <translation id="5787146423283493983">Acord privind cheia</translation> <translation id="5787420647064736989">Numele dispozitivului</translation> <translation id="5788367137662787332">Ne pare rău, cel puțin o partiție de pe dispozitivul <ph name="DEVICE_LABEL" /> nu a putut fi montată.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Ai reușit</translation> <translation id="5790651917470750848">Redirecționarea de port există deja</translation> <translation id="5792728279623964091">Atinge butonul de pornire</translation> @@ -4605,6 +4618,7 @@ <translation id="5816434091619127343">Modificările solicitate ar face imprimanta inutilizabilă.</translation> <translation id="5817069030404929329">Muți parole de pe acest dispozitiv în Contul Google?</translation> <translation id="5817918615728894473">Asociază</translation> +<translation id="581840385858998009">Personalizează imaginea de fundal, avatarul, screensaverul și altele</translation> <translation id="5821565227679781414">Creați o comandă rapidă</translation> <translation id="5822095611691580107">Nivelul bateriei căștii stângi: <ph name="BATTERY_PERCENTAGE" /> %.</translation> <translation id="5825412242012995131">Activat (recomandat)</translation> @@ -4811,10 +4825,8 @@ <ph name="BEGIN_PARAGRAPH2" />Poți dezactiva Locația oprind setarea principală privind locația de pe dispozitivul tău. Poți dezactiva și folosirea Wi-Fi, a rețelelor mobile și a senzorilor pentru localizare din setările privind locația.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Ieși din ecranul complet</translation> <translation id="6042308850641462728">Mai multe</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> trimite conținutul unei file Chrome către <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Configurația nu a fost analizată</translation> <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="6049797270917061226">Fișierul le poate da atacatorilor posibilitatea să îți fure informațiile cu caracter personal.</translation> @@ -4894,6 +4906,7 @@ <translation id="6116921718742659598">Schimbați setările pentru limbă și introducere de text</translation> <translation id="6119927814891883061">Denumește dispozitivul <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Fixați această pagină pe ecranul de pornire...</translation> +<translation id="6121773125605585883">Vezi parola asociată numelui de utilizator <ph name="USERNAME" /> pentru <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">Conexiunea la internet este controlată</translation> <translation id="6122093587541546701">Adresă de e-mail (opțională):</translation> <translation id="6122095009389448667">Blochează în continuare accesul la clipboard pentru acest site</translation> @@ -4970,6 +4983,7 @@ <translation id="6208725777148613371">Nu s-a salvat în <ph name="WEB_DRIVE" /> – <ph name="INTERRUPT_REASON" /></translation> <translation id="6209838773933913227">Se actualizează componentele</translation> <translation id="6209908325007204267">Dispozitivul tău conține un upgrade la Chrome Enterprise, dar numele tău de utilizator nu este asociat unui cont de întreprindere. Creează un cont de întreprindere accesând g.co/ChromeEnterpriseAccount de pe alt dispozitiv.</translation> +<translation id="6210282067670792090">În bara de adrese, folosește această comandă rapidă de la tastatură cu comenzi rapide pentru motoare de căutare și căutarea pe site</translation> <translation id="621172521139737651">{COUNT,plural, =0{Deschide-le pe toate într-un &nou grup de file}=1{Deschide într-un &nou grup de file}few{Deschide-le pe toate ({COUNT}) într-un &nou grup de file}other{Deschide-le pe toate ({COUNT}) într-un &nou grup de file}}</translation> <translation id="6212039847102026977">Afișează proprietățile avansate pentru rețea</translation> <translation id="6212168817037875041">Dezactivează ecranul</translation> @@ -5453,6 +5467,7 @@ <translation id="6709357832553498500">Conectează-te folosind <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Înapoi</translation> <translation id="6711146141291425900">Conectează contul <ph name="WEB_DRIVE" /> pentru Descărcări</translation> +<translation id="6712943853047024245">Ai salvat deja o parolă folosind acest nume de utilizator pentru <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Adaugă un profil de serviciu</translation> <translation id="6715803357256707211">A apărut o eroare în timpul instalării aplicației Linux. Dă clic pe notificare pentru detalii.</translation> <translation id="671619610707606484">Astfel, se vor șterge <ph name="TOTAL_USAGE" /> din datele stocate de site-uri</translation> @@ -6078,6 +6093,7 @@ <translation id="7385854874724088939">A apărut o eroare la printare. Verifică imprimanta și încearcă din nou.</translation> <translation id="7385896526023870365">Această extensie nu are acces suplimentar la site.</translation> <translation id="7387273928653486359">Acceptabilă</translation> +<translation id="7387951778417998929">Pentru a folosi alt motor de căutare decât cel prestabilit, introdu comanda rapidă respectivă în bara de adrese, urmată de comanda rapidă de la tastatură preferată. Poți să schimbi motorul de căutare prestabilit și de aici.</translation> <translation id="7388209873137778229">Se afișează numai dispozitivele compatibile.</translation> <translation id="7392118418926456391">Scanarea antivirus nu a reușit</translation> <translation id="7392915005464253525">R&edeschide fereastra închisă</translation> @@ -6255,6 +6271,7 @@ <translation id="7559719679815339381">Așteaptă... Aplicația de tip chioșc se actualizează. Nu scoate stickul USB.</translation> <translation id="7560756177962144929">Sincronizează dispozitivul <ph name="DEVICE_TYPE" /></translation> <translation id="7561196759112975576">Întotdeauna</translation> +<translation id="7562099761826673163">Personalizează dispozitivul</translation> <translation id="756445078718366910">Deschide fereastra de browser</translation> <translation id="7564847347806291057">Oprește procesul</translation> <translation id="756503097602602175">Poți să gestionezi Conturile Google conectate din <ph name="LINK_BEGIN" />Setări<ph name="LINK_END" />. Permisiunile pe care le-ai acordat site-urilor și aplicațiilor se pot aplica tuturor conturilor. Dacă nu vrei ca site-urile sau aplicațiile să îți acceseze informațiile contului, poți să te conectezi pe <ph name="DEVICE_TYPE" /> ca invitat sau să navighezi pe web într-o <ph name="LINK_2_BEGIN" />fereastră incognito<ph name="LINK_2_END" />.</translation> @@ -6572,6 +6589,7 @@ <translation id="78526636422538552">Adăugarea mai multor Conturi Google este dezactivată</translation> <translation id="7853747251428735">Mai multe instru&mente</translation> <translation id="7855678561139483478">Mută fila în fereastră nouă</translation> +<translation id="7856654138655787862">Rulează teste de diagnosticare pentru sistemul de operare Chrome.</translation> <translation id="7857093393627376423">Sugestii de text</translation> <translation id="7857949311770343000">Aceasta este pagina Filă nouă pe care o așteptați?</translation> <translation id="7858328180167661092"><ph name="APP_NAME" /> (Windows)</translation> @@ -7220,6 +7238,7 @@ <translation id="8551588720239073785">Setări de dată și oră</translation> <translation id="8553342806078037065">Gestionează alte persoane</translation> <translation id="8554899698005018844">Nicio limbă</translation> +<translation id="855604308879080518">Permite accesul aplicațiilor pentru Android la dispozitivele USB conectate la acest Chromebook. Permisiunea va fi solicitată de fiecare dată când conectezi un dispozitiv USB. Aplicațiile pentru Android individuale vor solicita permisiuni suplimentare.</translation> <translation id="8557022314818157177">Atinge cheia de securitate până când ți se capturează amprenta</translation> <translation id="8557180006508471423">Activează Google Chrome în Servicii de localizare pe Mac</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Deschide-le pe toate într-o fereastră &nouă}=1{Deschide într-o fereastră &nouă}few{Deschide-le pe toate ({COUNT}) într-o fereastră &nouă}other{Deschide-le pe toate ({COUNT}) într-o fereastră &nouă}}</translation> @@ -7310,7 +7329,6 @@ <translation id="8655295600908251630">Canal</translation> <translation id="8655972064210167941">Nu s-a conectat, deoarece parola nu a putut fi confirmată. Contactează administratorul sau încearcă din nou.</translation> <translation id="8657393004602556571">Renunți la feedback?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> trimite conținutul de pe ecran și conținutul audio către <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Deschide linkul într-o fereastră inco&gnito</translation> <translation id="8662671328352114214">Conectează-te la rețeaua <ph name="TYPE" /></translation> <translation id="8662733268723715832">Acțiunea durează mai mult decât s-a estimat. Poți să o omiți sau să aștepți până când se finalizează.</translation> @@ -7606,7 +7624,6 @@ <translation id="8941173171815156065">Revocă permisiunea „<ph name="PERMISSION" />”</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">va consuma bateria mai rapid (în prezent, <ph name="BATTERY_PERCENTAGE" />%);</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> trimite conținutul unei ferestre către <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Dimensiunea pictogramei</translation> <translation id="8946359700442089734">Funcțiile de remediere a erorilor nu au fost activate complet pe acest dispozitiv <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Bună</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 421bc393..3d8f8c9 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -161,6 +161,7 @@ <translation id="1153356358378277386">Сопряженные устройства</translation> <translation id="1153636665119721804">Программа Дополнительной защиты от Google</translation> <translation id="1155816283571436363">Подключение к телефону…</translation> +<translation id="1158080958325422608">Заменить на прописные</translation> <translation id="1158238185437008462">Открыть воспоминания</translation> <translation id="1161575384898972166">Чтобы экспортировать сертификат клиента, войдите в <ph name="TOKEN_NAME" />.</translation> <translation id="116173250649946226">Администратор установил тему по умолчанию, и ее нельзя изменить.</translation> @@ -532,6 +533,7 @@ <translation id="1549275686094429035">ARC включен</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> запрашивает доступ к тому "<ph name="VOLUME_NAME" />". Это может привести к изменению или удалению файлов.</translation> <translation id="1552301827267621511">Расширение "<ph name="EXTENSION_NAME" />" установило поисковую систему "<ph name="SEARCH_PROVIDER_DOMAIN" />" в качестве основной.</translation> +<translation id="1552752544932680961">Управление расширениями</translation> <translation id="1553538517812678578">неограниченно</translation> <translation id="1555130319947370107">Синий</translation> <translation id="1556537182262721003">Не удалось переместить каталог расширений в профиль.</translation> @@ -694,6 +696,7 @@ <translation id="1700079447639026019">Сайты, которые не могут использовать файлы cookie</translation> <translation id="1703331064825191675">Можно больше не беспокоиться о паролях</translation> <translation id="1703666494654169921">Запретить сайтам использовать устройства и данные виртуальной реальности</translation> +<translation id="1704097193565924901">Заменить первую букву на прописную</translation> <translation id="1704230497453185209">Запретить сайтам воспроизводить звук</translation> <translation id="1704970325597567340">Проверка безопасности выполнена <ph name="DATE" />.</translation> <translation id="1706586824377653884">Добавлено администратором</translation> @@ -2778,7 +2781,6 @@ <translation id="3842552989725514455">Шрифты с засечками</translation> <translation id="3843464315703645664">Разрешение дано браузером Chrome</translation> <translation id="3844888638014364087">Вставлен символ эмодзи</translation> -<translation id="384513009320852920">Устройство Bluetooth должно находиться рядом. На нем необходимо выбрать режим подключения. <ph name="BEGIN_LINK_LEARN_MORE" />Подробнее…<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Разрабатывайте сайты, приложения для Android и другие программы с помощью удобных инструментов. При установке Linux будут скачаны данные объемом <ph name="DOWNLOAD_SIZE" />.</translation> <translation id="3847319713229060696">Помочь сделать Интернет безопасным для всех</translation> <translation id="3848547754896969219">Открыть в режиме &инкогнито</translation> @@ -3563,6 +3565,7 @@ <translation id="4681453295291708042">Отключить Обмен с окружением</translation> <translation id="4681930562518940301">Открыть оригинальное изображение в новой вкладке</translation> <translation id="4682551433947286597">Обои устанавливаются на экран входа.</translation> +<translation id="4683629100208651599">Заменить на строчные</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" /> % (по умолчанию)</translation> <translation id="4684427112815847243">Синхронизировать все</translation> <translation id="4684471265911890182">Приложение "<ph name="APP_NAME" />" пытается получить доступ к камере. Чтобы предоставить его, переведите в выключенное положение переключатель, позволяющий управлять настройками конфиденциальности камеры.</translation> @@ -4285,7 +4288,6 @@ <translation id="5485102783864353244">Установить приложение</translation> <translation id="5485754497697573575">Восстановить все вкладки</translation> <translation id="5486261815000869482">Подтвердите пароль</translation> -<translation id="5486275809415469523">Приложение "<ph name="APP_NAME" />" предоставило сайту <ph name="TAB_NAME" /> доступ к вашему экрану.</translation> <translation id="5486561344817861625">Симулировать перезапуск браузера</translation> <translation id="5487460042548760727">Переименовать профиль в "<ph name="PROFILE_NAME" />"</translation> <translation id="5487521232677179737">Удалить данные</translation> @@ -4347,6 +4349,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> запрашивает разрешение на:</translation> <translation id="5534304873398226603">Удалить фото или видео</translation> <translation id="5535941515421698170">Удалить данные с этого устройства</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">Сервер отклонил введенный пароль. Помните, что пароль должен отличаться от предыдущих паролей и содержать необходимое количество цифр и символов.</translation> <translation id="5541694225089836610">Действие отключено администратором.</translation> <translation id="5542132724887566711">Профиль</translation> @@ -4577,6 +4580,7 @@ <translation id="5787146423283493983">Согласование ключей</translation> <translation id="5787420647064736989">Название устройства</translation> <translation id="5788367137662787332">Не удалось добавить один или несколько разделов устройства <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">:</translation> <translation id="5790085346892983794">Выполнено</translation> <translation id="5790651917470750848">Такой порт уже существует.</translation> <translation id="5792728279623964091">Нажмите кнопку питания.</translation> @@ -4808,10 +4812,8 @@ <ph name="BEGIN_PARAGRAPH2" />При желании отключите эту функцию в настройках устройства. Там же вы можете запретить использование датчиков, Wi‑Fi и мобильных сетей для уточнения местоположения.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Обычный режим</translation> <translation id="6042308850641462728">Ещё</translation> -<translation id="6043317578411397101">Приложение "<ph name="APP_NAME" />" предоставило сайту <ph name="TAB_NAME" /> доступ к вкладке Chrome.</translation> <translation id="604388835206766544">Не удалось выполнить синтаксический анализ конфигурации.</translation> <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="6049797270917061226">С помощью этого файла злоумышленники могут похитить ваши личные данные.</translation> @@ -5955,6 +5957,7 @@ <translation id="7257173066616499747">Сети Wi-Fi</translation> <translation id="725758059478686223">Сервис печати</translation> <translation id="7257666756905341374">Доступ к копируемым и вставляемым данным</translation> +<translation id="7258192266780953209">Преобразование</translation> <translation id="7258225044283673131">Приложение не отвечает. Чтобы выйти из него, нажмите "Закрыть принудительно".</translation> <translation id="7262004276116528033">Сервис входа размещен в домене <ph name="SAML_DOMAIN" /></translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Следуйте приведенным ниже инструкциям. @@ -7306,7 +7309,6 @@ <translation id="8655295600908251630">Канал</translation> <translation id="8655972064210167941">Ошибка входа: не удалось подтвердить пароль. Обратитесь к администратору или повторите попытку.</translation> <translation id="8657393004602556571">Не отправлять отзыв?</translation> -<translation id="8658645149275195032">Приложение "<ph name="APP_NAME" />" предоставило сайту <ph name="TAB_NAME" /> доступ к экрану и аудио.</translation> <translation id="8661290697478713397">Открыть ссылку в режиме инкогнито</translation> <translation id="8662671328352114214">Новая сеть <ph name="TYPE" /></translation> <translation id="8662733268723715832">Операция выполняется дольше, чем обычно. Вы можете подождать или пропустить этот этап.</translation> @@ -7604,7 +7606,6 @@ <translation id="8941173171815156065">Отозвать разрешение "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Начнет быстрее расходовать заряд батареи (сейчас она заряжена на <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280">Приложение "<ph name="APP_NAME" />" предоставило сайту <ph name="TAB_NAME" /> доступ к окну.</translation> <translation id="8945274638472141382">Размер значков</translation> <translation id="8946359700442089734">На устройстве <ph name="IDS_SHORT_PRODUCT_NAME" /> включены не все функции отладки.</translation> <translation id="894763922177556086">высокое</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index cb12ee50b..5d9221b 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -533,6 +533,7 @@ <translation id="1549275686094429035">ARC සබලයි</translation> <translation id="1549788673239553762"><ph name="APP_NAME" />හට <ph name="VOLUME_NAME" /> වෙත ප්රවේශ වීමට අවශ්යය. එය ඔබේ ගොනු විකරණය කිරීමට හෝ මැකීමට හැකිය.</translation> <translation id="1552301827267621511">"<ph name="EXTENSION_NAME" />" දිගුව <ph name="SEARCH_PROVIDER_DOMAIN" /> භාවිතයට ඇති සෙවීම වෙනස් කළා</translation> +<translation id="1552752544932680961">දිගු කළමනාකරණය කරන්න</translation> <translation id="1553538517812678578">අසීමිත</translation> <translation id="1555130319947370107">නිල්</translation> <translation id="1556537182262721003">දිගු නාමාවලිය පැතිකඩ තුළට ගෙනයා නොහැකි විය.</translation> @@ -2791,7 +2792,6 @@ <translation id="3842552989725514455">සෙරිෆ් අකුර</translation> <translation id="3843464315703645664">අභ්යන්තරව ඉඩ දෙන ලේඛනගත කෙරිණි</translation> <translation id="3844888638014364087">ඉමොජි ඇතුළත් කරන ලදි</translation> -<translation id="384513009320852920">ඔබගේ බ්ලූටූත් උපාංගය යුගල කිරීමේ ප්රකාරයේ සහ අවට තිබෙන බව සහතික කර ගන්න. <ph name="BEGIN_LINK_LEARN_MORE" />තව දැන ගන්න<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">වෙබ් අඩවි, Android යෙදුම් සහ තවත් දේ සංවර්ධනයට මෙවලම් ලබා ගන්න. Linux ස්ථාපනය කිරීම දත්තවලින් <ph name="DOWNLOAD_SIZE" /> බාගනු ඇත.</translation> <translation id="3847319713229060696">සියලු දෙනා සඳහා වෙබය මත ආරක්ෂාව වැඩිදියුණු කිරීමට උදවු කරන්න</translation> @@ -4303,7 +4303,6 @@ <translation id="5485102783864353244">යෙදුම එක් කරන්න</translation> <translation id="5485754497697573575">සියලු ටැබ ප්රතිසාධනය කරන්න</translation> <translation id="5486261815000869482">රහස්වචනය තහවුරු කරන්න</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> විසින් ඔබේ තිරය <ph name="TAB_NAME" /> සමග හුවමාරු කර ගනී.</translation> <translation id="5486561344817861625">බ්රවුසර යළි ආරම්භය ප්රති නිර්මාණය කරන්න</translation> <translation id="5487460042548760727">පැතිකඩ <ph name="PROFILE_NAME" /> ලෙස යළි නම් කරන ලදි</translation> <translation id="5487521232677179737">දත්ත හිස් කරන්නෙ</translation> @@ -4365,6 +4364,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> හට කිරීමට අවශ්ය වන්නේ</translation> <translation id="5534304873398226603">ඡායාරූපය හෝ වීඩියෝව ඉවත ලන්න</translation> <translation id="5535941515421698170">මෙම උපාංගයෙන් ඔබගේ පවතින දත්තද ඉවත් කරන්න</translation> +<translation id="5537725057119320332">විකාශය</translation> <translation id="5539221284352502426">ඔබ ඇතුළු කළ මුරපදය සේවාදායකය විසින් ප්රතික්ෂේප කරන ලදී. විය හැකි හේතුවල ඇතුළත් වන්නේ: මුරපදය ඉතා කෙටි වේ. මුරපදයේ අංක හෝ සංකේත ඇතුළත් විය යුතුය. මුරපදය මීට පෙර මුරපදවලින් වෙනස් විය යුතුය.</translation> <translation id="5541694225089836610">ක්රියාව ඔබේ පරිපාලකයා විසින් අබල කරනු ලැබ ඇත</translation> <translation id="5542132724887566711">පැතිකඩ</translation> @@ -4596,6 +4596,7 @@ <translation id="5787146423283493983">ප්රධාන ගිවිසුම</translation> <translation id="5787420647064736989">උපාංග නම</translation> <translation id="5788367137662787332">සමාවන්න, අඩුවශයෙන් <ph name="DEVICE_LABEL" /> උපාංගය මත එක් කොටසක්වත් නැංවිය නොහැක.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">සාර්ථකයි</translation> <translation id="5790651917470750848">පෝර්ට් ඉදිරියට ගෙන යාම දැනටමත් පවතී</translation> <translation id="5792728279623964091">ඔබේ බල බොත්තමට තට්ටු කරන්න</translation> @@ -4828,10 +4829,8 @@ <ph name="BEGIN_PARAGRAPH2" />ඔබේ උපාංගයෙහි ප්රධාන ස්ථාන සැකසීම ක්රියාවිරහිත කිරීමෙන් ඔබට ස්ථානය ක්රියාවිරහිත කළ හැකිය. ඔබට ස්ථානය සඳහා Wi‑Fi, ජංගම ජාල සහ සංවේදක භාවිතය ස්ථාන සැකසීම් තුළ ක්රියාවිරහිත කිරීමත් කළ හැකිය.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">පූර්ණ තිරයෙන් ඉවත් වන්න</translation> <translation id="6042308850641462728">වැඩිදුර</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> සමග Chrome ටැබයක් බෙදා ගනිමින් සිටී.</translation> <translation id="604388835206766544">වින්යාසය විග්රහ කිරීම අසාර්ථක විය</translation> <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="6049797270917061226">මෙම ගොනුව ඔබගේ පුද්ගලික තොරතුරු සොරකම් කිරීමට ප්රහාරකයන්ට ඉඩ දිය හැකිය.</translation> @@ -7330,7 +7329,6 @@ <translation id="8655295600908251630">නාලිකාව</translation> <translation id="8655972064210167941">ඔබේ මුරපදය තහවුරු කළ නොහැකි වූ බැවින් පිරීම අසාර්ථකයි. කරුණාකර ඔබගේ පරිපාලක අමතන්න නැතහොත් නැවත උත්සාහ කරන්න.</translation> <translation id="8657393004602556571">ඔබට ප්රතිපෝෂණය ඉවත ලෑමට අවශ්යද?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> ඔබේ තිරය සහ ශ්රව්යය <ph name="TAB_NAME" /> සමග බෙදා ගනිමින් සිටී.</translation> <translation id="8661290697478713397">Incognito කවුළුව තුළ සබැඳිය විවෘත කරන්න</translation> <translation id="8662671328352114214"><ph name="TYPE" /> ජාලයට එකතු වන්න</translation> <translation id="8662733268723715832">මෙය බලාපොරොත්තු වූවාට වඩා වැඩි කාලයක් ගනී, ඔබට එය මඟ හැරීමට හෝ එය නිම කරන තෙක් රැඳී සිටීමට හැකිය.</translation> @@ -7626,7 +7624,6 @@ <translation id="8941173171815156065">'<ph name="PERMISSION" />' අවසරය ඉවත් කරන්න</translation> <translation id="894360074127026135">Netscape අන්තර්ජාතික ඉහල පියවර</translation> <translation id="8944099748578356325">වඩා ඉක්මනින් බැටරිය භාවිත කරන්න (දැනට <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> සමගින් කවුළුවක් බෙදා ගනිමින් සිටී.</translation> <translation id="8945274638472141382">නිරූපක තරම</translation> <translation id="8946359700442089734">මෙම <ph name="IDS_SHORT_PRODUCT_NAME" /> උපාංගය මත දෝශ නිරාකරණ විශේශාංග සම්පූර්ණයෙන් සක්රීය කර නොමැත.</translation> <translation id="894763922177556086">හොඳ</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 370f9471..4375cbc5 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -534,6 +534,7 @@ <translation id="1549275686094429035">ARC je aktivované</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> vyžaduje prístup k médiu <ph name="VOLUME_NAME" />. Aplikácia môže upraviť alebo odstrániť vaše súbory.</translation> <translation id="1552301827267621511">Rozšírenie <ph name="EXTENSION_NAME" /> zmenilo vyhľadávanie na <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Spravovať rozšírenie</translation> <translation id="1553538517812678578">bez obmedzenia</translation> <translation id="1555130319947370107">Modrá</translation> <translation id="1556537182262721003">Nepodarilo sa do profilu presunúť adresár rozšírenia.</translation> @@ -2788,7 +2789,6 @@ <translation id="3842552989725514455">Pätkové písmo</translation> <translation id="3843464315703645664">Povolené interne</translation> <translation id="3844888638014364087">Bolo vložené emodži</translation> -<translation id="384513009320852920">Skontrolujte, či je zariadenie s rozhraním Bluetooth v párovacom režime a nablízku. <ph name="BEGIN_LINK_LEARN_MORE" />Ďalšie informácie<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Získajte nástroje na vývoj webov, aplikácií pre Android atď. Inštaláciou systému Linux stiahnete <ph name="DOWNLOAD_SIZE" /> dát.</translation> <translation id="3847319713229060696">Pomôžte zlepšiť zabezpečenie na internete pre všetkých</translation> <translation id="3848547754896969219">Otvoriť v okne &inkognito</translation> @@ -4298,7 +4298,6 @@ <translation id="5485102783864353244">Pridať aplikáciu</translation> <translation id="5485754497697573575">Obnoviť všetky karty</translation> <translation id="5486261815000869482">Potvrďte heslo</translation> -<translation id="5486275809415469523">Aplikácia <ph name="APP_NAME" /> zdieľa vašu obrazovku s kartou <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simulovať reštartovanie prehliadača</translation> <translation id="5487460042548760727">Premenovať profil na <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Vymazať dáta</translation> @@ -4360,6 +4359,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> vyžaduje</translation> <translation id="5534304873398226603">Zahodiť fotku alebo video</translation> <translation id="5535941515421698170">Zároveň z tohto zariadenia odstrániť existujúce dáta</translation> +<translation id="5537725057119320332">Prenášať</translation> <translation id="5539221284352502426">Zadané heslo bolo zamietnuté serverom. Možné dôvody: Heslo je príliš krátke. Heslo musí obsahovať čísla alebo symboly. Heslo sa musí odlišovať od predchádzajúcich hesiel.</translation> <translation id="5541694225089836610">Správca akciu zakázal</translation> <translation id="5542132724887566711">Profil</translation> @@ -4590,6 +4590,7 @@ <translation id="5787146423283493983">Odsúhlasenie kľúča</translation> <translation id="5787420647064736989">Názov zariadenia</translation> <translation id="5788367137662787332">Je nám ľúto, ale nepodarilo sa pripojiť minimálne jeden oddiel zariadenia <ph name="DEVICE_LABEL" />.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Úspešné</translation> <translation id="5790651917470750848">Presmerovanie portov už existuje</translation> <translation id="5792728279623964091">Klepnite na vypínač</translation> @@ -4822,10 +4823,8 @@ <ph name="BEGIN_PARAGRAPH2" />Nastavenie Poloha môžete deaktivovať vypnutím hlavného nastavenia Poloha v tomto zariadení. V nastaveniach polohy môžete tiež vypnúť určovanie polohy pomocou siete Wi‑Fi, mobilnej siete a senzorov.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Ukončiť režim celej obrazovky</translation> <translation id="6042308850641462728">Viac</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> zdieľa kartu Chromu s kartou <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Konfiguráciu sa nepodarilo analyzovať</translation> <translation id="6043994281159824495">Odhlásiť sa</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> zdieľa kartu Chromu a zvuk s kartou <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Primárne tlačidlo TrackPoint</translation> <translation id="6047632800149092791">Synchronizácia nefunguje. Skúste sa odhlásiť a znova prihlásiť.</translation> <translation id="6049797270917061226">Tento súbor môže útočníkom umožniť ukradnúť vaše osobné údaje.</translation> @@ -7327,7 +7326,6 @@ <translation id="8655295600908251630">Kanál</translation> <translation id="8655972064210167941">Prihlásenie zlyhalo, pretože sa heslo nepodarilo overiť. Kontaktujte svojho správcu alebo to skúste znova.</translation> <translation id="8657393004602556571">Chcete spätnú väzbu zahodiť?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> zdieľa vašu obrazovku a zvuk s kartou <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Otvoriť odkaz v okne inko&gnito</translation> <translation id="8662671328352114214">Pridanie sa k sieti <ph name="TYPE" /></translation> <translation id="8662733268723715832">Trvá to dlhšie, ako sa očakávalo. Môžete preskočiť alebo čakať na dokončenie.</translation> @@ -7624,7 +7622,6 @@ <translation id="8941173171815156065">Odvolať povolenie „<ph name="PERMISSION" />“</translation> <translation id="894360074127026135">Netscape – medzinárodný prestup na vyššiu edíciu</translation> <translation id="8944099748578356325">Bude intenzívnejšie využívať batériu (aktuálne <ph name="BATTERY_PERCENTAGE" /> %)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> zdieľa okno s kartou <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Veľkosť ikony</translation> <translation id="8946359700442089734">Na tomto zariadení <ph name="IDS_SHORT_PRODUCT_NAME" /> neboli úplne povolené funkcie ladenia</translation> <translation id="894763922177556086">Dobré</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index eb8b8f5..6cd5787 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -537,6 +537,7 @@ <translation id="1549275686094429035">ARC je omogočen</translation> <translation id="1549788673239553762">Aplikacija <ph name="APP_NAME" /> želi dostopati do <ph name="VOLUME_NAME" />. Morda bo spreminjala ali izbrisala vaše datoteke.</translation> <translation id="1552301827267621511">Razširitev »<ph name="EXTENSION_NAME" />« je spremenila ponudnika iskanja; poslej se uporablja <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Upravljanje razširitve</translation> <translation id="1553538517812678578">neomejeno</translation> <translation id="1555130319947370107">Modra</translation> <translation id="1556537182262721003">Imenika razširitve ni bilo mogoče premakniti v profil.</translation> @@ -2797,7 +2798,6 @@ <translation id="3842552989725514455">Serifna pisava</translation> <translation id="3843464315703645664">Interno na seznamu dovoljenih</translation> <translation id="3844888638014364087">Vstavljen je emodži</translation> -<translation id="384513009320852920">Naprava Bluetooth mora biti v načinu za seznanjanje in v bližini. <ph name="BEGIN_LINK_LEARN_MORE" />Več o tem<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Prenesite orodja za razvoj spletnih mest, aplikacij za Android in drugega. Ob namestitvi Linuxa bo prenesenih <ph name="DOWNLOAD_SIZE" /> podatkov.</translation> <translation id="3847319713229060696">Pomagajte izboljšati varnost v spletu za vse</translation> <translation id="3848547754896969219">Odpiranje v &anonimnem oknu</translation> @@ -4306,7 +4306,6 @@ <translation id="5485102783864353244">Dodaj aplikacijo</translation> <translation id="5485754497697573575">Obnovi vse zavihke</translation> <translation id="5486261815000869482">Potrditev gesla</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> souporablja vaš zaslon s kartico <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Posnemaj vnovični zagon brskalnika</translation> <translation id="5487460042548760727">Preimenuj profil v <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Izbriši podatke</translation> @@ -4368,6 +4367,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> želi</translation> <translation id="5534304873398226603">Zavrzi fotografijo ali videoposnetek</translation> <translation id="5535941515421698170">Odstranite tudi obstoječe podatke iz te naprave</translation> +<translation id="5537725057119320332">Predvajanje</translation> <translation id="5539221284352502426">Vneseno geslo je zavrnil strežnik. Možni razlogi za to so: Geslo je prekratko. Geslo mora vsebovati številke ali simbole. Geslo se mora razlikovati od prejšnjih gesel.</translation> <translation id="5541694225089836610">Dejanje je onemogočil skrbnik</translation> <translation id="5542132724887566711">Profil</translation> @@ -4600,6 +4600,7 @@ <translation id="5787146423283493983">Pogodba o ključu</translation> <translation id="5787420647064736989">Ime naprave</translation> <translation id="5788367137662787332">Vsaj ene particije v napravi <ph name="DEVICE_LABEL" /> ni bilo mogoče vpeti.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Uspešno</translation> <translation id="5790651917470750848">Posredovanje vrat že obstaja</translation> <translation id="5792728279623964091">Dotaknite se gumba za vklop</translation> @@ -4831,10 +4832,8 @@ <ph name="BEGIN_PARAGRAPH2" />Lokacijo lahko izklopite tako, da izklopite glavno nastavitev lokacije v napravi. V nastavitvah lokacije lahko izklopite tudi uporabo omrežij Wi‑Fi, mobilnih omrežij in tipal za zaznavanje lokacije.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Zapri celozaslonski način</translation> <translation id="6042308850641462728">Več</translation> -<translation id="6043317578411397101">Aplikacija <ph name="APP_NAME" /> je v skupno rabo z zavihkom <ph name="TAB_NAME" /> dala Chromov zavihek.</translation> <translation id="604388835206766544">Konfiguracije ni bilo mogoče razčleniti</translation> <translation id="6043994281159824495">Odjava</translation> -<translation id="6044805581023976844">Aplikacija <ph name="APP_NAME" /> je v skupno rabo z zavihkom <ph name="TAB_NAME" /> dala Chromov zavihek in zvok.</translation> <translation id="6045114302329202345">Glavni gumb sledilne palčke</translation> <translation id="6047632800149092791">Sinhronizacija ne deluje. Poskusite se odjaviti in znova prijaviti.</translation> <translation id="6049797270917061226">Ta datoteka lahko napadalcem omogoči, da ukradejo vaše osebne podatke.</translation> @@ -7331,7 +7330,6 @@ <translation id="8655295600908251630">Kanal</translation> <translation id="8655972064210167941">Prijava ni uspela, ker ni bilo mogoče preveriti gesla. Obrnite se na skrbnika ali poskusite znova.</translation> <translation id="8657393004602556571">Ali želite zavreči povratne informacije?</translation> -<translation id="8658645149275195032">Aplikacija <ph name="APP_NAME" /> je v skupno rabo z zavihkom <ph name="TAB_NAME" /> dala vaš zaslon in zvok.</translation> <translation id="8661290697478713397">Odpri povezavo v oknu brez bele&ženja zgodovine</translation> <translation id="8662671328352114214">Pridružitev omrežju <ph name="TYPE" /></translation> <translation id="8662733268723715832">Postopek traja dlje, kot je pričakovano. Lahko preskočite ali počakate, da se dokonča.</translation> @@ -7629,7 +7627,6 @@ <translation id="8941173171815156065">Preklic dovoljenja »<ph name="PERMISSION" />«</translation> <translation id="894360074127026135">Nadgradnja Netscape International</translation> <translation id="8944099748578356325">Hitrejša poraba energije akumulatorja (trenutno <ph name="BATTERY_PERCENTAGE" /> %)</translation> -<translation id="8944964446326379280">Aplikacija <ph name="APP_NAME" /> je v skupno rabo z zavihkom <ph name="TAB_NAME" /> dala okno.</translation> <translation id="8945274638472141382">Velikost ikone</translation> <translation id="8946359700442089734">V tej napravi niso bile v celoti omogočene funkcije za odpravljanje napak: <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Dobra</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index c553bc9b..73bc459 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -161,6 +161,7 @@ <translation id="1153356358378277386">Pajisjet e çiftuara</translation> <translation id="1153636665119721804">Programi i "Mbrojtjes së përparuar" të Google</translation> <translation id="1155816283571436363">Po lidhet me telefonin tënd</translation> +<translation id="1158080958325422608">Bëj me shkronja të mëdha</translation> <translation id="1158238185437008462">Shiko kujtimet</translation> <translation id="1161575384898972166">Identifikohu në <ph name="TOKEN_NAME" /> për të eksportuar certifikatën e klientit.</translation> <translation id="116173250649946226">Administratori yt ka caktuar një temë të parazgjedhur e cila nuk mund të modifikohet.</translation> @@ -527,6 +528,7 @@ <translation id="1549275686094429035">ARC-ja është aktivizuar</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> dëshiron të ketë qasje te <ph name="VOLUME_NAME" />. Ai mund të modifikojë ose fshijë skedarët e tu.</translation> <translation id="1552301827267621511">Shtesa "<ph name="EXTENSION_NAME" />" ndryshoi kërkimin për të përdorur <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Menaxho shtesën</translation> <translation id="1553538517812678578">e pakufizuar</translation> <translation id="1555130319947370107">E kaltër</translation> <translation id="1556537182262721003">Direktoria e shtesës nuk mund të zhvendoset te profili.</translation> @@ -689,6 +691,7 @@ <translation id="1700079447639026019">Sajtet që nuk mund t'i përdorin asnjëherë kukit</translation> <translation id="1703331064825191675">Mos u shqetëso asnjëherë për fjalëkalime e tua</translation> <translation id="1703666494654169921">Mos lejo që sajtet të përdorin të dhënat ose pajisjet e realitetit virtual</translation> +<translation id="1704097193565924901">Kapitalizo</translation> <translation id="1704230497453185209">Mos lejo që sajtet të luajnë tinguj</translation> <translation id="1704970325597567340">Kontrolli i sigurisë u ekzekutua më <ph name="DATE" /></translation> <translation id="1706586824377653884">Shtuar nga administratori yt</translation> @@ -2774,7 +2777,6 @@ <translation id="3842552989725514455">Shkrimi serif</translation> <translation id="3843464315703645664">Lista e lejimeve në nivel të brendshëm</translation> <translation id="3844888638014364087">Emoji u fut</translation> -<translation id="384513009320852920">Sigurohu që pajisja jote me Bluetooth të jetë në modalitet çiftimi dhe në afërsi. <ph name="BEGIN_LINK_LEARN_MORE" />Mëso më shumë<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Merr vegla për zhvillimin e faqeve të internetit, aplikacioneve për Android dhe shumë të tjera. Instalimi i Linux do të shkarkojë <ph name="DOWNLOAD_SIZE" /> të dhëna.</translation> <translation id="3847319713229060696">Ndihmo në përmirësimin e sigurisë për të gjithë</translation> <translation id="3848547754896969219">Hape në &dritare "të fshehtë"</translation> @@ -3559,6 +3561,7 @@ <translation id="4681453295291708042">Çaktivizo "Ndarjen në afërsi"</translation> <translation id="4681930562518940301">Hap imazhin &origjinal në skedë të re</translation> <translation id="4682551433947286597">Imazhet e sfondit shfaqen në "Ekranin e identifikimit".</translation> +<translation id="4683629100208651599">Bëj me shkronja të vogla</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />% (i parazgjedhur)</translation> <translation id="4684427112815847243">Sinkronizo gjithçka</translation> <translation id="4684471265911890182"><ph name="APP_NAME" /> po përpiqet të ketë qasje te kamera. Çaktivizo çelësin e privatësisë të kamerës për të lejuar qasjen.</translation> @@ -4281,7 +4284,6 @@ <translation id="5485102783864353244">Shto një aplikacion</translation> <translation id="5485754497697573575">Restauro të gjitha skedat</translation> <translation id="5486261815000869482">Konfirmo fjalëkalimin</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> po ndan ekranin tënd me <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simulo rifillimin e shfletimit</translation> <translation id="5487460042548760727">Riemërtoje profilin si <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Pastro të dhënat</translation> @@ -4343,6 +4345,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> dëshiron</translation> <translation id="5534304873398226603">Hiq fotografinë dhe videon</translation> <translation id="5535941515421698170">Hiq gjithashtu edhe të dhënat ekzistuese nga kjo pajisje</translation> +<translation id="5537725057119320332">Transmeto</translation> <translation id="5539221284352502426">Fjalëkalimi që fute u refuzua nga serveri. Arsyet e mundshme përfshijnë: fjalëkalimi është tepër i shkurtër. Fjalëkalimi duhet të përfshijë numra ose simbole. Fjalëkalimi duhet të jetë i ndryshëm nga fjalëkalimet e mëparshme.</translation> <translation id="5541694225089836610">Veprimi është çaktivizuar nga administratori yt</translation> <translation id="5542132724887566711">Profili</translation> @@ -4573,6 +4576,7 @@ <translation id="5787146423283493983">Marrëveshja kryesore</translation> <translation id="5787420647064736989">Emri i pajisjes</translation> <translation id="5788367137662787332">Na vjen keq, të paktën një pjesë në pajisjen <ph name="DEVICE_LABEL" /> nuk mund të montohej.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Me sukses</translation> <translation id="5790651917470750848">Porta transferuese ekziston tashmë</translation> <translation id="5792728279623964091">Trokit te butoni i energjisë</translation> @@ -4804,10 +4808,8 @@ <ph name="BEGIN_PARAGRAPH2" />Mund ta çaktivizosh "Vendndodhjen" duke çaktivizuar cilësimin kryesor të "Vendndodhjes" në pajisje. Mund dhe të çaktivizosh përdorimin e Wi-Fi, rrjeteve celulare dhe sensorëve për vendndodhjen te cilësimet e vendndodhjes.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Dil nga ekrani i plotë</translation> <translation id="6042308850641462728">Më shumë</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> po ndan një skedë të Chrome me <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Analizimi i konfigurimit dështoi</translation> <translation id="6043994281159824495">Dil tani</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> po ndan një skedë të Chrome dhe audion me <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Butoni kryesor i TrackPoint</translation> <translation id="6047632800149092791">Sinkronizimi nuk po punon. Provo të dalësh dhe të identifikohesh sërish.</translation> <translation id="6049797270917061226">Ky skedar mund t'u lejojë sulmuesve të vjedhin informacionet e tua personale.</translation> @@ -5951,6 +5953,7 @@ <translation id="7257173066616499747">Rrjetet Wi-Fi</translation> <translation id="725758059478686223">Shërbimi i printimit</translation> <translation id="7257666756905341374">Lexo të dhënat që kopjon dhe ngjit</translation> +<translation id="7258192266780953209">Transformimet</translation> <translation id="7258225044283673131">Aplikacioni nuk përgjigjet. Zgjidh "Ndalo me forcë" për ta mbyllur aplikacionin.</translation> <translation id="7262004276116528033">Ky shërbim identifikimi strehohet nga <ph name="SAML_DOMAIN" /></translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Provo këto hapa të zgjidhjes së problemeve: @@ -7300,7 +7303,6 @@ <translation id="8655295600908251630">Kanali</translation> <translation id="8655972064210167941">Identifikimi dështoi pasi fjalëkalimi nuk mund të verifikohej. Kontakto me administratorin ose provo përsëri.</translation> <translation id="8657393004602556571">Dëshiron të heqësh komentin?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> po ndan ekranin tënd dhe audion me <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Hape lidhjen në një dritare të fshe&htë</translation> <translation id="8662671328352114214">Bashkohu në rrjetin <ph name="TYPE" /></translation> <translation id="8662733268723715832">Kjo po zgjat më shumë nga sa pritej. Mund ta kapërcesh ose të presësh derisa të kryhet.</translation> @@ -7595,7 +7597,6 @@ <translation id="8941173171815156065">Revoko lejen "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Netscape International me rritje</translation> <translation id="8944099748578356325">Përdorë baterinë më shpejt (aktualisht <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> po ndan një dritare me <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Madhësia e ikonës</translation> <translation id="8946359700442089734">Karakteristikat e korrigjimit të gabimeve nuk u aktivizuan plotësisht në këtë pajisje <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">E mirë</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 9a894f8..ea319bbd 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -532,6 +532,7 @@ <translation id="1549275686094429035">Vreme izvršavanja aplikacije za Chrome je omogućeno</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> želi da pristupa <ph name="VOLUME_NAME" />. Možda će da menja ili briše datoteke.</translation> <translation id="1552301827267621511">Dodatak „<ph name="EXTENSION_NAME" />“ je promenio pretragu tako da koristi <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Upravljajte dodatkom</translation> <translation id="1553538517812678578">neograničeno</translation> <translation id="1555130319947370107">Plava</translation> <translation id="1556537182262721003">Katalog dodataka nije bilo moguće premestiti u profil.</translation> @@ -2787,7 +2788,6 @@ <translation id="3842552989725514455">Font Serif</translation> <translation id="3843464315703645664">Na internoj listi dozvoljenih</translation> <translation id="3844888638014364087">Emodži je umetnut</translation> -<translation id="384513009320852920">Proverite da li je Bluetooth uređaj u režimu uparivanja i u blizini. <ph name="BEGIN_LINK_LEARN_MORE" />Saznajte više<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Pronađite alatke za programiranje veb-sajtova, Android aplikacija i drugo. Instaliranje Linux-a će preuzeti podatke (<ph name="DOWNLOAD_SIZE" />).</translation> <translation id="3847319713229060696">Poboljšajte bezbednost na vebu za svakoga</translation> <translation id="3848547754896969219">Otvori u &prozoru bez arhiviranja</translation> @@ -4297,7 +4297,6 @@ <translation id="5485102783864353244">Dodaj aplikaciju</translation> <translation id="5485754497697573575">Vrati sve kartice</translation> <translation id="5486261815000869482">Potvrdite lozinku</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> deli ekran sa <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simuliraj ponovno pokretanje pregledača</translation> <translation id="5487460042548760727">Preimenujte profil u <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Obriši podatke</translation> @@ -4359,6 +4358,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> želi da</translation> <translation id="5534304873398226603">Odbaci sliku ili video</translation> <translation id="5535941515421698170">Uklanja i postojeće podatke sa ovog uređaja</translation> +<translation id="5537725057119320332">Prebacuj</translation> <translation id="5539221284352502426">Server je odbio lozinku koju ste uneli. Mogući razlozi obuhvataju: Lozinka je prekratka. Lozinka mora da sadrži brojeve ili simbole. Lozinka mora da se razlikuje od prethodnih lozinki.</translation> <translation id="5541694225089836610">Administrator je onemogućio radnju</translation> <translation id="5542132724887566711">Profil</translation> @@ -4590,6 +4590,7 @@ <translation id="5787146423283493983">Slaganje ključa</translation> <translation id="5787420647064736989">Naziv uređaja</translation> <translation id="5788367137662787332">Žao nam je, najmanje jednu particiju na uređaju <ph name="DEVICE_LABEL" /> nije bilo moguće uključiti.</translation> +<translation id="5789643057113097023">,</translation> <translation id="5790085346892983794">Uspešno</translation> <translation id="5790651917470750848">Prosleđivanje porta već postoji</translation> <translation id="5792728279623964091">Dodirnite dugme za uključivanje</translation> @@ -4822,10 +4823,8 @@ <ph name="BEGIN_PARAGRAPH2" />Lokaciju možete da isključite ako isključite glavno podešavanje Lokacija na uređaju. U podešavanjima lokacije možete da isključite i korišćenje Wi‑Fi mreža, mobilnih mreža i senzora za lokaciju.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Izađi iz celog ekrana</translation> <translation id="6042308850641462728">Još</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> deli Chrome karticu sa <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Raščlanjivanje konfiguracije nije uspelo</translation> <translation id="6043994281159824495">Odjavi me odmah</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> deli Chrome karticu i zvuk sa <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Primarno dugme TrackPoint-a</translation> <translation id="6047632800149092791">Sinhronizacija ne radi. Probajte da se odjavite i ponovo prijavite.</translation> <translation id="6049797270917061226">Ovaj fajl može da dozvoli napadačima da vam ukradu lične podatke.</translation> @@ -7328,7 +7327,6 @@ <translation id="8655295600908251630">Kanal</translation> <translation id="8655972064210167941">Prijavljivanje nije uspelo jer nismo uspeli da verifikujemo lozinku. Kontaktirajte administratora ili pokušajte ponovo.</translation> <translation id="8657393004602556571">Želite da odbacite povratne informacije?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> deli ekran i zvuk sa <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Otvori link u prozoru za pre&gledanje bez arhiviranja</translation> <translation id="8662671328352114214">Pridružite se <ph name="TYPE" /> mreži</translation> <translation id="8662733268723715832">Ovo traje duže od očekivanog, pa možete da preskočite ili da sačekate dok ne bude gotovo.</translation> @@ -7625,7 +7623,6 @@ <translation id="8941173171815156065">Opozovite dozvolu „<ph name="PERMISSION" />“</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">brža potrošnja baterije (trenutno <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> deli prozor sa <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Veličina ikone</translation> <translation id="8946359700442089734">Funkcije za otklanjanje grešaka nisu u potpunosti omogućene na ovom <ph name="IDS_SHORT_PRODUCT_NAME" /> uređaju.</translation> <translation id="894763922177556086">Dobra</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 2b363d4..05a3798b 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -532,6 +532,7 @@ <translation id="1549275686094429035">Време извршавања апликације за Chrome је омогућено</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> жели да приступа <ph name="VOLUME_NAME" />. Можда ће да мења или брише датотеке.</translation> <translation id="1552301827267621511">Додатак „<ph name="EXTENSION_NAME" />“ је променио претрагу тако да користи <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Управљајте додатком</translation> <translation id="1553538517812678578">неограничено</translation> <translation id="1555130319947370107">Плава</translation> <translation id="1556537182262721003">Каталог додатака није било могуће преместити у профил.</translation> @@ -2787,7 +2788,6 @@ <translation id="3842552989725514455">Фонт Serif</translation> <translation id="3843464315703645664">На интерној листи дозвољених</translation> <translation id="3844888638014364087">Емоџи је уметнут</translation> -<translation id="384513009320852920">Проверите да ли је Bluetooth уређај у режиму упаривања и у близини. <ph name="BEGIN_LINK_LEARN_MORE" />Сазнајте више<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Пронађите алатке за програмирање веб-сајтова, Android апликација и друго. Инсталирање Linux-а ће преузети податке (<ph name="DOWNLOAD_SIZE" />).</translation> <translation id="3847319713229060696">Побољшајте безбедност на вебу за свакога</translation> <translation id="3848547754896969219">Отвори у &прозору без архивирања</translation> @@ -4297,7 +4297,6 @@ <translation id="5485102783864353244">Додај апликацију</translation> <translation id="5485754497697573575">Врати све картице</translation> <translation id="5486261815000869482">Потврдите лозинку</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> дели екран са <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Симулирај поновно покретање прегледача</translation> <translation id="5487460042548760727">Преименујте профил у <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Обриши податке</translation> @@ -4359,6 +4358,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> жели да</translation> <translation id="5534304873398226603">Одбаци слику или видео</translation> <translation id="5535941515421698170">Уклања и постојеће податке са овог уређаја</translation> +<translation id="5537725057119320332">Пребацуј</translation> <translation id="5539221284352502426">Сервер је одбио лозинку коју сте унели. Могући разлози обухватају: Лозинка је прекратка. Лозинка мора да садржи бројеве или симболе. Лозинка мора да се разликује од претходних лозинки.</translation> <translation id="5541694225089836610">Администратор је онемогућио радњу</translation> <translation id="5542132724887566711">Профил</translation> @@ -4590,6 +4590,7 @@ <translation id="5787146423283493983">Слагање кључа</translation> <translation id="5787420647064736989">Назив уређаја</translation> <translation id="5788367137662787332">Жао нам је, најмање једну партицију на уређају <ph name="DEVICE_LABEL" /> није било могуће укључити.</translation> +<translation id="5789643057113097023">,</translation> <translation id="5790085346892983794">Успешно</translation> <translation id="5790651917470750848">Прослеђивање порта већ постоји</translation> <translation id="5792728279623964091">Додирните дугме за укључивање</translation> @@ -4822,10 +4823,8 @@ <ph name="BEGIN_PARAGRAPH2" />Локацију можете да искључите ако искључите главно подешавање Локација на уређају. У подешавањима локације можете да искључите и коришћење Wi‑Fi мрежа, мобилних мрежа и сензора за локацију.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Изађи из целог екрана</translation> <translation id="6042308850641462728">Још</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> дели Chrome картицу са <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Рашчлањивање конфигурације није успело</translation> <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="6049797270917061226">Овај фајл може да дозволи нападачима да вам украду личне податке.</translation> @@ -7328,7 +7327,6 @@ <translation id="8655295600908251630">Канал</translation> <translation id="8655972064210167941">Пријављивање није успело јер нисмо успели да верификујемо лозинку. Контактирајте администратора или покушајте поново.</translation> <translation id="8657393004602556571">Желите да одбаците повратне информације?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> дели екран и звук са <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Отвори линк у прозору за пре&гледање без архивирања</translation> <translation id="8662671328352114214">Придружите се <ph name="TYPE" /> мрежи</translation> <translation id="8662733268723715832">Ово траје дуже од очекиваног, па можете да прескочите или да сачекате док не буде готово.</translation> @@ -7625,7 +7623,6 @@ <translation id="8941173171815156065">Опозовите дозволу „<ph name="PERMISSION" />“</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">бржа потрошња батерије (тренутно <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> дели прозор са <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Величина иконе</translation> <translation id="8946359700442089734">Функције за отклањање грешака нису у потпуности омогућене на овом <ph name="IDS_SHORT_PRODUCT_NAME" /> уређају.</translation> <translation id="894763922177556086">Добра</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 6c03ece..08f5495 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -163,6 +163,7 @@ <translation id="1153356358378277386">Kopplade enheter</translation> <translation id="1153636665119721804">Avancerat skydd från Google</translation> <translation id="1155816283571436363">Ansluter till telefonen</translation> +<translation id="1158080958325422608">Ändra till versaler</translation> <translation id="1158238185437008462">Se minnen</translation> <translation id="1161575384898972166">Logga in på <ph name="TOKEN_NAME" /> om du vill exportera klientcertifikatet.</translation> <translation id="116173250649946226">Administratören har ställt in ett standardtema som inte kan ändras.</translation> @@ -533,6 +534,7 @@ <translation id="1549275686094429035">ARC aktiverat</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> vill ha åtkomst till <ph name="VOLUME_NAME" />. Den kan ändra eller ta bort dina filer.</translation> <translation id="1552301827267621511">Tillägget <ph name="EXTENSION_NAME" /> ändrade sökleverantören till <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Hantera tillägg</translation> <translation id="1553538517812678578">obegränsad</translation> <translation id="1555130319947370107">Blå</translation> <translation id="1556537182262721003">Det gick inte att flytta tilläggskatalogen till profilen.</translation> @@ -695,6 +697,7 @@ <translation id="1700079447639026019">Webbplatser som aldrig kan använda cookies</translation> <translation id="1703331064825191675">Tänk inte mer på dina lösenord</translation> <translation id="1703666494654169921">Tillåt inte att webbplatser använder VR-enheter eller VR-data</translation> +<translation id="1704097193565924901">Använd versaler</translation> <translation id="1704230497453185209">Tillåt inte att webbplatser spelar upp ljud</translation> <translation id="1704970325597567340">Säkerhetskontrollen kördes den <ph name="DATE" /></translation> <translation id="1706586824377653884">Lades till av administratören</translation> @@ -2792,7 +2795,6 @@ <translation id="3842552989725514455">Serif-teckensnitt</translation> <translation id="3843464315703645664">Tillagd på den interna godkännandelistan</translation> <translation id="3844888638014364087">Emojin infogades</translation> -<translation id="384513009320852920">Kontrollera att Bluetooth-enheten är i parkopplingsläge och finns i närheten. <ph name="BEGIN_LINK_LEARN_MORE" />Läs mer<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Skaffa verktyg för att utveckla webbplatser, Android-appar och mycket annat. <ph name="DOWNLOAD_SIZE" /> data laddas ned när Linux installeras.</translation> <translation id="3847319713229060696">Hjälp till att förbättra säkerheten på webben för alla</translation> <translation id="3848547754896969219">Öppna i ett &inkognitofönster</translation> @@ -3578,6 +3580,7 @@ <translation id="4681453295291708042">Inaktivera Närdelning</translation> <translation id="4681930562518940301">Öppna originalbilden i en ny flik</translation> <translation id="4682551433947286597">Bakgrunder visas på inloggningsskärmen.</translation> +<translation id="4683629100208651599">Ändra till gemener</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" /> % (standard)</translation> <translation id="4684427112815847243">Synkronisera allt</translation> <translation id="4684471265911890182"><ph name="APP_NAME" /> försöker använda kameran. Om du vill låta den göra detta måste du inaktivera integritetsinställningen som blockerar kameran.</translation> @@ -4300,7 +4303,6 @@ <translation id="5485102783864353244">Lägg till app</translation> <translation id="5485754497697573575">Återställ alla flikar</translation> <translation id="5486261815000869482">Bekräfta lösenord</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> delar din skärm med <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Simulera omstart av webbläsaren</translation> <translation id="5487460042548760727">Ändra namnet på profilen till <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Rensa data</translation> @@ -4362,6 +4364,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> vill</translation> <translation id="5534304873398226603">Släng fotot eller videon</translation> <translation id="5535941515421698170">Ta även bort befintlig data från den här enheten</translation> +<translation id="5537725057119320332">Casta</translation> <translation id="5539221284352502426">Det angivna lösenordet avvisades av servern. Möjliga orsaker: Lösenordet är för kort. Lösenordet måste innehålla siffror eller symboler. Det får inte vara ett återanvänt lösenord.</translation> <translation id="5541694225089836610">Åtgärden har inaktiverats av administratören</translation> <translation id="5542132724887566711">Profil</translation> @@ -4592,6 +4595,7 @@ <translation id="5787146423283493983">Nyckelavtal</translation> <translation id="5787420647064736989">Enhetens namn</translation> <translation id="5788367137662787332">Minst en partition på enheten <ph name="DEVICE_LABEL" /> kunde inte monteras.</translation> +<translation id="5789643057113097023">,</translation> <translation id="5790085346892983794">Klart</translation> <translation id="5790651917470750848">Portvidarebefordran finns redan</translation> <translation id="5792728279623964091">Tryck på strömbrytaren</translation> @@ -4823,10 +4827,8 @@ <ph name="BEGIN_PARAGRAPH2" />Du kan inaktivera tjänsten genom att inaktivera huvudinställningen för Plats på enheten. Du kan även inaktivera användningen av wifi, mobilnätverk och sensorer för plats i platsinställningarna.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Avsluta helskärmsläget</translation> <translation id="6042308850641462728">Mer</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> delar en Chrome-flik med <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Det gick inte att tolka konfigurationen</translation> <translation id="6043994281159824495">Logga ut nu</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> delar ljud och en flik i Chrome med <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Primär TrackPoint-knapp</translation> <translation id="6047632800149092791">Det går inte att synkronisera. Testa att logga ut och sedan logga in igen.</translation> <translation id="6049797270917061226">Den här filen kan göra att angripare stjäl dina personliga uppgifter.</translation> @@ -5970,6 +5972,7 @@ <translation id="7257173066616499747">wifi-nätverk</translation> <translation id="725758059478686223">Utskriftstjänst</translation> <translation id="7257666756905341374">Läsa data som du kopierar och klistrar in</translation> +<translation id="7258192266780953209">Transformationer</translation> <translation id="7258225044283673131">Appen svarar inte. Stäng appen med Tvångsavsluta.</translation> <translation id="7262004276116528033">Inloggningstjänsten tillhandahålls av <ph name="SAML_DOMAIN" />.</translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Testa felsökningsåtgärderna nedan: @@ -7322,7 +7325,6 @@ <translation id="8655295600908251630">Kanal</translation> <translation id="8655972064210167941">Inloggningen misslyckades eftersom ditt lösenord inte kunde verifieras. Kontakta administratören eller försök igen.</translation> <translation id="8657393004602556571">Vill du inte skicka feedback?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> delar skärmen och ljudet med <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Öppna länk i inko&gnitofönster</translation> <translation id="8662671328352114214">Anslut till <ph name="TYPE" />-nätverket</translation> <translation id="8662733268723715832">Det här tar längre tid än väntat. Du kan vänta tills det är klart eller hoppa över detta.</translation> @@ -7617,7 +7619,6 @@ <translation id="8941173171815156065">Återkalla behörigheten <ph name="PERMISSION" /></translation> <translation id="894360074127026135">Netscapes internationella uppgradering</translation> <translation id="8944099748578356325">Batteriet förbrukas snabbare (för närvarande <ph name="BATTERY_PERCENTAGE" /> %)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> delar ett fönster med <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Ikonstorlek</translation> <translation id="8946359700442089734">Felsökningsfunktionerna aktiverades inte helt på den här <ph name="IDS_SHORT_PRODUCT_NAME" />-enheten.</translation> <translation id="894763922177556086">Bra</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index d3b0f0df..fe41824f 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -531,6 +531,7 @@ <translation id="1549275686094429035">ARC Imewashwa</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> inataka kufikia <ph name="VOLUME_NAME" />. Inaweza kurekebisha au kufuta faili zako.</translation> <translation id="1552301827267621511">Kiendelezi cha "<ph name="EXTENSION_NAME" />" kilibadilisha mtambo wa kutafuta ili kitumie <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Dhibiti kiendelezi</translation> <translation id="1553538517812678578">bila kikomo</translation> <translation id="1555130319947370107">Samawati</translation> <translation id="1556537182262721003">Saraka ya kiendelezi haikuweza kuhamishwa hadi kwenye wasifu.</translation> @@ -2790,7 +2791,6 @@ <translation id="3842552989725514455">Fonti ya Serif</translation> <translation id="3843464315703645664">Imeruhusiwa ndani ya kampuni</translation> <translation id="3844888638014364087">Umeweka emoji</translation> -<translation id="384513009320852920">Hakikisha kwamba kifaa chako chenye Bluetooth kiko katika hali ya kuoanisha na kiko karibu. <ph name="BEGIN_LINK_LEARN_MORE" />Pata maelezo zaidi<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Pata zana za kutengeneza tovuti, programu za Android, na zaidi. Kusakinisha Linux kutapakua data ya <ph name="DOWNLOAD_SIZE" />.</translation> <translation id="3847319713229060696">Tusaidie kuboresha usalama wa kila mtu kwenye wavuti</translation> <translation id="3848547754896969219">Fungua katika &dirisha fiche</translation> @@ -4297,7 +4297,6 @@ <translation id="5485102783864353244">Ongeza programu</translation> <translation id="5485754497697573575">Hifadhi Upya Vichupo Vyote</translation> <translation id="5486261815000869482">Thibitisha nenosiri</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> inashiriki skrini yako na <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Unda Uanzishaji upya wa Ukurasa</translation> <translation id="5487460042548760727">Badilisha jina la wasifu liwe <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Futa data</translation> @@ -4359,6 +4358,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> inataka</translation> <translation id="5534304873398226603">Ondoa picha au video</translation> <translation id="5535941515421698170">Pia ondoa data yako iliyopo kwenye kifaa hiki</translation> +<translation id="5537725057119320332">Tuma</translation> <translation id="5539221284352502426">Nenosiri uliloweka limekataliwa na seva. Hali hii inaweza kusababishwa na: Nenosiri kuwa fupi mno. Nenosiri lazima lijumuishe nambari na ishara. Nenosiri lazima liwe tofauti na manenosiri ya awali.</translation> <translation id="5541694225089836610">Kitendo kimezimwa na msimamizi wako</translation> <translation id="5542132724887566711">Wasifu</translation> @@ -4589,6 +4589,7 @@ <translation id="5787146423283493983">Makubaliano ya Funguo</translation> <translation id="5787420647064736989">Jina la kifaa</translation> <translation id="5788367137662787332">Samahani, angalau sehemu moja kwenye kifaa <ph name="DEVICE_LABEL" /> haingeweza kuangikwa.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Mafanikio</translation> <translation id="5790651917470750848">Mlango unaosambazia tayari upo</translation> <translation id="5792728279623964091">Tafadhali gusa kitufe chako cha kuwasha/kuzima</translation> @@ -4820,10 +4821,8 @@ <ph name="BEGIN_PARAGRAPH2" />Unaweza kuzima huduma ya Mahali kwa kuzima mipangilio ya msingi ya Mahali kwenye kifaa chako. Pia, unaweza kuzima utumiaji wa Wi-Fi, mitandao ya simu na vitambuzi vya mahali katika mipangilio ya mahali.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Ondoka kwenye Skrini Nzima</translation> <translation id="6042308850641462728">Zaidi</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> inashiriki kichupo cha Chrome na <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Imeshindwa kuchanganua mipangilio</translation> <translation id="6043994281159824495">Ondoka kwenye akaunti sasa hivi</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> inashiriki kichupo cha Chrome na sauti pamoja na <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Kitufe cha msingi cha TrackPoint</translation> <translation id="6047632800149092791">Kipengele cha kusawazisha hakifanyi kazi. Jaribu kuondoka na kuingia tena katika akaunti.</translation> <translation id="6049797270917061226">Faili hii inaweza kuwawezesha wadukuzi kuiba taarifa zako binafsi.</translation> @@ -7322,7 +7321,6 @@ <translation id="8655295600908251630">Kituo</translation> <translation id="8655972064210167941">Haikufaulu kuingia katika akaunti kwa sababu nenosiri lako halikuthibitishwa. Tafadhali wasiliana na msimamizi wako au jaribu tena.</translation> <translation id="8657393004602556571">Ungependa kuondoa maoni?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> inashiriki skrini na sauti yako pamoja na <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Fungua Kiungo katika Dirisha &Fiche</translation> <translation id="8662671328352114214">Jiunge na mtandao wa <ph name="TYPE" /></translation> <translation id="8662733268723715832">Hatua hii inachukua muda mrefu zaidi ya ilivyotarajiwa, unaweza kuiruka au kusubiri hadi ikamilike.</translation> @@ -7617,7 +7615,6 @@ <translation id="8941173171815156065">Batilisha ruhusa '<ph name="PERMISSION" />'</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Tumia betri kwa haraka zaidi (kwa sasa <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> inashiriki dirisha na <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Ukubwa wa aikoni</translation> <translation id="8946359700442089734">Vipengele vya kutatua havikuwashwa kikamilifu kwenye kifaa hiki cha <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Mzuri</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 334f555..7b0d25f 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -162,6 +162,7 @@ <translation id="1152346050262092795">உங்கள் கணக்கைச் சரிபார்க்க, கடவுச்சொல்லை மீண்டும் உள்ளிடவும்.</translation> <translation id="1153356358378277386">இணைத்த சாதனங்கள்</translation> <translation id="1153636665119721804">Google மேம்பட்ட பாதுகாப்புத் திட்டம்</translation> +<translation id="1155545602507378023">இல்லை, இந்தச் சாதனத்தில் மட்டும்</translation> <translation id="1155816283571436363">உங்கள் மொபைலுடன் இணைக்கிறது</translation> <translation id="1158080958325422608">பேரெழுத்தாக்கு</translation> <translation id="1158238185437008462">நினைவுகளைக் காட்டு</translation> @@ -396,6 +397,7 @@ <translation id="1410197035576869800">ஆப்ஸின் ஐகான்</translation> <translation id="1410616244180625362">உங்கள் கேமராவை அணுக <ph name="HOST" /> ஐத் தொடர்ந்து அனுமதிக்கவும்</translation> <translation id="1410806973194718079">கொள்கைகளைச் சரிபார்க்க முடியவில்லை</translation> +<translation id="1412681350727866021">கூடுதல் நீட்டிப்புகள்</translation> <translation id="1414315029670184034">கேமராவைப் பயன்படுத்த தளங்களை அனுமதிக்காதே</translation> <translation id="1414648216875402825">உருவாக்கப்பட்டு வரும் அம்சங்கள் உள்ள <ph name="PRODUCT_NAME" /> இன் நிலையற்ற பதிப்பிற்கு மேம்படுத்துகிறீர்கள். சிதைவுகள் மற்றும் எதிர்பாராத பிழைகள் ஏற்படும். கவனமாக தொடரவும்.</translation> <translation id="1415708812149920388">கிளிப்போர்டைப் படிப்பதற்கான அணுகல் மறுக்கப்பட்டது</translation> @@ -534,6 +536,7 @@ <translation id="1549275686094429035">ARC இயக்கப்பட்டது</translation> <translation id="1549788673239553762"><ph name="APP_NAME" />க்கு <ph name="VOLUME_NAME" /> இன் அணுகல் தேவை. இது உங்கள் கோப்புகளை மாற்றலாம் அல்லது நீக்கலாம்.</translation> <translation id="1552301827267621511"><ph name="SEARCH_PROVIDER_DOMAIN" /> டொமைனைப் பயன்படுத்தும் வகையில் தேடலை "<ph name="EXTENSION_NAME" />" நீட்டிப்பு மாற்றியுள்ளது</translation> +<translation id="1552752544932680961">நீட்டிப்பை நிர்வகிக்கவும்</translation> <translation id="1553538517812678578">வரம்பில்லை</translation> <translation id="1555130319947370107">நீலம்</translation> <translation id="1556537182262721003">சுயவிவரத்தில் நீட்டிப்புக் கோப்பகத்தை நகர்த்த முடியவில்லை.</translation> @@ -949,6 +952,7 @@ <translation id="1937774647013465102">கண்டெய்னர் கட்டமைப்பு வகை <ph name="ARCHITECTURE_CONTAINER" />ஐ இந்த <ph name="ARCHITECTURE_DEVICE" /> சாதனத்தில் இறக்க முடியவில்லை. இந்தக் கண்டெய்னரை வேறு சாதனத்திற்குள் மீட்டமைக்க முயலலாம் அல்லது Files ஆப்ஸில் திறந்து இந்தக் கண்டெய்னர் படத்திற்குள் இருக்கும் கோப்புகளை அணுகலாம்.</translation> <translation id="1938351510777341717">வெளிக் கட்டளை</translation> <translation id="1940546824932169984">இணைத்துள்ள சாதனங்கள்</translation> +<translation id="1941410638996203291">தொடக்க நேரம்: <ph name="TIME" /></translation> <translation id="1942128823046546853">எல்லா இணையதளங்களிலும் உள்ள உங்களின் அனைத்துத் தரவையும் படிக்கலாம் திருத்தலாம்</translation> <translation id="1942600407708803723">கவர் மூடியிருக்கும்போது நிறுத்து</translation> <translation id="1944528062465413897">புளூடூத் இணைத்தல் குறியீடு:</translation> @@ -1327,6 +1331,7 @@ <translation id="2320295602967756579">லைட் தீமினை இயக்குதல்</translation> <translation id="2322193970951063277">மேற்குறிப்புகளும் அடிக்குறிப்புகளும்</translation> <translation id="2322318151094136999">ஒரு தளம் சீரியல் போர்ட்டுகளை அணுக வேண்டியிருக்கும்போது கேள் (பரிந்துரைக்கப்படுகிறது)</translation> +<translation id="2322622365472107569">முடிவு நேரம்: <ph name="TIME" /></translation> <translation id="2323018538045954000">சேமித்த வைஃபை நெட்வொர்க்குகள்</translation> <translation id="2325444234681128157">கடவுச்சொல்லைச் சேமி</translation> <translation id="2326188115274135041">தானாக அன்லாக் ஆகும் அம்சத்தை இயக்க பின்னை உறுதிசெய்யவும்</translation> @@ -1432,6 +1437,7 @@ <translation id="2435248616906486374">நெட்வொர்க் துண்டிக்கப்பட்டது</translation> <translation id="2435457462613246316">கடவுச்சொல்லைக் காண்பி</translation> <translation id="2436186046335138073">எல்லா <ph name="PROTOCOL" /> இணைப்புகளையும் திறக்க, <ph name="HANDLER_HOSTNAME" /> ஐ அனுமதிக்கவா?</translation> +<translation id="2439626940657133600"><ph name="WINDOW_TITLE" /> ஐ ஏற்றுகிறது</translation> <translation id="2440604414813129000">ஆ&தாரத்தைக் காண்பி</translation> <translation id="244231003699905658">தவறான முகவரி. முகவரியைச் சரிபார்த்துவிட்டு மீண்டும் முயலவும்.</translation> <translation id="2442916515643169563">டெக்ஸ்ட் ஷேடோ</translation> @@ -1937,6 +1943,7 @@ <translation id="2935654492420446828">பள்ளிக் கணக்கைப் பிறகு சேர்த்தல்</translation> <translation id="2936851848721175671">காப்புப் பிரதி & மீட்டெடுத்தல்</translation> <translation id="2938225289965773019"><ph name="PROTOCOL" /> இணைப்புகளைத் திறக்கும்</translation> +<translation id="2939908794993783865">பட்டியலை முழுவதும் காட்டு</translation> <translation id="2939938020978911855">கிடைக்கும் புளூடூத் சாதனங்களைக் காட்டு</translation> <translation id="2941112035454246133">குறைவு</translation> <translation id="2942279350258725020">Android Messages</translation> @@ -2082,6 +2089,7 @@ <translation id="3090589793601454425">நகர்த்த வேண்டாம்</translation> <translation id="3090819949319990166">வெளிப்புற crx ஃபைலை <ph name="TEMP_CRX_FILE" />க்கு நகலெடுக்க முடியாது.</translation> <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" இணைக்கப்பட்டது</translation> +<translation id="3093362725605442088">Chrome OS சாதனம், காம்பனென்ட் வரிசை எண்கள் ஆகியவற்றைப் படித்தல்.</translation> <translation id="3093714882666365141">பேமெண்ட் ஹேண்ட்லர்களை நிறுவ தளங்களை அனுமதிக்காதே</translation> <translation id="3094141017404513551">இதனால் <ph name="EXISTING_USER" /> பயனரிடமிருந்து உங்கள் உலாவல் தனிப்பட்டதாக வைத்திருக்கப்படும்</translation> <translation id="3095871294753148861">புக்மார்க்குகள், கடவுச்சொற்கள், பிற உலாவித் தரவு ஆகியவை முதன்மைக் கணக்குடன் ஒத்திசைக்கப்படும்.</translation> @@ -2269,6 +2277,7 @@ <translation id="3308852433423051161">Google அசிஸ்டண்ட்டை ஏற்றுகிறது...</translation> <translation id="3309330461362844500">சான்றிதழின் சுயவிவர ஐடி</translation> <translation id="3311445899360743395">இந்த ஆப்ஸுடன் தொடர்புடைய தரவு இந்தச் சாதனத்திலிருந்து அகற்றப்படக்கூடும்.</translation> +<translation id="3312883087018430408">குறிப்பிட்ட தளம் அல்லது Chrome பகுதியில் தேட, முகவரிப் பட்டியில் ஷார்ட்கட்டை டைப் செய்தபிறகு உங்களுக்கு விருப்பமான கீபோர்டு ஷார்ட்கட்டை டைப் செய்யவும். உதாரணத்திற்கு, புக்மார்க்குகளை மட்டும் தேட, "@bookmarks" என்று டைப் செய்தபிறகு Tab அல்லது Space பட்டனை அழுத்தவும்.</translation> <translation id="3313622045786997898">சான்றிதழ் கையொப்ப மதிப்பு</translation> <translation id="3313950410573257029">இணைப்பைச் சரிபாருங்கள்</translation> <translation id="3315158641124845231"><ph name="PRODUCT_NAME" /> ஐ மறை</translation> @@ -2688,6 +2697,7 @@ <translation id="3747077776423672805">ஆப்ஸை அகற்ற, 'அமைப்புகள் > Google Play Store > Android விருப்பத்தேர்வுகளை நிர்வகி > ஆப்ஸ் அல்லது ஆப்ஸ் நிர்வாகி’ என்பதற்குச் செல்லவும். அதில், நிறுவல் நீக்க விரும்பும் ஆப்ஸைத் தட்டவும் (ஆப்ஸைக் கண்டறிய வலப்புறம் அல்லது இடப்புறம் ஸ்வைப் செய்ய வேண்டியிருக்கலாம்). பின்னர், ‘நிறுவல் நீக்கு’ அல்லது ‘முடக்கு’ என்பதைத் தட்டவும்.</translation> <translation id="3747220812138541072">டைப் செய்யும்போது சொல் பரிந்துரைகளைக் காட்டும்</translation> <translation id="3748706263662799310">பிழையைப் புகாரளி</translation> +<translation id="3750562496035670393">உங்கள் கடவுச்சொல்லை இந்தச் சாதனத்தில் Chrome சேமித்துள்ளது, இதற்குப் பதிலாக உங்கள் Google கணக்கில் சேமிக்கலாம். அவ்வாறு சேமித்தால், Google கணக்கில் சேமித்துள்ள அனைத்துக் கடவுச்சொற்களையும் நீங்கள் உள்நுழைந்திருக்கும்போது பயன்படுத்தலாம்.</translation> <translation id="3752253558646317685">கைரேகையைச் சேமிக்க உங்கள் பிள்ளையிடம் விரலை வைத்து வைத்து எடுக்குமாறு கூறவும்</translation> <translation id="3752582316358263300">சரி...</translation> <translation id="3753033997400164841">ஒரு முறை சேமித்து. எங்கும் பயன்படுத்தலாம்</translation> @@ -2794,7 +2804,6 @@ <translation id="3842552989725514455">Serif எழுத்துரு</translation> <translation id="3843464315703645664">உலாவியில் பயன்படுத்த அனுமதிக்கப்பட்டது</translation> <translation id="3844888638014364087">ஈமோஜி சேர்க்கப்பட்டது</translation> -<translation id="384513009320852920">உங்கள் புளூடூத் சாதனம் இணைத்தல் பயன்முறையிலும் அருகிலும் இருப்பதை உறுதிசெய்துகொள்ளுங்கள். <ph name="BEGIN_LINK_LEARN_MORE" />மேலும் அறிக<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">இணையதளங்கள், Android ஆப்ஸ் மற்றும் பலவற்றை உருவாக்கத் தேவையான கருவிகளைப் பெறுக. Linuxஸை நிறுவ, <ph name="DOWNLOAD_SIZE" /> டேட்டா பயன்படுத்தப்படும்.</translation> <translation id="3847319713229060696">வலையைப் பயன்படுத்தும் அனைவருக்கும் பாதுகாப்பை மேம்படுத்த உதவுங்கள்</translation> <translation id="3848547754896969219">&மறைநிலைச் சாளரத்தில் திற</translation> @@ -3129,6 +3138,7 @@ <translation id="4194570336751258953">கிளிக்குக்கு தட்டுவதை இயக்கு</translation> <translation id="4195643157523330669">புதிய தாவலில் திற</translation> <translation id="4195814663415092787">நான் விட்ட இடத்திலிருந்து தொடங்கு</translation> +<translation id="4198268995694216131">கூடுதல் தளங்கள்</translation> <translation id="4200689466366162458">பிரத்தியேக சொற்கள்</translation> <translation id="4200983522494130825">புதிய &தாவல்</translation> <translation id="4201546031411513170">எவற்றை ஒத்திசைக்க வேண்டும் என்பதை அமைப்புகளில் எப்போது வேண்டுமானாலும் தேர்வுசெய்யலாம்.</translation> @@ -3250,6 +3260,7 @@ <translation id="4341577178275615435">சுட்டி உலாவலை இயக்கவோ முடக்கவோ ‘F7’ என்ற ஷார்ட்கட் விசையைப் பயன்படுத்தவும்</translation> <translation id="4341905082470253054">TPM நிலையைச் சரிபார்க்கிறது...</translation> <translation id="434198521554309404">வேகமானது. பாதுகாப்பானது. எளிதானது.</translation> +<translation id="4343250402091037179">குறிப்பிட்ட தளம் அல்லது Chrome பகுதியில் தேட, முகவரிப் பட்டியில் ஷார்ட்கட்டை டைப் செய்தபிறகு உங்களுக்கு விருப்பமான கீபோர்டு ஷார்ட்கட்டை டைப் செய்யவும்.</translation> <translation id="434404122609091467">உங்களின் தற்போதைய சேவை வழங்குநருடன்</translation> <translation id="4345587454538109430">உள்ளமை...</translation> <translation id="4345732373643853732">பயனர் பெயர் சேவையகத்தில் இல்லை</translation> @@ -4002,6 +4013,7 @@ <translation id="5153234146675181447">ஃபோனை அகற்றும்</translation> <translation id="5154108062446123722"><ph name="PRINTING_DESTINATION" /> க்கான மேம்பட்ட அமைப்புகள்</translation> <translation id="5154702632169343078">பொருள்</translation> +<translation id="5155327081870541046">தேட விரும்பும் தளத்திற்கான ஷார்ட்கட்டை முகவரிப் பட்டியில் டைப் செய்யவும் (எ.கா. "@bookmarks"). அதன்பிறகு உங்களுக்கு விருப்பமான கீபோர்டு ஷார்ட்கட்டை அழுத்தி தேடல் வார்த்தையை டைப் செய்யவும்.</translation> <translation id="5157635116769074044">தொடக்கத் திரையில் இந்தப் பக்கத்தைப் பொருத்து...</translation> <translation id="5159094275429367735">Crostiniயை அமைத்திடுங்கள்</translation> <translation id="5159419673777902220">நீட்டிப்புக்கான அனுமதிகளை உங்கள் பெற்றோர் முடக்கியுள்ளார்</translation> @@ -4303,7 +4315,6 @@ <translation id="5485102783864353244">பயன்பாட்டைச் சேர்</translation> <translation id="5485754497697573575">அனைத்து தாவல்களையும் மீட்டமை</translation> <translation id="5486261815000869482">கடவுச்சொல்லை உறுதிசெய்க</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" />, உங்கள் திரையை <ph name="TAB_NAME" /> உடன் பகிர்கிறது.</translation> <translation id="5486561344817861625">உலாவி மறுதொடக்கத்தை உருவகப்படுத்து</translation> <translation id="5487460042548760727">சுயவிவரத்தின் பெயரை <ph name="PROFILE_NAME" /> என மாற்றும்</translation> <translation id="5487521232677179737">தரவை அழி</translation> @@ -4365,6 +4376,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> பின்வருவனவற்றைச் செய்ய விரும்புகிறது:</translation> <translation id="5534304873398226603">படம் அல்லது வீடியோவை நிராகரி</translation> <translation id="5535941515421698170">அத்துடன், தற்போதுள்ள தரவையும் இந்தச் சாதனத்திலிருந்து அகற்று</translation> +<translation id="5537725057119320332">அலைபரப்பு</translation> <translation id="5539221284352502426">சேவையகம் நீங்கள் உள்ளிட்ட கடவுச்சொல்லை நிராகரித்தது. நிராகரிப்பிற்கான சாத்தியமான காரணங்கள்: கடவுச்சொல் மிகச் சிறியது. கடவுச்சொல்லில் எண்கள் அல்லது குறியீடுகள் இருக்க வேண்டும். முந்தைய கடவுச்சொற்களிலிருந்து தற்போதைய கடவுச்சொல் வேறுபட்டு இருக்க வேண்டும்.</translation> <translation id="5541694225089836610">செயல்பாட்டை நிர்வாகி முடக்கியுள்ளார்</translation> <translation id="5542132724887566711">சுயவிவரம்</translation> @@ -4596,6 +4608,7 @@ <translation id="5787146423283493983">விசை ஒப்பந்தம்</translation> <translation id="5787420647064736989">சாதனத்தின் பெயர்</translation> <translation id="5788367137662787332"><ph name="DEVICE_LABEL" /> சாதனத்தில் குறைந்தபட்சம் ஒரு பிரிவினை இருந்தாலும் அதை ஏற்ற முடியாது. மன்னிக்கவும்.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">வெற்றி</translation> <translation id="5790651917470750848">போர்ட் அனுப்புதல் ஏற்கெனவே உள்ளது</translation> <translation id="5792728279623964091">பவர் பட்டனைத் தட்டவும்</translation> @@ -4621,6 +4634,7 @@ <translation id="5816434091619127343">கோரிய பிரிண்டர் மாற்றங்கள், அதைப் பயன்படுத்த முடியாததாக மாற்றும்.</translation> <translation id="5817069030404929329">இந்தச் சாதனத்திலிருந்து உங்கள் Google கணக்கிற்குக் கடவுச்சொற்களை நகர்த்தவா?</translation> <translation id="5817918615728894473">இணை</translation> +<translation id="581840385858998009">வால்பேப்பர், தோற்றம், ஸ்கிரீன் சேவர், மேலும் பலவற்றைப் பிரத்தியேகமாக்கலாம்</translation> <translation id="5821565227679781414">ஷார்ட்கட்டை உருவாக்கு</translation> <translation id="5822095611691580107">இடதுபக்க பட் பேட்டரி நிலை <ph name="BATTERY_PERCENTAGE" />%.</translation> <translation id="5825412242012995131">ஆன் (பரிந்துரைக்கப்படுகிறது)</translation> @@ -4827,10 +4841,8 @@ <ph name="BEGIN_PARAGRAPH2" />உங்கள் சாதனத்தில் முதன்மை இருப்பிட அமைப்பை முடக்குவதன் மூலம் ‘இருப்பிடச் சேவையை’ முடக்கலாம். இருப்பிடத்திற்கு வைஃபை, மொபைல் நெட்வொர்க்குகள் மற்றும் சென்சார்களைப் பயன்படுத்துவதையும் இருப்பிட அமைப்புகளில் முடக்கலாம்.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">முழுத்திரையிலிருந்து வெளியேறு</translation> <translation id="6042308850641462728">மேலும்</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> உடன் Chrome தாவலைப் பகிர்கிறது.</translation> <translation id="604388835206766544">உள்ளமைவைப் பாகுபடுத்த முடியவில்லை</translation> <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="6049797270917061226">தீங்கிழைப்பவர்கள் உங்கள் தனிப்பட்ட தகவல்களைத் திருட இந்த ஃபைல் அனுமதிக்கக்கூடும்.</translation> @@ -4910,6 +4922,7 @@ <translation id="6116921718742659598">மொழி மற்றும் உள்ளீட்டு அமைப்புகளை மாற்றவும்</translation> <translation id="6119927814891883061"><ph name="DEVICE_NAME" /> எனச் சாதனத்திற்குப் பெயரிடும்</translation> <translation id="6120205520491252677">தொடக்கத் திரையில் இந்தப் பக்கத்தைப் பொருத்து...</translation> +<translation id="6121773125605585883"><ph name="WEBSITE" /> தளத்திற்காக <ph name="USERNAME" /> எனும் பயனர் பெயருடன் சேமிக்கப்பட்டுள்ள கடவுச்சொல்லைக் காட்டும்</translation> <translation id="6122081475643980456">உங்கள் இணைய இணைப்பு கட்டுப்படுத்தப்படுகிறது</translation> <translation id="6122093587541546701">மின்னஞ்சல் (விரும்பினால்):</translation> <translation id="6122095009389448667">இந்தத் தளம், கிளிப்போர்டைப் பார்ப்பதைத் தொடர்ந்து தடைசெய்</translation> @@ -4986,6 +4999,7 @@ <translation id="6208725777148613371"><ph name="WEB_DRIVE" /> இல் சேமிக்க முடியவில்லை - <ph name="INTERRUPT_REASON" /></translation> <translation id="6209838773933913227">காம்பனென்ட் புதுப்பிப்பு</translation> <translation id="6209908325007204267">உங்கள் சாதனம் Chrome எண்டர்பிரைஸ் மேம்படுத்தலை உள்ளடக்கியதாகும், ஆனால் நிறுவனக் கணக்கு ஒன்றுடன் உங்கள் பயனர்பெயர் தொடர்புடையதாக இல்லை. வேறு சாதனத்தில் g.co/ChromeEnterpriseAccount என்பதற்குச் சென்று நிறுவனக் கணக்கு ஒன்றை உருவாக்கவும்.</translation> +<translation id="6210282067670792090">தேடல் இன்ஜின்கள் & தளத் தேடல்களுக்கான ஷார்ட்கட்களுடன் முகவரிப்பட்டியில் இந்தக் கீபோர்டு ஷார்ட்கட்டைப் பயன்படுத்தவும்</translation> <translation id="621172521139737651">{COUNT,plural, =0{எல்லாவற்றையும் &புதிய பிரிவுக் குழுவில் திற}=1{&புதிய பிரிவுக் குழுவில் திற}other{எல்லாவற்றையும் ({COUNT}) &புதிய பிரிவுக் குழுவில் திற}}</translation> <translation id="6212039847102026977">மேம்பட்ட நெட்வொர்க் பண்புகளைக் காட்டு</translation> <translation id="6212168817037875041">திரையை அணை</translation> @@ -5469,6 +5483,7 @@ <translation id="6709357832553498500"><ph name="EXTENSIONNAME" />ஐப் பயன்படுத்தி இணை</translation> <translation id="6710213216561001401">முந்தையது</translation> <translation id="6711146141291425900">பதிவிறக்க, <ph name="WEB_DRIVE" /> கணக்கை இணைக்கவும்</translation> +<translation id="6712943853047024245"><ph name="WEBSITE" /> தளத்திற்கு இந்தப் பயனர்பெயரில் ஏற்கெனவே ஒரு கடவுச்சொல்லைச் சேமித்துள்ளீர்கள்</translation> <translation id="6713233729292711163">பணிக் கணக்கைச் சேர்</translation> <translation id="6715803357256707211">உங்கள் Linux ஆப்ஸை நிறுவும்போது பிழை நேர்ந்தது. விவரங்களைப் பார்க்க அறிவிப்பைக் கிளிக் செய்யவும்.</translation> <translation id="671619610707606484">தளங்கள் சேமித்த <ph name="TOTAL_USAGE" /> தரவை இது அழிக்கும்</translation> @@ -6094,6 +6109,7 @@ <translation id="7385854874724088939">அச்சிட முயற்சித்தபோது, ஏதோ தவறு ஏற்பட்டது. உங்கள் பிரிண்டரைச் சரிபார்த்து மீண்டும் முயற்சி செய்க.</translation> <translation id="7385896526023870365">இந்த நீட்டிப்புக்குக் கூடுதல் தள அணுகல் இல்லை.</translation> <translation id="7387273928653486359">சுமாரானது</translation> +<translation id="7387951778417998929">இயல்புத் தேடல் இன்ஜினைத் தவிர்த்து வேறொன்றைப் பயன்படுத்த, அதன் ஷார்ட்கட்டை முகவரிப் பட்டியில் டைப் செய்தபிறகு உங்களுக்கு விருப்பமான கீபோர்டு ஷார்ட்கட்டை டைப் செய்யவும். இயல்புத் தேடல் இன்ஜினையும் இங்கே மாற்றலாம்.</translation> <translation id="7388209873137778229">ஆதரிக்கப்படும் சாதனங்கள் மட்டும் காட்டப்படுகின்றன.</translation> <translation id="7392118418926456391">வைரஸ் ஸ்கேன் தோல்வி</translation> <translation id="7392915005464253525">மூடப்பட்ட சாளரத்தை மீ&ண்டும் திற</translation> @@ -6271,6 +6287,7 @@ <translation id="7559719679815339381">காத்திருக்கவும்....கியாஸ்க் ஆப்ஸ் புதுப்பிக்கப்படுகிறது. USB சாதனத்தை அகற்றாதீர்கள்.</translation> <translation id="7560756177962144929"><ph name="DEVICE_TYPE" /> சாதனத்தை ஒத்திசைத்தல்</translation> <translation id="7561196759112975576">எப்போதும்</translation> +<translation id="7562099761826673163">சாதனத்தைப் பிரத்தியேகமாக்குங்கள்</translation> <translation id="756445078718366910">உலாவி சாளரத்தைத் திற</translation> <translation id="7564847347806291057">செயலாக்கத்தை முடி</translation> <translation id="756503097602602175">உள்நுழைந்துள்ள Google கணக்குகளை <ph name="LINK_BEGIN" />அமைப்புகளில்<ph name="LINK_END" /> நிர்வகிக்கலாம். இணையதளங்களுக்கும் ஆப்ஸுக்கும் நீங்கள் வழங்கிய அனுமதிகள் அனைத்துக் கணக்குகளுக்கும் பொருந்தக்கூடும். உங்கள் கணக்குத் தகவலைத் தளங்களோ ஆப்ஸோ அணுக வேண்டாம் என நீங்கள் விரும்பினால் <ph name="DEVICE_TYPE" /> சாதனத்தில் நீங்கள் கெஸ்டாக உள்நுழையலாம் அல்லது இணையத்தில் <ph name="LINK_2_BEGIN" />மறைநிலைச் சாளரத்தில்<ph name="LINK_2_END" /> உலாவலாம்.</translation> @@ -6588,6 +6605,7 @@ <translation id="78526636422538552">கூடுதல் Google கணக்குகளைச் சேர்ப்பது முடக்கப்பட்டுள்ளது</translation> <translation id="7853747251428735">மேலும் கருவி&கள்</translation> <translation id="7855678561139483478">தாவலை புதிய சாளரத்திற்கு நகர்த்து</translation> +<translation id="7856654138655787862">Chrome OS பிழை கண்டறிதல் சோதனைகளைச் செய்தல்.</translation> <translation id="7857093393627376423">சொல் பரிந்துரைகள்</translation> <translation id="7857949311770343000">இந்தப் புதிய தாவல் பக்கத்தைத்தான் எதிர்பார்த்தீர்களா?</translation> <translation id="7858328180167661092"><ph name="APP_NAME" /> (Windows)</translation> @@ -7237,6 +7255,7 @@ <translation id="8551588720239073785">தேதி & நேர அமைப்புகள்</translation> <translation id="8553342806078037065">பிற பயனர்களை நிர்வகி</translation> <translation id="8554899698005018844">மொழி இல்லை</translation> +<translation id="855604308879080518">இந்த Chromebookகில் உள்ள USB சாதனங்களை Android ஆப்ஸ் பயன்படுத்த அனுமதியுங்கள். USB சாதனத்தை ஒவ்வொரு முறை நீங்கள் செருகும்போதும் அனுமதி கேட்கப்படும். தனிப்பட்ட முறையில் Android ஆப்ஸ் ஒவ்வொன்றும் கூடுதல் அனுமதிகளைக் கேட்கும்.</translation> <translation id="8557022314818157177">உங்கள் கைரேகையைப் பதிவுசெய்யும் வரை உங்கள் பாதுகாப்பு விசையைத் தொடர்ந்து அழுத்தவும்</translation> <translation id="8557180006508471423">Mac சாதனத்தில் இருப்பிடச் சேவைகள் அமைப்பில் "Google Chrome" உலாவிக்கு இருப்பிடச் சேவையை இயக்கவும்</translation> <translation id="8560327176991673955">{COUNT,plural, =0{எல்லாவற்றையும் &புதிய சாளரத்தில் திற}=1{&புதிய சாளரத்தில் திற}other{எல்லாவற்றையும் ({COUNT}) &புதிய சாளரத்தில் திற}}</translation> @@ -7327,7 +7346,6 @@ <translation id="8655295600908251630">சேனல்</translation> <translation id="8655972064210167941">உங்கள் கடவுச்சொல்லைச் சரிபார்க்க முடியாததால் உள்நுழைவு தோல்வியானது. உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும் அல்லது மீண்டும் முயலவும்.</translation> <translation id="8657393004602556571">கருத்தை நீக்க விரும்புகிறீர்களா?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> உடன் உங்கள் திரையையும் ஆடியோவையும் பகிர்கிறது.</translation> <translation id="8661290697478713397">மறை&நிலை சாளரத்தில் இணைப்பைத் திற</translation> <translation id="8662671328352114214"><ph name="TYPE" /> நெட்வொர்க்கில் சேர்தல்</translation> <translation id="8662733268723715832">எதிர்பார்த்ததைவிட அதிக நேரம் ஆகிறது, நீங்கள் இதைத் தவிர்க்கலாம் அல்லது முடியும் வரை காத்திருக்கலாம்.</translation> @@ -7622,7 +7640,6 @@ <translation id="8941173171815156065">'<ph name="PERMISSION" />' அனுமதியை அகற்று</translation> <translation id="894360074127026135">Netscape சர்வதேச மேம்படுத்தல்</translation> <translation id="8944099748578356325">பேட்டரியை அதிகமாகப் பயன்படுத்தும் (தற்போது <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> உடன் சாளரத்தைப் பகிர்கிறது.</translation> <translation id="8945274638472141382">ஐகான் அளவு</translation> <translation id="8946359700442089734">இந்த <ph name="IDS_SHORT_PRODUCT_NAME" /> சாதனத்தில் பிழைத் திருத்த அம்சங்கள் முழுமையாக இயக்கப்படவில்லை.</translation> <translation id="894763922177556086">நன்று</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 2868552..d226e623 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -536,6 +536,7 @@ <translation id="1549275686094429035">ARC ఎనేబుల్ చేయబడింది</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> <ph name="VOLUME_NAME" />ని యాక్సెస్ చేయాలనుకుంటోంది. దీని వలన మీ ఫైళ్లు మారవచ్చు లేదా తొలగించబడవచ్చు.</translation> <translation id="1552301827267621511"><ph name="SEARCH_PROVIDER_DOMAIN" />ను ఉపయోగించడానికి "<ph name="EXTENSION_NAME" />" ఎక్స్టెన్షన్ సెర్చ్ను మార్చింది</translation> +<translation id="1552752544932680961">ఎక్స్టెన్షన్ను నిర్వహించండి</translation> <translation id="1553538517812678578">అపరిమిత</translation> <translation id="1555130319947370107">నీలం</translation> <translation id="1556537182262721003">ఎక్స్టెన్షన్ డైరెక్టరీని ప్రొఫైల్ లోపలికి తరలించలేకపోయింది.</translation> @@ -2802,7 +2803,6 @@ <translation id="3842552989725514455">Serif ఫాంట్</translation> <translation id="3843464315703645664">ఇంటర్నల్గా వైట్లిస్ట్ చేయబడింది</translation> <translation id="3844888638014364087">ఎమోజి చొప్పించబడింది</translation> -<translation id="384513009320852920">మీ బ్లూటూత్ పరికరం పెయిరింగ్ మోడ్లో ఉందని, ఇంకా సమీపంలో ఉందని నిర్ధారించుకోండి. <ph name="BEGIN_LINK_LEARN_MORE" />మరింత తెలుసుకోండి<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">వెబ్సైట్లు, Android యాప్లు మరియు మరిన్నింటిని అభివృద్ధి చేయడానికి సాధనాలను పొందండి. Linuxను ఇన్స్టాల్ చేయడం ద్వారా <ph name="DOWNLOAD_SIZE" /> డేటా డౌన్లోడ్ అవుతుంది.</translation> <translation id="3847319713229060696">వెబ్లో ప్రతిఒక్కరికీ భద్రతను మెరుగుపరచడంలో సహాయపడండి</translation> <translation id="3848547754896969219">&అజ్ఞాత విండోలో తెరువు</translation> @@ -4314,7 +4314,6 @@ <translation id="5485102783864353244">యాప్ను జోడించు</translation> <translation id="5485754497697573575">అన్ని ట్యాబ్లను పునరుద్ధరించు</translation> <translation id="5486261815000869482">పాస్వర్డ్ని నిర్ధారించండి</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> మీ స్క్రీన్ను <ph name="TAB_NAME" />తో భాగస్వామ్యం చేస్తోంది.</translation> <translation id="5486561344817861625">బ్రౌజర్ పునఃప్రారంభాన్ని ప్రారంభించండి</translation> <translation id="5487460042548760727"><ph name="PROFILE_NAME" />కు ప్రొఫైల్ పేరుమార్చండి</translation> <translation id="5487521232677179737">డేటాని తీసివేయి</translation> @@ -4376,6 +4375,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> వీటిని చేయాలనుకుంటోంది</translation> <translation id="5534304873398226603">ఫోటో లేదా వీడియోను విస్మరించు</translation> <translation id="5535941515421698170">అలాగే ఈ పరికరం నుండి ఇప్పటికే ఉన్న మీ డేటాను తీసివేయండి</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">మీరు నమోదు చేసిన పాస్వర్డ్ను సర్వర్ తిరస్కరించింది. సంభావ్య కారణాలు: పాస్వర్డ్ చాలా చిన్నదిగా ఉంది. పాస్వర్డ్ తప్పనిసరిగా సంఖ్యలు లేదా గుర్తులను కలిగి ఉండాలి. మునుపు ఉపయోగించిన పాస్వర్డ్లలో దేనినీ తిరిగి ఉపయోగించకూడదు.</translation> <translation id="5541694225089836610">మీ నిర్వాహకుల ద్వారా చర్య నిలిపివేయబడింది</translation> <translation id="5542132724887566711">ప్రొఫైల్</translation> @@ -4606,6 +4606,7 @@ <translation id="5787146423283493983">కీ ఒప్పందాలు</translation> <translation id="5787420647064736989">పరికరం పేరు</translation> <translation id="5788367137662787332">క్షమించండి, పరికరం <ph name="DEVICE_LABEL" /> లో కనీసం ఒక విభజన కూడా ఉంచబడదు.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">విజయవంతం</translation> <translation id="5790651917470750848">పోర్ట్ ఫార్వర్డ్ ఇప్పటికే ఉంది</translation> <translation id="5792728279623964091">దయచేసి మీ పవర్ బటన్పై నొక్కండి</translation> @@ -4838,10 +4839,8 @@ <ph name="BEGIN_PARAGRAPH2" />మీరు మీ పరికరంలో ప్రధాన స్థాన సెట్టింగ్ని ఆఫ్ చేయడం ద్వారా స్థానాన్ని ఆఫ్ చేయవచ్చు. మీరు స్థాన సెట్టింగ్లలో స్థానం కోసం Wi‑Fi, మొబైల్ నెట్వర్క్లు మరియు సెన్సార్ల వినియోగాన్ని కూడా ఆఫ్ చేయవచ్చు.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">పూర్తి స్క్రీన్ నుండి నిష్క్రమించు</translation> <translation id="6042308850641462728">మరింత చూపించు</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> ఒక Chrome ట్యాబ్ను <ph name="TAB_NAME" />తో భాగస్వామ్యం చేస్తోంది.</translation> <translation id="604388835206766544">కాన్ఫిగరేషన్ అన్వయింపు విఫలమైంది</translation> <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="6049797270917061226">ఈ ఫైల్ మీ వ్యక్తిగత సమాచారాన్ని దొంగింలించేందుకు దాడులకు పాల్పడే వారిని అనుమతించవచ్చు.</translation> @@ -7341,7 +7340,6 @@ <translation id="8655295600908251630">ఛానల్</translation> <translation id="8655972064210167941">మీ పాస్వర్డ్ను ధృవీకరించలేకపోయినందున సైన్-ఇన్ విఫలమైంది. దయచేసి మీ నిర్వాహకుడిని సంప్రదించండి లేదా మళ్లీ ప్రయత్నించండి.</translation> <translation id="8657393004602556571">మీరు ఫీడ్బ్యాక్ను విస్మరించాలనుకుంటున్నారా?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> మీ స్క్రీన్ మరియు ఆడియోను <ph name="TAB_NAME" />తో భాగస్వామ్యం చేస్తోంది.</translation> <translation id="8661290697478713397">అజ్ఞా&త విండోలో లింక్ను తెరువు</translation> <translation id="8662671328352114214"><ph name="TYPE" /> నెట్వర్క్లో చేరండి</translation> <translation id="8662733268723715832">దీనికి ఊహించిన దాని కంటే ఎక్కువ సమయం పడుతోంది, అందుచేత మీరు స్కిప్ చేయవచ్చు లేదా ఇది పూర్తి అయ్యేవరకు వేచి ఉండవచ్చు.</translation> @@ -7636,7 +7634,6 @@ <translation id="8941173171815156065">'<ph name="PERMISSION" />' అనుమతిని ఉపసంహరించు</translation> <translation id="894360074127026135">Netscape అంతర్జాతీయ స్టెప్-అప్</translation> <translation id="8944099748578356325">బ్యాటరీని మరింత వేగంగా ఉపయోగిస్తుంది (ప్రస్తుతం <ph name="BATTERY_PERCENTAGE" />% ఉంది)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> ఒక విండోను <ph name="TAB_NAME" />తో షేర్ చేస్తోంది.</translation> <translation id="8945274638472141382">చిహ్నం పరిమాణం</translation> <translation id="8946359700442089734">డీబగ్గింగ్ ఫీచర్లు ఈ <ph name="IDS_SHORT_PRODUCT_NAME" /> పరికరంలో పూర్తిగా ప్రారంభించబడలేదు.</translation> <translation id="894763922177556086">బాగుంది</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 9f62e59..c6aa84e64 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -531,6 +531,7 @@ <translation id="1549275686094429035">ARC เปิดใช้งานอยู่</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> ต้องการเข้าถึง <ph name="VOLUME_NAME" /> แอปอาจแก้ไขหรือลบไฟล์ของคุณได้</translation> <translation id="1552301827267621511">ส่วนขยาย "<ph name="EXTENSION_NAME" />" เปลี่ยนไปใช้การค้นหาโดย <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">จัดการส่วนขยาย</translation> <translation id="1553538517812678578">ไม่จำกัด</translation> <translation id="1555130319947370107">สีน้ำเงิน</translation> <translation id="1556537182262721003">ไม่สามารถย้ายไดเรกทอรีส่วนขยายเข้าไปในโปรไฟล์</translation> @@ -2778,7 +2779,6 @@ <translation id="3842552989725514455">แบบอักษร Serif</translation> <translation id="3843464315703645664">เป็นรายการที่อนุญาตภายใน</translation> <translation id="3844888638014364087">แทรกอีโมจิแล้ว</translation> -<translation id="384513009320852920">โปรดตรวจสอบว่าอุปกรณ์บลูทูธอยู่ในโหมดการจับคู่และอยู่ใกล้ <ph name="BEGIN_LINK_LEARN_MORE" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">รับเครื่องมือสำหรับพัฒนาเว็บไซต์, แอป Android และอื่นๆ การติดตั้ง Linux จะดาวน์โหลดข้อมูลขนาด <ph name="DOWNLOAD_SIZE" /></translation> <translation id="3847319713229060696">ช่วยปรับปรุงความปลอดภัยในอินเทอร์เน็ตให้กับทุกคน</translation> <translation id="3848547754896969219">เปิดใน&หน้าต่างที่ไม่ระบุตัวตน</translation> @@ -4286,7 +4286,6 @@ <translation id="5485102783864353244">เพิ่มแอป</translation> <translation id="5485754497697573575">คืนค่าแท็บทั้งหมด</translation> <translation id="5486261815000869482">ยืนยันรหัสผ่าน</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> กำลังแชร์หน้าจอของคุณกับ <ph name="TAB_NAME" /></translation> <translation id="5486561344817861625">จำลองการรีสตาร์ทเบราว์เซอร์</translation> <translation id="5487460042548760727">เปลี่ยนชื่อโปรไฟล์เป็น <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">ล้างข้อมูล</translation> @@ -4348,6 +4347,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ต้องการที่จะ</translation> <translation id="5534304873398226603">ทิ้งรูปภาพหรือวิดีโอ</translation> <translation id="5535941515421698170">นำข้อมูลที่มีอยู่ของคุณออกจากอุปกรณ์นี้ด้วย</translation> +<translation id="5537725057119320332">แคสต์</translation> <translation id="5539221284352502426">เซิร์ฟเวอร์ปฏิเสธรหัสผ่านที่คุณป้อน สาเหตุที่เป็นไปได้คือรหัสผ่านสั้นเกินไป ทั้งนี้รหัสผ่านต้องมีตัวเลขหรือสัญลักษณ์อยู่ด้วย และต้องแตกต่างจากรหัสผ่านที่เคยใช้</translation> <translation id="5541694225089836610">ผู้ดูแลระบบของคุณปิดการทำงาน</translation> <translation id="5542132724887566711">โปรไฟล์</translation> @@ -4578,6 +4578,7 @@ <translation id="5787146423283493983">ข้อตกลงเกี่ยวกับคีย์</translation> <translation id="5787420647064736989">ชื่ออุปกรณ์</translation> <translation id="5788367137662787332">ขออภัย ไม่สามารถติดตั้งอย่างน้อยหนึ่งพาร์ทิชันลงในอุปกรณ์ <ph name="DEVICE_LABEL" /> ได้</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">สำเร็จ</translation> <translation id="5790651917470750848">มีการส่งต่อพอร์ตอยู่แล้ว</translation> <translation id="5792728279623964091">โปรดแตะปุ่มเปิด/ปิด</translation> @@ -4809,10 +4810,8 @@ <ph name="BEGIN_PARAGRAPH2" />คุณปิดตำแหน่งได้โดยปิดการตั้งค่าตำแหน่งหลักในอุปกรณ์ และปิดการใช้ Wi‑Fi, เครือข่ายมือถือ และเซ็นเซอร์สำหรับการบอกตำแหน่งในการตั้งค่าตำแหน่งได้ด้วย<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">ออกจากโหมดเต็มหน้าจอ</translation> <translation id="6042308850641462728">แสดงเพิ่ม</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> กำลังแชร์แท็บใน Chrome กับ <ph name="TAB_NAME" /></translation> <translation id="604388835206766544">แยกวิเคราะห์ค่ากำหนดไม่สำเร็จ</translation> <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="6049797270917061226">ไฟล์นี้อาจปล่อยให้ผู้โจมตีขโมยข้อมูลส่วนบุคคลของคุณได้</translation> @@ -7307,7 +7306,6 @@ <translation id="8655295600908251630">ช่องทาง</translation> <translation id="8655972064210167941">การลงชื่อเข้าใช้ล้มเหลวเนื่องจากไม่สามารถยืนยันรหัสผ่านได้ โปรดติดต่อผู้ดูแลระบบของคุณหรือลองอีกครั้ง</translation> <translation id="8657393004602556571">ต้องการทิ้งความคิดเห็นใช่ไหม</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> กำลังแชร์หน้าจอและเสียงของคุณกับ <ph name="TAB_NAME" /></translation> <translation id="8661290697478713397">เปิดลิงก์ในหน้าต่าง&ที่ไม่ระบุตัวตน</translation> <translation id="8662671328352114214">เข้าร่วมเครือข่าย <ph name="TYPE" /></translation> <translation id="8662733268723715832">การดำเนินการนี้ใช้เวลานานกว่าที่คาดไว้ คุณจะข้ามไปก่อนหรือรอให้ดำเนินการเสร็จก็ได้</translation> @@ -7602,7 +7600,6 @@ <translation id="8941173171815156065">เพิกถอนสิทธิ์ "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">ใช้แบตเตอรี่หมดเร็วขึ้น (ขณะนี้อยู่ที่ <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> กำลังแชร์หน้าต่างกับ <ph name="TAB_NAME" /></translation> <translation id="8945274638472141382">ขนาดไอคอน</translation> <translation id="8946359700442089734">ไม่ได้เปิดใช้ฟีเจอร์การแก้ไขข้อบกพร่องอย่างสมบูรณ์บนอุปกรณ์ <ph name="IDS_SHORT_PRODUCT_NAME" /> นี้</translation> <translation id="894763922177556086">ดี</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index c7c38aaa..2d4073f 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -161,6 +161,7 @@ <translation id="1153356358378277386">Eşlenen cihazlar</translation> <translation id="1153636665119721804">Google Gelişmiş Koruma Programı</translation> <translation id="1155816283571436363">Telefonunuza bağlanılıyor</translation> +<translation id="1158080958325422608">Büyük Harf Yap</translation> <translation id="1158238185437008462">Anıları gör</translation> <translation id="1161575384898972166">Lütfen istemci sertifikasını dışa aktarmak için <ph name="TOKEN_NAME" /> cihazında oturum açın.</translation> <translation id="116173250649946226">Yöneticiniz, değiştirilemeyen bir varsayılan tema ayarladı.</translation> @@ -530,6 +531,7 @@ <translation id="1549275686094429035">ARC Etkinleştirildi</translation> <translation id="1549788673239553762"><ph name="APP_NAME" />, <ph name="VOLUME_NAME" /> birimine erişmek istiyor. Uygulama, dosyalarınızı değiştirebilir veya silebilir.</translation> <translation id="1552301827267621511">"<ph name="EXTENSION_NAME" />" uzantısı, <ph name="SEARCH_PROVIDER_DOMAIN" /> alan adını kullanacak şekilde aramayı değiştirdi.</translation> +<translation id="1552752544932680961">Uzantıyı yönet</translation> <translation id="1553538517812678578">sınırsız</translation> <translation id="1555130319947370107">Mavi</translation> <translation id="1556537182262721003">Uzantı dizini profile taşınamadı.</translation> @@ -692,6 +694,7 @@ <translation id="1700079447639026019">Hiçbir zaman çerez kullanamayan siteler</translation> <translation id="1703331064825191675">Şifreleriniz için hiç kaygılanmayın</translation> <translation id="1703666494654169921">Sitelerin sanal gerçeklik cihazlarını veya verileri kullanmasına izin verme</translation> +<translation id="1704097193565924901">Büyük Harf Kullan</translation> <translation id="1704230497453185209">Sitelerin ses çalmasına izin verme</translation> <translation id="1704970325597567340">Güvenlik kontrolü şu tarihte çalıştırıldı: <ph name="DATE" /></translation> <translation id="1706586824377653884">Yöneticiniz tarafından eklendi</translation> @@ -2775,7 +2778,6 @@ <translation id="3842552989725514455">Serif yazı tipi</translation> <translation id="3843464315703645664">Dahili olarak izin verilenler listesine eklendi</translation> <translation id="3844888638014364087">Emoji eklendi</translation> -<translation id="384513009320852920">Bluetooth cihazınızın eşleme modunda ve yakında olduğundan emin olun. <ph name="BEGIN_LINK_LEARN_MORE" />Daha fazla bilgi<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Web siteleri, Android uygulamaları ve diğer içerikleri geliştirmek için araçlar edinin. Linux'ı yüklediğinizde <ph name="DOWNLOAD_SIZE" /> veri indirilecektir.</translation> <translation id="3847319713229060696">Web'de herkes için güvenliğin iyileştirilmesine yardımcı olun</translation> <translation id="3848547754896969219">&Gizli pencerede aç</translation> @@ -3560,6 +3562,7 @@ <translation id="4681453295291708042">Yakındakilerle Paylaş'ı devre dışı bırak</translation> <translation id="4681930562518940301">Orijinal &resmi yeni sekmede aç</translation> <translation id="4682551433947286597">Duvar kağıtları Oturum Açma Ekranında görüntülenir.</translation> +<translation id="4683629100208651599">Küçük Harf Yap</translation> <translation id="4683947955326903992">%<ph name="PERCENTAGE" /> (varsayılan)</translation> <translation id="4684427112815847243">Her şeyi senkronize et</translation> <translation id="4684471265911890182"><ph name="APP_NAME" />, kameraya erişmeye çalışıyor. Erişime izin vermek için kamera gizliliğini kapatın.</translation> @@ -4282,7 +4285,6 @@ <translation id="5485102783864353244">Uygulama ekle</translation> <translation id="5485754497697573575">Tüm Sekmeleri Kurtar</translation> <translation id="5486261815000869482">Şifreyi onaylayın</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> ekranınızı <ph name="TAB_NAME" /> ile paylaşıyor.</translation> <translation id="5486561344817861625">Tarayıcı Yeniden Başlatmasını Simüle Et</translation> <translation id="5487460042548760727">Profili, <ph name="PROFILE_NAME" /> olarak yeniden adlandır</translation> <translation id="5487521232677179737">Verileri temizle</translation> @@ -4344,6 +4346,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> şunu yapmak istiyor:</translation> <translation id="5534304873398226603">Fotoğraf veya videoyu sil</translation> <translation id="5535941515421698170">Ayrıca, mevcut verilerinizi bu cihazdan kaldırın</translation> +<translation id="5537725057119320332">Yayınla</translation> <translation id="5539221284352502426">Girdiğiniz şifre, sunucu tarafından reddedildi. Bu durumun olası nedenleri şunlardır: Şifre çok kısadır. Şifre, sayılar veya semboller içermelidir. Şifre, önceki şifrelerden farklı olmalıdır.</translation> <translation id="5541694225089836610">İşlem, yöneticiniz tarafından devre dışı bırakıldı</translation> <translation id="5542132724887566711">Profil</translation> @@ -4575,6 +4578,7 @@ <translation id="5787146423283493983">Anahtar Anlaşması</translation> <translation id="5787420647064736989">Cihaz adı</translation> <translation id="5788367137662787332">Maalesef, <ph name="DEVICE_LABEL" /> cihazındaki en az bir bölüm eklenemedi.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Başarılı</translation> <translation id="5790651917470750848">Bağlantı noktası yönlendirme zaten var</translation> <translation id="5792728279623964091">Lütfen cihazınızın güç düğmesine dokunun</translation> @@ -4806,10 +4810,8 @@ <ph name="BEGIN_PARAGRAPH2" />Konum özelliğini, cihazınızın ana Konum ayarını kapatarak devre dışı bırakabilirsiniz. Ayrıca konum ayarlarından kablosuz, mobil ağlar ve konum sensörlerinin kullanılmasını da devre dışı bırakabilirsiniz.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Tam Ekran modundan çık</translation> <translation id="6042308850641462728">Daha fazla</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" />, bir Chrome sekmesini <ph name="TAB_NAME" /> ile paylaşıyor.</translation> <translation id="604388835206766544">Yapılandırma ayrıştırılamadı</translation> <translation id="6043994281159824495">Şimdi çıkış yap</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" />, bir Chrome sekmesini ve sesi <ph name="TAB_NAME" /> ile paylaşıyor.</translation> <translation id="6045114302329202345">Birincil TrackPoint düğmesi</translation> <translation id="6047632800149092791">Senkronizasyon çalışmıyor. Oturumu kapatıp tekrar açmayı deneyin.</translation> <translation id="6049797270917061226">Bu dosya, saldırganların kişisel bilgilerinizi çalmasına neden olabilir.</translation> @@ -5953,6 +5955,7 @@ <translation id="7257173066616499747">Kablosuz ağlar</translation> <translation id="725758059478686223">Yazdırma Hizmeti</translation> <translation id="7257666756905341374">Kopyaladığınız ve yapıştırdığınız verileri okuma</translation> +<translation id="7258192266780953209">Dönüşümler</translation> <translation id="7258225044283673131">Uygulama yanıt vermiyor. Uygulamayı kapatmak için "Uygulamayı kapat"ı seçin.</translation> <translation id="7262004276116528033">Bu oturum açma hizmeti, <ph name="SAML_DOMAIN" /> tarafından barındırılıyor.</translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Aşağıdaki sorun giderme adımlarını deneyin: @@ -7303,7 +7306,6 @@ <translation id="8655295600908251630">Kanal</translation> <translation id="8655972064210167941">Şifreniz doğrulanamadığı için oturum açma işlemi başarısız oldu. Lütfen yöneticinizle iletişime geçin veya tekrar deneyin.</translation> <translation id="8657393004602556571">Geri bildirimi silmek istediğinizden emin misiniz?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" />, ekranınızı ve sesinizi <ph name="TAB_NAME" /> ile paylaşıyor.</translation> <translation id="8661290697478713397">Bağlantıyı Giz&li Pencere'de Aç</translation> <translation id="8662671328352114214"><ph name="TYPE" /> ağına katılın</translation> <translation id="8662733268723715832">Bu işlem beklenenden daha uzun sürüyor. İşlemi atlayabilir veya tamamlanana kadar bekleyebilirsiniz.</translation> @@ -7598,7 +7600,6 @@ <translation id="8941173171815156065">"<ph name="PERMISSION" />" iznini kaldır</translation> <translation id="894360074127026135">Netscape Uluslararası İlerlemesi</translation> <translation id="8944099748578356325">Pili daha çabuk tüketir (şu anda %<ph name="BATTERY_PERCENTAGE" />)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" />, bir pencereyi <ph name="TAB_NAME" /> ile paylaşıyor.</translation> <translation id="8945274638472141382">Simge boyutu</translation> <translation id="8946359700442089734">Hata ayıklama özellikleri bu <ph name="IDS_SHORT_PRODUCT_NAME" /> cihazda tam olarak etkinleştirilmemişti.</translation> <translation id="894763922177556086">İyi</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 14a2a7e..dcf6ce3 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -164,6 +164,7 @@ <translation id="1153636665119721804">Програма додаткового захисту Google</translation> <translation id="1155545602507378023">Ні, лише цей пристрій</translation> <translation id="1155816283571436363">Підключення до телефона</translation> +<translation id="1158080958325422608">Застосувати верхній регістр</translation> <translation id="1158238185437008462">Переглянути спогади</translation> <translation id="1161575384898972166">Увійдіть у <ph name="TOKEN_NAME" />, щоб експортувати сертифікат клієнта.</translation> <translation id="116173250649946226">Адміністратор призначив тему за умовчанням. Її не можна змінювати.</translation> @@ -538,6 +539,7 @@ <translation id="1549275686094429035">ARC ввімкнено</translation> <translation id="1549788673239553762">Додатку <ph name="APP_NAME" /> потрібен доступ до тому <ph name="VOLUME_NAME" />. Він може змінювати або видаляти ваші файли.</translation> <translation id="1552301827267621511">Розширення "<ph name="EXTENSION_NAME" />" змінило пошукову систему на <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Керувати розширенням</translation> <translation id="1553538517812678578">без обмежень</translation> <translation id="1555130319947370107">Синій</translation> <translation id="1556537182262721003">Не вдалося перемістити каталог розширення в профіль.</translation> @@ -700,6 +702,7 @@ <translation id="1700079447639026019">Сайти, які ніколи не можуть використовувати файли cookie</translation> <translation id="1703331064825191675">Не хвилюйтеся про свої паролі</translation> <translation id="1703666494654169921">Заборонити сайтам використовувати пристрої або дані віртуальної реальності</translation> +<translation id="1704097193565924901">Почати з великої літери</translation> <translation id="1704230497453185209">Заборонити сайтам відтворювати звук</translation> <translation id="1704970325597567340">Перевірку безпеки виконано <ph name="DATE" /></translation> <translation id="1706586824377653884">Додано адміністратором</translation> @@ -2804,7 +2807,6 @@ <translation id="3842552989725514455">Шрифт Serif</translation> <translation id="3843464315703645664">Додано в білий список (внутрішньо)</translation> <translation id="3844888638014364087">Вставлено смайл</translation> -<translation id="384513009320852920">Переконайтеся, що пристрій із Bluetooth поруч і на ньому ввімкнено режим підключення. <ph name="BEGIN_LINK_LEARN_MORE" />Докладніше<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Отримайте інструменти для розробки веб-сайтів, додатків Android тощо. Під час встановлення Linux завантажиться <ph name="DOWNLOAD_SIZE" /> даних.</translation> <translation id="3847319713229060696">Допоможіть підвищити безпеку в Інтернеті для кожного</translation> <translation id="3848547754896969219">Відкрити у &вікні в режимі анонімного перегляду</translation> @@ -3592,6 +3594,7 @@ <translation id="4681453295291708042">Вимкнути функцію "Передавання поблизу"</translation> <translation id="4681930562518940301">Відкрити оригінальне зображення в новій вкладці</translation> <translation id="4682551433947286597">Фонові малюнки з’являються на екрані входу.</translation> +<translation id="4683629100208651599">Застосувати нижній регістр</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />% (за умовчанням)</translation> <translation id="4684427112815847243">Синхронізувати все</translation> <translation id="4684471265911890182">Додаток <ph name="APP_NAME" /> намагається отримати доступ до камери. Щоб надати його, вимкніть перемикач конфіденційності камери.</translation> @@ -4315,7 +4318,6 @@ <translation id="5485102783864353244">Установити додаток</translation> <translation id="5485754497697573575">Відновити всі вкладки</translation> <translation id="5486261815000869482">Підтвердьте пароль</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> показує ваш екран із вкладкою "<ph name="TAB_NAME" />".</translation> <translation id="5486561344817861625">Імітувати перезапуск веб-переглядача</translation> <translation id="5487460042548760727">Перейменувати профіль на "<ph name="PROFILE_NAME" />"</translation> <translation id="5487521232677179737">Видалити дані</translation> @@ -4377,6 +4379,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> хоче</translation> <translation id="5534304873398226603">Відхилити фото або відео</translation> <translation id="5535941515421698170">Також вилучити всі дані з цього пристрою</translation> +<translation id="5537725057119320332">Трансляція</translation> <translation id="5539221284352502426">Сервер відхилив введений вами пароль. Можливі причини: пароль закороткий; пароль має містити цифри або символи; пароль має відрізнятися від попередніх.</translation> <translation id="5541694225089836610">Адміністратор вимкнув цю дію</translation> <translation id="5542132724887566711">Профіль</translation> @@ -4607,6 +4610,7 @@ <translation id="5787146423283493983">Угода щодо ключів</translation> <translation id="5787420647064736989">Назва пристрою</translation> <translation id="5788367137662787332">На жаль, підключити принаймні один розділ пристрою <ph name="DEVICE_LABEL" /> неможливо.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Готово</translation> <translation id="5790651917470750848">Така переадресація порту вже існує</translation> <translation id="5792728279623964091">Натисніть кнопку живлення</translation> @@ -4839,10 +4843,8 @@ <ph name="BEGIN_PARAGRAPH2" />Щоб вимкнути її, дезактивуйте основну функцію "Доступ до моїх геоданих". Ви також можете вимкнути визначення місцезнаходження за допомогою Wi-Fi, мобільних мереж і датчиків у меню "Доступ до моїх геоданих".<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Вийти з повноекранного режиму</translation> <translation id="6042308850641462728">Більше</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> транслює вкладку Chrome на вкладку <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Не вдалося виконати синтаксичний аналіз конфігурації</translation> <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="6049797270917061226">Через цей файл зловмисники можуть викрасти вашу особисту інформацію.</translation> @@ -5989,6 +5991,7 @@ <translation id="7257173066616499747">Мережі Wi-Fi</translation> <translation id="725758059478686223">Служба друку</translation> <translation id="7257666756905341374">Читати дані, які ви копіюєте та вставляєте</translation> +<translation id="7258192266780953209">Перетворення</translation> <translation id="7258225044283673131">Додаток не відповідає. Щоб закрити його, виберіть опцію "Примусово закрити".</translation> <translation id="7262004276116528033">Ця служба входу в обліковий запис зареєстрована в домені <ph name="SAML_DOMAIN" /></translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />Для вирішення проблеми виконайте подані нижче дії. @@ -7345,7 +7348,6 @@ <translation id="8655295600908251630">Канал</translation> <translation id="8655972064210167941">Помилка входу. Не вдалося підтвердити ваш пароль. Зв’яжіться з адміністратором або повторіть спробу.</translation> <translation id="8657393004602556571">Не надсилати відгук?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> транслює ваш екран і аудіо на вкладку <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Відкрити посилання в аноні&мному вікні</translation> <translation id="8662671328352114214">Під’єднатися до мережі <ph name="TYPE" /></translation> <translation id="8662733268723715832">Це триває довше, ніж очікувалося. Можете пропустити або зачекати.</translation> @@ -7643,7 +7645,6 @@ <translation id="8941173171815156065">Скасувати дозвіл "<ph name="PERMISSION" />"</translation> <translation id="894360074127026135">Програма підвищення до міжнародного рівня Netscape</translation> <translation id="8944099748578356325">швидше виснажуватиме акумулятор (наразі <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> транслює вікно на вкладку <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Розмір значка</translation> <translation id="8946359700442089734">Функції налагодження не повністю ввімкнено на цьому пристрої <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Хороший сигнал</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 267443a..d5ceff2 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -533,6 +533,7 @@ <translation id="1549275686094429035">ARC فعال ہے</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> <ph name="VOLUME_NAME" /> تک رسائی حاصل کرنا چاہتی ہے۔ یہ آپ کی فائلوں میں ترمیم یا انہیں حذف کر سکتی ہے۔</translation> <translation id="1552301827267621511"><ph name="SEARCH_PROVIDER_DOMAIN" /> کے استعمال کے لیے "<ph name="EXTENSION_NAME" />" ایکسٹینشن نے تلاش کو تبدیل کر دیا</translation> +<translation id="1552752544932680961">ایکسٹینشن کا نظم کریں</translation> <translation id="1553538517812678578">لا محدود</translation> <translation id="1555130319947370107">نیلا</translation> <translation id="1556537182262721003">ایکسٹینشن ڈائرکٹری کو پروفائل میں منتقل نہیں کیا جا سکا۔</translation> @@ -2787,7 +2788,6 @@ <translation id="3842552989725514455">Serif فونٹ</translation> <translation id="3843464315703645664">اندرونی طور پر اجازت یافتہ</translation> <translation id="3844888638014364087">ایموجی داخل کی گئی</translation> -<translation id="384513009320852920">اس بات کو یقینی بنائیں کہ آپ کا بلوٹوتھ آلہ جوڑا بنانے والے موڈ میں اور قریبی ہے۔ <ph name="BEGIN_LINK_LEARN_MORE" />مزید جانیں<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">ویب سائٹس، Android ایپس، اور مزید کو ڈیولپ کرنے والے ٹولز حاصل کریں۔ Linux انسٹال کرنے پر <ph name="DOWNLOAD_SIZE" /> ڈیٹا ڈاؤن لوڈ ہوگا۔</translation> <translation id="3847319713229060696">سبھی کے لیے ویب پر سیکیورٹی کو بہتر بنانے میں مدد کریں</translation> <translation id="3848547754896969219">&پوشیدگی ونڈو میں کھولیں</translation> @@ -4297,7 +4297,6 @@ <translation id="5485102783864353244">ایپ شامل کریں</translation> <translation id="5485754497697573575">سبھی ٹیبز بحال کریں</translation> <translation id="5486261815000869482">پاس ورڈ کی توثیق کریں</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> آپ کی اسکرین کا <ph name="TAB_NAME" /> کے ساتھ اشتراک کر رہی ہے۔</translation> <translation id="5486561344817861625">براؤزر کو دوبارہ شروع کرنے کی نقل کریں</translation> <translation id="5487460042548760727">پروفائل کا نام <ph name="PROFILE_NAME" /> میں تبدیل کریں</translation> <translation id="5487521232677179737">ڈیٹا صاف کریں</translation> @@ -4359,6 +4358,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> چاہتی ہے کہ</translation> <translation id="5534304873398226603">تصویر یا ویڈیو مسترد کریں</translation> <translation id="5535941515421698170">نیز اس آلہ سے اپنا موجودہ ڈیٹا ہٹائیں</translation> +<translation id="5537725057119320332">کاسٹ کریں</translation> <translation id="5539221284352502426">آپ کا درج کردہ پاس ورڈ سرور کی طرف سے مسترد کر دیا گیا۔ ممکنہ وجوہات میں شامل ہیں: پاس ورڈ کافی چھوٹا ہے۔ پاس ورڈ میں نمبرز یا علامتوں کا شامل ہونا ضروری ہے۔ پاس ورڈ کا پرانے پاس ورڈز سے مختلف ہونا ضروری ہے۔</translation> <translation id="5541694225089836610">آپ کے منتظم نے کارروائی کو غیر فعال کر دیا ہے</translation> <translation id="5542132724887566711">پروفائل</translation> @@ -4589,6 +4589,7 @@ <translation id="5787146423283493983">کلیدی اقرارنامہ</translation> <translation id="5787420647064736989">آلہ کا نام</translation> <translation id="5788367137662787332">معذرت، کم از کم ایک حصہ آلہ <ph name="DEVICE_LABEL" /> پر ماؤنٹ نہیں کیا جا سکا۔</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">کامیاب</translation> <translation id="5790651917470750848">پورٹ فارورڈ پہلے سے ہی دستیاب ہے</translation> <translation id="5792728279623964091">براہ کرم اپنے پاور بٹن پر تھپتھپائیں</translation> @@ -4821,10 +4822,8 @@ <ph name="BEGIN_PARAGRAPH2" />آپ اپنے آلہ پر 'مقام' کی مرکزی ترتیب کو آف کر کے 'مقام' کو آف کر سکتے ہیں۔ آپ مقام کی ترتیبات میں مقام کے لیے Wi‑Fi، موبائل نیٹ ورکس اور سینسرز کے استعمال کو بھی آف کر سکتے ہیں۔<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">پوری اسکرین سے باہر نکلیں</translation> <translation id="6042308850641462728">مزید</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> ایک Chrome ٹیب کا <ph name="TAB_NAME" /> کے ساتھ اشتراک کر رہی ہے۔</translation> <translation id="604388835206766544">کنفیگریشن پارس کرنے میں ناکام</translation> <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="6049797270917061226">یہ فائل حملہ آوروں کو آپ کی ذاتی معلومات چوری کرنے کی اجازت دے سکتی ہے۔</translation> @@ -7327,7 +7326,6 @@ <translation id="8655295600908251630">چینل</translation> <translation id="8655972064210167941">سائن ان ناکام ہو گیا کیونکہ آپ کے پاس ورڈز کی توثیق نہيں ہو سکی۔ براہ کرم اپنے منتظم سے رابطہ کریں یا دوبارہ کوشش کریں۔</translation> <translation id="8657393004602556571">کیا آپ تاثرات کو مسترد کرنا چاہتے ہیں؟</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> آپ کی اسکرین اور آڈیو کا <ph name="TAB_NAME" /> کے ساتھ اشتراک کر رہی ہے۔</translation> <translation id="8661290697478713397">لنک پوشید&گی ونڈو میں کھولیں</translation> <translation id="8662671328352114214"><ph name="TYPE" /> نیٹ ورک میں شامل ہوں</translation> <translation id="8662733268723715832">اس میں توقع سے زیادہ وقت لگ رہا ہے، آپ اسے نظر انداز کر سکتے ہیں یا اس کے مکمل ہونے تک انتظار کر سکتے ہیں۔</translation> @@ -7622,7 +7620,6 @@ <translation id="8941173171815156065">اجازت '<ph name="PERMISSION" />' کو کالعدم کریں</translation> <translation id="894360074127026135">Netscape انٹرنیشنل سٹیپ اپ</translation> <translation id="8944099748578356325">مزید تیزی سے بیٹری کا استعمال کریں (فی الحال %<ph name="BATTERY_PERCENTAGE" />)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> ایک ونڈو کا <ph name="TAB_NAME" /> کے ساتھ اشتراک کر رہی ہے۔</translation> <translation id="8945274638472141382">آئیکن کا سائز</translation> <translation id="8946359700442089734">ڈیبگ کرنے کی خصوصیات اس <ph name="IDS_SHORT_PRODUCT_NAME" /> آلے پر مکمل طورپر فعال نہیں کی گئی تھیں۔</translation> <translation id="894763922177556086">اچھا</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 1ae299a..c0523287a 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -531,6 +531,7 @@ <translation id="1549275686094429035">ARC yoniq</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> ilovasi <ph name="VOLUME_NAME" /> bo‘limiga ruxsat so‘rayapti. Bu fayllarni tahrirlash va o‘chirib yuborishi mumkin.</translation> <translation id="1552301827267621511">“<ph name="EXTENSION_NAME" />” kengaytmasi <ph name="SEARCH_PROVIDER_DOMAIN" /> saytini qidiruv tizimi sifatida belgiladi</translation> +<translation id="1552752544932680961">Kengaytmalar boshqaruvi</translation> <translation id="1553538517812678578">cheksiz</translation> <translation id="1555130319947370107">Ko‘k</translation> <translation id="1556537182262721003">Kengaytmalar katalogini profilga ko‘chirib bo‘lmadi.</translation> @@ -2790,7 +2791,6 @@ <translation id="3842552989725514455">Serif shrifti</translation> <translation id="3843464315703645664">Ichki ruxsat etilganlar</translation> <translation id="3844888638014364087">Emoji joylandi</translation> -<translation id="384513009320852920">Bluetooth qurilmasi ulanish rejimida va yaqin-atrofdaligini tekshiring. <ph name="BEGIN_LINK_LEARN_MORE" />Batafsil<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Saytlar, Android ilovalar va boshqa narsalar yaratish vositalariga ruxsat oling. Linuxni o‘rnatishda <ph name="DOWNLOAD_SIZE" /> axborot yuklab olinadi.</translation> <translation id="3847319713229060696">Internetni hamma uchun xavfsiz boʻlishiga yordam berish</translation> <translation id="3848547754896969219">&Inkognito oynasida ochish</translation> @@ -4302,7 +4302,6 @@ <translation id="5485102783864353244">Ilovani o‘rnatish</translation> <translation id="5485754497697573575">Barcha ichki oynalarni qayta tiklash</translation> <translation id="5486261815000869482">Parolni tasdiqlang</translation> -<translation id="5486275809415469523">“<ph name="APP_NAME" />” ilovasi <ph name="TAB_NAME" /> saytiga ekraningizdan foydalanishga ruxsat berdi.</translation> <translation id="5486561344817861625">Brauzerning qayta ishga tushishini simulyatsiyalash</translation> <translation id="5487460042548760727">Profil nomini bunga qayta nomlash: <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Tarixni tozalash</translation> @@ -4364,6 +4363,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> bunday qilmoqchi:</translation> <translation id="5534304873398226603">Fotosurat yoki videoni o‘chirib tashlash</translation> <translation id="5535941515421698170">Bu qurilmadan mavjud ma’lumotlaringizni ham olib tashlang</translation> +<translation id="5537725057119320332">Cast</translation> <translation id="5539221284352502426">Server kiritilgan parolni qabul qilmadi. Unutmangki: Parol juda qisqa, raqamlar va belgilardan iborat va avval ishlatilmagan bo‘lishi zarur.</translation> <translation id="5541694225089836610">Bu amalni administrator faolsizlantirgan</translation> <translation id="5542132724887566711">Profil</translation> @@ -4594,6 +4594,7 @@ <translation id="5787146423283493983">Asosiy kelishuv</translation> <translation id="5787420647064736989">Qurilma nomi</translation> <translation id="5788367137662787332"><ph name="DEVICE_LABEL" /> qurilmasida bir yoki undan ortiq bo‘lim qo‘shib bo‘lmadi.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Bajarildi</translation> <translation id="5790651917470750848">Port allaqachon uzatilmoqda</translation> <translation id="5792728279623964091">Quvvat tugmasini bosing</translation> @@ -4826,10 +4827,8 @@ <ph name="BEGIN_PARAGRAPH2" />Bu qurilmada asosiy Joylashuv sozlamasini faolsizlantirish orqali Joylashuvni aniqlash xizmatini faolsizlantirish mumkin. Shuningdek, joylashuv parametri orqali joylashuv axboroti uchun Wi-Fi va mobil tarmoqlardan foydalanish hamda sensorlarni ham faolsizlantirish mumkin.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">To‘liq ekran rejimidan chiqish</translation> <translation id="6042308850641462728">Yana</translation> -<translation id="6043317578411397101">“<ph name="APP_NAME" />” ilovasi <ph name="TAB_NAME" /> saytiga Chrome sahifasiga kirish uchun ruxsat berdi.</translation> <translation id="604388835206766544">Konfiguratsiya tahlil qilinmadi</translation> <translation id="6043994281159824495">Chiqish</translation> -<translation id="6044805581023976844">“<ph name="APP_NAME" />” ilovasi <ph name="TAB_NAME" /> saytiga Chrome sahifasi va audioga kirish uchun ruxsat berdi.</translation> <translation id="6045114302329202345">Asosiy TrackPoint tugmasi</translation> <translation id="6047632800149092791">Sinxronizatsiya ishlamayapti. Profilingizdan chiqing va qaytadan urining.</translation> <translation id="6049797270917061226">Bu fayl yordamida firibgarlar shaxsiy axborotingizni oʻgʻirlashi mumkin.</translation> @@ -7332,7 +7331,6 @@ <translation id="8655295600908251630">Kanal</translation> <translation id="8655972064210167941">Hisobingizga kirish amalga oshmadi, chunki parolni tekshirib bo‘lmadi. Qaytadan urinib ko‘ring.</translation> <translation id="8657393004602556571">Fikr-mulohaza yuborish bekor qilinsinmi?</translation> -<translation id="8658645149275195032">“<ph name="APP_NAME" />” ilovasi <ph name="TAB_NAME" /> saytiga ekraningizdan foydalanishga ruxsat berdi.</translation> <translation id="8661290697478713397">Havolani &inkognito rejimida ochish</translation> <translation id="8662671328352114214"><ph name="TYPE" /> tarmoqqa ulanish</translation> <translation id="8662733268723715832">Bu odatdagidan koʻproq vaqt oladi, keyinga qoldiring yoki tugashini kuting.</translation> @@ -7627,7 +7625,6 @@ <translation id="8941173171815156065">“<ph name="PERMISSION" />” ruxsatnomalarini bekor qilish</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Batareya quvvati tezroq sarflanadi (hozirda: <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280">“<ph name="APP_NAME" />” ilovasi<ph name="TAB_NAME" /> saytiga ekraningizdan foydalanishga ruxsat berdi.</translation> <translation id="8945274638472141382">Belgi oʻlchami</translation> <translation id="8946359700442089734">Nosozliklarni ko‘rib chiqish xususiyatlari <ph name="IDS_SHORT_PRODUCT_NAME" /> qurilmaga to‘liq yoqilmagan.</translation> <translation id="894763922177556086">Yaxshi</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 043f858..f466e1f 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -534,6 +534,7 @@ <translation id="1549275686094429035">Đã bật ARC</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> muốn truy cập <ph name="VOLUME_NAME" />. Ứng dụng này có thể sửa đổi hoặc xóa các tệp của bạn.</translation> <translation id="1552301827267621511">Tiện ích "<ph name="EXTENSION_NAME" />" đã thay đổi công cụ tìm kiếm thành <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Quản lý tiện ích</translation> <translation id="1553538517812678578">không giới hạn</translation> <translation id="1555130319947370107">Xanh lam</translation> <translation id="1556537182262721003">Không thể di chuyển thư mục tiện ích vào hồ sơ.</translation> @@ -2794,7 +2795,6 @@ <translation id="3842552989725514455">Phông chữ Serif</translation> <translation id="3843464315703645664">Đã cho phép trong nội bộ</translation> <translation id="3844888638014364087">Đã chèn biểu tượng cảm xúc</translation> -<translation id="384513009320852920">Hãy đảm bảo thiết bị Bluetooth của bạn đang ở gần và đã bật chế độ ghép nối. <ph name="BEGIN_LINK_LEARN_MORE" />Tìm hiểu thêm<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Tải các công cụ phát triển trang web, ứng dụng Android, v.v. Việc cài đặt Linux sẽ tải <ph name="DOWNLOAD_SIZE" /> dữ liệu xuống.</translation> <translation id="3847319713229060696">Giúp tăng cường bảo mật cho mọi người trên web</translation> <translation id="3848547754896969219">Mở trong cửa sổ Ẩ&n danh</translation> @@ -4303,7 +4303,6 @@ <translation id="5485102783864353244">Thêm ứng dụng</translation> <translation id="5485754497697573575">Khôi phục Tất cả các Thẻ</translation> <translation id="5486261815000869482">Xác nhận mật khẩu</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> đang chia sẻ màn hình của bạn với <ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Mô phỏng khởi động lại trình duyệt</translation> <translation id="5487460042548760727">Đổi tên hồ sơ thành <ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Xóa dữ liệu</translation> @@ -4365,6 +4364,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> muốn</translation> <translation id="5534304873398226603">Hủy ảnh hoặc video</translation> <translation id="5535941515421698170">Đồng thời, xóa dữ liệu hiện có của bạn khỏi thiết bị này</translation> +<translation id="5537725057119320332">Truyền</translation> <translation id="5539221284352502426">Mật khẩu bạn nhập đã bị máy chủ từ chối. Các lý do có thể bao gồm: Mật khẩu quá ngắn. Mật khẩu phải chứa chữ số hoặc biểu tượng. Mật khẩu phải khác với mật khẩu cũ.</translation> <translation id="5541694225089836610">Quản trị viên đã vô hiệu hóa thao tác này</translation> <translation id="5542132724887566711">Tiểu sử</translation> @@ -4595,6 +4595,7 @@ <translation id="5787146423283493983">Thoả thuận về Khoá</translation> <translation id="5787420647064736989">Tên thiết bị</translation> <translation id="5788367137662787332">Rất tiếc, ít nhất một phân vùng trên thiết bị <ph name="DEVICE_LABEL" /> không thể kết nối được.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Thành công</translation> <translation id="5790651917470750848">Đã chuyển tiếp cổng này</translation> <translation id="5792728279623964091">Vui lòng nhấn vào nút nguồn</translation> @@ -4826,10 +4827,8 @@ <ph name="BEGIN_PARAGRAPH2" />Bạn có thể tắt Vị trí bằng cách tắt tùy chọn cài đặt Vị trí chính trên thiết bị. Ngoài ra, bạn có thể tắt tùy chọn sử dụng mạng Wi-Fi, mạng di động và cảm biến cho vị trí trong mục cài đặt vị trí.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Thoát chế độ toàn màn hình</translation> <translation id="6042308850641462728">Xem thêm</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> đang chia sẻ một thẻ trong Chrome với <ph name="TAB_NAME" />.</translation> <translation id="604388835206766544">Không thể phân tích cú pháp cấu hình</translation> <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="6049797270917061226">Tệp này có thể cho phép kẻ tấn công đánh cắp thông tin cá nhân của bạn.</translation> @@ -7326,7 +7325,6 @@ <translation id="8655295600908251630">Kênh</translation> <translation id="8655972064210167941">Đăng nhập không thành công vì không thể xác minh mật khẩu của bạn. Vui lòng liên hệ với quản trị viên của bạn hoặc thử lại.</translation> <translation id="8657393004602556571">Bạn có muốn loại bỏ ý kiến phản hồi này không?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> đang chia sẻ màn hình và âm thanh của bạn với <ph name="TAB_NAME" />.</translation> <translation id="8661290697478713397">Mở Liên kết bằn&g Cửa sổ Ẩn danh</translation> <translation id="8662671328352114214">Kết nối mạng <ph name="TYPE" /></translation> <translation id="8662733268723715832">Quá trình này mất nhiều thời gian hơn dự kiến, bạn có thể bỏ qua hoặc đợi cho đến khi hoàn tất.</translation> @@ -7621,7 +7619,6 @@ <translation id="8941173171815156065">Thu hồi quyền '<ph name="PERMISSION" />'</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">Sử dụng pin nhanh hơn (hiện tại là <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> đang chia sẻ một cửa sổ với <ph name="TAB_NAME" />.</translation> <translation id="8945274638472141382">Kích thước biểu tượng</translation> <translation id="8946359700442089734">Tính năng gỡ lỗi không được bật hoàn toàn trên thiết bị <ph name="IDS_SHORT_PRODUCT_NAME" /> này.</translation> <translation id="894763922177556086">Tốt</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 8effee9..1acdecd 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -161,6 +161,7 @@ <translation id="1153356358378277386">已配对的设备</translation> <translation id="1153636665119721804">Google 高级保护计划</translation> <translation id="1155816283571436363">正在连接到您的手机</translation> +<translation id="1158080958325422608">转换为大写</translation> <translation id="1158238185437008462">查看回忆集锦</translation> <translation id="1161575384898972166">请登录“<ph name="TOKEN_NAME" />”,导出客户端证书。</translation> <translation id="116173250649946226">您的管理员已设置默认主题,您无法更改。</translation> @@ -527,6 +528,7 @@ <translation id="1549275686094429035">已启用 ARC</translation> <translation id="1549788673239553762">“<ph name="APP_NAME" />”想访问 <ph name="VOLUME_NAME" />。它可能会修改或删除您的文件。</translation> <translation id="1552301827267621511">扩展程序“<ph name="EXTENSION_NAME" />”将搜索服务提供商改成了 <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">管理扩展程序</translation> <translation id="1553538517812678578">无限制</translation> <translation id="1555130319947370107">蓝色</translation> <translation id="1556537182262721003">无法将扩展程序目录移动到个人资料中。</translation> @@ -689,6 +691,7 @@ <translation id="1700079447639026019">始终无法使用 Cookie 的网站</translation> <translation id="1703331064825191675">再也不必费心记住您的密码</translation> <translation id="1703666494654169921">不允许网站使用虚拟实境设备或数据</translation> +<translation id="1704097193565924901">大写</translation> <translation id="1704230497453185209">不允许网站播放声音</translation> <translation id="1704970325597567340"><ph name="DATE" />运行过安全检查</translation> <translation id="1706586824377653884">此图标是由管理员添加的</translation> @@ -2773,7 +2776,6 @@ <translation id="3842552989725514455">Serif 字体</translation> <translation id="3843464315703645664">已列入内部许可名单</translation> <translation id="3844888638014364087">已插入表情符号</translation> -<translation id="384513009320852920">请确保您的蓝牙设备处于配对模式且就在附近。<ph name="BEGIN_LINK_LEARN_MORE" />了解详情<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">获取用于开发网站、Android 应用等内容的工具。安装 Linux 会使系统下载 <ph name="DOWNLOAD_SIZE" /> 的数据。</translation> <translation id="3847319713229060696">帮助我们为所有人改善网络安全环境</translation> <translation id="3848547754896969219">在无痕式窗口中打开(&I)</translation> @@ -3557,6 +3559,7 @@ <translation id="4681453295291708042">停用“附近分享”功能</translation> <translation id="4681930562518940301">在新标签页中打开原始图片(&I)</translation> <translation id="4682551433947286597">登录屏幕上显示的壁纸。</translation> +<translation id="4683629100208651599">转换为小写</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />%(默认)</translation> <translation id="4684427112815847243">同步所有数据类型</translation> <translation id="4684471265911890182"><ph name="APP_NAME" />正在尝试使用摄像头。若要允许它使用摄像头,请关闭摄像头的隐私保护开关。</translation> @@ -4279,7 +4282,6 @@ <translation id="5485102783864353244">添加应用</translation> <translation id="5485754497697573575">还原所有标签页</translation> <translation id="5486261815000869482">确认密码</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" />正在与<ph name="TAB_NAME" />共享您的屏幕。</translation> <translation id="5486561344817861625">模拟浏览器重启</translation> <translation id="5487460042548760727">将配置文件重命名为“<ph name="PROFILE_NAME" />”</translation> <translation id="5487521232677179737">清除数据</translation> @@ -4341,6 +4343,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" />想要</translation> <translation id="5534304873398226603">舍弃照片或视频</translation> <translation id="5535941515421698170">一并从这台设备中移除您的现有数据</translation> +<translation id="5537725057119320332">投射</translation> <translation id="5539221284352502426">您输入的密码被服务器拒绝了。可能的原因包括:此密码太短。此密码必须包含数字或符号,且必须不同于旧密码。</translation> <translation id="5541694225089836610">操作已被您的管理员禁止执行</translation> <translation id="5542132724887566711">个人资料</translation> @@ -4571,6 +4574,7 @@ <translation id="5787146423283493983">密钥协议</translation> <translation id="5787420647064736989">设备名称</translation> <translation id="5788367137662787332">抱歉,“<ph name="DEVICE_LABEL" />”设备上至少有一个分区无法加载。</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">成功</translation> <translation id="5790651917470750848">端口转发已存在</translation> <translation id="5792728279623964091">请点按您的电源按钮</translation> @@ -4802,10 +4806,8 @@ <ph name="BEGIN_PARAGRAPH2" />您可以通过关闭相应设备上的主要“位置信息”设置来关闭位置信息服务。此外,您还可以在“位置信息”设置中关闭那些使用 WLAN、移动网络和传感器来获取位置信息的功能。<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">退出全屏</translation> <translation id="6042308850641462728">展开</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> 正在与 <ph name="TAB_NAME" /> 共享 Chrome 标签页。</translation> <translation id="604388835206766544">无法解析配置</translation> <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="6049797270917061226">攻击者可能会利用此文件窃取您的个人信息。</translation> @@ -5949,6 +5951,7 @@ <translation id="7257173066616499747">Wi-Fi 网络</translation> <translation id="725758059478686223">打印服务</translation> <translation id="7257666756905341374">读取您复制和粘贴的数据</translation> +<translation id="7258192266780953209">转换</translation> <translation id="7258225044283673131">此应用无响应。请选择“强制关闭”以关闭此应用。</translation> <translation id="7262004276116528033">此登录服务由 <ph name="SAML_DOMAIN" /> 托管</translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />请尝试执行以下问题排查步骤: @@ -7300,7 +7303,6 @@ <translation id="8655295600908251630">版本</translation> <translation id="8655972064210167941">由于无法验证您的密码,因此登录失败了。请与管理员联系或重试。</translation> <translation id="8657393004602556571">您想舍弃反馈吗?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> 正在与 <ph name="TAB_NAME" /> 共享您的屏幕和音频。</translation> <translation id="8661290697478713397">在隐身窗口中打开链接(&G)</translation> <translation id="8662671328352114214">加入<ph name="TYPE" />网络</translation> <translation id="8662733268723715832">这项操作的用时超出了预期,您可以选择跳过或继续等待。</translation> @@ -7595,7 +7597,6 @@ <translation id="8941173171815156065">撤消“<ph name="PERMISSION" />”权限</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">这样会更快消耗电量(目前电量:<ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> 正在与 <ph name="TAB_NAME" /> 共享窗口。</translation> <translation id="8945274638472141382">图标大小</translation> <translation id="8946359700442089734">此<ph name="IDS_SHORT_PRODUCT_NAME" />设备上未完全启用调试功能。</translation> <translation id="894763922177556086">良好</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 43a25bc..73bbcd94 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -534,6 +534,7 @@ <translation id="1549275686094429035">已啟用 ARC</translation> <translation id="1549788673239553762">「<ph name="APP_NAME" />」想要存取「<ph name="VOLUME_NAME" />」。它可以修改或刪除您的檔案。</translation> <translation id="1552301827267621511">「<ph name="EXTENSION_NAME" />」擴充程式已變更搜尋引擎,改為使用 <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">管理擴充功能</translation> <translation id="1553538517812678578">無限制</translation> <translation id="1555130319947370107">藍色</translation> <translation id="1556537182262721003">無法將擴充功能目錄移至設定檔。</translation> @@ -2793,7 +2794,6 @@ <translation id="3842552989725514455">Serif 字型</translation> <translation id="3843464315703645664">已於內部加入許可名單</translation> <translation id="3844888638014364087">插入咗 Emoji</translation> -<translation id="384513009320852920">請確保藍牙裝置在附近,並且已處於配對模式。<ph name="BEGIN_LINK_LEARN_MORE" />瞭解詳情<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">獲取開發網站、Android 應用程式及其他平台的工具。安裝 Linux 時會下載 <ph name="DOWNLOAD_SIZE" /> 數據。</translation> <translation id="3847319713229060696">可為所有網絡使用者提供更完善的安全防護</translation> <translation id="3848547754896969219">在無痕式視窗中開啟書籤(&I)</translation> @@ -4303,7 +4303,6 @@ <translation id="5485102783864353244">新增應用程式</translation> <translation id="5485754497697573575">還原所有分頁</translation> <translation id="5486261815000869482">確認密碼</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> 正與 <ph name="TAB_NAME" /> 共用您的螢幕。</translation> <translation id="5486561344817861625">模擬瀏覽器重新啟動</translation> <translation id="5487460042548760727">將設定檔重新改名做「<ph name="PROFILE_NAME" />」</translation> <translation id="5487521232677179737">清除資料</translation> @@ -4365,6 +4364,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" />要求以下權限:</translation> <translation id="5534304873398226603">捨棄相片或影片</translation> <translation id="5535941515421698170">並從此裝置移除現有的資料</translation> +<translation id="5537725057119320332">投放</translation> <translation id="5539221284352502426">伺服器已拒絕您輸入的密碼。原因可能包括:密碼太短、密碼必須包含數字或符號、新舊密碼必須有所不同。</translation> <translation id="5541694225089836610">您的管理員已停用此操作</translation> <translation id="5542132724887566711">設定檔</translation> @@ -4595,6 +4595,7 @@ <translation id="5787146423283493983">金鑰協議</translation> <translation id="5787420647064736989">裝置名稱</translation> <translation id="5788367137662787332">很抱歉,<ph name="DEVICE_LABEL" /> 裝置上至少有一個分割區無法掛載。</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">成功</translation> <translation id="5790651917470750848">連接埠轉送已存在</translation> <translation id="5792728279623964091">請輕按您的開關按鈕</translation> @@ -4826,10 +4827,8 @@ <ph name="BEGIN_PARAGRAPH2" />關閉裝置的主要位置資訊設定,即可關閉定位服務。您也可以在位置資訊設定中關閉使用 Wi‑Fi、流動網絡和感應器確定位置的功能。<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">關閉全螢幕模式</translation> <translation id="6042308850641462728">更多選項</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> 正在與 <ph name="TAB_NAME" /> 共用 Chrome 分頁。</translation> <translation id="604388835206766544">無法剖析設定</translation> <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="6049797270917061226">攻擊者可能透過此檔案盜取您的個人資料。</translation> @@ -7326,7 +7325,6 @@ <translation id="8655295600908251630">版本</translation> <translation id="8655972064210167941">系統無法驗證您的密碼,導致登入失敗。請與您的管理員聯絡或再試一次。</translation> <translation id="8657393004602556571">您要捨棄這則意見嗎?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> 正與 <ph name="TAB_NAME" /> 共用您的螢幕和音效。</translation> <translation id="8661290697478713397">在無痕式視窗中開啟連結(&G)</translation> <translation id="8662671328352114214">加入 <ph name="TYPE" /> 網絡</translation> <translation id="8662733268723715832">操作需時比預期長,您可以選擇略過或繼續等待。</translation> @@ -7621,7 +7619,6 @@ <translation id="8941173171815156065">撤銷「<ph name="PERMISSION" />」權限</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">加快耗電量 (目前為 <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> 正在與 <ph name="TAB_NAME" /> 共用視窗。</translation> <translation id="8945274638472141382">圖示大小</translation> <translation id="8946359700442089734">這部 <ph name="IDS_SHORT_PRODUCT_NAME" /> 裝置未完全啟用偵錯功能。</translation> <translation id="894763922177556086">良好</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 2faf109..e89ad918 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -161,6 +161,7 @@ <translation id="1153356358378277386">配對裝置</translation> <translation id="1153636665119721804">Google 進階保護計畫</translation> <translation id="1155816283571436363">正在連線到你的手機</translation> +<translation id="1158080958325422608">使用大寫字母</translation> <translation id="1158238185437008462">查看回憶集錦</translation> <translation id="1161575384898972166">登入 <ph name="TOKEN_NAME" /> 即可匯出用戶端憑證。</translation> <translation id="116173250649946226">管理員設定的預設主題不可變更。</translation> @@ -530,6 +531,7 @@ <translation id="1549275686094429035">已啟用 ARC</translation> <translation id="1549788673239553762">「<ph name="APP_NAME" />」要求存取 <ph name="VOLUME_NAME" />。您的檔案可能會遭到修改或刪除。</translation> <translation id="1552301827267621511">「<ph name="EXTENSION_NAME" />」擴充功能已將搜尋引擎改為 <ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">管理擴充功能</translation> <translation id="1553538517812678578">無限制</translation> <translation id="1555130319947370107">藍色</translation> <translation id="1556537182262721003">無法將擴充功能目錄移至設定檔。</translation> @@ -692,6 +694,7 @@ <translation id="1700079447639026019">一律無法使用 Cookie 的網站</translation> <translation id="1703331064825191675">再也不必費心記住你的密碼</translation> <translation id="1703666494654169921">禁止網站使用虛擬實境裝置或資料</translation> +<translation id="1704097193565924901">大小寫設定</translation> <translation id="1704230497453185209">禁止網站播放音效</translation> <translation id="1704970325597567340">已於 <ph name="DATE" />執行安全檢查</translation> <translation id="1706586824377653884">由管理員新增</translation> @@ -2777,7 +2780,6 @@ <translation id="3842552989725514455">Serif 字型</translation> <translation id="3843464315703645664">已加入內部許可清單</translation> <translation id="3844888638014364087">已插入表情符號</translation> -<translation id="384513009320852920">請確認你的藍牙裝置放在附近,且處於配對模式。<ph name="BEGIN_LINK_LEARN_MORE" />瞭解詳情<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">取得網站開發工具、Android 應用程式等等。安裝 Linux 將下載 <ph name="DOWNLOAD_SIZE" /> 的資料。</translation> <translation id="3847319713229060696">協助我們改善所有人的網路安全性</translation> <translation id="3848547754896969219">在無痕式視窗中開啟(&I)</translation> @@ -3561,6 +3563,7 @@ <translation id="4681453295291708042">停用鄰近分享功能</translation> <translation id="4681930562518940301">在新分頁中開啟原始圖片(&I)</translation> <translation id="4682551433947286597">登入畫面上顯示的桌布。</translation> +<translation id="4683629100208651599">使用小寫字母</translation> <translation id="4683947955326903992"><ph name="PERCENTAGE" />% (預設)</translation> <translation id="4684427112815847243">同步處理所有資料</translation> <translation id="4684471265911890182">「<ph name="APP_NAME" />」正在嘗試存取攝影機。如要允許存取,請將攝影機的隱私權開關切換為關閉。</translation> @@ -4283,7 +4286,6 @@ <translation id="5485102783864353244">新增應用程式</translation> <translation id="5485754497697573575">還原所有分頁</translation> <translation id="5486261815000869482">確認密碼</translation> -<translation id="5486275809415469523"><ph name="APP_NAME" /> 正與 <ph name="TAB_NAME" /> 共用你的畫面。</translation> <translation id="5486561344817861625">模擬瀏覽器重新啟動</translation> <translation id="5487460042548760727">將設定檔重新命名為「<ph name="PROFILE_NAME" />」</translation> <translation id="5487521232677179737">清除資料</translation> @@ -4345,6 +4347,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" />要求下列權限:</translation> <translation id="5534304873398226603">捨棄相片或影片</translation> <translation id="5535941515421698170">將你現有的資料從這個裝置上一併移除</translation> +<translation id="5537725057119320332">投放</translation> <translation id="5539221284352502426">輸入的密碼遭到伺服器拒絕。可能的原因包括:密碼長度不足、密碼必須包含數字或符號、新舊密碼必須有所不同。</translation> <translation id="5541694225089836610">你的管理員停用了這個動作</translation> <translation id="5542132724887566711">設定檔</translation> @@ -4575,6 +4578,7 @@ <translation id="5787146423283493983">金鑰協議</translation> <translation id="5787420647064736989">裝置名稱</translation> <translation id="5788367137662787332">很抱歉,<ph name="DEVICE_LABEL" /> 裝置上至少有一個分割區無法掛載。</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">成功</translation> <translation id="5790651917470750848">轉送連接埠已經存在</translation> <translation id="5792728279623964091">請輕觸電源按鈕</translation> @@ -4806,10 +4810,8 @@ <ph name="BEGIN_PARAGRAPH2" />關閉裝置的主要「定位」設定即可關閉「定位」服務。你也可以前往位置資訊設定,將使用 Wi‑Fi、行動網路和感應器的定位功能關閉。<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">結束全螢幕</translation> <translation id="6042308850641462728">更多</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> 正在與 <ph name="TAB_NAME" /> 共用 Chrome 分頁。</translation> <translation id="604388835206766544">無法剖析設定</translation> <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="6049797270917061226">攻擊者可能透過這個檔案竊取你的個人資訊。</translation> @@ -5953,6 +5955,7 @@ <translation id="7257173066616499747">Wi-Fi 網路</translation> <translation id="725758059478686223">列印服務</translation> <translation id="7257666756905341374">讀取你複製和貼上的資料</translation> +<translation id="7258192266780953209">轉換</translation> <translation id="7258225044283673131">應用程式沒有回應。選取「強制關閉」即可關閉應用程式。</translation> <translation id="7262004276116528033">這是由 <ph name="SAML_DOMAIN" /> 代管的登入服務。</translation> <translation id="7264564921322372728"><ph name="BEGIN_PARAGRAPH1" />請試試下列疑難排解步驟: @@ -7305,7 +7308,6 @@ <translation id="8655295600908251630">頻道</translation> <translation id="8655972064210167941">無法驗證您的密碼,導致登入失敗。請與您的管理員聯絡或再試一次。</translation> <translation id="8657393004602556571">你要捨棄這則意見嗎?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> 正在與 <ph name="TAB_NAME" /> 共用您的畫面和音訊。</translation> <translation id="8661290697478713397">在無痕式視窗中開啟連結(&G)</translation> <translation id="8662671328352114214">加入 <ph name="TYPE" /> 網路</translation> <translation id="8662733268723715832">作業時間過長。你可以選擇略過或繼續等待。</translation> @@ -7600,7 +7602,6 @@ <translation id="8941173171815156065">撤銷「<ph name="PERMISSION" />」權限</translation> <translation id="894360074127026135">Netscape International Step-Up</translation> <translation id="8944099748578356325">更快耗盡電量 (目前為 <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> 正在與 <ph name="TAB_NAME" /> 共用視窗。</translation> <translation id="8945274638472141382">圖示大小</translation> <translation id="8946359700442089734">尚未在這個 <ph name="IDS_SHORT_PRODUCT_NAME" /> 裝置上完整啟用偵錯功能。</translation> <translation id="894763922177556086">良好</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 790b019..9780308 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -533,6 +533,7 @@ <translation id="1549275686094429035">I-ARC inikwe amandla</translation> <translation id="1549788673239553762">I-<ph name="APP_NAME" /> ifuna ukufinyelela ku-<ph name="VOLUME_NAME" />. Ingaguqula noma isuse amafayela wakho.</translation> <translation id="1552301827267621511">Isandiso se-"<ph name="EXTENSION_NAME" />" sishintshe usesho ukuba lusebenzise i-<ph name="SEARCH_PROVIDER_DOMAIN" /></translation> +<translation id="1552752544932680961">Phatha isandiso</translation> <translation id="1553538517812678578">ayinamkhawulo</translation> <translation id="1555130319947370107">Okuluhlaza okwesibhakabhaka</translation> <translation id="1556537182262721003">Ayikwazanga ukuhambisa umkhombandlela wesandiso kuphrofayela.</translation> @@ -2793,7 +2794,6 @@ <translation id="3842552989725514455">ifonti ye-serif</translation> <translation id="3843464315703645664">Uhlu lwabagunyaziwe ngaphakathi</translation> <translation id="3844888638014364087">I-emoji ifakiwe</translation> -<translation id="384513009320852920">Qiniseka ukuthi idivayisi ye-Bluetooth yakho ikwimodi yokubhangqa futhi iseduze. <ph name="BEGIN_LINK_LEARN_MORE" />Funda kabanzi<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3846116211488856547">Thola amathuluzi okuthuthukisa amawebhusayithi, izinhlelo zokusebenza ze-Android, nokuningi. Ukufaka i-Linux kuzolanda okungu-<ph name="DOWNLOAD_SIZE" /> kwedatha.</translation> <translation id="3847319713229060696">Siza ukuthuthukisa ukuvikelwa kuwebhu kuwo wonke umuntu</translation> <translation id="3848547754896969219">Vula ewindini le-&Incognito</translation> @@ -4303,7 +4303,6 @@ <translation id="5485102783864353244">Engeza uhlelo lokusbenza</translation> <translation id="5485754497697573575">Buyisela wonke amathebhu</translation> <translation id="5486261815000869482">Qinisekisa iphasiwedi</translation> -<translation id="5486275809415469523">I-<ph name="APP_NAME" /> yabelana ngesikrini sakho ne-<ph name="TAB_NAME" />.</translation> <translation id="5486561344817861625">Lingisa ukuqala kabusha kwesiphequluli</translation> <translation id="5487460042548760727">Qamba kabusha iphrofayela ku-<ph name="PROFILE_NAME" /></translation> <translation id="5487521232677179737">Sula idatha</translation> @@ -4365,6 +4364,7 @@ <translation id="5533001281916885985">I-<ph name="SITE_NAME" /> ifuna</translation> <translation id="5534304873398226603">Lahla isithombe noma ividiyo</translation> <translation id="5535941515421698170">Phinda ususe idatha yakho ekhona kusukela kule divayisi</translation> +<translation id="5537725057119320332">Sakaza</translation> <translation id="5539221284352502426">Iphasiwedi oyifakile inqatshwe yiseva. Izizathu ezingenzeka zibandakanya: Iphasiwedi yifushane kakhulu. Iphasiwedi kufanele ibandakanye izinombolo noma izimpawu. Iphasiwedi kufanele yehluke kunamaphasiwedi wangaphambilini.</translation> <translation id="5541694225089836610">Isenzo sikhutshazwe umlawuli wakho</translation> <translation id="5542132724887566711">Iphrofayela</translation> @@ -4596,6 +4596,7 @@ <translation id="5787146423283493983">Isivumelwano sokhiye</translation> <translation id="5787420647064736989">Igama ledivaysi</translation> <translation id="5788367137662787332">Uxolo, okungenani ingxenye eyodwa kudivayisi engu-<ph name="DEVICE_LABEL" /> ayikwazanga ukukhwezwa.</translation> +<translation id="5789643057113097023">.</translation> <translation id="5790085346892983794">Impumelelo</translation> <translation id="5790651917470750848">Ukudlulisela ngembobo sekukhona kakade</translation> <translation id="5792728279623964091">Sicela uthephe inkinobho yakho yamandla</translation> @@ -4827,10 +4828,8 @@ <ph name="BEGIN_PARAGRAPH2" />Ungavala indawo ngokuvala isilungiselelo esikhulu sendawo sedivayisi yakho. Ungaphinda uvale ukusetshenziswa kwe-Wi-Fi, amanethiwekhi eselula, nezinzwa zendawo kuzilungiselelo zendawo.<ph name="END_PARAGRAPH2" /></translation> <translation id="6041155700700864984">Phuma Kusikrini Esigcwele</translation> <translation id="6042308850641462728">Okuningi</translation> -<translation id="6043317578411397101"><ph name="APP_NAME" /> yabelana ngethebhu ye-Chrome ne-<ph name="TAB_NAME" /> .</translation> <translation id="604388835206766544">Yehlulekile ukuncozulula ukulungiselelwa</translation> <translation id="6043994281159824495">Phuma ngemvume manje</translation> -<translation id="6044805581023976844"><ph name="APP_NAME" /> yabelana ngethebhu ye-Chrome nomsindo ne-<ph name="TAB_NAME" /> .</translation> <translation id="6045114302329202345">Inkinobho ye-TrackPoint eyinhloko</translation> <translation id="6047632800149092791">Ukuvumelanisa akusebenzi. Zama ukuphuma ngemvume uphinde ungene ngemvume futhi.</translation> <translation id="6049797270917061226">Leli fayela lingavumela abahlaseli batshontshe ulwazi lwakho lomuntu siqu.</translation> @@ -7326,7 +7325,6 @@ <translation id="8655295600908251630">Isiteshi</translation> <translation id="8655972064210167941">Ukungena ngemvume kwehlulekile ngoba iphasiwedi yakho ayikwazanga ukuqinisekiswa. Sicela uxhumane nomlawuli wakho noma zama futhi.</translation> <translation id="8657393004602556571">Ngabe ufuna ukulahla impendulo?</translation> -<translation id="8658645149275195032"><ph name="APP_NAME" /> yabelana ngesikrini sakho nomsindo ne-<ph name="TAB_NAME" /> .</translation> <translation id="8661290697478713397">Vula isixhumanisi kuwindi le-Inco&gnito</translation> <translation id="8662671328352114214">Jona inethiwekhi ye-<ph name="TYPE" /></translation> <translation id="8662733268723715832">Lokhu kuthatha isikhathi eside kunokulindelekile, ungeqa noma ulinde kuze kuqedwe.</translation> @@ -7622,7 +7620,6 @@ <translation id="8941173171815156065">Vuselela imvume ye-'<ph name="PERMISSION" />'</translation> <translation id="894360074127026135">Ukukhuphula isitebhisi kwamazwe ngamazwe kwe-Netscape</translation> <translation id="8944099748578356325">Sebenzisa ibhethri ngokushesha (okwamanje <ph name="BATTERY_PERCENTAGE" />%)</translation> -<translation id="8944964446326379280"><ph name="APP_NAME" /> yabelana ngewindi ne-<ph name="TAB_NAME" /> .</translation> <translation id="8945274638472141382">Ubungako besithonjana:</translation> <translation id="8946359700442089734">Izici zokususa amaphutha azinikwanga amandla ngokuphelele kule divayisi ye-<ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="894763922177556086">Kuhle</translation>
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn index 164747b0..d3bb44b 100644 --- a/chrome/app/vector_icons/BUILD.gn +++ b/chrome/app/vector_icons/BUILD.gn
@@ -98,6 +98,7 @@ "remove_box.icon", "resize_handle.icon", "sad_tab.icon", + "safety_check.icon", "save_group.icon", "save_page.icon", "scrolling_tabstrip_leading.icon", @@ -105,6 +106,7 @@ "security.icon", "send_tab_to_self.icon", "sharing_hub_screenshot.icon", + "shield_bad.icon", "side_panel.icon", "side_panel_touch.icon", "sign_out.icon", @@ -257,10 +259,6 @@ if (is_chrome_branded && is_chromeos_ash) { sources += [ "google_chrome/assistant.icon" ] } - - if (is_android) { - sources += [ "safety_check.icon" ] - } } source_set("vector_icons") {
diff --git a/chrome/app/vector_icons/shield_bad.icon b/chrome/app/vector_icons/shield_bad.icon new file mode 100644 index 0000000..0e90337 --- /dev/null +++ b/chrome/app/vector_icons/shield_bad.icon
@@ -0,0 +1,40 @@ +// 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. + +CANVAS_DIMENSIONS, 24, +MOVE_TO, 9.9f, 15.5f, +LINE_TO, 12, 13.4f, +LINE_TO, 14.1f, 15.5f, +LINE_TO, 15.5f, 14.1f, +LINE_TO, 13.4f, 12, +LINE_TO, 15.5f, 9.9f, +LINE_TO, 14.1f, 8.5f, +LINE_TO, 12, 10.6f, +LINE_TO, 9.9f, 8.5f, +LINE_TO, 8.5f, 9.9f, +LINE_TO, 10.6f, 12, +LINE_TO, 8.5f, 14.1f, +CLOSE, +MOVE_TO, 12, 22, +R_QUADRATIC_TO, -3.47f, -0.87f, -5.74f, -3.99f, +QUADRATIC_TO, 4, 14.9f, 4, 11.1f, +V_LINE_TO, 5, +R_LINE_TO, 8, -3, +R_LINE_TO, 8, 3, +R_V_LINE_TO, 6.1f, +R_QUADRATIC_TO, 0, 3.8f, -2.26f, 6.91f, +QUADRATIC_TO, 15.48f, 21.13f, 12, 22, +CLOSE, +R_MOVE_TO, 0, -10, +CLOSE, +R_MOVE_TO, 0, 7.9f, +R_QUADRATIC_TO, 2.6f, -0.82f, 4.3f, -3.3f, +R_QUADRATIC_TO, 1.7f, -2.47f, 1.7f, -5.5f, +V_LINE_TO, 6.38f, +R_LINE_TO, -6, -2.25f, +R_LINE_TO, -6, 2.25f, +V_LINE_TO, 11.1f, +R_QUADRATIC_TO, 0, 3.03f, 1.7f, 5.5f, +R_QUADRATIC_TO, 1.7f, 2.47f, 4.3f, 3.3f, +CLOSE \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 76be7fa..60c2a4e0 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -371,9 +371,6 @@ "crash_upload_list/crash_upload_list.h", "custom_handlers/chrome_protocol_handler_registry_delegate.cc", "custom_handlers/chrome_protocol_handler_registry_delegate.h", - "custom_handlers/protocol_handler_registry.cc", - "custom_handlers/protocol_handler_registry.h", - "custom_handlers/protocol_handler_registry.h", "custom_handlers/protocol_handler_registry_factory.cc", "custom_handlers/protocol_handler_registry_factory.h", "data_reduction_proxy/data_reduction_proxy_chrome_settings.cc", @@ -2061,6 +2058,7 @@ "//components/country_codes", "//components/crash/core/browser", "//components/crx_file", + "//components/custom_handlers", "//components/data_reduction_proxy/core/browser", "//components/data_use_measurement/core:ascriber", "//components/device_event_log",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index cffe7e20..4b06f4c 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -78,6 +78,7 @@ "+components/browser_watcher", "+components/browsing_data/content", "+components/browsing_data/core", + "+components/custom_handlers", "+components/captive_portal", "+components/cast_certificate", "+components/cast_channel",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index d910dde..04064f0e 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2526,6 +2526,9 @@ const FeatureEntry::FeatureParam kReadLaterSemiIntegrated[] = { {"use_root_bookmark_as_default", "true"}, {"allow_bookmark_type_swapping", "true"}}; +const FeatureEntry::FeatureParam kReadLaterNoCustomTab[] = { + {"use_root_bookmark_as_default", "true"}, + {"use_cct", "false"}}; const FeatureEntry::FeatureVariation kReadLaterVariations[] = { {"(use root bookmark as default)", kReadLaterUseRootBookmarkAsDefault, @@ -2533,7 +2536,9 @@ {"(with app menu item)", kReadLaterInAppMenu, base::size(kReadLaterInAppMenu), nullptr}, {"(bookmarks semi-integration)", kReadLaterSemiIntegrated, - base::size(kReadLaterSemiIntegrated), nullptr}}; + base::size(kReadLaterSemiIntegrated), nullptr}, + {"(no custom tab)", kReadLaterNoCustomTab, + base::size(kReadLaterNoCustomTab), nullptr}}; const FeatureEntry::FeatureParam kBookmarksRefreshVisuals[] = { {"bookmark_visuals_enabled", "true"}}; @@ -4177,13 +4182,6 @@ kOsCrOS, SINGLE_VALUE_TYPE( ::switches::kEnableExperimentalAccessibilitySwitchAccessText)}, - {"enable-experimental-accessibility-switch-access-setup-guide", - flag_descriptions::kExperimentalAccessibilitySwitchAccessSetupGuideName, - flag_descriptions:: - kExperimentalAccessibilitySwitchAccessSetupGuideDescription, - kOsCrOS, - FEATURE_VALUE_TYPE( - features::kExperimentalAccessibilitySwitchAccessSetupGuide)}, {"enable-experimental-accessibility-switch-access-multistep-automation", flag_descriptions:: kExperimentalAccessibilitySwitchAccessMultistepAutomationName, @@ -4695,7 +4693,7 @@ {"history-journeys", flag_descriptions::kJourneysName, flag_descriptions::kJourneysDescription, kOsDesktop, - FEATURE_VALUE_TYPE(history_clusters::kJourneys)}, + FEATURE_VALUE_TYPE(history_clusters::internal::kJourneys)}, {"history-journeys-omnibox-action", flag_descriptions::kJourneysOmniboxActionName,
diff --git a/chrome/browser/android/search_permissions/search_permissions_service.cc b/chrome/browser/android/search_permissions/search_permissions_service.cc index 6ea5011..a89d0bf 100644 --- a/chrome/browser/android/search_permissions/search_permissions_service.cc +++ b/chrome/browser/android/search_permissions/search_permissions_service.cc
@@ -411,8 +411,8 @@ // If the user's content setting is being overridden by the DSE setting, // we migrate the DSE setting to be stored in the user's content setting. - bool dse_setting = false; - dict->GetBoolean(kDSESettingKeyDeprecated, &dse_setting); + bool dse_setting = + dict->FindBoolPath(kDSESettingKeyDeprecated).value_or(false); if (dse_geolocation_setting == CONTENT_SETTING_ASK) { dse_geolocation_setting = dse_setting ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK;
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc b/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc index ac23285..a3aa8a58 100644 --- a/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc +++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc
@@ -71,7 +71,6 @@ app_type_name_map->insert(apps::AppTypeName::kSystemWeb); app_type_name_map->insert(apps::AppTypeName::kChromeBrowser); app_type_name_map->insert(apps::AppTypeName::kStandaloneBrowserChromeApp); - app_type_name_map->insert(apps::AppTypeName::kExtension); } return *app_type_name_map; } @@ -139,8 +138,6 @@ return apps::AppTypeNameV2::kSystemWeb; case apps::mojom::AppType::kStandaloneBrowserChromeApp: return apps::AppTypeNameV2::kStandaloneBrowserChromeApp; - case apps::mojom::AppType::kExtension: - return apps::AppTypeNameV2::kExtension; } } @@ -187,8 +184,6 @@ return apps::AppTypeNameV2::kSystemWeb; case apps::mojom::AppType::kStandaloneBrowserChromeApp: return apps::AppTypeNameV2::kStandaloneBrowserChromeApp; - case apps::mojom::AppType::kExtension: - return apps::AppTypeNameV2::kExtension; } } @@ -247,7 +242,6 @@ constexpr char kChromeBrowserHistogramName[] = "ChromeBrowser"; constexpr char kStandaloneBrowserChromeAppHistogramName[] = "StandaloneBrowserChromeApp"; -constexpr char kExtensionHistogramName[] = "Extension"; constexpr char kChromeAppTabHistogramName[] = "ChromeAppTab"; constexpr char kChromeAppWindowHistogramName[] = "ChromeAppWindow"; @@ -284,8 +278,6 @@ return kChromeBrowserHistogramName; case apps::AppTypeName::kStandaloneBrowserChromeApp: return kStandaloneBrowserChromeAppHistogramName; - case apps::AppTypeName::kExtension: - return kExtensionHistogramName; } } @@ -323,8 +315,6 @@ return kChromeBrowserHistogramName; case apps::AppTypeNameV2::kStandaloneBrowserChromeApp: return kStandaloneBrowserChromeAppHistogramName; - case apps::AppTypeNameV2::kExtension: - return kExtensionHistogramName; } } @@ -989,7 +979,6 @@ switch (app_type) { case apps::mojom::AppType::kBuiltIn: case apps::mojom::AppType::kChromeApp: - case apps::mojom::AppType::kExtension: source_id = ukm::AppSourceUrlRecorder::GetSourceIdForChromeApp(app_id); break; case apps::mojom::AppType::kArc:
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.cc b/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.cc index 8fd84d9..abfd18d6 100644 --- a/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.cc +++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.cc
@@ -191,8 +191,6 @@ return apps::AppTypeName::kSystemWeb; case apps::mojom::AppType::kStandaloneBrowserChromeApp: return apps::AppTypeName::kStandaloneBrowserChromeApp; - case apps::mojom::AppType::kExtension: - return apps::AppTypeName::kExtension; } } @@ -218,7 +216,6 @@ case AppType::kSystemWeb: case AppType::kCrostini: case AppType::kBorealis: - case AppType::kExtension: return true; case AppType::kUnknown: case AppType::kMacOs: @@ -282,8 +279,6 @@ return apps::AppTypeName::kSystemWeb; case apps::mojom::AppType::kStandaloneBrowserChromeApp: return apps::AppTypeName::kStandaloneBrowserChromeApp; - case apps::mojom::AppType::kExtension: - return apps::AppTypeName::kExtension; } }
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.h b/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.h index bc9cc0bbf..26182de 100644 --- a/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.h +++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.h
@@ -35,11 +35,10 @@ kSystemWeb = 11, kChromeBrowser = 12, kStandaloneBrowserChromeApp = 13, - kExtension = 14, // Add any new values above this one, and update kMaxValue to the highest // enumerator value. - kMaxValue = kExtension, + kMaxValue = kStandaloneBrowserChromeApp, }; // This is used for logging, so do not remove or reorder existing entries. @@ -65,11 +64,10 @@ kSystemWeb = 13, kChromeBrowser = 14, kStandaloneBrowserChromeApp = 15, - kExtension = 16, // Add any new values above this one, and update kMaxValue to the highest // enumerator value. - kMaxValue = kExtension, + kMaxValue = kStandaloneBrowserChromeApp, }; extern const base::TimeDelta kMinDuration;
diff --git a/chrome/browser/apps/app_service/publisher_host.cc b/chrome/browser/apps/app_service/publisher_host.cc index 8afd500..614a977 100644 --- a/chrome/browser/apps/app_service/publisher_host.cc +++ b/chrome/browser/apps/app_service/publisher_host.cc
@@ -11,7 +11,6 @@ #include "chrome/browser/ash/guest_os/guest_os_registry_service_factory.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/web_applications/app_service/web_apps.h" -#include "chrome/common/chrome_features.h" #if BUILDFLAG(IS_CHROMEOS_ASH) #include "chrome/browser/apps/app_service/browser_app_instance_registry.h" @@ -45,7 +44,7 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) void PublisherHost::SetArcIsRegistered() { - chrome_apps_->ObserveArc(); + extension_apps_->ObserveArc(); } void PublisherHost::FlushMojoCallsForTesting() { @@ -53,13 +52,9 @@ built_in_chrome_os_apps_->FlushMojoCallsForTesting(); } crostini_apps_->FlushMojoCallsForTesting(); - chrome_apps_->FlushMojoCallsForTesting(); - if (extension_apps_) { - chrome_apps_->FlushMojoCallsForTesting(); - } - if (plugin_vm_apps_) { + extension_apps_->FlushMojoCallsForTesting(); + if (plugin_vm_apps_) plugin_vm_apps_->FlushMojoCallsForTesting(); - } if (standalone_browser_apps_) { standalone_browser_apps_->FlushMojoCallsForTesting(); } @@ -78,10 +73,7 @@ void PublisherHost::Shutdown() { if (proxy_->AppService().is_connected()) { - chrome_apps_->Shutdown(); - if (extension_apps_) { - extension_apps_->Shutdown(); - } + extension_apps_->Shutdown(); if (web_apps_) { web_apps_->Shutdown(); } @@ -107,15 +99,8 @@ crostini_apps_ = std::make_unique<CrostiniApps>(proxy_); crostini_apps_->Initialize(); - chrome_apps_ = - std::make_unique<ExtensionAppsChromeOs>(proxy_, AppType::kChromeApp); - chrome_apps_->Initialize(); - - if (base::FeatureList::IsEnabled(features::kAppServiceExtension)) { - extension_apps_ = - std::make_unique<ExtensionAppsChromeOs>(proxy_, AppType::kExtension); - extension_apps_->Initialize(); - } + extension_apps_ = std::make_unique<ExtensionAppsChromeOs>(proxy_); + extension_apps_->Initialize(); if (!g_omit_plugin_vm_apps_for_testing_) { plugin_vm_apps_ = std::make_unique<PluginVmApps>(proxy_); @@ -135,8 +120,8 @@ #else web_apps_ = std::make_unique<web_app::WebApps>(proxy_); - chrome_apps_ = std::make_unique<ExtensionApps>(proxy_, AppType::kChromeApp); - chrome_apps_->Initialize(); + extension_apps_ = std::make_unique<ExtensionApps>(proxy_); + extension_apps_->Initialize(); #endif }
diff --git a/chrome/browser/apps/app_service/publisher_host.h b/chrome/browser/apps/app_service/publisher_host.h index 78f07f9..f93b27e 100644 --- a/chrome/browser/apps/app_service/publisher_host.h +++ b/chrome/browser/apps/app_service/publisher_host.h
@@ -59,7 +59,6 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) std::unique_ptr<BuiltInChromeOsApps> built_in_chrome_os_apps_; std::unique_ptr<CrostiniApps> crostini_apps_; - std::unique_ptr<ExtensionAppsChromeOs> chrome_apps_; std::unique_ptr<ExtensionAppsChromeOs> extension_apps_; std::unique_ptr<PluginVmApps> plugin_vm_apps_; std::unique_ptr<StandaloneBrowserApps> standalone_browser_apps_; @@ -67,7 +66,7 @@ std::unique_ptr<BorealisApps> borealis_apps_; #else std::unique_ptr<web_app::WebApps> web_apps_; - std::unique_ptr<ExtensionApps> chrome_apps_; + std::unique_ptr<ExtensionApps> extension_apps_; #endif };
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps.cc b/chrome/browser/apps/app_service/publishers/extension_apps.cc index f84cbdd..ca44239 100644 --- a/chrome/browser/apps/app_service/publishers/extension_apps.cc +++ b/chrome/browser/apps/app_service/publishers/extension_apps.cc
@@ -11,8 +11,8 @@ namespace apps { -ExtensionApps::ExtensionApps(AppServiceProxy* proxy, AppType app_type) - : ExtensionAppsBase(proxy, app_type) {} +ExtensionApps::ExtensionApps(AppServiceProxy* proxy) + : ExtensionAppsBase(proxy) {} ExtensionApps::~ExtensionApps() = default;
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps.h b/chrome/browser/apps/app_service/publishers/extension_apps.h index 2766d04..496b131 100644 --- a/chrome/browser/apps/app_service/publishers/extension_apps.h +++ b/chrome/browser/apps/app_service/publishers/extension_apps.h
@@ -9,7 +9,6 @@ #include "chrome/browser/apps/app_service/app_icon/icon_key_util.h" #include "chrome/browser/apps/app_service/publishers/extension_apps_base.h" -#include "components/services/app_service/public/cpp/app_types.h" #include "components/services/app_service/public/mojom/app_service.mojom.h" #include "components/services/app_service/public/mojom/types.mojom.h" #include "mojo/public/cpp/bindings/remote.h" @@ -32,7 +31,7 @@ // See components/services/app_service/README.md. class ExtensionApps : public apps::ExtensionAppsBase { public: - ExtensionApps(AppServiceProxy* proxy, AppType app_type); + explicit ExtensionApps(AppServiceProxy* proxy); ~ExtensionApps() override; ExtensionApps(const ExtensionApps&) = delete;
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_base.cc b/chrome/browser/apps/app_service/publishers/extension_apps_base.cc index 53596a4c2..fa851f6 100644 --- a/chrome/browser/apps/app_service/publishers/extension_apps_base.cc +++ b/chrome/browser/apps/app_service/publishers/extension_apps_base.cc
@@ -150,8 +150,8 @@ namespace apps { -ExtensionAppsBase::ExtensionAppsBase(AppServiceProxy* proxy, AppType app_type) - : AppPublisher(proxy), profile_(proxy->profile()), app_type_(app_type) {} +ExtensionAppsBase::ExtensionAppsBase(AppServiceProxy* proxy) + : AppPublisher(proxy), profile_(proxy->profile()) {} ExtensionAppsBase::~ExtensionAppsBase() = default; @@ -169,7 +169,7 @@ // Construct an App with only the information required to identify an // uninstallation. apps::mojom::AppPtr mojom_app = apps::mojom::App::New(); - mojom_app->app_type = mojom_app_type(); + mojom_app->app_type = apps::mojom::AppType::kChromeApp; mojom_app->app_id = extension->id(); mojom_app->readiness = reason == extensions::UNINSTALL_REASON_MIGRATED ? apps::mojom::Readiness::kUninstalledByMigration @@ -178,7 +178,8 @@ SetShowInFields(mojom_app, extension); PublisherBase::Publish(std::move(mojom_app), subscribers_); - std::unique_ptr<App> app = std::make_unique<App>(app_type(), extension->id()); + std::unique_ptr<App> app = + std::make_unique<App>(AppType::kChromeApp, extension->id()); app->readiness = reason == extensions::UNINSTALL_REASON_MIGRATED ? Readiness::kUninstalledByMigration : Readiness::kUninstalledByUser; @@ -210,7 +211,7 @@ const extensions::Extension* extension, Readiness readiness) { std::unique_ptr<App> app = AppPublisher::MakeApp( - app_type(), extension->id(), readiness, extension->name()); + AppType::kChromeApp, extension->id(), readiness, extension->name()); app->short_name = extension->short_name(); app->description = extension->description(); app->version = extension->GetVersionForDisplay(); @@ -224,8 +225,8 @@ apps::mojom::Readiness readiness) { auto install_reason = GetInstallReason(profile_, extension); apps::mojom::AppPtr app = - PublisherBase::MakeApp(mojom_app_type(), extension->id(), readiness, - extension->name(), install_reason); + PublisherBase::MakeApp(apps::mojom::AppType::kChromeApp, extension->id(), + readiness, extension->name(), install_reason); app->short_name = extension->short_name(); app->description = extension->description(); @@ -335,13 +336,14 @@ } void ExtensionAppsBase::Initialize() { - RegisterPublisher(app_type()); + RegisterPublisher(AppType::kChromeApp); prefs_observation_.Observe(extensions::ExtensionPrefs::Get(profile_)); registry_observation_.Observe(extensions::ExtensionRegistry::Get(profile_)); DCHECK(profile_); - PublisherBase::Initialize(proxy()->AppService(), mojom_app_type()); + PublisherBase::Initialize(proxy()->AppService(), + apps::mojom::AppType::kChromeApp); // Publish apps after all extensions have been loaded, to include all apps // including the disabled apps. @@ -421,7 +423,7 @@ } mojo::Remote<apps::mojom::Subscriber> subscriber( std::move(subscriber_remote)); - subscriber->OnApps(std::move(apps), mojom_app_type(), + subscriber->OnApps(std::move(apps), apps::mojom::AppType::kChromeApp, true /* should_notify_initialized */); subscribers_.Add(std::move(subscriber)); } @@ -620,7 +622,7 @@ } apps::mojom::AppPtr app = apps::mojom::App::New(); - app->app_type = mojom_app_type(); + app->app_type = apps::mojom::AppType::kChromeApp; app->app_id = extension->id(); app->last_launch_time = last_launch_time; @@ -641,7 +643,7 @@ } apps::mojom::AppPtr mojom_app = apps::mojom::App::New(); - mojom_app->app_type = mojom_app_type(); + mojom_app->app_type = apps::mojom::AppType::kChromeApp; mojom_app->app_id = extension->id(); mojom_app->readiness = apps::mojom::Readiness::kReady; mojom_app->name = extension->name(); @@ -688,13 +690,13 @@ } apps::mojom::AppPtr mojom_app = apps::mojom::App::New(); - mojom_app->app_type = mojom_app_type(); + mojom_app->app_type = apps::mojom::AppType::kChromeApp; mojom_app->app_id = extension->id(); mojom_app->readiness = mojom_readiness; PublisherBase::Publish(std::move(mojom_app), subscribers_); std::unique_ptr<App> app = AppPublisher::MakeApp( - app_type(), extension->id(), readiness, extension->name()); + AppType::kChromeApp, extension->id(), readiness, extension->name()); AppPublisher::Publish(std::move(app)); }
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_base.h b/chrome/browser/apps/app_service/publishers/extension_apps_base.h index cff13da..76b72227 100644 --- a/chrome/browser/apps/app_service/publishers/extension_apps_base.h +++ b/chrome/browser/apps/app_service/publishers/extension_apps_base.h
@@ -16,7 +16,6 @@ #include "chrome/browser/apps/app_service/app_icon/icon_key_util.h" #include "chrome/browser/apps/app_service/launch_result_type.h" #include "chrome/browser/apps/app_service/publishers/app_publisher.h" -#include "components/services/app_service/public/cpp/app_types.h" #include "components/services/app_service/public/cpp/publisher_base.h" #include "components/services/app_service/public/mojom/app_service.mojom.h" #include "components/services/app_service/public/mojom/types.mojom.h" @@ -57,7 +56,7 @@ public extensions::ExtensionPrefsObserver, public extensions::ExtensionRegistryObserver { public: - ExtensionAppsBase(AppServiceProxy* proxy, AppType app_type); + explicit ExtensionAppsBase(AppServiceProxy* proxy); ~ExtensionAppsBase() override; ExtensionAppsBase(const ExtensionAppsBase&) = delete; @@ -117,15 +116,6 @@ return icon_key_factory_; } - AppType app_type() { return app_type_; } - - mojom::AppType mojom_app_type() { - DCHECK(app_type_ == AppType::kChromeApp || - app_type_ == AppType::kExtension); - return app_type_ == AppType::kChromeApp ? mojom::AppType::kChromeApp - : mojom::AppType::kExtension; - } - private: // Holds onto a success/failure callback and invokes it with `false` if the // holding object is deleted before the callback is otherwise invoked. @@ -246,10 +236,6 @@ const raw_ptr<Profile> profile_; - // The app type published by this publisher. Must be either kChromeApp or - // kExtension. - AppType app_type_; - apps_util::IncrementingIconKeyFactory icon_key_factory_; base::ScopedObservation<extensions::ExtensionPrefs,
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc index 552f297a..febf9f192 100644 --- a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc +++ b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
@@ -101,10 +101,8 @@ namespace apps { -ExtensionAppsChromeOs::ExtensionAppsChromeOs(AppServiceProxy* proxy, - AppType app_type) - : ExtensionAppsBase(proxy, app_type), - instance_registry_(&proxy->InstanceRegistry()) { +ExtensionAppsChromeOs::ExtensionAppsChromeOs(AppServiceProxy* proxy) + : ExtensionAppsBase(proxy), instance_registry_(&proxy->InstanceRegistry()) { DCHECK(instance_registry_); } @@ -163,10 +161,6 @@ app_window_registry_.Observe(extensions::AppWindowRegistry::Get(profile())); - if (app_type() == AppType::kExtension) { - return; - } - media_dispatcher_.Observe(MediaCaptureDevicesDispatcher::GetInstance()); notification_display_service_.Observe( @@ -270,9 +264,9 @@ } constexpr bool kPaused = true; - PublisherBase::Publish( - paused_apps_.GetAppWithPauseStatus(mojom_app_type(), app_id, kPaused), - subscribers()); + PublisherBase::Publish(paused_apps_.GetAppWithPauseStatus( + apps::mojom::AppType::kChromeApp, app_id, kPaused), + subscribers()); if (!instance_registry_->ContainsAppId(app_id)) { return; @@ -290,9 +284,9 @@ } constexpr bool kPaused = false; - PublisherBase::Publish( - paused_apps_.GetAppWithPauseStatus(mojom_app_type(), app_id, kPaused), - subscribers()); + PublisherBase::Publish(paused_apps_.GetAppWithPauseStatus( + apps::mojom::AppType::kChromeApp, app_id, kPaused), + subscribers()); ash::app_time::AppTimeLimitInterface* app_time = ash::app_time::AppTimeLimitInterface::Get(profile()); @@ -552,9 +546,9 @@ app_notifications_.RemoveNotification(notification_id); for (const auto& app_id : app_ids) { - PublisherBase::Publish( - app_notifications_.GetAppWithHasBadgeStatus(mojom_app_type(), app_id), - subscribers()); + PublisherBase::Publish(app_notifications_.GetAppWithHasBadgeStatus( + apps::mojom::AppType::kChromeApp, app_id), + subscribers()); } } @@ -572,9 +566,9 @@ } app_notifications_.AddNotification(app_id, notification_id); - PublisherBase::Publish( - app_notifications_.GetAppWithHasBadgeStatus(mojom_app_type(), app_id), - subscribers()); + PublisherBase::Publish(app_notifications_.GetAppWithHasBadgeStatus( + apps::mojom::AppType::kChromeApp, app_id), + subscribers()); return true; } @@ -635,7 +629,7 @@ } apps::mojom::AppPtr app = apps::mojom::App::New(); - app->app_type = mojom_app_type(); + app->app_type = apps::mojom::AppType::kChromeApp; app->app_id = app_id; SetShowInFields(app, extension); PublisherBase::Publish(std::move(app), subscribers()); @@ -673,26 +667,25 @@ } bool ExtensionAppsChromeOs::Accepts(const extensions::Extension* extension) { - if (app_type() == AppType::kExtension) { - if (!extension->is_extension() || IsBlocklisted(extension->id())) { - return false; - } - // QuickOffice has file_handlers which we need to register. - if (extension->id() == extension_misc::kQuickOfficeComponentExtensionId) { - return true; - } - // Only accept extensions with file_browser_handlers. + // QuickOffice has file_handlers which we need to register. + if (extension->id() == extension_misc::kQuickOfficeComponentExtensionId) { + return true; + } + if (!extension->is_app() && !extension->is_extension()) { + return false; + } + if (IsBlocklisted(extension->id())) { + return false; + } + // Only accept extensions with file_browser_handlers. + if (extension->is_extension()) { FileBrowserHandler::List* handler_list = FileBrowserHandler::GetHandlers(extension); if (!handler_list) { return false; } - return true; } - if (!extension->is_app() || IsBlocklisted(extension->id())) { - return false; - } return !extension->from_bookmark(); } @@ -845,13 +838,13 @@ } apps::mojom::AppPtr mojom_app = apps::mojom::App::New(); - mojom_app->app_type = mojom_app_type(); + mojom_app->app_type = apps::mojom::AppType::kChromeApp; mojom_app->app_id = app_id; mojom_app->icon_key = icon_key_factory().MakeIconKey( GetIconEffects(extension, paused_apps_.IsPaused(app_id))); PublisherBase::Publish(std::move(mojom_app), subscribers()); - std::unique_ptr<App> app = std::make_unique<App>(app_type(), app_id); + std::unique_ptr<App> app = std::make_unique<App>(AppType::kChromeApp, app_id); app->icon_key = std::move(*icon_key_factory().CreateIconKey( GetIconEffects(extension, paused_apps_.IsPaused(app_id)))); AppPublisher::Publish(std::move(app)); @@ -867,10 +860,8 @@ } // ARC Play Store is not published by this publisher, but the window for Play - // Store should be able to be added to InstanceRegistry by the Chrome app - // publisher. - if (extension->id() == arc::kPlayStoreAppId && - app_type() != AppType::kExtension) { + // Store should be able to be added to InstanceRegistry. + if (extension->id() == arc::kPlayStoreAppId) { return true; }
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.h b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.h index f721ed6..5e16303 100644 --- a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.h +++ b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.h
@@ -22,7 +22,6 @@ #include "chrome/browser/notifications/notification_display_service.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" #include "components/prefs/pref_change_registrar.h" -#include "components/services/app_service/public/cpp/app_types.h" #include "components/services/app_service/public/cpp/instance.h" #include "components/services/app_service/public/cpp/instance_registry.h" #include "components/services/app_service/public/mojom/app_service.mojom.h" @@ -46,10 +45,8 @@ class PublisherHost; // An app publisher (in the App Service sense) of extension-backed apps for -// ChromeOS, including Chrome Apps (platform apps and legacy packaged apps), -// hosted apps (including desktop PWAs), and browser extensions. In Chrome OS, -// there are 2 ExtensionAppsChromeOs publishers for browser extensions and -// Chrome apps(including hosted apps) separately. +// ChromeOS, including Chrome Apps (platform apps and legacy packaged apps) and +// hosted apps (including desktop PWAs). // // In the future, desktop PWAs will be migrated to a new system. // @@ -61,7 +58,7 @@ public MediaCaptureDevicesDispatcher::Observer, public AppWebContentsData::Client { public: - ExtensionAppsChromeOs(AppServiceProxy* proxy, AppType app_type); + explicit ExtensionAppsChromeOs(AppServiceProxy* proxy); ~ExtensionAppsChromeOs() override; ExtensionAppsChromeOs(const ExtensionAppsChromeOs&) = delete;
diff --git a/chrome/browser/apps/intent_helper/intent_picker_internal.cc b/chrome/browser/apps/intent_helper/intent_picker_internal.cc index 6911013..5867954 100644 --- a/chrome/browser/apps/intent_helper/intent_picker_internal.cc +++ b/chrome/browser/apps/intent_helper/intent_picker_internal.cc
@@ -209,7 +209,6 @@ case mojom::AppType::kCrostini: case mojom::AppType::kPluginVm: case mojom::AppType::kChromeApp: - case mojom::AppType::kExtension: case mojom::AppType::kStandaloneBrowser: case mojom::AppType::kStandaloneBrowserChromeApp: case mojom::AppType::kRemote:
diff --git a/chrome/browser/ash/DEPS b/chrome/browser/ash/DEPS index 38cb2ad61..726523b 100644 --- a/chrome/browser/ash/DEPS +++ b/chrome/browser/ash/DEPS
@@ -43,6 +43,11 @@ "device_status_collector_browsertest.cc": [ "+mojo/core/embedder/embedder.h", ], + # TODO(b/209791738): Remove chrome/browser/ui dependencies from + # chrome/browser/ash/arc. + "arc/icon_decode_request.cc": [ + "+chrome/browser/ui/app_list/md_icon_normalizer.h", + ], "legacy_device_status_collector_browsertest.cc": [ "+mojo/core/embedder/embedder.h", ],
diff --git a/chrome/browser/ash/app_restore/app_launch_handler.cc b/chrome/browser/ash/app_restore/app_launch_handler.cc index fbf50e9..d9da363 100644 --- a/chrome/browser/ash/app_restore/app_launch_handler.cc +++ b/chrome/browser/ash/app_restore/app_launch_handler.cc
@@ -46,7 +46,6 @@ case apps::mojom::AppType::kStandaloneBrowserChromeApp: case apps::mojom::AppType::kRemote: case apps::mojom::AppType::kBorealis: - case apps::mojom::AppType::kExtension: return apps::AppTypeName::kUnknown; case apps::mojom::AppType::kSystemWeb: return apps::AppTypeName::kSystemWeb; @@ -177,7 +176,6 @@ case apps::mojom::AppType::kStandaloneBrowserChromeApp: case apps::mojom::AppType::kRemote: case apps::mojom::AppType::kBorealis: - case apps::mojom::AppType::kExtension: NOTREACHED(); break; }
diff --git a/chrome/browser/ash/arc/screen_capture/OWNERS b/chrome/browser/ash/arc/screen_capture/OWNERS index beda97fb..a5be881 100644 --- a/chrome/browser/ash/arc/screen_capture/OWNERS +++ b/chrome/browser/ash/arc/screen_capture/OWNERS
@@ -1 +1,3 @@ -jkardatzke@chromium.org +lpique@chromium.org +domlaskowski@chromium.org +jkardatzke@google.com \ No newline at end of file
diff --git a/chrome/browser/ash/child_accounts/family_user_app_metrics.cc b/chrome/browser/ash/child_accounts/family_user_app_metrics.cc index 9f633967..3babaa29 100644 --- a/chrome/browser/ash/child_accounts/family_user_app_metrics.cc +++ b/chrome/browser/ash/child_accounts/family_user_app_metrics.cc
@@ -63,9 +63,6 @@ const char* GetAppsCountHistogramName(apps::mojom::AppType app_type) { switch (app_type) { case apps::mojom::AppType::kUnknown: - // Extensions are recorded separately, and AppService only has some - // extensions with file browser handlers. - case apps::mojom::AppType::kExtension: return kUnknownAppsCountHistogramName; case apps::mojom::AppType::kArc: return kArcAppsCountHistogramName; @@ -159,11 +156,6 @@ void FamilyUserAppMetrics::OnAppTypeInitialized(apps::mojom::AppType app_type) { DCHECK(!base::Contains(ready_app_types_, app_type)); - // Skip the extension app type, because extensions are recorded separately, - // and AppService only has some extensions with file browser handlers. - if (app_type == apps::mojom::AppType::kExtension) - return; - ready_app_types_.insert(app_type); if (should_record_metrics_on_new_day_) RecordRecentlyUsedAppsCount(app_type);
diff --git a/chrome/browser/ash/child_accounts/time_limits/app_types.cc b/chrome/browser/ash/child_accounts/time_limits/app_types.cc index 4272a464..13d0c22 100644 --- a/chrome/browser/ash/child_accounts/time_limits/app_types.cc +++ b/chrome/browser/ash/child_accounts/time_limits/app_types.cc
@@ -23,7 +23,6 @@ case apps::mojom::AppType::kWeb: return "Web"; case apps::mojom::AppType::kChromeApp: - case apps::mojom::AppType::kExtension: case apps::mojom::AppType::kStandaloneBrowserChromeApp: return "Extension"; case apps::mojom::AppType::kBuiltIn:
diff --git a/chrome/browser/ash/file_manager/app_service_file_tasks.cc b/chrome/browser/ash/file_manager/app_service_file_tasks.cc index f969740..bb69172 100644 --- a/chrome/browser/ash/file_manager/app_service_file_tasks.cc +++ b/chrome/browser/ash/file_manager/app_service_file_tasks.cc
@@ -62,7 +62,6 @@ case apps::mojom::AppType::kSystemWeb: return TASK_TYPE_WEB_APP; case apps::mojom::AppType::kChromeApp: - case apps::mojom::AppType::kExtension: case apps::mojom::AppType::kStandaloneBrowserChromeApp: // Chrome apps and Extensions both get called file_handler, even though // extensions really have file_browser_handler. It doesn't matter anymore @@ -176,10 +175,8 @@ app_type == apps::mojom::AppType::kWeb || app_type == apps::mojom::AppType::kSystemWeb || app_type == apps::mojom::AppType::kChromeApp || - app_type == apps::mojom::AppType::kExtension || - app_type == apps::mojom::AppType::kStandaloneBrowserChromeApp)) { + app_type == apps::mojom::AppType::kStandaloneBrowserChromeApp)) continue; - } if (app_type == apps::mojom::AppType::kWeb || app_type == apps::mojom::AppType::kSystemWeb) { @@ -211,8 +208,7 @@ continue; } - if (app_type == apps::mojom::AppType::kChromeApp || - app_type == apps::mojom::AppType::kExtension) { + if (app_type == apps::mojom::AppType::kChromeApp) { if (profile->IsOffTheRecord() && !extensions::util::IsIncognitoEnabled(launch_entry.app_id, profile)) continue;
diff --git a/chrome/browser/ash/file_manager/prefs_migration_uma.h b/chrome/browser/ash/file_manager/prefs_migration_uma.h new file mode 100644 index 0000000..66d29fb --- /dev/null +++ b/chrome/browser/ash/file_manager/prefs_migration_uma.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_ASH_FILE_MANAGER_PREFS_MIGRATION_UMA_H_ +#define CHROME_BROWSER_ASH_FILE_MANAGER_PREFS_MIGRATION_UMA_H_ + +namespace file_manager { + +// These are used in histograms, do not remove/renumber entries. If you're +// adding to this enum with the intention that it will be logged, update the +// FileManagerPrefsMigrationStatus enum listing in +// tools/metrics/histograms/enums.xml. +enum class FileManagerPrefsMigrationStatus { + kSuccess = 0, + kFailNoExistingPreferences = 1, + kFailMigratingPreferences = 2, + kMaxValue = kFailMigratingPreferences, +}; + +extern const char kPrefsMigrationStatusUMA[] = + "FileBrowser.SWA.PrefsMigrationStatus"; + +} // namespace file_manager + +#endif // CHROME_BROWSER_ASH_FILE_MANAGER_PREFS_MIGRATION_UMA_H_
diff --git a/chrome/browser/ash/login/gaia_reauth_token_fetcher.cc b/chrome/browser/ash/login/gaia_reauth_token_fetcher.cc index 5539be2..b432797 100644 --- a/chrome/browser/ash/login/gaia_reauth_token_fetcher.cc +++ b/chrome/browser/ash/login/gaia_reauth_token_fetcher.cc
@@ -7,9 +7,12 @@ #include <string> #include "ash/constants/ash_switches.h" +#include "base/bind.h" #include "base/callback.h" #include "base/command_line.h" #include "base/json/json_reader.h" +#include "base/metrics/histogram_functions.h" +#include "base/time/time.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/net/system_network_context_manager.h" #include "google_apis/google_api_keys.h" @@ -30,6 +33,8 @@ "https://staging-chromeoslogin-pa.sandbox.googleapis.com/v1/rart"; const char kApiKeyParameter[] = "key"; +constexpr base::TimeDelta kWaitTimeout = base::Seconds(5); + GURL GetFetchReauthTokenUrl() { GURL url = base::CommandLine::ForCurrentProcess()->HasSwitch( @@ -93,11 +98,13 @@ simple_url_loader_ = network::SimpleURLLoader::Create( std::move(resource_request), traffic_annotation); simple_url_loader_->SetAllowHttpErrorResults(true); + simple_url_loader_->SetTimeoutDuration(kWaitTimeout); simple_url_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( g_browser_process->system_network_context_manager() ->GetURLLoaderFactory(), base::BindOnce(&GaiaReauthTokenFetcher::OnSimpleLoaderComplete, weak_ptr_factory_.GetWeakPtr())); + fetch_timer_ = std::make_unique<base::ElapsedTimer>(); } void GaiaReauthTokenFetcher::OnSimpleLoaderComplete( @@ -117,6 +124,8 @@ message_value->FindStringKey("encodedReauthRequestToken"); if (token != nullptr) { VLOG(1) << "Successfully fetched reauth request token."; + base::UmaHistogramTimes("Login.ReauthToken.FetchDuration.Success", + fetch_timer_->Elapsed()); std::move(callback_).Run(*token); return; } else { @@ -129,6 +138,8 @@ } else { LOG(WARNING) << "Failed to fetch reauth request token."; } + base::UmaHistogramTimes("Login.ReauthToken.FetchDuration.Failure", + fetch_timer_->Elapsed()); std::move(callback_).Run(/*token=*/std::string()); }
diff --git a/chrome/browser/ash/login/gaia_reauth_token_fetcher.h b/chrome/browser/ash/login/gaia_reauth_token_fetcher.h index 4c378b8..061b8f3 100644 --- a/chrome/browser/ash/login/gaia_reauth_token_fetcher.h +++ b/chrome/browser/ash/login/gaia_reauth_token_fetcher.h
@@ -10,6 +10,7 @@ #include "base/callback.h" #include "base/memory/weak_ptr.h" +#include "base/timer/elapsed_timer.h" #include "services/network/public/cpp/simple_url_loader.h" namespace ash { @@ -33,7 +34,7 @@ void Fetch(); private: - // Handles responses from the SimpleURLLoader + // Handles responses from the SimpleURLLoader. void OnSimpleLoaderComplete(std::unique_ptr<std::string> response_body); // Called at the end of Fetch(). @@ -41,6 +42,9 @@ std::unique_ptr<network::SimpleURLLoader> simple_url_loader_; + // Used for metrics: + std::unique_ptr<base::ElapsedTimer> fetch_timer_; + base::WeakPtrFactory<GaiaReauthTokenFetcher> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ash/login/oobe_quick_start/OWNERS b/chrome/browser/ash/login/oobe_quick_start/OWNERS new file mode 100644 index 0000000..bc0f79ba --- /dev/null +++ b/chrome/browser/ash/login/oobe_quick_start/OWNERS
@@ -0,0 +1,2 @@ +rrsilva@google.com +rsorokin@chromium.org
diff --git a/chrome/browser/ash/login/oobe_quick_start/verification_shapes.cc b/chrome/browser/ash/login/oobe_quick_start/verification_shapes.cc new file mode 100644 index 0000000..1327ffb --- /dev/null +++ b/chrome/browser/ash/login/oobe_quick_start/verification_shapes.cc
@@ -0,0 +1,34 @@ +// 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/ash/login/oobe_quick_start/verification_shapes.h" + +#include <cstdint> + +#include "base/containers/span.h" +#include "base/hash/sha1.h" + +namespace ash { +namespace quick_start { + +ShapeHolder::ShapeHolder(int firstByte, int secondByte) + : shape(static_cast<Shape>((firstByte & 0xC0) >> 6)), + color(static_cast<Color>((firstByte & 0x30) >> 4)), + digit(std::abs(((firstByte << 8) | secondByte) % 10)) {} + +ShapeList GenerateShapes(const std::string& token) { + auto bytes = base::as_bytes(base::make_span(token.cbegin(), token.cend())); + base::SHA1Digest digest = base::SHA1HashSpan(bytes); + return {ShapeHolder{static_cast<int8_t>(digest[0]), + static_cast<int8_t>(digest[1])}, + ShapeHolder{static_cast<int8_t>(digest[2]), + static_cast<int8_t>(digest[3])}, + ShapeHolder{static_cast<int8_t>(digest[4]), + static_cast<int8_t>(digest[5])}, + ShapeHolder{static_cast<int8_t>(digest[6]), + static_cast<int8_t>(digest[7])}}; +} + +} // namespace quick_start +} // namespace ash
diff --git a/chrome/browser/ash/login/oobe_quick_start/verification_shapes.h b/chrome/browser/ash/login/oobe_quick_start/verification_shapes.h new file mode 100644 index 0000000..0fe2b5b --- /dev/null +++ b/chrome/browser/ash/login/oobe_quick_start/verification_shapes.h
@@ -0,0 +1,47 @@ +// 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_ASH_LOGIN_OOBE_QUICK_START_VERIFICATION_SHAPES_H_ +#define CHROME_BROWSER_ASH_LOGIN_OOBE_QUICK_START_VERIFICATION_SHAPES_H_ + +#include <array> +#include <cstdint> +#include <string> + +namespace ash { +namespace quick_start { + +// See internal go/oobe-verification-shapes for details. +enum class Shape { + kCircle = 0, + kDiamond = 1, + kTriangle = 2, + kSquare = 3, +}; + +enum class Color { + kBlue = 0, + kRed = 1, + kGreen = 2, + kYellow = 3, +}; + +struct ShapeHolder { + ShapeHolder() = delete; + + ShapeHolder(int firstByte, int secondByte); + + const Shape shape; + const Color color; + const int8_t digit; +}; + +using ShapeList = std::array<ShapeHolder, 4>; + +ShapeList GenerateShapes(const std::string& token); + +} // namespace quick_start +} // namespace ash + +#endif // CHROME_BROWSER_ASH_LOGIN_OOBE_QUICK_START_VERIFICATION_SHAPES_H_
diff --git a/chrome/browser/ash/login/oobe_quick_start/verification_shapes_unittest.cc b/chrome/browser/ash/login/oobe_quick_start/verification_shapes_unittest.cc new file mode 100644 index 0000000..9f452ea --- /dev/null +++ b/chrome/browser/ash/login/oobe_quick_start/verification_shapes_unittest.cc
@@ -0,0 +1,36 @@ +// 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/ash/login/oobe_quick_start/verification_shapes.h" + +#include "base/hash/sha1.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash { +namespace quick_start { + +// See internal go/oobe-verification-shapes for details. +TEST(Verification, ShapesCompatibility) { + ShapeList shapes = GenerateShapes("ABC123"); + ASSERT_EQ(shapes.size(), 4u); + + EXPECT_EQ(shapes[0].shape, Shape::kDiamond); + EXPECT_EQ(shapes[0].color, Color::kGreen); + EXPECT_EQ(shapes[0].digit, 0u); + + EXPECT_EQ(shapes[1].shape, Shape::kTriangle); + EXPECT_EQ(shapes[1].color, Color::kBlue); + EXPECT_EQ(shapes[1].digit, 2u); + + EXPECT_EQ(shapes[2].shape, Shape::kSquare); + EXPECT_EQ(shapes[2].color, Color::kRed); + EXPECT_EQ(shapes[2].digit, 3u); + + EXPECT_EQ(shapes[3].shape, Shape::kTriangle); + EXPECT_EQ(shapes[3].color, Color::kBlue); + EXPECT_EQ(shapes[3].digit, 0u); +} + +} // namespace quick_start +} // namespace ash
diff --git a/chrome/browser/ash/policy/status_collector/app_info_generator.cc b/chrome/browser/ash/policy/status_collector/app_info_generator.cc index 91dbc7a..250a73b6 100644 --- a/chrome/browser/ash/policy/status_collector/app_info_generator.cc +++ b/chrome/browser/ash/policy/status_collector/app_info_generator.cc
@@ -70,7 +70,6 @@ return em::AppInfo::AppType::AppInfo_AppType_TYPE_BOREALIS; case apps::mojom::AppType::kMacOs: case apps::mojom::AppType::kStandaloneBrowser: - case apps::mojom::AppType::kExtension: case apps::mojom::AppType::kRemote: case apps::mojom::AppType::kUnknown: return em::AppInfo::AppType::AppInfo_AppType_TYPE_UNKNOWN;
diff --git a/chrome/browser/ash/preferences.cc b/chrome/browser/ash/preferences.cc index b8f4140..ebbdcdf 100644 --- a/chrome/browser/ash/preferences.cc +++ b/chrome/browser/ash/preferences.cc
@@ -488,6 +488,10 @@ registry->RegisterListPref( prefs::kFilesAppFolderShortcuts, user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF); + + registry->RegisterBooleanPref( + prefs::kFilesAppUIPrefsMigrated, false, + user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF); } void Preferences::InitUserPrefs(sync_preferences::PrefServiceSyncable* prefs) {
diff --git a/chrome/browser/ash/sharesheet/copy_to_clipboard_share_action.cc b/chrome/browser/ash/sharesheet/copy_to_clipboard_share_action.cc index d64b4bb8..60298e49 100644 --- a/chrome/browser/ash/sharesheet/copy_to_clipboard_share_action.cc +++ b/chrome/browser/ash/sharesheet/copy_to_clipboard_share_action.cc
@@ -9,10 +9,13 @@ #include "ash/public/cpp/toast_data.h" #include "ash/public/cpp/toast_manager.h" #include "ash/resources/vector_icons/vector_icons.h" +#include "base/containers/flat_set.h" +#include "base/strings/string_split.h" #include "chrome/browser/apps/app_service/file_utils.h" #include "chrome/browser/ash/file_manager/filesystem_api_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sharesheet/sharesheet_controller.h" +#include "chrome/browser/sharesheet/sharesheet_metrics.h" #include "chrome/browser/sharesheet/sharesheet_types.h" #include "chrome/browser/ui/ash/sharesheet/sharesheet_util.h" #include "chrome/grit/generated_resources.h" @@ -26,11 +29,48 @@ namespace { const char kToastId[] = "copy_to_clipboard_share_action"; const int kToastDurationMs = 2500; +const char kMimeTypeSeparator[] = "/"; + +::sharesheet::SharesheetMetrics::MimeType ConvertMimeTypeForMetrics( + std::string mime_type) { + std::vector<std::string> type = + base::SplitString(mime_type, kMimeTypeSeparator, base::TRIM_WHITESPACE, + base::SPLIT_WANT_NONEMPTY); + if (type.size() == 0) { + return ::sharesheet::SharesheetMetrics::MimeType::kUnknown; + } + + if (type[0] == "text") { + return ::sharesheet::SharesheetMetrics::MimeType::kTextFile; + } else if (type[0] == "image") { + return ::sharesheet::SharesheetMetrics::MimeType::kImageFile; + } else if (type[0] == "video") { + return ::sharesheet::SharesheetMetrics::MimeType::kVideoFile; + } else if (type[0] == "audio") { + return ::sharesheet::SharesheetMetrics::MimeType::kAudioFile; + } else if (mime_type == "application/pdf") { + return ::sharesheet::SharesheetMetrics::MimeType::kPdfFile; + } else { + return ::sharesheet::SharesheetMetrics::MimeType::kUnknown; + } +} + +void RecordMimeTypes( + const base::flat_set<::sharesheet::SharesheetMetrics::MimeType>& + mime_types_to_record) { + for (auto& mime_type : mime_types_to_record) { + ::sharesheet::SharesheetMetrics::RecordCopyToClipboardShareActionMimeType( + mime_type); + } +} + } // namespace namespace ash { namespace sharesheet { +using ::sharesheet::SharesheetMetrics; + CopyToClipboardShareAction::CopyToClipboardShareAction(Profile* profile) : profile_(profile) {} @@ -50,6 +90,7 @@ views::View* root_view, apps::mojom::IntentPtr intent) { ui::ScopedClipboardWriter clipboard_writer(ui::ClipboardBuffer::kCopyPaste); + base::flat_set<SharesheetMetrics::MimeType> mime_types_to_record; if (intent->share_text.has_value()) { apps_util::SharedText extracted_text = @@ -57,6 +98,7 @@ if (!extracted_text.text.empty()) { clipboard_writer.WriteText(base::UTF8ToUTF16(extracted_text.text)); + mime_types_to_record.insert(SharesheetMetrics::MimeType::kText); } if (!extracted_text.url.is_empty()) { @@ -66,6 +108,7 @@ anchor_text = intent->share_title.value(); } clipboard_writer.WriteText(base::UTF8ToUTF16(extracted_text.url.spec())); + mime_types_to_record.insert(SharesheetMetrics::MimeType::kUrl); } } @@ -80,11 +123,16 @@ if (!file_manager::util::IsNonNativeFileSystemType(file_url.type())) { file_infos.emplace_back( ui::FileInfo(file_url.path(), base::FilePath())); + if (file->mime_type.has_value()) + mime_types_to_record.insert( + ConvertMimeTypeForMetrics(file->mime_type.value())); } } clipboard_writer.WriteFilenames(ui::FileInfosToURIList(file_infos)); } + RecordMimeTypes(mime_types_to_record); + if (controller) { controller->CloseBubble(::sharesheet::SharesheetResult::kSuccess); }
diff --git a/chrome/browser/ash/sharesheet/copy_to_clipboard_share_action_unittest.cc b/chrome/browser/ash/sharesheet/copy_to_clipboard_share_action_unittest.cc index b72e18f..88de7bb0 100644 --- a/chrome/browser/ash/sharesheet/copy_to_clipboard_share_action_unittest.cc +++ b/chrome/browser/ash/sharesheet/copy_to_clipboard_share_action_unittest.cc
@@ -4,8 +4,10 @@ #include "chrome/browser/ash/sharesheet/copy_to_clipboard_share_action.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/sharesheet/share_action/share_action_cache.h" +#include "chrome/browser/sharesheet/sharesheet_metrics.h" #include "chrome/browser/sharesheet/sharesheet_test_util.h" #include "chrome/common/chrome_features.h" #include "chrome/grit/generated_resources.h" @@ -63,6 +65,7 @@ }; TEST_F(CopyToClipboardShareActionTest, CopyToClipboardText) { + base::HistogramTester histograms; auto* copy_action = share_action_cache()->GetActionFromName(l10n_util::GetStringUTF16( IDS_SHARESHEET_COPY_TO_CLIPBOARD_SHARE_ACTION_LABEL)); @@ -74,9 +77,13 @@ ui::ClipboardBuffer::kCopyPaste, /* data_dst = */ nullptr, &clipboard_text); EXPECT_EQ(::sharesheet::kTestText, base::UTF16ToUTF8(clipboard_text)); + histograms.ExpectBucketCount( + ::sharesheet::kSharesheetCopyToClipboardMimeTypeResultHistogram, + ::sharesheet::SharesheetMetrics::MimeType::kText, 1); } TEST_F(CopyToClipboardShareActionTest, CopyToClipboardUrl) { + base::HistogramTester histograms; auto* copy_action = share_action_cache()->GetActionFromName(l10n_util::GetStringUTF16( IDS_SHARESHEET_COPY_TO_CLIPBOARD_SHARE_ACTION_LABEL)); @@ -88,9 +95,13 @@ ui::ClipboardBuffer::kCopyPaste, /* data_dst = */ nullptr, &clipboard_url); EXPECT_EQ(::sharesheet::kTestUrl, base::UTF16ToUTF8(clipboard_url)); + histograms.ExpectBucketCount( + ::sharesheet::kSharesheetCopyToClipboardMimeTypeResultHistogram, + ::sharesheet::SharesheetMetrics::MimeType::kUrl, 1); } TEST_F(CopyToClipboardShareActionTest, CopyToClipboardOneFile) { + base::HistogramTester histograms; auto* copy_action = share_action_cache()->GetActionFromName(l10n_util::GetStringUTF16( IDS_SHARESHEET_COPY_TO_CLIPBOARD_SHARE_ACTION_LABEL)); @@ -107,9 +118,13 @@ ui::ClipboardBuffer::kCopyPaste, /* data_dst = */ nullptr, &filenames); EXPECT_EQ(filenames.size(), 1u); EXPECT_EQ(url.path(), filenames[0].path); + histograms.ExpectBucketCount( + ::sharesheet::kSharesheetCopyToClipboardMimeTypeResultHistogram, + ::sharesheet::SharesheetMetrics::MimeType::kTextFile, 1); } TEST_F(CopyToClipboardShareActionTest, CopyToClipboardMultipleFiles) { + base::HistogramTester histograms; auto* copy_action = share_action_cache()->GetActionFromName(l10n_util::GetStringUTF16( IDS_SHARESHEET_COPY_TO_CLIPBOARD_SHARE_ACTION_LABEL)); @@ -130,6 +145,12 @@ EXPECT_EQ(filenames.size(), 2u); EXPECT_EQ(url1.path(), filenames[0].path); EXPECT_EQ(url2.path(), filenames[1].path); + histograms.ExpectBucketCount( + ::sharesheet::kSharesheetCopyToClipboardMimeTypeResultHistogram, + ::sharesheet::SharesheetMetrics::MimeType::kTextFile, 1); + histograms.ExpectBucketCount( + ::sharesheet::kSharesheetCopyToClipboardMimeTypeResultHistogram, + ::sharesheet::SharesheetMetrics::MimeType::kPdfFile, 1); } TEST_F(CopyToClipboardShareActionTest, @@ -195,5 +216,31 @@ {::sharesheet::kMimeTypePdf, ::sharesheet::kMimeTypeText})); } +TEST_F(CopyToClipboardShareActionTest, CopyToClipboardMultipleImageFiles) { + base::HistogramTester histograms; + auto* copy_action = + share_action_cache()->GetActionFromName(l10n_util::GetStringUTF16( + IDS_SHARESHEET_COPY_TO_CLIPBOARD_SHARE_ACTION_LABEL)); + storage::FileSystemURL url1 = ::sharesheet::FileInDownloads( + profile(), base::FilePath("path/to/image1.png")); + storage::FileSystemURL url2 = ::sharesheet::FileInDownloads( + profile(), base::FilePath("path/to/image2.jpg")); + copy_action->LaunchAction( + /*controller=*/nullptr, /*root_view=*/nullptr, + apps_util::CreateShareIntentFromFiles({url1.ToGURL(), url2.ToGURL()}, + {"image/png", "image/jpg"})); + + // Check filenames copied correctly. + std::vector<ui::FileInfo> filenames; + ui::Clipboard::GetForCurrentThread()->ReadFilenames( + ui::ClipboardBuffer::kCopyPaste, /* data_dst = */ nullptr, &filenames); + EXPECT_EQ(filenames.size(), 2u); + EXPECT_EQ(url1.path(), filenames[0].path); + EXPECT_EQ(url2.path(), filenames[1].path); + histograms.ExpectBucketCount( + ::sharesheet::kSharesheetCopyToClipboardMimeTypeResultHistogram, + ::sharesheet::SharesheetMetrics::MimeType::kImageFile, 1); +} + } // namespace sharesheet } // namespace ash
diff --git a/chrome/browser/ash/usb/cros_usb_detector.cc b/chrome/browser/ash/usb/cros_usb_detector.cc index c144b2c4..fa6263c 100644 --- a/chrome/browser/ash/usb/cros_usb_detector.cc +++ b/chrome/browser/ash/usb/cros_usb_detector.cc
@@ -287,7 +287,8 @@ chromeos::settings::mojom::kPluginVmUsbPreferencesSubpagePath; } - if (IsPlayStoreEnabledWithArcVmForProfile(profile())) { + if (IsPlayStoreEnabledWithArcVmForProfile(profile()) && + base::FeatureList::IsEnabled(arc::kUsbDeviceDefaultAttachToArcVm)) { vm_name = l10n_util::GetStringUTF16(IDS_CROSUSB_NOTIFICATION_ARCVM); vm_name_button_text = l10n_util::GetStringUTF16(IDS_CROSUSB_NOTIFICATION_ARCVM_BUTTON); @@ -504,7 +505,8 @@ bool CrosUsbDetector::ShouldShowNotification(const UsbDevice& device) { if (!crostini::CrostiniFeatures::Get()->IsEnabled(profile()) && !plugin_vm::PluginVmFeatures::Get()->IsEnabled(profile()) && - !IsPlayStoreEnabledWithArcVmForProfile(profile())) { + !(IsPlayStoreEnabledWithArcVmForProfile(profile()) && + base::FeatureList::IsEnabled(arc::kUsbDeviceDefaultAttachToArcVm))) { return false; } if (!device.shareable) { @@ -620,7 +622,6 @@ // Copy fields prior to moving |device_info| and |new_device|. std::string guid = device_info->guid; std::u16string label = new_device.label; - uint32_t allowed_interfaces_mask = new_device.allowed_interfaces_mask; new_device.info = std::move(device_info); auto result = usb_devices_.emplace(guid, std::move(new_device)); @@ -632,20 +633,6 @@ SignalUsbDeviceObservers(); - // Temporarily allow User to attach un claimed USB devices to ARC VM. - // This part as well as the emperiment flag should go away once UI permission - // is integrated in |ShowNotificationForDevice|. - if (arc::IsArcVmEnabled() && - base::FeatureList::IsEnabled(arc::kUsbDeviceDefaultAttachToArcVm)) { - if (has_supported_interface || allowed_interfaces_mask != 0) { - // USB devices not claimed by Chrome OS get automatically attached to the - // ARCVM. Note that this relies on the underlying VM (ARCVM) having - // its own permission model to restrict access to the device. - AttachUsbDeviceToVm(arc::kArcVmName, guid, base::DoNothing()); - return; - } - } - // Some devices should not trigger the notification. if (hide_notification || !ShouldShowNotification(result.first->second)) { VLOG(1) << "Not showing USB notification for " << label;
diff --git a/chrome/browser/ash/usb/cros_usb_detector_unittest.cc b/chrome/browser/ash/usb/cros_usb_detector_unittest.cc index c7d99be..8df75954 100644 --- a/chrome/browser/ash/usb/cros_usb_detector_unittest.cc +++ b/chrome/browser/ash/usb/cros_usb_detector_unittest.cc
@@ -378,13 +378,16 @@ device_manager_.RemoveDevice(device); base::RunLoop().RunUntilIdle(); - // Should have 3 buttions when ARCVM is enabled and user enables ARC. + // Should have 2 buttions when ARCVM is enabled and user enables ARC but the + // feature is disabled. + // Update this test when the kUsbDeviceDefaultAttachToArcVm is enabled + // by default or removed. ASSERT_TRUE(arc::SetArcPlayStoreEnabledForProfile(profile(), true)); device_manager_.AddDevice(device); base::RunLoop().RunUntilIdle(); notification = display_service_->GetNotification(notification_id); ASSERT_TRUE(notification); - EXPECT_EQ(notification->buttons().size(), 3u); + EXPECT_EQ(notification->buttons().size(), 2u); } TEST_F(CrosUsbDetectorTest, UsbNotificationClicked) {
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc b/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc index 8b18f66..eca87a4a 100644 --- a/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc +++ b/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
@@ -6,7 +6,6 @@ #include "base/strings/string_util.h" #include "build/build_config.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/external_protocol/external_protocol_handler.h" #include "chrome/browser/profiles/profile.h" @@ -17,6 +16,7 @@ #if defined(OS_ANDROID) #include "chrome/browser/ui/android/omnibox/jni_headers/ChromeAutocompleteSchemeClassifier_jni.h" #endif +#include "components/custom_handlers/protocol_handler_registry.h" #include "content/public/common/url_constants.h" #include "url/url_util.h" @@ -64,8 +64,9 @@ // Also check for schemes registered via registerProtocolHandler(), which // can be handled by web pages/apps. - ProtocolHandlerRegistry* registry = profile_ ? - ProtocolHandlerRegistryFactory::GetForBrowserContext(profile_) : NULL; + custom_handlers::ProtocolHandlerRegistry* registry = + profile_ ? ProtocolHandlerRegistryFactory::GetForBrowserContext(profile_) + : NULL; if (registry && registry->IsHandledProtocol(scheme)) return metrics::OmniboxInputType::URL;
diff --git a/chrome/browser/browser_features.cc b/chrome/browser/browser_features.cc index 9b3464bd..17ced6e 100644 --- a/chrome/browser/browser_features.cc +++ b/chrome/browser/browser_features.cc
@@ -30,6 +30,11 @@ const base::Feature kDestroyProfileOnBrowserClose{ "DestroyProfileOnBrowserClose", base::FEATURE_DISABLED_BY_DEFAULT}; +// Nukes profile directory before creating a new profile using +// ProfileManager::CreateMultiProfileAsync(). +const base::Feature kNukeProfileBeforeCreateMultiAsync{ + "NukeProfileBeforeCreateMultiAsync", base::FEATURE_ENABLED_BY_DEFAULT}; + // Enables executing the browser commands sent by the NTP promos. const base::Feature kPromoBrowserCommands{"PromoBrowserCommands", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chrome/browser/browser_features.h b/chrome/browser/browser_features.h index 8935581e..61ffd30 100644 --- a/chrome/browser/browser_features.h +++ b/chrome/browser/browser_features.h
@@ -23,6 +23,8 @@ extern const base::Feature kDestroyProfileOnBrowserClose; +extern const base::Feature kNukeProfileBeforeCreateMultiAsync; + extern const base::Feature kPromoBrowserCommands; extern const char kBrowserCommandIdParam[];
diff --git a/chrome/browser/browser_process_platform_part_chromeos.cc b/chrome/browser/browser_process_platform_part_chromeos.cc index 88dbf605..9682d86 100644 --- a/chrome/browser/browser_process_platform_part_chromeos.cc +++ b/chrome/browser/browser_process_platform_part_chromeos.cc
@@ -37,7 +37,6 @@ #include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/component_updater/metadata_table_chromeos.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/prefs/session_startup_pref.h" #include "chrome/browser/profiles/profile.h" @@ -53,6 +52,7 @@ #include "chrome/common/chrome_switches.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "components/app_restore/features.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/keep_alive_registry/keep_alive_types.h" #include "components/keep_alive_registry/scoped_keep_alive.h" #include "components/keyed_service/content/browser_context_keyed_service_shutdown_notifier_factory.h" @@ -162,7 +162,7 @@ for (const auto& url : pref.urls) urls.push_back(url); - ProtocolHandlerRegistry* registry = + custom_handlers::ProtocolHandlerRegistry* registry = ProtocolHandlerRegistryFactory::GetForBrowserContext(browser->profile()); for (const GURL& url : urls) { // We skip URLs that we'd have to launch an external protocol handler for.
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc index 4cc1819..7e8b10d 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -32,7 +32,6 @@ #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/crash_upload_list/crash_upload_list.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.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" @@ -93,6 +92,7 @@ #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_pattern.h" #include "components/crash/core/app/crashpad.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc index 661048d..6217cf27 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -39,7 +39,6 @@ #include "chrome/browser/browsing_data/chrome_browsing_data_remover_constants.h" #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_factory.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/custom_handlers/test_protocol_handler_registry_delegate.h" #include "chrome/browser/domain_reliability/service_factory.h" @@ -90,6 +89,7 @@ #include "components/content_settings/core/browser/website_settings_registry.h" #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_pattern.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/domain_reliability/clear_mode.h" #include "components/domain_reliability/monitor.h" #include "components/favicon/core/favicon_service.h" @@ -497,7 +497,7 @@ std::unique_ptr<KeyedService> BuildProtocolHandlerRegistry( content::BrowserContext* context) { Profile* profile = Profile::FromBrowserContext(context); - return std::make_unique<ProtocolHandlerRegistry>( + return std::make_unique<custom_handlers::ProtocolHandlerRegistry>( profile, std::make_unique<TestProtocolHandlerRegistryDelegate>()); } @@ -2341,10 +2341,10 @@ base::Time one_hour_ago = base::Time::Now() - base::Hours(1); base::Time yesterday = base::Time::Now() - base::Days(1); registry->OnAcceptRegisterProtocolHandler( - ProtocolHandler::CreateProtocolHandler("news", kOrigin)); + content::ProtocolHandler::CreateProtocolHandler("news", kOrigin)); registry->OnAcceptRegisterProtocolHandler( - ProtocolHandler("mailto", kOrigin, yesterday, - blink::ProtocolHandlerSecurityLevel::kStrict)); + content::ProtocolHandler("mailto", kOrigin, yesterday, + blink::ProtocolHandlerSecurityLevel::kStrict)); EXPECT_TRUE(registry->IsHandledProtocol("news")); EXPECT_TRUE(registry->IsHandledProtocol("mailto")); EXPECT_EQ(
diff --git a/chrome/browser/browsing_data/counters/site_settings_counter.cc b/chrome/browser/browsing_data/counters/site_settings_counter.cc index cbb39f89d..c42c611 100644 --- a/chrome/browser/browsing_data/counters/site_settings_counter.cc +++ b/chrome/browser/browsing_data/counters/site_settings_counter.cc
@@ -6,11 +6,11 @@ #include <set> #include "build/build_config.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/translate/chrome_translate_client.h" #include "components/browsing_data/core/pref_names.h" #include "components/content_settings/core/browser/content_settings_registry.h" #include "components/content_settings/core/common/content_settings_pattern.h" +#include "components/custom_handlers/protocol_handler_registry.h" #if !defined(OS_ANDROID) #include "content/public/browser/host_zoom_map.h" @@ -19,7 +19,7 @@ SiteSettingsCounter::SiteSettingsCounter( HostContentSettingsMap* map, content::HostZoomMap* zoom_map, - ProtocolHandlerRegistry* handler_registry, + custom_handlers::ProtocolHandlerRegistry* handler_registry, PrefService* pref_service) : map_(map), zoom_map_(zoom_map),
diff --git a/chrome/browser/browsing_data/counters/site_settings_counter.h b/chrome/browser/browsing_data/counters/site_settings_counter.h index 16fdbaf..ff997a4 100644 --- a/chrome/browser/browsing_data/counters/site_settings_counter.h +++ b/chrome/browser/browsing_data/counters/site_settings_counter.h
@@ -14,14 +14,17 @@ } class PrefService; +namespace custom_handlers { class ProtocolHandlerRegistry; +} class SiteSettingsCounter : public browsing_data::BrowsingDataCounter { public: - explicit SiteSettingsCounter(HostContentSettingsMap* map, - content::HostZoomMap* zoom_map, - ProtocolHandlerRegistry* handler_registry, - PrefService* pref_service); + explicit SiteSettingsCounter( + HostContentSettingsMap* map, + content::HostZoomMap* zoom_map, + custom_handlers::ProtocolHandlerRegistry* handler_registry, + PrefService* pref_service); ~SiteSettingsCounter() override; const char* GetPrefName() const override; @@ -33,7 +36,7 @@ scoped_refptr<HostContentSettingsMap> map_; raw_ptr<content::HostZoomMap> zoom_map_; - raw_ptr<ProtocolHandlerRegistry> handler_registry_; + raw_ptr<custom_handlers::ProtocolHandlerRegistry> handler_registry_; raw_ptr<PrefService> pref_service_; };
diff --git a/chrome/browser/browsing_data/counters/site_settings_counter_unittest.cc b/chrome/browser/browsing_data/counters/site_settings_counter_unittest.cc index cdc7abdc..6744530a 100644 --- a/chrome/browser/browsing_data/counters/site_settings_counter_unittest.cc +++ b/chrome/browser/browsing_data/counters/site_settings_counter_unittest.cc
@@ -14,13 +14,13 @@ #include "base/test/simple_test_clock.h" #include "build/build_config.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/custom_handlers/test_protocol_handler_registry_delegate.h" #include "chrome/browser/translate/chrome_translate_client.h" #include "chrome/test/base/testing_profile.h" #include "components/browsing_data/core/browsing_data_utils.h" #include "components/browsing_data/core/pref_names.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/prefs/pref_service.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" @@ -41,8 +41,9 @@ #else zoom_map_ = nullptr; #endif - handler_registry_ = std::make_unique<ProtocolHandlerRegistry>( - profile(), std::make_unique<TestProtocolHandlerRegistryDelegate>()); + handler_registry_ = + std::make_unique<custom_handlers::ProtocolHandlerRegistry>( + profile(), std::make_unique<TestProtocolHandlerRegistryDelegate>()); counter_ = std::make_unique<SiteSettingsCounter>( map(), zoom_map(), handler_registry(), profile_->GetPrefs()); @@ -61,7 +62,7 @@ content::HostZoomMap* zoom_map() { return zoom_map_; } - ProtocolHandlerRegistry* handler_registry() { + custom_handlers::ProtocolHandlerRegistry* handler_registry() { return handler_registry_.get(); } @@ -116,7 +117,7 @@ scoped_refptr<HostContentSettingsMap> map_; raw_ptr<content::HostZoomMap> zoom_map_; - std::unique_ptr<ProtocolHandlerRegistry> handler_registry_; + std::unique_ptr<custom_handlers::ProtocolHandlerRegistry> handler_registry_; std::unique_ptr<SiteSettingsCounter> counter_; bool finished_; browsing_data::BrowsingDataCounter::ResultInt result_;
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc index 092eb4e4..06dff05b 100644 --- a/chrome/browser/chrome_browser_interface_binders.cc +++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -140,6 +140,7 @@ #if !defined(OFFICIAL_BUILD) #include "chrome/browser/ui/webui/new_tab_page/foo/foo.mojom.h" // nogncheck crbug.com/1125897 #endif +#include "chrome/browser/history_clusters/history_clusters_service_factory.h" #include "chrome/browser/ui/webui/download_shelf/download_shelf.mojom.h" #include "chrome/browser/ui/webui/download_shelf/download_shelf_ui.h" #include "chrome/browser/ui/webui/history_clusters/history_clusters.mojom.h" @@ -154,7 +155,7 @@ #include "chrome/browser/ui/webui/tab_search/tab_search_ui.h" #include "chrome/browser/ui/webui/whats_new/whats_new_ui.h" #include "chrome/common/webui_url_constants.h" -#include "components/history_clusters/core/features.h" +#include "components/history_clusters/core/history_clusters_service.h" #include "components/search/ntp_features.h" #include "media/base/media_switches.h" #include "media/mojo/mojom/speech_recognition_service.mojom.h" @@ -673,7 +674,8 @@ } void PopulateChromeWebUIFrameBinders( - mojo::BinderMapWithContext<content::RenderFrameHost*>* map) { + mojo::BinderMapWithContext<content::RenderFrameHost*>* map, + content::RenderFrameHost* render_frame_host) { RegisterWebUIControllerInterfaceBinder<::mojom::BluetoothInternalsHandler, BluetoothInternalsUI>(map); @@ -727,7 +729,11 @@ most_visited::mojom::MostVisitedPageHandlerFactory, NewTabPageUI, NewTabPageThirdPartyUI>(map); - if (base::FeatureList::IsEnabled(history_clusters::kJourneys)) { + auto* history_clusters_service = + HistoryClustersServiceFactory::GetForBrowserContext( + render_frame_host->GetProcess()->GetBrowserContext()); + if (history_clusters_service && + history_clusters_service->IsJourneysEnabled()) { RegisterWebUIControllerInterfaceBinder<history_clusters::mojom::PageHandler, HistoryUI>(map); }
diff --git a/chrome/browser/chrome_browser_interface_binders.h b/chrome/browser/chrome_browser_interface_binders.h index 9132879..413dbc7 100644 --- a/chrome/browser/chrome_browser_interface_binders.h +++ b/chrome/browser/chrome_browser_interface_binders.h
@@ -35,7 +35,8 @@ // GetInterface() handler callbacks for chrome-specific document-scoped // interfaces used from WebUI pages (e.g. chrome://bluetooth-internals). void PopulateChromeWebUIFrameBinders( - mojo::BinderMapWithContext<content::RenderFrameHost*>* map); + mojo::BinderMapWithContext<content::RenderFrameHost*>* map, + content::RenderFrameHost* render_frame_host); // PopulateChromeWebUIFrameInterfaceBrokers registers BrowserInterfaceBrokers // for each WebUI, these brokers are used to handle that WebUI's JavaScript
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index afe26b1..d0eaa02 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -40,7 +40,6 @@ #include "chrome/browser/chrome_content_browser_client_parts.h" #include "chrome/browser/content_settings/cookie_settings_factory.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/data_use_measurement/chrome_data_use_measurement.h" #include "chrome/browser/defaults.h" @@ -180,6 +179,7 @@ #include "components/content_settings/core/browser/private_network_settings.h" #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_types.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h" #include "components/dom_distiller/core/dom_distiller_switches.h" #include "components/dom_distiller/core/url_constants.h" @@ -1082,7 +1082,7 @@ } // Do not launch external requests for schemes that have a handler registered. - ProtocolHandlerRegistry* protocol_handler_registry = + custom_handlers::ProtocolHandlerRegistry* protocol_handler_registry = ProtocolHandlerRegistryFactory::GetForBrowserContext( web_contents->GetBrowserContext()); if (protocol_handler_registry && @@ -1825,7 +1825,7 @@ bool ChromeContentBrowserClient::HasCustomSchemeHandler( content::BrowserContext* browser_context, const std::string& scheme) { - if (ProtocolHandlerRegistry* protocol_handler_registry = + if (custom_handlers::ProtocolHandlerRegistry* protocol_handler_registry = ProtocolHandlerRegistryFactory::GetForBrowserContext( browser_context)) { return protocol_handler_registry->IsHandledProtocol(scheme); @@ -4551,7 +4551,7 @@ class ProtocolHandlerThrottle : public blink::URLLoaderThrottle { public: explicit ProtocolHandlerThrottle( - ProtocolHandlerRegistry* protocol_handler_registry) + custom_handlers::ProtocolHandlerRegistry* protocol_handler_registry) : protocol_handler_registry_(protocol_handler_registry) { DCHECK(protocol_handler_registry); } @@ -4589,7 +4589,7 @@ *url = translated_url; } - raw_ptr<ProtocolHandlerRegistry> protocol_handler_registry_; + raw_ptr<custom_handlers::ProtocolHandlerRegistry> protocol_handler_registry_; }; } // namespace
diff --git a/chrome/browser/chrome_content_browser_client_browsertest.cc b/chrome/browser/chrome_content_browser_client_browsertest.cc index 2b4afb6..464c5e5 100644 --- a/chrome/browser/chrome_content_browser_client_browsertest.cc +++ b/chrome/browser/chrome_content_browser_client_browsertest.cc
@@ -17,7 +17,6 @@ #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" @@ -34,6 +33,7 @@ #include "chrome/common/url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/network_session_configurator/common/network_switches.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/prefs/pref_service.h" @@ -463,7 +463,7 @@ GURL(redirect_template))); } - ProtocolHandlerRegistry* protocol_handler_registry() { + custom_handlers::ProtocolHandlerRegistry* protocol_handler_registry() { return ProtocolHandlerRegistryFactory::GetInstance()->GetForBrowserContext( browser()->profile()); }
diff --git a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc index 65a49a5..272ddb9 100644 --- a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc +++ b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
@@ -324,7 +324,7 @@ content::RenderFrameHost* render_frame_host, mojo::BinderMapWithContext<content::RenderFrameHost*>* map) { chrome::internal::PopulateChromeFrameBinders(map, render_frame_host); - chrome::internal::PopulateChromeWebUIFrameBinders(map); + chrome::internal::PopulateChromeWebUIFrameBinders(map, render_frame_host); #if BUILDFLAG(ENABLE_EXTENSIONS) const GURL& site = render_frame_host->GetSiteInstance()->GetSiteURL();
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index bf0c750..05f760f63 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1470,6 +1470,7 @@ "../ash/file_manager/open_with_browser.h", "../ash/file_manager/path_util.cc", "../ash/file_manager/path_util.h", + "../ash/file_manager/prefs_migration_uma.h", "../ash/file_manager/select_file_dialog_util.cc", "../ash/file_manager/select_file_dialog_util.h", "../ash/file_manager/snapshot_manager.cc", @@ -1864,6 +1865,8 @@ "../ash/login/onboarding_user_activity_counter.h", "../ash/login/oobe_configuration.cc", "../ash/login/oobe_configuration.h", + "../ash/login/oobe_quick_start/verification_shapes.cc", + "../ash/login/oobe_quick_start/verification_shapes.h", "../ash/login/oobe_screen.cc", "../ash/login/oobe_screen.h", "../ash/login/profile_auth_data.cc", @@ -4226,6 +4229,7 @@ "../ash/login/hwid_checker_unittest.cc", "../ash/login/lock/screen_locker_unittest.cc", "../ash/login/onboarding_user_activity_counter_unittest.cc", + "../ash/login/oobe_quick_start/verification_shapes_unittest.cc", "../ash/login/profile_auth_data_unittest.cc", "../ash/login/quick_unlock/fingerprint_storage_unittest.cc", "../ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc",
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc index e318fa9..9f838df 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -360,8 +360,6 @@ // TODO(https://crbug.com/1225848): Figure out appropriate behavior for // Lacros-hosted chrome-apps. break; - case apps::mojom::AppType::kExtension: - break; } NOTREACHED(); return api::autotest_private::AppType::APP_TYPE_NONE;
diff --git a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller.cc b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller.cc index 85793b0..bd7395d8 100644 --- a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller.cc +++ b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller.cc
@@ -18,11 +18,16 @@ #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.h" #include "chrome/browser/profiles/profile_manager.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/url_constants.h" #include "extensions/common/constants.h" #include "ui/base/clipboard/clipboard.h" #include "ui/base/data_transfer_policy/data_transfer_endpoint.h" #include "url/gurl.h" +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "ash/webui/file_manager/url_constants.h" +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + namespace policy { namespace { @@ -63,12 +68,24 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) bool IsFilesApp(const ui::DataTransferEndpoint* const data_dst) { +#if BUILDFLAG(IS_CHROMEOS_ASH) if (!data_dst || !data_dst->IsUrlType()) return false; GURL url = data_dst->GetOrigin()->GetURL(); - return url.has_scheme() && url.SchemeIs(extensions::kExtensionScheme) && - url.has_host() && url.host() == extension_misc::kFilesManagerAppId; + // TODO(b/207576430): Once Files Extension is removed, remove this condition. + bool is_files_extension = + url.has_scheme() && url.SchemeIs(extensions::kExtensionScheme) && + url.has_host() && url.host() == extension_misc::kFilesManagerAppId; + bool is_files_swa = url.has_scheme() && + url.SchemeIs(content::kChromeUIScheme) && + url.has_host() && + url.host() == ash::file_manager::kChromeUIFileManagerHost; + + return is_files_extension || is_files_swa; +#else + return false; +#endif // BUILDFLAG(IS_CHROMEOS_ASH) } bool IsClipboardHistory(const ui::DataTransferEndpoint* const data_dst) {
diff --git a/chrome/browser/custom_handlers/chrome_protocol_handler_registry_delegate.h b/chrome/browser/custom_handlers/chrome_protocol_handler_registry_delegate.h index 361b412..d1a7719 100644 --- a/chrome/browser/custom_handlers/chrome_protocol_handler_registry_delegate.h +++ b/chrome/browser/custom_handlers/chrome_protocol_handler_registry_delegate.h
@@ -9,15 +9,15 @@ #include <string> #include "base/memory/weak_ptr.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/shell_integration.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/pref_registry/pref_registry_syncable.h" // This class implements the ProtocolHandlerRegistry::Delegate // abstract class to provide an OS dependent implementation to handle // the user preferences and deal with the //shell_integration module. class ChromeProtocolHandlerRegistryDelegate - : public ProtocolHandlerRegistry::Delegate { + : public custom_handlers::ProtocolHandlerRegistry::Delegate { public: ChromeProtocolHandlerRegistryDelegate(); ~ChromeProtocolHandlerRegistryDelegate() override;
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc b/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc index e138ca40..c862fd55 100644 --- a/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc +++ b/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
@@ -33,6 +33,7 @@ #endif using content::WebContents; +using custom_handlers::ProtocolHandlerRegistry; namespace { @@ -51,8 +52,8 @@ void OnProtocolHandlerRegistryChanged() override { run_loop_.Quit(); } private: - base::ScopedObservation<ProtocolHandlerRegistry, - ProtocolHandlerRegistry::Observer> + base::ScopedObservation<custom_handlers::ProtocolHandlerRegistry, + custom_handlers::ProtocolHandlerRegistry::Observer> registry_observation_{this}; base::RunLoop run_loop_; }; @@ -91,24 +92,24 @@ } void AddProtocolHandler(const std::string& protocol, const GURL& url) { - ProtocolHandler handler = ProtocolHandler::CreateProtocolHandler(protocol, - url); + ProtocolHandler handler = + ProtocolHandler::CreateProtocolHandler(protocol, url); ProtocolHandlerRegistry* registry = ProtocolHandlerRegistryFactory::GetForBrowserContext( browser()->profile()); // Fake that this registration is happening on profile startup. Otherwise // it'll try to register with the OS, which causes DCHECKs on Windows when // running as admin on Windows 7. - registry->is_loading_ = true; + registry->SetIsLoading(true); registry->OnAcceptRegisterProtocolHandler(handler); - registry->is_loading_ = false; + registry->SetIsLoading(true); ASSERT_TRUE(registry->IsHandledProtocol(protocol)); } void RemoveProtocolHandler(const std::string& protocol, const GURL& url) { - ProtocolHandler handler = ProtocolHandler::CreateProtocolHandler(protocol, - url); + ProtocolHandler handler = + ProtocolHandler::CreateProtocolHandler(protocol, url); ProtocolHandlerRegistry* registry = ProtocolHandlerRegistryFactory::GetForBrowserContext( browser()->profile());
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry_factory.cc b/chrome/browser/custom_handlers/protocol_handler_registry_factory.cc index ccb2573..fc024927a 100644 --- a/chrome/browser/custom_handlers/protocol_handler_registry_factory.cc +++ b/chrome/browser/custom_handlers/protocol_handler_registry_factory.cc
@@ -10,8 +10,8 @@ #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/custom_handlers/chrome_protocol_handler_registry_delegate.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/profiles/incognito_helpers.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" // static @@ -20,17 +20,17 @@ } // static -ProtocolHandlerRegistry* ProtocolHandlerRegistryFactory::GetForBrowserContext( +custom_handlers::ProtocolHandlerRegistry* +ProtocolHandlerRegistryFactory::GetForBrowserContext( content::BrowserContext* context) { - return static_cast<ProtocolHandlerRegistry*>( + return static_cast<custom_handlers::ProtocolHandlerRegistry*>( GetInstance()->GetServiceForBrowserContext(context, true)); } ProtocolHandlerRegistryFactory::ProtocolHandlerRegistryFactory() : BrowserContextKeyedServiceFactory( - "ProtocolHandlerRegistry", - BrowserContextDependencyManager::GetInstance()) { -} + "ProtocolHandlerRegistry", + BrowserContextDependencyManager::GetInstance()) {} ProtocolHandlerRegistryFactory::~ProtocolHandlerRegistryFactory() { } @@ -58,8 +58,9 @@ KeyedService* ProtocolHandlerRegistryFactory::BuildServiceInstanceFor( content::BrowserContext* context) const { - ProtocolHandlerRegistry* registry = new ProtocolHandlerRegistry( - context, std::make_unique<ChromeProtocolHandlerRegistryDelegate>()); + custom_handlers::ProtocolHandlerRegistry* registry = + new custom_handlers::ProtocolHandlerRegistry( + context, std::make_unique<ChromeProtocolHandlerRegistryDelegate>()); #if BUILDFLAG(IS_CHROMEOS_ASH) // If installing defaults, they must be installed prior calling
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry_factory.h b/chrome/browser/custom_handlers/protocol_handler_registry_factory.h index 5c5004c..dbb98388 100644 --- a/chrome/browser/custom_handlers/protocol_handler_registry_factory.h +++ b/chrome/browser/custom_handlers/protocol_handler_registry_factory.h
@@ -8,7 +8,9 @@ #include "components/keyed_service/content/browser_context_keyed_service_factory.h" class Profile; +namespace custom_handlers { class ProtocolHandlerRegistry; +} namespace base { template <typename T> struct DefaultSingletonTraits; @@ -25,7 +27,7 @@ // Returns the ProtocolHandlerRegistry that provides intent registration for // |context|. Ownership stays with this factory object. - static ProtocolHandlerRegistry* GetForBrowserContext( + static custom_handlers::ProtocolHandlerRegistry* GetForBrowserContext( content::BrowserContext* context); ProtocolHandlerRegistryFactory(const ProtocolHandlerRegistryFactory&) =
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc b/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc index bd5058bd..1dbe6d4 100644 --- a/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc +++ b/chrome/browser/custom_handlers/protocol_handler_registry_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/custom_handlers/protocol_handler_registry.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include <stddef.h> @@ -21,6 +21,8 @@ #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" +#include "components/custom_handlers/pref_names.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/sync_preferences/pref_service_syncable.h" #include "content/public/browser/browser_task_traits.h" @@ -32,6 +34,7 @@ using content::BrowserThread; using content::ProtocolHandler; +using custom_handlers::ProtocolHandlerRegistry; namespace { @@ -165,8 +168,6 @@ registry_observation_{this}; }; -} // namespace - class ProtocolHandlerRegistryTest : public testing::Test { protected: ProtocolHandlerRegistryTest() @@ -214,8 +215,8 @@ } int InPrefHandlerCount() { - const base::ListValue* in_pref_handlers = - profile()->GetPrefs()->GetList(prefs::kRegisteredProtocolHandlers); + const base::ListValue* in_pref_handlers = profile()->GetPrefs()->GetList( + custom_handlers::prefs::kRegisteredProtocolHandlers); return static_cast<int>(in_pref_handlers->GetList().size()); } @@ -229,7 +230,8 @@ int InPrefIgnoredHandlerCount() { const base::ListValue* in_pref_ignored_handlers = - profile()->GetPrefs()->GetList(prefs::kIgnoredProtocolHandlers); + profile()->GetPrefs()->GetList( + custom_handlers::prefs::kIgnoredProtocolHandlers); return static_cast<int>(in_pref_ignored_handlers->GetList().size()); } @@ -276,6 +278,8 @@ ProtocolHandler test_protocol_handler_; }; +} // namespace + TEST_F(ProtocolHandlerRegistryTest, AcceptProtocolHandlerHandlesProtocol) { ASSERT_FALSE(registry()->IsHandledProtocol("news")); registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler()); @@ -871,10 +875,12 @@ handlers_registered_by_policy.Append( GetProtocolHandlerValueWithDefault("mailto", URL_p3u1, true)); - profile()->GetPrefs()->Set(prefs::kRegisteredProtocolHandlers, - handlers_registered_by_pref); - profile()->GetPrefs()->Set(prefs::kPolicyRegisteredProtocolHandlers, - handlers_registered_by_policy); + profile()->GetPrefs()->Set( + custom_handlers::prefs::kRegisteredProtocolHandlers, + handlers_registered_by_pref); + profile()->GetPrefs()->Set( + custom_handlers::prefs::kPolicyRegisteredProtocolHandlers, + handlers_registered_by_policy); registry()->InitProtocolSettings(); // Duplicate p1u2 eliminated in memory but not yet saved in pref @@ -948,10 +954,11 @@ handlers_ignored_by_policy.Append(GetProtocolHandlerValue("news", URL_p1u3)); handlers_ignored_by_policy.Append(GetProtocolHandlerValue("im", URL_p2u1)); - profile()->GetPrefs()->Set(prefs::kIgnoredProtocolHandlers, + profile()->GetPrefs()->Set(custom_handlers::prefs::kIgnoredProtocolHandlers, handlers_ignored_by_pref); - profile()->GetPrefs()->Set(prefs::kPolicyIgnoredProtocolHandlers, - handlers_ignored_by_policy); + profile()->GetPrefs()->Set( + custom_handlers::prefs::kPolicyIgnoredProtocolHandlers, + handlers_ignored_by_policy); registry()->InitProtocolSettings(); // Duplicate p1u2 eliminated in memory but not yet saved in pref
diff --git a/chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc b/chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc index d57f9c9..fc3f85df 100644 --- a/chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc +++ b/chrome/browser/custom_handlers/register_protocol_handler_permission_request.cc
@@ -7,15 +7,15 @@ #include "base/bind.h" #include "base/metrics/user_metrics.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/grit/generated_resources.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/permissions/request_type.h" #include "ui/base/l10n/l10n_util.h" #include "url/gurl.h" RegisterProtocolHandlerPermissionRequest:: RegisterProtocolHandlerPermissionRequest( - ProtocolHandlerRegistry* registry, + custom_handlers::ProtocolHandlerRegistry* registry, const ProtocolHandler& handler, GURL url, base::ScopedClosureRunner fullscreen_block)
diff --git a/chrome/browser/custom_handlers/register_protocol_handler_permission_request.h b/chrome/browser/custom_handlers/register_protocol_handler_permission_request.h index 51179d2..6a95e42 100644 --- a/chrome/browser/custom_handlers/register_protocol_handler_permission_request.h +++ b/chrome/browser/custom_handlers/register_protocol_handler_permission_request.h
@@ -17,7 +17,9 @@ using content::ProtocolHandler; class GURL; +namespace custom_handlers { class ProtocolHandlerRegistry; +} // This class provides display data for a permission request, shown when a page // wants to register a protocol handler and was triggered by a user action. @@ -25,7 +27,7 @@ : public permissions::PermissionRequest { public: RegisterProtocolHandlerPermissionRequest( - ProtocolHandlerRegistry* registry, + custom_handlers::ProtocolHandlerRegistry* registry, const ProtocolHandler& handler, GURL url, base::ScopedClosureRunner fullscreen_block); @@ -46,7 +48,7 @@ void PermissionDecided(ContentSetting result, bool is_one_time); void DeleteRequest(); - raw_ptr<ProtocolHandlerRegistry> registry_; + raw_ptr<custom_handlers::ProtocolHandlerRegistry> registry_; ProtocolHandler handler_; // Fullscreen will be blocked for the duration of the lifetime of this block. // TODO(avi): Move to either permissions::PermissionRequest or the
diff --git a/chrome/browser/custom_handlers/test_protocol_handler_registry_delegate.h b/chrome/browser/custom_handlers/test_protocol_handler_registry_delegate.h index 3b348d14..0af7ec5 100644 --- a/chrome/browser/custom_handlers/test_protocol_handler_registry_delegate.h +++ b/chrome/browser/custom_handlers/test_protocol_handler_registry_delegate.h
@@ -8,12 +8,12 @@ #include <set> #include <string> -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" +#include "components/custom_handlers/protocol_handler_registry.h" // A test ProtocolHandlerRegistry::Delegate implementation that keeps track of // registered protocols and doesn't change any OS settings. class TestProtocolHandlerRegistryDelegate - : public ProtocolHandlerRegistry::Delegate { + : public custom_handlers::ProtocolHandlerRegistry::Delegate { public: TestProtocolHandlerRegistryDelegate(); ~TestProtocolHandlerRegistryDelegate() override;
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc index 4e73163..ab195bb1 100644 --- a/chrome/browser/download/chrome_download_manager_delegate.cc +++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -91,6 +91,7 @@ #include "net/base/mime_util.h" #include "net/base/network_change_notifier.h" #include "ppapi/buildflags/buildflags.h" +#include "third_party/blink/public/common/mime_util/mime_util.h" #include "ui/base/l10n/l10n_util.h" #if defined(OS_ANDROID) @@ -843,7 +844,8 @@ return; } - if (!DownloadItemModel(download).ShouldPreferOpeningInBrowser()) { + if (!blink::IsSupportedMimeType(download->GetMimeType()) && + !IsOpenInBrowserPreferreredForFile(download->GetTargetFilePath())) { RecordDownloadOpenMethod(DOWNLOAD_OPEN_METHOD_DEFAULT_PLATFORM); OpenDownloadUsingPlatformHandler(download); return;
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc index eb2f19b..10167b9 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
@@ -68,6 +68,8 @@ #endif const char kProfilePolicyClientDescription[] = "a profile-level user"; +const char16_t kMaskedUsername[] = u"*****"; + void AddAnalysisConnectorVerdictToEvent( const enterprise_connectors::ContentAnalysisResponse::Result& result, base::Value* event) { @@ -128,6 +130,18 @@ } } +// Do a best-effort masking of `username`. If it's an email address (such as +// foo@example.com), everything before @ should be masked. Otherwise, the entire +// username should be masked. +std::u16string MaskUsername(const std::u16string& username) { + size_t pos = username.find(u"@"); + if (pos == std::string::npos) { + return std::u16string(kMaskedUsername); + } + + return std::u16string(kMaskedUsername) + username.substr(pos); +} + } // namespace namespace extensions { @@ -782,7 +796,7 @@ if (is_federated) event.SetStringKey(kKeyFederatedOrigin, federated_origin.Serialize()); event.SetStringKey(kKeyProfileUserName, GetProfileUserName()); - event.SetStringKey(kKeyLoginUserName, username); + event.SetStringKey(kKeyLoginUserName, MaskUsername(username)); ReportRealtimeEvent(kKeyLoginEvent, std::move(settings.value()), std::move(event));
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc index 8191d514b..be77a86 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
@@ -753,11 +753,31 @@ safe_browsing::EventReportValidator validator(client_.get()); validator.ExpectLoginEvent("https://www.example.com/", false, "", - profile_->GetProfileUserName(), u"login-username"); + profile_->GetProfileUserName(), u"*****"); TriggerOnLoginEvent(GURL("https://www.example.com/"), u"login-username"); } +TEST_F(SafeBrowsingPrivateEventRouterTest, + TestOnLoginEventWithEmailAsLoginUsernam) { + SetUpRouters(); + + signin::IdentityTestEnvironment identity_test_environment; + SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile_) + ->SetIdentityManagerForTesting( + identity_test_environment.identity_manager()); + identity_test_environment.MakePrimaryAccountAvailable( + profile_->GetProfileUserName(), signin::ConsentLevel::kSignin); + + safe_browsing::EventReportValidator validator(client_.get()); + validator.ExpectLoginEvent("https://www.example.com/", false, "", + profile_->GetProfileUserName(), + u"*****@example.com"); + + TriggerOnLoginEvent(GURL("https://www.example.com/"), + u"login-username@example.com"); +} + TEST_F(SafeBrowsingPrivateEventRouterTest, TestOnLoginEventFederated) { SetUpRouters(); @@ -771,7 +791,7 @@ safe_browsing::EventReportValidator validator(client_.get()); validator.ExpectLoginEvent("https://www.example.com/", true, "https://www.google.com", - profile_->GetProfileUserName(), u"login-username"); + profile_->GetProfileUserName(), u"*****"); TriggerOnLoginEvent(GURL("https://www.example.com/"), u"login-username", url::Origin::Create(GURL("https://www.google.com")));
diff --git a/chrome/browser/extensions/protocol_handler_apitest.cc b/chrome/browser/extensions/protocol_handler_apitest.cc index 99fb15fe..6dd0e32 100644 --- a/chrome/browser/extensions/protocol_handler_apitest.cc +++ b/chrome/browser/extensions/protocol_handler_apitest.cc
@@ -6,10 +6,10 @@ #include "base/scoped_observation.h" #include "build/build_config.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/permissions/permission_request.h" #include "components/permissions/permission_request_manager.h" #include "content/public/browser/web_contents_delegate.h" @@ -35,9 +35,11 @@ } }; -class ProtocolHandlerChangeWaiter : public ProtocolHandlerRegistry::Observer { +class ProtocolHandlerChangeWaiter + : public custom_handlers::ProtocolHandlerRegistry::Observer { public: - explicit ProtocolHandlerChangeWaiter(ProtocolHandlerRegistry* registry) { + explicit ProtocolHandlerChangeWaiter( + custom_handlers::ProtocolHandlerRegistry* registry) { registry_observation_.Observe(registry); } ProtocolHandlerChangeWaiter(const ProtocolHandlerChangeWaiter&) = delete; @@ -50,8 +52,8 @@ void OnProtocolHandlerRegistryChanged() override { run_loop_.Quit(); } private: - base::ScopedObservation<ProtocolHandlerRegistry, - ProtocolHandlerRegistry::Observer> + base::ScopedObservation<custom_handlers::ProtocolHandlerRegistry, + custom_handlers::ProtocolHandlerRegistry::Observer> registry_observation_{this}; base::RunLoop run_loop_; }; @@ -82,7 +84,7 @@ ->set_auto_response_for_test( permissions::PermissionRequestManager::ACCEPT_ALL); - ProtocolHandlerRegistry* registry = + custom_handlers::ProtocolHandlerRegistry* registry = ProtocolHandlerRegistryFactory::GetForBrowserContext( browser()->profile());
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackCollector.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackCollector.java index 17bbee5e..b885734 100644 --- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackCollector.java +++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FeedbackCollector.java
@@ -56,7 +56,7 @@ protected void init( Activity activity, @Nullable ScreenshotSource screenshotTask, T initParams) { // 1. Build all synchronous and asynchronous sources. - mSynchronousSources = buildSynchronousFeedbackSources(initParams); + mSynchronousSources = buildSynchronousFeedbackSources(activity, initParams); mAsynchronousSources = buildAsynchronousFeedbackSources(initParams); // Sanity check in case a source is added to the wrong list. @@ -80,7 +80,8 @@ @VisibleForTesting @NonNull - protected abstract List<FeedbackSource> buildSynchronousFeedbackSources(T initParams); + protected abstract List<FeedbackSource> buildSynchronousFeedbackSources( + Activity activity, T initParams); @VisibleForTesting @NonNull
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 667e8e7d..4d5ffa5 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -247,7 +247,7 @@ "name": "arc-usb-device-attach-to-vm-experiment", "owners": [ "lgcheng" ], // Used on ChromeOS to temperorily attach unclaimed USB device to ARCVM - "expiry_milestone": 98 + "expiry_milestone": 100 }, { "name": "arc-use-high-memory-dalvik-profile", @@ -1476,11 +1476,6 @@ "expiry_milestone": 100 }, { - "name": "enable-autofill-account-wallet-storage", - "owners": [ "treib", "jsaul@google.com", "butter-team@google.com" ], - "expiry_milestone": 97 - }, - { "name": "enable-autofill-credit-card-authentication", "owners": [ "jsaul@google.com", "siyua" ], "expiry_milestone": 105
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 0a06b7da..9a0ecbe 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -676,11 +676,6 @@ "Slows down animations triggered by documentTransition JavaScript API for " "debugging."; -const char kEnableAutofillAccountWalletStorageName[] = - "Enable the account data storage for autofill"; -const char kEnableAutofillAccountWalletStorageDescription[] = - "Enable the ephemeral storage for account data for autofill."; - const char kEnableAutofillAddressSavePromptName[] = "Autofill Address Save Prompts"; const char kEnableAutofillAddressSavePromptDescription[] = @@ -4659,12 +4654,6 @@ "Enable experimental or in-progress Switch Access features for improved " "text input"; -const char kExperimentalAccessibilitySwitchAccessSetupGuideName[] = - "Enable setup guide for Switch Access."; -const char kExperimentalAccessibilitySwitchAccessSetupGuideDescription[] = - "Enable a setup guide to walk through the steps of initially configuring " - "Switch Access."; - const char kExperimentalAccessibilitySwitchAccessMultistepAutomationName[] = "Enable multistep automation for Switch Access."; const char
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 226f840..9a233fc7 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -409,9 +409,6 @@ extern const char kDocumentTransitionSlowdownFactorName[]; extern const char kDocumentTransitionSlowdownFactorDescription[]; -extern const char kEnableAutofillAccountWalletStorageName[]; -extern const char kEnableAutofillAccountWalletStorageDescription[]; - extern const char kEnableAutofillAddressSavePromptName[]; extern const char kEnableAutofillAddressSavePromptDescription[]; @@ -2686,9 +2683,6 @@ extern const char kExperimentalAccessibilitySwitchAccessTextName[]; extern const char kExperimentalAccessibilitySwitchAccessTextDescription[]; -extern const char kExperimentalAccessibilitySwitchAccessSetupGuideName[]; -extern const char kExperimentalAccessibilitySwitchAccessSetupGuideDescription[]; - extern const char kExperimentalAccessibilitySwitchAccessMultistepAutomationName[]; extern const char
diff --git a/chrome/browser/history_clusters/history_clusters_metrics_browsertest.cc b/chrome/browser/history_clusters/history_clusters_metrics_browsertest.cc index 10d82d2..3b125b0 100644 --- a/chrome/browser/history_clusters/history_clusters_metrics_browsertest.cc +++ b/chrome/browser/history_clusters/history_clusters_metrics_browsertest.cc
@@ -67,7 +67,7 @@ class HistoryClustersMetricsBrowserTest : public InProcessBrowserTest { public: HistoryClustersMetricsBrowserTest() { - feature_list_.InitWithFeatures({history_clusters::kJourneys}, {}); + feature_list_.InitWithFeatures({history_clusters::internal::kJourneys}, {}); } private:
diff --git a/chrome/browser/history_clusters/history_clusters_tab_helper_unittest.cc b/chrome/browser/history_clusters/history_clusters_tab_helper_unittest.cc index fea36fa..f03b812 100644 --- a/chrome/browser/history_clusters/history_clusters_tab_helper_unittest.cc +++ b/chrome/browser/history_clusters/history_clusters_tab_helper_unittest.cc
@@ -58,7 +58,7 @@ HistoryClustersTabHelperTest() { // This needs to be initialized as early as possible to avoid data races // with tasks on other threads checking if features are enabled. - feature_list_.InitAndEnableFeature(history_clusters::kJourneys); + feature_list_.InitAndEnableFeature(history_clusters::internal::kJourneys); } // ChromeRenderViewHostTestHarness:
diff --git a/chrome/browser/media/capture_access_handler_base.cc b/chrome/browser/media/capture_access_handler_base.cc index d4afb19..8f7a69e 100644 --- a/chrome/browser/media/capture_access_handler_base.cc +++ b/chrome/browser/media/capture_access_handler_base.cc
@@ -84,6 +84,21 @@ std::unique_ptr<WeakPtrToWebContents> target_weak_web_contents; }; +CaptureAccessHandlerBase::PendingAccessRequest::PendingAccessRequest( + std::unique_ptr<DesktopMediaPicker> picker, + const content::MediaStreamRequest& request, + content::MediaResponseCallback callback, + std::u16string application_title, + bool should_display_notification) + : picker(std::move(picker)), + request(request), + callback(std::move(callback)), + application_title(std::move(application_title)), + should_display_notification(should_display_notification) {} + +CaptureAccessHandlerBase::PendingAccessRequest::~PendingAccessRequest() = + default; + CaptureAccessHandlerBase::CaptureAccessHandlerBase() = default; CaptureAccessHandlerBase::~CaptureAccessHandlerBase() = default;
diff --git a/chrome/browser/media/capture_access_handler_base.h b/chrome/browser/media/capture_access_handler_base.h index e7c0bb90..05e5fe6d 100644 --- a/chrome/browser/media/capture_access_handler_base.h +++ b/chrome/browser/media/capture_access_handler_base.h
@@ -6,8 +6,10 @@ #define CHROME_BROWSER_MEDIA_CAPTURE_ACCESS_HANDLER_BASE_H_ #include <list> +#include <string> #include "chrome/browser/media/media_access_handler.h" +#include "chrome/browser/media/webrtc/desktop_media_picker.h" #include "content/public/browser/desktop_media_id.h" #include "content/public/browser/media_request_state.h" #include "third_party/blink/public/common/mediastream/media_stream_request.h" @@ -52,6 +54,29 @@ bool is_secure) override; protected: + // Holds pending request information. + struct PendingAccessRequest { + PendingAccessRequest(std::unique_ptr<DesktopMediaPicker> picker, + const content::MediaStreamRequest& request, + content::MediaResponseCallback callback, + std::u16string application_title, + bool should_display_notification); + PendingAccessRequest(const PendingAccessRequest& other) = delete; + PendingAccessRequest& operator=(const PendingAccessRequest& other) = delete; + ~PendingAccessRequest(); + + std::unique_ptr<DesktopMediaPicker> picker; + content::MediaStreamRequest request; + content::MediaResponseCallback callback; + std::u16string application_title; + bool should_display_notification; + }; + + using RequestsQueue = + base::circular_deque<std::unique_ptr<PendingAccessRequest>>; + + using RequestsQueues = base::flat_map<content::WebContents*, RequestsQueue>; + static bool IsExtensionAllowedForScreenCapture( const extensions::Extension* extension);
diff --git a/chrome/browser/media/router/discovery/access_code/discovery_resources.proto b/chrome/browser/media/router/discovery/access_code/discovery_resources.proto index 50abf431..4e8aeb7 100644 --- a/chrome/browser/media/router/discovery/access_code/discovery_resources.proto +++ b/chrome/browser/media/router/discovery/access_code/discovery_resources.proto
@@ -8,36 +8,6 @@ // Chrome requires this. option optimize_for = LITE_RUNTIME; -// A device able to receive casting -message ReceiverDevice { - // 128 bit UUID that uniquely identifies the receiver - string id = 1; - // "friendly name" from Cast V2 spec, the name displayed to users - string display_name = 2; - // Model name of the receiver device - string model_name = 3; - // Receiver device icon url - string device_icon_url = 4; - // A unique id used for sender/receiver reporting. Either empty or a 16-byte - // hex string - string metrics_id = 5; - // Capabilities of the receiver - DeviceCapabilities device_capabilities = 6; - enum DeviceStatus { - IDLE = 0; - BUSY_JOIN = 1; - } - // Status of the receiver device - DeviceStatus status = 7; - // The cast protocol version supported by the receiver. - // Begins at 2, counts up by 1 for each subsequent version. - int32 cast_protocol_version = 8; - // Network information for the receiver - NetworkInfo network_info = 9; - // 256-bit Subject public key identifier from SSL cert - string subject_public_key = 10; -} - // This list of capabilities should be kept in sync with the bit-mask found in // CastMediaSink.capabilities // chromium/src/components/media_router/common/mojom/media_router.mojom
diff --git a/chrome/browser/media/webrtc/desktop_capture_access_handler.cc b/chrome/browser/media/webrtc/desktop_capture_access_handler.cc index e5f7db6..c5123e6 100644 --- a/chrome/browser/media/webrtc/desktop_capture_access_handler.cc +++ b/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
@@ -170,25 +170,6 @@ } // namespace -// Holds pending request information so that we display one picker UI at a time -// for each content::WebContents. -struct DesktopCaptureAccessHandler::PendingAccessRequest { - PendingAccessRequest(std::unique_ptr<DesktopMediaPicker> picker, - const content::MediaStreamRequest& request, - content::MediaResponseCallback callback, - const extensions::Extension* extension) - : picker(std::move(picker)), - request(request), - callback(std::move(callback)), - extension(extension) {} - ~PendingAccessRequest() = default; - - std::unique_ptr<DesktopMediaPicker> picker; - content::MediaStreamRequest request; - content::MediaResponseCallback callback; - raw_ptr<const extensions::Extension> extension; -}; - DesktopCaptureAccessHandler::DesktopCaptureAccessHandler() : picker_factory_(new DesktopMediaPickerFactoryImpl()), display_notification_(true), @@ -512,7 +493,9 @@ RequestsQueue& queue = pending_requests_[web_contents]; queue.push_back(std::make_unique<PendingAccessRequest>( - std::move(picker), request, std::move(callback), extension)); + std::move(picker), request, std::move(callback), + GetApplicationTitle(web_contents, extension), + display_notification_ && ShouldDisplayNotification(extension))); // If this is the only request then pop picker UI. if (queue.size() == 1) ProcessQueuedAccessRequest(queue, web_contents); @@ -585,8 +568,7 @@ gfx::NativeWindow parent_window = web_contents->GetTopLevelNativeWindow(); picker_params.context = parent_window; picker_params.parent = parent_window; - picker_params.app_name = - GetApplicationTitle(web_contents, pending_request.extension); + picker_params.app_name = pending_request.application_title; picker_params.target_name = picker_params.app_name; picker_params.request_audio = pending_request.request.audio_type != blink::mojom::MediaStreamType::NO_SERVICE; @@ -644,13 +626,12 @@ } #endif // BUILDFLAG(IS_CHROMEOS_ASH) - const extensions::Extension* extension = pending_request.extension; blink::MediaStreamDevices devices; std::unique_ptr<content::MediaStreamUI> ui = GetDevicesForDesktopCapture( pending_request.request, web_contents, media_id, media_id.audio_share, pending_request.request.disable_local_echo, - display_notification_ && ShouldDisplayNotification(extension), - GetApplicationTitle(web_contents, extension), &devices); + pending_request.should_display_notification, + pending_request.application_title, &devices); std::move(pending_request.callback) .Run(devices, blink::mojom::MediaStreamRequestResult::OK, std::move(ui));
diff --git a/chrome/browser/media/webrtc/desktop_capture_access_handler.h b/chrome/browser/media/webrtc/desktop_capture_access_handler.h index a72f25f9..06ae1ef 100644 --- a/chrome/browser/media/webrtc/desktop_capture_access_handler.h +++ b/chrome/browser/media/webrtc/desktop_capture_access_handler.h
@@ -67,12 +67,6 @@ private: friend class DesktopCaptureAccessHandlerTest; - class WebContentsDestroyedObserver; - struct PendingAccessRequest; - using RequestsQueue = - base::circular_deque<std::unique_ptr<PendingAccessRequest>>; - using RequestsQueues = base::flat_map<content::WebContents*, RequestsQueue>; - void ProcessScreenCaptureAccessRequest( content::WebContents* web_contents, const content::MediaStreamRequest& request,
diff --git a/chrome/browser/media/webrtc/display_media_access_handler.cc b/chrome/browser/media/webrtc/display_media_access_handler.cc index 884b14aa..eaae9d4 100644 --- a/chrome/browser/media/webrtc/display_media_access_handler.cc +++ b/chrome/browser/media/webrtc/display_media_access_handler.cc
@@ -55,22 +55,6 @@ } // namespace -// Holds pending request information so that we display one picker UI at a time -// for each content::WebContents. -struct DisplayMediaAccessHandler::PendingAccessRequest { - PendingAccessRequest(std::unique_ptr<DesktopMediaPicker> picker, - const content::MediaStreamRequest& request, - content::MediaResponseCallback callback) - : picker(std::move(picker)), - request(request), - callback(std::move(callback)) {} - ~PendingAccessRequest() = default; - - std::unique_ptr<DesktopMediaPicker> picker; - content::MediaStreamRequest request; - content::MediaResponseCallback callback; -}; - DisplayMediaAccessHandler::DisplayMediaAccessHandler() : picker_factory_(new DesktopMediaPickerFactoryImpl()), web_contents_collection_(this) {} @@ -214,7 +198,8 @@ RequestsQueue& queue = pending_requests_[web_contents]; queue.push_back(std::make_unique<PendingAccessRequest>( - std::move(picker), request, std::move(callback))); + std::move(picker), request, std::move(callback), + GetApplicationTitle(web_contents), display_notification_)); // If this is the only request then pop picker UI. if (queue.size() == 1) ProcessQueuedAccessRequest(queue, web_contents); @@ -231,7 +216,8 @@ RequestsQueue& queue = pending_requests_[web_contents]; queue.push_back(std::make_unique<PendingAccessRequest>( - /*picker=*/nullptr, request, std::move(callback))); + /*picker=*/nullptr, request, std::move(callback), + GetApplicationTitle(web_contents), display_notification_)); // If this is the only request then pop it. Otherwise, there is already a task // scheduled to pop the next request. if (queue.size() == 1) @@ -324,7 +310,7 @@ } void DisplayMediaAccessHandler::ProcessQueuedPickerRequest( - const DisplayMediaAccessHandler::PendingAccessRequest& pending_request, + const PendingAccessRequest& pending_request, content::WebContents* web_contents, AllowedScreenCaptureLevel capture_level, const GURL& request_origin) {
diff --git a/chrome/browser/media/webrtc/display_media_access_handler.h b/chrome/browser/media/webrtc/display_media_access_handler.h index d274d53f6..97e6e4b1 100644 --- a/chrome/browser/media/webrtc/display_media_access_handler.h +++ b/chrome/browser/media/webrtc/display_media_access_handler.h
@@ -61,11 +61,6 @@ private: friend class DisplayMediaAccessHandlerTest; - struct PendingAccessRequest; - using RequestsQueue = - base::circular_deque<std::unique_ptr<PendingAccessRequest>>; - using RequestsQueues = base::flat_map<content::WebContents*, RequestsQueue>; - void ProcessChangeSourceRequest(content::WebContents* web_contents, const content::MediaStreamRequest& request, content::MediaResponseCallback callback); @@ -75,11 +70,10 @@ void ProcessQueuedAccessRequest(const RequestsQueue& queue, content::WebContents* web_contents); - void ProcessQueuedPickerRequest( - const DisplayMediaAccessHandler::PendingAccessRequest& pending_request, - content::WebContents* web_contents, - AllowedScreenCaptureLevel capture_level, - const GURL& request_origin); + void ProcessQueuedPickerRequest(const PendingAccessRequest& pending_request, + content::WebContents* web_contents, + AllowedScreenCaptureLevel capture_level, + const GURL& request_origin); void ProcessQueuedChangeSourceRequest( const content::MediaStreamRequest& request,
diff --git a/chrome/browser/nacl_host/nacl_browser_delegate_impl.h b/chrome/browser/nacl_host/nacl_browser_delegate_impl.h index 37508ca1..ef36a12 100644 --- a/chrome/browser/nacl_host/nacl_browser_delegate_impl.h +++ b/chrome/browser/nacl_host/nacl_browser_delegate_impl.h
@@ -5,8 +5,8 @@ #ifndef CHROME_BROWSER_NACL_HOST_NACL_BROWSER_DELEGATE_IMPL_H_ #define CHROME_BROWSER_NACL_HOST_NACL_BROWSER_DELEGATE_IMPL_H_ -#include <set> #include <string> +#include <vector> #include "base/memory/raw_ptr.h" #include "components/nacl/browser/nacl_browser_delegate.h" @@ -57,5 +57,4 @@ bool inverse_debug_patterns_; }; - #endif // CHROME_BROWSER_NACL_HOST_NACL_BROWSER_DELEGATE_IMPL_H_
diff --git a/chrome/browser/net/net_error_tab_helper_browsertest.cc b/chrome/browser/net/net_error_tab_helper_browsertest.cc index 9c09fd1..b14f8b54 100644 --- a/chrome/browser/net/net_error_tab_helper_browsertest.cc +++ b/chrome/browser/net/net_error_tab_helper_browsertest.cc
@@ -241,21 +241,14 @@ result.ExtractString()); } -// TODO(crbug.com/1269931): Make this test work properly and not result in an -// error page being navigated to in the fenced frame, and then re-enable the -// test. IN_PROC_BROWSER_TEST_F(NetErrorTabHelperWithFencedFrameTest, - DISABLED_CanRunDiagnosticsDialogOnFencedFrame) { - GURL initial_url = + CanRunDiagnosticsDialogOnFencedFrame) { + GURL fenced_frame_url = net::URLRequestFailedJob::GetMockHttpUrl(net::ERR_NAME_NOT_RESOLVED); RenderFrameHost* inner_fenced_frame_rfh = fenced_frame_test_helper().CreateFencedFrame( - GetWebContents()->GetMainFrame(), initial_url); - const GURL fenced_frame_url = - net::URLRequestFailedJob::GetMockHttpUrl(net::ERR_NAME_NOT_RESOLVED); - inner_fenced_frame_rfh = - fenced_frame_test_helper().NavigateFrameInFencedFrameTree( - inner_fenced_frame_rfh, fenced_frame_url); + GetWebContents()->GetMainFrame(), fenced_frame_url, + net::ERR_NAME_NOT_RESOLVED); EvalJsResult result = EvalJs(inner_fenced_frame_rfh, kSearchingForDiagnosisScript); ASSERT_TRUE(result.error.empty());
diff --git a/chrome/browser/notifications/notification_display_service_impl.cc b/chrome/browser/notifications/notification_display_service_impl.cc index 77e4176b..9169283 100644 --- a/chrome/browser/notifications/notification_display_service_impl.cc +++ b/chrome/browser/notifications/notification_display_service_impl.cc
@@ -17,6 +17,7 @@ #include "chrome/browser/notifications/notification_display_service_factory.h" #include "chrome/browser/notifications/persistent_notification_handler.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/safe_browsing/tailored_security/consented_notification_desktop.h" #include "chrome/browser/updates/announcement_notification/announcement_notification_handler.h" #include "chrome/common/pref_names.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -87,6 +88,14 @@ profile_)); #endif +#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_MAC) || \ + defined(OS_WIN) + AddNotificationHandler( + NotificationHandler::Type::TAILORED_SECURITY_CONSENTED, + std::make_unique< + safe_browsing::TailoredSecurityConsentedNotificationHandler>()); +#endif + #if BUILDFLAG(ENABLE_EXTENSIONS) AddNotificationHandler( NotificationHandler::Type::EXTENSION,
diff --git a/chrome/browser/notifications/notification_handler.h b/chrome/browser/notifications/notification_handler.h index db4c20e..ca4ba19 100644 --- a/chrome/browser/notifications/notification_handler.h +++ b/chrome/browser/notifications/notification_handler.h
@@ -38,7 +38,8 @@ ANNOUNCEMENT = 7, NEARBY_SHARE = 8, NOTIFICATIONS_MUTED = 9, - MAX = NOTIFICATIONS_MUTED, + TAILORED_SECURITY_CONSENTED = 10, + MAX = TAILORED_SECURITY_CONSENTED, }; virtual ~NotificationHandler();
diff --git a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc index 6cad5e8..d5fd751 100644 --- a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc
@@ -1149,9 +1149,11 @@ ukm::builders::Graphics_Smoothness_NormalizedPercentDroppedFrames builder( GetDelegate().GetPageUkmSourceId()); builder.SetAverage(smoothness_data.avg_smoothness) + .SetMedian(smoothness_data.median_smoothness) .SetPercentile95(smoothness_data.percentile_95) .SetAboveThreshold(smoothness_data.above_threshold) .SetWorstCase(smoothness_data.worst_smoothness) + .SetVariance(smoothness_data.variance) .SetTimingSinceFCPWorstCase( smoothness_data.time_max_delta.InMilliseconds()) .SetSmoothnessVeryGood(smoothness_data.buckets[0])
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index 741122f8..8428a14 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -63,6 +63,7 @@ #include "components/content_settings/core/browser/cookie_settings_policy_handler.h" #include "components/content_settings/core/browser/insecure_private_network_policy_handler.h" #include "components/content_settings/core/common/pref_names.h" +#include "components/custom_handlers/pref_names.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h" #include "components/embedder_support/pref_names.h" #include "components/enterprise/browser/reporting/cloud_reporting_policy_handler.h" @@ -1735,7 +1736,7 @@ handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>( key::kRegisteredProtocolHandlers, - prefs::kPolicyRegisteredProtocolHandlers, chrome_schema, + custom_handlers::prefs::kPolicyRegisteredProtocolHandlers, chrome_schema, SCHEMA_ALLOW_UNKNOWN, SimpleSchemaValidatingPolicyHandler::RECOMMENDED_ALLOWED, SimpleSchemaValidatingPolicyHandler::MANDATORY_PROHIBITED));
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index b134bc61..f2a12d054 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -18,7 +18,6 @@ #include "chrome/browser/browser_process_impl.h" #include "chrome/browser/chrome_content_browser_client.h" #include "chrome/browser/component_updater/component_updater_prefs.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/data_use_measurement/chrome_data_use_measurement.h" #include "chrome/browser/devtools/devtools_window.h" #include "chrome/browser/download/download_prefs.h" @@ -96,6 +95,7 @@ #include "components/browsing_data/core/pref_names.h" #include "components/certificate_transparency/pref_names.h" #include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h" #include "components/dom_distiller/core/distilled_page_prefs.h" #include "components/dom_distiller/core/dom_distiller_features.h" @@ -1174,7 +1174,7 @@ Profile::RegisterProfilePrefs(registry); ProfileImpl::RegisterProfilePrefs(registry); ProfileNetworkContextService::RegisterProfilePrefs(registry); - ProtocolHandlerRegistry::RegisterProfilePrefs(registry); + custom_handlers::ProtocolHandlerRegistry::RegisterProfilePrefs(registry); PushMessagingAppIdentifier::RegisterProfilePrefs(registry); QuietNotificationPermissionUiState::RegisterProfilePrefs(registry); RegisterBrowserUserPrefs(registry);
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc index d72e7d22..feacaf4 100644 --- a/chrome/browser/profiles/profile_manager.cc +++ b/chrome/browser/profiles/profile_manager.cc
@@ -918,48 +918,68 @@ } // static -base::FilePath ProfileManager::CreateMultiProfileAsync( - const std::u16string& name, - size_t icon_index, - bool is_hidden, - const CreateCallback& callback) { +void ProfileManager::CreateMultiProfileAsync(const std::u16string& name, + size_t icon_index, + bool is_hidden, + const CreateCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(!name.empty()); DCHECK(profiles::IsDefaultAvatarIconIndex(icon_index)); ProfileManager* profile_manager = g_browser_process->profile_manager(); - base::FilePath new_path = profile_manager->GenerateNextProfileDirectoryPath(); - DCHECK(profile_manager->CanCreateProfileAtPath(new_path)); - ProfileAttributesStorage& storage = profile_manager->GetProfileAttributesStorage(); - ProfileAttributesEntry* entry = - storage.GetProfileAttributesWithPath(new_path); - if (entry) { - LOG(WARNING) << "Failed to generate a unique profile name for a new " - "profile. Creation parameters will be ignored, loading an " - "existing profile at path \"" - << new_path << "\" instead."; - } else { - // Add a storage entry early here to set up a new profile with user selected - // name and avatar. - // These parameters will be used to initialize profile's prefs in - // InitProfileUserPrefs(). AddProfileToStorage() will set any missing - // attributes after prefs are loaded. - // TODO(alexilin): consider using the user data to supply these parameters - // to profile. - ProfileAttributesInitParams init_params; - init_params.profile_path = new_path; - init_params.profile_name = name; - init_params.icon_index = icon_index; - init_params.is_ephemeral = is_hidden; - init_params.is_omitted = is_hidden; - storage.AddProfile(std::move(init_params)); + base::FilePath new_path; + ProfileAttributesEntry* entry = nullptr; + // In some crashes, it can happen that next profile dir (backed up by local + // pref) is out-of-sync with profiles dir. Keep generating next profile path + // until that path is _not_ present in `storage`. + do { + new_path = profile_manager->GenerateNextProfileDirectoryPath(); + // The generated path should be unused and free to use. + DCHECK_EQ(profile_manager->GetProfileByPath(new_path), nullptr); + DCHECK(profile_manager->CanCreateProfileAtPath(new_path)); + + entry = storage.GetProfileAttributesWithPath(new_path); + } while (entry != nullptr); + + // Add a storage entry early here to set up a new profile with user selected + // name and avatar. + // These parameters will be used to initialize profile's prefs in + // InitProfileUserPrefs(). AddProfileToStorage() will set any missing + // attributes after prefs are loaded. + // TODO(alexilin): consider using the user data to supply these parameters + // to profile. + ProfileAttributesInitParams init_params; + init_params.profile_path = new_path; + init_params.profile_name = name; + init_params.icon_index = icon_index; + init_params.is_ephemeral = is_hidden; + init_params.is_omitted = is_hidden; + storage.AddProfile(std::move(init_params)); + + if (!base::FeatureList::IsEnabled( + features::kNukeProfileBeforeCreateMultiAsync)) { + profile_manager->CreateProfileAsync(new_path, callback); + return; } - profile_manager->CreateProfileAsync(new_path, callback); - return new_path; + // As another check, make sure the generated path is not present in the file + // system (there could be orphan profile dirs). + // TODO(crbug.com/1277948): There can be a theoretical race condition with a + // direct CreateProfileAsync() call that can create the directory before + // adding an entry to ProfileAttributesStorage. Creating a new + // ProfileAttributesEntry consistently before writing the profile folder to + // disk would resolve this. + base::ThreadPool::PostTask( + FROM_HERE, + {base::MayBlock(), base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::BindOnce(&NukeProfileFromDisk, new_path, + base::BindOnce(&ProfileManager::CreateProfileAsync, + profile_manager->weak_factory_.GetWeakPtr(), + new_path, callback))); } // static
diff --git a/chrome/browser/profiles/profile_manager.h b/chrome/browser/profiles/profile_manager.h index 19e84b0a..35bc427 100644 --- a/chrome/browser/profiles/profile_manager.h +++ b/chrome/browser/profiles/profile_manager.h
@@ -20,6 +20,7 @@ #include "base/files/file_path.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" +#include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/threading/thread_checker.h" #include "build/build_config.h" @@ -183,21 +184,19 @@ // otherwise return null. Profile* GetProfileByPath(const base::FilePath& path) const; - // Creates a new profile in the next available multiprofile directory. - // Directories are named "profile_1", "profile_2", etc., in sequence of - // creation. (Because directories can be removed, however, it may be the case - // that at some point the list of numbered profiles is not continuous.) - // |callback| may be invoked multiple times (for CREATE_STATUS_INITIALIZED - // and CREATE_STATUS_CREATED) so binding parameters with bind::Passed() is - // prohibited. Returns the file path to the profile that will be created - // asynchronously. - // If |is_hidden| is true, the new profile will be created as ephemeral - // (removed on the next startup) and omitted (not visible in the list of - // profiles). - static base::FilePath CreateMultiProfileAsync(const std::u16string& name, - size_t icon_index, - bool is_hidden, - const CreateCallback& callback); + // Asynchronously creates a new profile in the next available multiprofile + // directory. Directories are named "profile_1", "profile_2", etc., in + // sequence of creation. (Because directories can be removed, however, it may + // be the case that at some point the list of numbered profiles is not + // continuous.) |callback| may be invoked multiple times (for + // CREATE_STATUS_INITIALIZED and CREATE_STATUS_CREATED) so binding parameters + // with bind::Passed() is prohibited. If |is_hidden| is true, the new profile + // will be created as ephemeral (removed on the next startup) and omitted (not + // visible in the list of profiles). + static void CreateMultiProfileAsync(const std::u16string& name, + size_t icon_index, + bool is_hidden, + const CreateCallback& callback); // Returns the full path to be used for guest profiles. static base::FilePath GetGuestProfilePath(); @@ -594,6 +593,8 @@ // enough to do as part of the mass refactor CL which introduced // |thread_checker_|, ref. https://codereview.chromium.org/2907253003/#msg37. THREAD_CHECKER(thread_checker_); + + base::WeakPtrFactory<ProfileManager> weak_factory_{this}; }; // Same as the ProfileManager, but doesn't initialize some services of the
diff --git a/chrome/browser/profiles/profile_manager_unittest.cc b/chrome/browser/profiles/profile_manager_unittest.cc index 3203b88f..adabe60 100644 --- a/chrome/browser/profiles/profile_manager_unittest.cc +++ b/chrome/browser/profiles/profile_manager_unittest.cc
@@ -232,6 +232,8 @@ entry->SetIsEphemeral(true); } + TestingPrefServiceSimple* local_state() { return local_state_.Get(); } + #if BUILDFLAG(IS_CHROMEOS_LACROS) void OnWillCreateBrowserContextServices(content::BrowserContext* context) { IdentityTestEnvironmentProfileAdaptor:: @@ -644,6 +646,97 @@ EXPECT_NE(profile2, profile3); } +TEST_F(ProfileManagerTest, + CreateMultiProfilesAsyncWithBrokenPrefAndProfileInCache) { + ProfileManager* profile_manager = g_browser_process->profile_manager(); + ASSERT_TRUE(profile_manager); + + // Simulate having "Profile 1" in the storage without properly incrementing + // the prefs::kProfilesNumCreated counter. + ProfileAttributesInitParams params_1; + params_1.profile_path = + profile_manager->user_data_dir().AppendASCII("Profile 1"); + params_1.profile_name = u"name_1"; + params_1.gaia_id = "12345"; + params_1.is_consented_primary_account = true; + profile_manager->GetProfileAttributesStorage().AddProfile( + std::move(params_1)); + + MockObserver mock_observer2; + Profile* profile2 = nullptr; + EXPECT_CALL(mock_observer2, OnProfileCreated(testing::NotNull(), NotFail())) + .Times(testing::AtLeast(2)) + .WillRepeatedly(testing::SaveArg<0>(&profile2)); + CreateMultiProfileAsync(profile_manager, "Profile B", &mock_observer2); + content::RunAllTasksUntilIdle(); + + ASSERT_NE(profile2, nullptr); + EXPECT_EQ(profile2->GetPath().BaseName().value(), + FILE_PATH_LITERAL("Profile 2")); + ProfileAttributesEntry* entry2 = + profile_manager->GetProfileAttributesStorage() + .GetProfileAttributesWithPath(profile2->GetPath()); + ASSERT_NE(entry2, nullptr); +} + +TEST_F(ProfileManagerTest, + PRE_CreateMultiProfilesAsyncWithBrokenPrefAndProfileOnDisk) { + ProfileManager* profile_manager = g_browser_process->profile_manager(); + ASSERT_TRUE(profile_manager); + + MockObserver mock_observer1; + Profile* profile1 = nullptr; + EXPECT_CALL(mock_observer1, OnProfileCreated(testing::NotNull(), NotFail())) + .Times(testing::AtLeast(2)) + .WillRepeatedly(testing::SaveArg<0>(&profile1)); + CreateMultiProfileAsync(profile_manager, "Profile A", &mock_observer1); + content::RunAllTasksUntilIdle(); + + ASSERT_NE(profile1, nullptr); + EXPECT_EQ(profile1->GetPath().BaseName().value(), + FILE_PATH_LITERAL("Profile 1")); + ProfileAttributesEntry* entry1 = + profile_manager->GetProfileAttributesStorage() + .GetProfileAttributesWithPath(profile1->GetPath()); + ASSERT_NE(entry1, nullptr); + + // Decrement next profile number to simulate it was never incremented. + EXPECT_EQ(local_state()->GetUserPref(prefs::kProfilesNumCreated)->GetInt(), + 2); + local_state()->SetUserPref(prefs::kProfilesNumCreated, + std::make_unique<base::Value>(1)); + // Wipe the profile from profile attributes storage to simulate it got deleted + // but not wiped from disk. + profile_manager->GetProfileAttributesStorage().RemoveProfile( + profile1->GetPath()); +} + +// We need to restart Chrome in the mean-time to make sure the profile is not +// loaded in memory. +TEST_F(ProfileManagerTest, + CreateMultiProfilesAsyncWithBrokenPrefAndProfileOnDisk) { + ProfileManager* profile_manager = g_browser_process->profile_manager(); + ASSERT_TRUE(profile_manager); + + MockObserver mock_observer2; + Profile* profile2 = nullptr; + EXPECT_CALL(mock_observer2, OnProfileCreated(testing::NotNull(), NotFail())) + .Times(testing::AtLeast(2)) + .WillRepeatedly(testing::SaveArg<0>(&profile2)); + CreateMultiProfileAsync(profile_manager, "Profile B", &mock_observer2); + content::RunAllTasksUntilIdle(); + + ASSERT_NE(profile2, nullptr); + // The profile uses the same base name as in the pre test. + EXPECT_EQ(profile2->GetPath().BaseName().value(), + FILE_PATH_LITERAL("Profile 1")); + ProfileAttributesEntry* entry2 = + profile_manager->GetProfileAttributesStorage() + .GetProfileAttributesWithPath(profile2->GetPath()); + ASSERT_NE(entry2, nullptr); + EXPECT_EQ(base::UTF16ToUTF8(entry2->GetName()), "Profile B"); +} + TEST_F(ProfileManagerTest, CreateHiddenProfileAsync) { Profile* profile = nullptr; MockObserver mock_observer; @@ -842,14 +935,14 @@ ProfileManager* profile_manager = g_browser_process->profile_manager(); ProfileAttributesStorage& storage = profile_manager->GetProfileAttributesStorage(); - local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled, - std::make_unique<base::Value>(true)); + local_state()->SetUserPref(prefs::kBackgroundModeEnabled, + std::make_unique<base::Value>(true)); // Setting a pref which is not applicable to a system (i.e., Android in this // case) does not necessarily create it. Don't bother continuing with the // test if this pref doesn't exist because it will not load the profiles if // it cannot verify that the pref for background mode is enabled. - if (!local_state_.Get()->HasPrefPath(prefs::kBackgroundModeEnabled)) + if (!local_state()->HasPrefPath(prefs::kBackgroundModeEnabled)) return; EXPECT_EQ(0u, storage.GetNumberOfProfiles()); @@ -892,8 +985,8 @@ ProfileManager* profile_manager = g_browser_process->profile_manager(); ProfileAttributesStorage& storage = profile_manager->GetProfileAttributesStorage(); - local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled, - std::make_unique<base::Value>(false)); + local_state()->SetUserPref(prefs::kBackgroundModeEnabled, + std::make_unique<base::Value>(false)); EXPECT_EQ(0u, storage.GetNumberOfProfiles());
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc index 118d0f27..c1e556e 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -2036,7 +2036,7 @@ } void RenderViewContextMenu::AppendProtocolHandlerSubMenu() { - const ProtocolHandlerRegistry::ProtocolHandlerList handlers = + const custom_handlers::ProtocolHandlerRegistry::ProtocolHandlerList handlers = GetHandlersForLinkUrl(); if (handlers.empty()) return; @@ -2875,9 +2875,9 @@ execute_plugin_action_callback_ = std::move(cb); } -ProtocolHandlerRegistry::ProtocolHandlerList +custom_handlers::ProtocolHandlerRegistry::ProtocolHandlerList RenderViewContextMenu::GetHandlersForLinkUrl() { - ProtocolHandlerRegistry::ProtocolHandlerList handlers = + custom_handlers::ProtocolHandlerRegistry::ProtocolHandlerList handlers = protocol_handler_registry_->GetHandlersFor(params_.link_url.scheme()); std::sort(handlers.begin(), handlers.end()); return handlers; @@ -3229,7 +3229,7 @@ return; } - ProtocolHandlerRegistry::ProtocolHandlerList handlers = + custom_handlers::ProtocolHandlerRegistry::ProtocolHandlerList handlers = GetHandlersForLinkUrl(); if (handlers.empty()) return;
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.h b/chrome/browser/renderer_context_menu/render_view_context_menu.h index 9ac3825b..7384cee 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.h +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.h
@@ -17,10 +17,10 @@ #include "build/branding_buildflags.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/share/share_submenu_model.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/send_tab_to_self/send_tab_to_self_sub_menu_model.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/renderer_context_menu/context_menu_content_type.h" #include "components/renderer_context_menu/render_view_context_menu_base.h" #include "components/renderer_context_menu/render_view_context_menu_observer.h" @@ -87,8 +87,9 @@ } // namespace policy #endif -class RenderViewContextMenu : public RenderViewContextMenuBase, - public ProtocolHandlerRegistry::Observer { +class RenderViewContextMenu + : public RenderViewContextMenuBase, + public custom_handlers::ProtocolHandlerRegistry::Observer { public: using ExecutePluginActionCallback = base::OnceCallback<void(content::RenderFrameHost*, @@ -301,7 +302,8 @@ // Returns a list of registered ProtocolHandlers that can handle the clicked // on URL. - ProtocolHandlerRegistry::ProtocolHandlerList GetHandlersForLinkUrl(); + custom_handlers::ProtocolHandlerRegistry::ProtocolHandlerList + GetHandlersForLinkUrl(); // ProtocolHandlerRegistry::Observer: void OnProtocolHandlerRegistryChanged() override; @@ -318,10 +320,10 @@ // - The submenu containing the installed protocol handlers. ui::SimpleMenuModel protocol_handler_submenu_model_; // - The registry with the protocols. - raw_ptr<ProtocolHandlerRegistry> protocol_handler_registry_; + raw_ptr<custom_handlers::ProtocolHandlerRegistry> protocol_handler_registry_; // - The observation of the registry. - base::ScopedObservation<ProtocolHandlerRegistry, - ProtocolHandlerRegistry::Observer> + base::ScopedObservation<custom_handlers::ProtocolHandlerRegistry, + custom_handlers::ProtocolHandlerRegistry::Observer> protocol_handler_registry_observation_{this}; // - Whether or not the registered protocols have changed since the menu was // built.
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h b/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h index 7740b68..27a661d 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h
@@ -12,6 +12,7 @@ #include "base/files/file_path.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/renderer_context_menu/render_view_context_menu.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "extensions/buildflags/buildflags.h" #include "url/gurl.h" @@ -80,7 +81,8 @@ extensions::ContextMenuMatcher& extension_items() { return extension_items_; } #endif - void set_protocol_handler_registry(ProtocolHandlerRegistry* registry) { + void set_protocol_handler_registry( + custom_handlers::ProtocolHandlerRegistry* registry) { protocol_handler_registry_ = registry; }
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc index 4249253..a77ffda 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
@@ -13,7 +13,6 @@ #include "build/branding_buildflags.h" #include "build/build_config.h" #include "chrome/app/chrome_command_ids.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/download/chrome_download_manager_delegate.h" #include "chrome/browser/download/download_core_service.h" #include "chrome/browser/download/download_core_service_factory.h" @@ -32,6 +31,7 @@ #include "chrome/test/base/search_test_utils.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h" #include "components/lens/lens_features.h" #include "components/policy/core/common/policy_pref_names.h" @@ -112,7 +112,7 @@ // Returns a test context menu. std::unique_ptr<TestRenderViewContextMenu> CreateContextMenu( content::WebContents* web_contents, - ProtocolHandlerRegistry* registry) { + custom_handlers::ProtocolHandlerRegistry* registry) { content::ContextMenuParams params = CreateParams(MenuItem::LINK); params.unfiltered_link_url = params.link_url; auto menu = std::make_unique<TestRenderViewContextMenu>( @@ -383,7 +383,8 @@ void SetUp() override { RenderViewContextMenuTest::SetUp(); // TestingProfile does not provide a protocol registry. - registry_ = std::make_unique<ProtocolHandlerRegistry>(profile(), nullptr); + registry_ = std::make_unique<custom_handlers::ProtocolHandlerRegistry>( + profile(), nullptr); } void TearDown() override { @@ -396,7 +397,7 @@ extensions::TestExtensionEnvironment& environment() { return *environment_; } protected: - std::unique_ptr<ProtocolHandlerRegistry> registry_; + std::unique_ptr<custom_handlers::ProtocolHandlerRegistry> registry_; }; TEST_F(RenderViewContextMenuExtensionsTest, @@ -446,7 +447,8 @@ void SetUp() override { ChromeRenderViewHostTestHarness::SetUp(); - registry_ = std::make_unique<ProtocolHandlerRegistry>(profile(), nullptr); + registry_ = std::make_unique<custom_handlers::ProtocolHandlerRegistry>( + profile(), nullptr); TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( profile(), @@ -506,7 +508,7 @@ PrefService* local_state() { return testing_local_state_->Get(); } private: - std::unique_ptr<ProtocolHandlerRegistry> registry_; + std::unique_ptr<custom_handlers::ProtocolHandlerRegistry> registry_; std::unique_ptr<ScopedTestingLocalState> testing_local_state_; raw_ptr<TemplateURLService> template_url_service_; };
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 b54e8de..5b22fd7 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -150,6 +150,24 @@ `; } + get nestedListDoc() { + return ` + <div> + <ul> + <li>Lemons</li> + <li>Oranges</li> + <li>Berries + <ul> + <li>Strawberries</li> + <li>Raspberries</li> + </ul> + </li> + <li>Bananas</li> + </ul> + </div> + `; + } + /** * Fires an onCustomSpokenFeedbackToggled event with enabled state of * |enabled|. @@ -2261,6 +2279,58 @@ }); }); +TEST_F('ChromeVoxBackgroundTest', 'NestedListNavigationSimple', function() { + const mockFeedback = this.createMockFeedback(); + this.runWithLoadedTree(this.nestedListDoc, function(root) { + mockFeedback.expectSpeech('• Lemons', 'List item', 'List', 'with 4 items') + .call(doCmd('nextObject')) + .expectSpeech('• Oranges', 'List item') + .call(doCmd('nextObject')) + .expectSpeech('• ', 'Berries', 'List item') + .expectBraille('• Berries lstitm') + .call(doCmd('nextObject')) + .expectSpeech('◦ Strawberries', 'List item', 'List', 'with 2 items') + .call(doCmd('nextObject')) + .expectSpeech('◦ Raspberries', 'List item', 'List end') + .call(doCmd('nextObject')) + .expectSpeech('• Bananas', 'List item', 'List end') + .expectBraille('• Bananas lstitm lst end') + .replay(); + }); +}); + +TEST_F('ChromeVoxBackgroundTest', 'NestedListNavigationMixed', function() { + const mockFeedback = this.createMockFeedback(); + this.runWithLoadedTree(this.nestedListDoc, function(root) { + mockFeedback.expectSpeech('• Lemons', 'List item', 'List', 'with 4 items') + .call(doCmd('nextObject')) + .expectSpeech('• Oranges', 'List item') + .call(doCmd('nextLine')) + .expectSpeech('• ', 'Berries', 'List item') + .call(doCmd('nextLine')) + .expectSpeech('◦ Strawberries', 'List item', 'List', 'with 2 items') + .call(doCmd('previousLine')) + .expectSpeech('• ', 'Berries') + .call(doCmd('nextWord')) + .expectSpeech('◦ Strawberries') + .call(doCmd('nextWord')) + .expectSpeech('◦ Raspberries') + .call(doCmd('previousObject')) + .call(doCmd('previousObject')) + .expectSpeech('• ', 'Berries') + .call(doCmd('previousCharacter')) + .call(doCmd('previousCharacter')) + .call(doCmd('previousCharacter')) + .expectSpeech('g') // For Oranges + .call(doCmd('nextGroup')) + .expectSpeech('◦ Strawberries', '◦ Raspberries') + .clearPendingOutput() + .call(doCmd('previousGroup')) + .expectSpeech('• Oranges') + .replay(); + }); +}); + TEST_F('ChromeVoxBackgroundTest', 'NavigationByList', function() { const mockFeedback = this.createMockFeedback(); const site = `
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js index 76ec051..7b69227 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js
@@ -776,6 +776,8 @@ owner.formatPhoneticReading_(node, buff); } else if (token === 'listNestedLevel') { owner.formatListNestedLevel_(node, buff); + } else if (token === 'precedingBullet') { + owner.formatPrecedingBullet_(node, buff); } else if (tree.firstChild) { owner.formatCustomFunction_( node, token, tree, buff, options, ruleStr); @@ -1461,6 +1463,24 @@ } /** + * @param {!AutomationNode} node + * @param {!Array<Spannable>} buff + */ + formatPrecedingBullet_(node, buff) { + let current = node; + if (current.role === RoleType.INLINE_TEXT_BOX) { + current = current.parent; + } + if (!current || current.role !== RoleType.STATIC_TEXT) { + return; + } + current = current.previousSibling; + if (current && current.role === RoleType.LIST_MARKER) { + this.append_(buff, current.name || ''); + } + } + + /** * @param {AutomationNode} node * @param {string} token * @param {!OutputFormatTree} tree @@ -2699,7 +2719,7 @@ }, imeCandidate: {speak: '$name $phoneticReading @describe_index($posInSet, $setSize)'}, - inlineTextBox: {speak: `$name=`}, + inlineTextBox: {speak: `$precedingBullet $name=`}, inputTime: {enter: `$nameFromNode $role $state $restriction $description`}, labelText: { speak: `$name $value $state $restriction $roleDescription $description`, @@ -2771,7 +2791,7 @@ speak: `$name $node(activeDescendant) $value $state $restriction $role $if($selected, @aria_selected_true) $description` }, - staticText: {speak: `$name= $description`}, + staticText: {speak: `$precedingBullet $name= $description`}, switch: { speak: `$if($checked, $earcon(CHECK_ON), $earcon(CHECK_OFF)) $if($checked, @describe_switch_on($name),
diff --git a/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js b/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js index 9805357..fbd6b12 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js +++ b/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js
@@ -549,6 +549,14 @@ return true; } + // Ignore list markers that are followed by a static text. + // The bullet will be added before the static text (or static text's inline + // text box) in output.js. + if (node.role === Role.LIST_MARKER && node.nextSibling && + node.nextSibling.role === Role.STATIC_TEXT) { + return true; + } + // Don't ignore nodes with names or name-like attribute. if (node.name || node.value || node.description || node.url) { return false;
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_el.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_el.xtb index 40916c6..9ac35d39 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_el.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_el.xtb
@@ -30,6 +30,7 @@ <translation id="1189258430971676908">Περιοχή εξάσκησης: αναπτυσσόμενες λίστες</translation> <translation id="1195238899008218998">Επίλογος</translation> <translation id="1197088940767939838">Πορτοκαλί</translation> +<translation id="1198865190323699001">Κινήσεις αφής</translation> <translation id="1201402288615127009">Επόμενο</translation> <translation id="1206619573307042055">μαρκίζα</translation> <translation id="1207086294218137981">Δεν υπάρχει επόμενη κεφαλίδα επιπέδου 4.</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_es-419.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_es-419.xtb index ddccd632..258845e 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_es-419.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_es-419.xtb
@@ -30,6 +30,7 @@ <translation id="1189258430971676908">Área de práctica: Listas desplegables</translation> <translation id="1195238899008218998">Posfacio</translation> <translation id="1197088940767939838">Naranja</translation> +<translation id="1198865190323699001">Gestos táctiles</translation> <translation id="1201402288615127009">Siguiente</translation> <translation id="1206619573307042055">marquee</translation> <translation id="1207086294218137981">No hay encabezados de nivel 4 siguientes</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ne.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ne.xtb index 71cc6f9..52b41792 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ne.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ne.xtb
@@ -30,6 +30,7 @@ <translation id="1189258430971676908">अभ्यास गर्ने क्षेत्र: ड्रप-डाउन सूचीहरू</translation> <translation id="1195238899008218998">उपसंहार</translation> <translation id="1197088940767939838">सुन्तला रङ्ग</translation> +<translation id="1198865190323699001">टच जेस्चरहरू</translation> <translation id="1201402288615127009">अर्को</translation> <translation id="1206619573307042055">मार्की</translation> <translation id="1207086294218137981">अर्को कुनै पनि लेभल ४ शीर्षक छैन</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_nl.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_nl.xtb index ce90ac7..e755f8d7 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_nl.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_nl.xtb
@@ -30,6 +30,7 @@ <translation id="1189258430971676908">Oefengedeelte: Dropdownmenu's</translation> <translation id="1195238899008218998">Nawoord</translation> <translation id="1197088940767939838">Oranje</translation> +<translation id="1198865190323699001">Tikgebaren</translation> <translation id="1201402288615127009">Volgende</translation> <translation id="1206619573307042055">marquee</translation> <translation id="1207086294218137981">Geen volgende kop van niveau 4</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-BR.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-BR.xtb index e3f1414..7bc0155f 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-BR.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-BR.xtb
@@ -30,6 +30,7 @@ <translation id="1189258430971676908">Área para prática: listas suspensas</translation> <translation id="1195238899008218998">Posfácio</translation> <translation id="1197088940767939838">Laranja</translation> +<translation id="1198865190323699001">Gestos de toque</translation> <translation id="1201402288615127009">Próxima</translation> <translation id="1206619573307042055">marquee</translation> <translation id="1207086294218137981">Nenhum cabeçalho de nível 4 a seguir</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ro.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ro.xtb index 9c95607..a32f6e4f 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ro.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ro.xtb
@@ -30,6 +30,7 @@ <translation id="1189258430971676908">Zonă pentru exersare: listele drop-down</translation> <translation id="1195238899008218998">Postfață</translation> <translation id="1197088940767939838">Portocaliu</translation> +<translation id="1198865190323699001">Gesturi tactile</translation> <translation id="1201402288615127009">Înainte</translation> <translation id="1206619573307042055">text derulant</translation> <translation id="1207086294218137981">Nu există un titlu de nivel 4 următor</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ta.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ta.xtb index b5530aa..269e687 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ta.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ta.xtb
@@ -30,6 +30,7 @@ <translation id="1189258430971676908">பயிற்சிப் பகுதி: கீழ் தோன்றும் பட்டிகள்</translation> <translation id="1195238899008218998">பின்னுரை</translation> <translation id="1197088940767939838">ஆரஞ்சு</translation> +<translation id="1198865190323699001">தொடுதல் சைகைகள்</translation> <translation id="1201402288615127009">அடுத்து</translation> <translation id="1206619573307042055">மார்கியூ</translation> <translation id="1207086294218137981">அடுத்த 4ம் நிலை தலைப்பு எதுவும் இல்லை</translation>
diff --git a/chrome/browser/resources/print_preview/ui/sidebar.ts b/chrome/browser/resources/print_preview/ui/sidebar.ts index ab98ef34..3c2e856 100644 --- a/chrome/browser/resources/print_preview/ui/sidebar.ts +++ b/chrome/browser/resources/print_preview/ui/sidebar.ts
@@ -248,5 +248,11 @@ // </if> } +declare global { + interface HTMLElementTagNameMap { + 'print-preview-sidebar': PrintPreviewSidebarElement; + } +} + customElements.define( PrintPreviewSidebarElement.is, PrintPreviewSidebarElement);
diff --git a/chrome/browser/resources/read_later/read_later_item.ts b/chrome/browser/resources/read_later/read_later_item.ts index 4978f3c..ddd602c 100644 --- a/chrome/browser/resources/read_later/read_later_item.ts +++ b/chrome/browser/resources/read_later/read_later_item.ts
@@ -10,7 +10,7 @@ import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import './icons.js'; -import {MouseHoverableMixin, MouseHoverableMixinInterface} from 'chrome://resources/cr_elements/mouse_hoverable_mixin.js'; +import {MouseHoverableMixin} from 'chrome://resources/cr_elements/mouse_hoverable_mixin.js'; import {assertNotReached} from 'chrome://resources/js/assert.m.js'; import {getFaviconForPageURL} from 'chrome://resources/js/icon.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; @@ -28,8 +28,7 @@ }, } -const ReadLaterItemElementBase = MouseHoverableMixin(PolymerElement) as - {new (): PolymerElement & MouseHoverableMixinInterface}; +const ReadLaterItemElementBase = MouseHoverableMixin(PolymerElement); export class ReadLaterItemElement extends ReadLaterItemElementBase { static get is() {
diff --git a/chrome/browser/resources/settings/a11y_page/captions_subpage.ts b/chrome/browser/resources/settings/a11y_page/captions_subpage.ts index 415aab2..2a9a8a8 100644 --- a/chrome/browser/resources/settings/a11y_page/captions_subpage.ts +++ b/chrome/browser/resources/settings/a11y_page/captions_subpage.ts
@@ -15,7 +15,7 @@ import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {FontsBrowserProxy, FontsBrowserProxyImpl, FontsData} from '../appearance_page/fonts_browser_proxy.js'; +import {FontsBrowserProxyImpl, FontsData} from '../appearance_page/fonts_browser_proxy.js'; import {DropdownMenuOptionList} from '../controls/settings_dropdown_menu.js'; import {SettingsToggleButtonElement} from '../controls/settings_toggle_button.js'; import {loadTimeData} from '../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/about_page/about_page.ts b/chrome/browser/resources/settings/about_page/about_page.ts index 35c2134b..c3bf1c0b 100644 --- a/chrome/browser/resources/settings/about_page/about_page.ts +++ b/chrome/browser/resources/settings/about_page/about_page.ts
@@ -29,7 +29,11 @@ import {loadTimeData} from '../i18n_setup.js'; import {LifetimeBrowserProxyImpl} from '../lifetime_browser_proxy.js'; -import {AboutPageBrowserProxy, AboutPageBrowserProxyImpl, PromoteUpdaterStatus, UpdateStatus, UpdateStatusChangedEvent} from './about_page_browser_proxy.js'; +import {AboutPageBrowserProxy, AboutPageBrowserProxyImpl, UpdateStatus, UpdateStatusChangedEvent} from './about_page_browser_proxy.js'; + +// <if expr="_google_chrome and is_macosx"> +import {PromoteUpdaterStatus} from './about_page_browser_proxy.js'; +// </if> const SettingsAboutPageElementBase = WebUIListenerMixin(I18nMixin(PolymerElement));
diff --git a/chrome/browser/resources/settings/about_page/about_page_browser_proxy.ts b/chrome/browser/resources/settings/about_page/about_page_browser_proxy.ts index 8fb6948..ef80e92 100644 --- a/chrome/browser/resources/settings/about_page/about_page_browser_proxy.ts +++ b/chrome/browser/resources/settings/about_page/about_page_browser_proxy.ts
@@ -7,10 +7,6 @@ * the browser. */ -// clang-format off -import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; -// clang-format on - /** * Enumeration of all possible update statuses. The string literals must match * the ones defined at |AboutHandler::UpdateStatusToString|. @@ -29,19 +25,14 @@ NEED_PERMISSION_TO_UPDATE = 'need_permission_to_update', } -// Note: This typedef should only defined for _google_chrome and is_macosx, -// however, while the Polymer 3 version of this file is autogenerated, it is -// temporarily defined on all platforms. -// TODO (rbpotter): Make this platform/build specific again once the Polymer 3 -// version of this file is checked in, and autogeneration is no longer -// necessary. - +// <if expr="_google_chrome and is_macosx"> export type PromoteUpdaterStatus = { hidden: boolean, disabled: boolean, actionable: boolean, text?: string, }; +// </if> export type UpdateStatusChangedEvent = { status: UpdateStatus,
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.ts b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.ts index 3b6ab9e..293ad42 100644 --- a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.ts +++ b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.ts
@@ -12,7 +12,6 @@ import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {DropdownMenuOptionList} from '../controls/settings_dropdown_menu.js'; -import {loadTimeData} from '../i18n_setup.js'; import {FontsBrowserProxy, FontsBrowserProxyImpl, FontsData} from './fonts_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/autofill_page/autofill_page.ts b/chrome/browser/resources/settings/autofill_page/autofill_page.ts index c5ff980a..960fc27 100644 --- a/chrome/browser/resources/settings/autofill_page/autofill_page.ts +++ b/chrome/browser/resources/settings/autofill_page/autofill_page.ts
@@ -17,7 +17,6 @@ import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {BaseMixin} from '../base_mixin.js'; -import {loadTimeData} from '../i18n_setup.js'; import {PrefsMixin} from '../prefs/prefs_mixin.js'; import {routes} from '../route.js'; import {Router} from '../router.js';
diff --git a/chrome/browser/resources/settings/autofill_page/autofill_section.ts b/chrome/browser/resources/settings/autofill_page/autofill_section.ts index 56b6382b..3f293b4 100644 --- a/chrome/browser/resources/settings/autofill_page/autofill_section.ts +++ b/chrome/browser/resources/settings/autofill_page/autofill_section.ts
@@ -19,6 +19,7 @@ import './address_edit_dialog.js'; import './address_remove_confirmation_dialog.js'; import './passwords_shared_css.js'; +import '../i18n_setup.js'; import {I18nMixin} from '//resources/js/i18n_mixin.js'; import {CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js'; @@ -28,9 +29,7 @@ import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {SettingsToggleButtonElement} from '../controls/settings_toggle_button.js'; -import {loadTimeData} from '../i18n_setup.js'; -import {SettingsAddressRemoveConfirmationDialogElement} from './address_remove_confirmation_dialog.js'; import {AutofillManagerImpl, AutofillManagerProxy, PersonalDataChangedListener} from './autofill_manager_proxy.js'; declare global {
diff --git a/chrome/browser/resources/settings/autofill_page/credit_card_edit_dialog.ts b/chrome/browser/resources/settings/autofill_page/credit_card_edit_dialog.ts index 276698e..227d40b2 100644 --- a/chrome/browser/resources/settings/autofill_page/credit_card_edit_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/credit_card_edit_dialog.ts
@@ -15,6 +15,7 @@ import 'chrome://resources/cr_elements/md_select_css.m.js'; import '../settings_shared_css.js'; import '../settings_vars_css.js'; +import '../i18n_setup.js'; import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; @@ -22,8 +23,6 @@ import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js'; import {html, microTask, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; - /** * Regular expression for invalid nickname. Nickname containing any digits will * be treated as invalid.
diff --git a/chrome/browser/resources/settings/autofill_page/merge_passwords_store_copies_mixin.ts b/chrome/browser/resources/settings/autofill_page/merge_passwords_store_copies_mixin.ts index 1fab5a5..2abda35 100644 --- a/chrome/browser/resources/settings/autofill_page/merge_passwords_store_copies_mixin.ts +++ b/chrome/browser/resources/settings/autofill_page/merge_passwords_store_copies_mixin.ts
@@ -13,7 +13,7 @@ import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; -import {PasswordManagerImpl, PasswordManagerProxy} from './password_manager_proxy.js'; +import {PasswordManagerImpl} from './password_manager_proxy.js'; type Constructor<T> = new (...args: any[]) => T;
diff --git a/chrome/browser/resources/settings/autofill_page/multi_store_exception_entry.ts b/chrome/browser/resources/settings/autofill_page/multi_store_exception_entry.ts index 4e82512a..f46fde2 100644 --- a/chrome/browser/resources/settings/autofill_page/multi_store_exception_entry.ts +++ b/chrome/browser/resources/settings/autofill_page/multi_store_exception_entry.ts
@@ -7,10 +7,7 @@ * are duplicated across stores as a single item in the UI. */ -import {assert} from 'chrome://resources/js/assert.m.js'; - import {MultiStoreIdHandler} from './multi_store_id_handler.js'; -import {PasswordManagerProxy} from './password_manager_proxy.js'; /** * A version of chrome.passwordsPrivate.ExceptionEntry used for deduplicating
diff --git a/chrome/browser/resources/settings/autofill_page/multi_store_password_ui_entry.ts b/chrome/browser/resources/settings/autofill_page/multi_store_password_ui_entry.ts index 4eb37f1f3..c3be3a6 100644 --- a/chrome/browser/resources/settings/autofill_page/multi_store_password_ui_entry.ts +++ b/chrome/browser/resources/settings/autofill_page/multi_store_password_ui_entry.ts
@@ -7,10 +7,7 @@ * are duplicated across stores as a single item in the UI. */ -import {assert} from 'chrome://resources/js/assert.m.js'; - import {MultiStoreIdHandler} from './multi_store_id_handler.js'; -import {PasswordManagerProxy} from './password_manager_proxy.js'; /** * A version of chrome.passwordsPrivate.PasswordUiEntry used for deduplicating
diff --git a/chrome/browser/resources/settings/autofill_page/password_check.ts b/chrome/browser/resources/settings/autofill_page/password_check.ts index ea2f288..5bed3aa 100644 --- a/chrome/browser/resources/settings/autofill_page/password_check.ts +++ b/chrome/browser/resources/settings/autofill_page/password_check.ts
@@ -11,6 +11,7 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; +import '../i18n_setup.js'; import '../route.js'; import '../prefs/prefs.js'; import './password_check_edit_dialog.js'; @@ -32,7 +33,10 @@ import {WebUIListenerMixin, WebUIListenerMixinInterface} from 'chrome://resources/js/web_ui_listener_mixin.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +// <if expr="chromeos or lacros"> import {loadTimeData} from '../i18n_setup.js'; +// </if> + import {StoredAccount, SyncBrowserProxyImpl, SyncPrefs, SyncStatus} from '../people_page/sync_browser_proxy.js'; import {PrefsMixin, PrefsMixinInterface} from '../prefs/prefs_mixin.js'; import {routes} from '../route.js'; @@ -44,7 +48,7 @@ import {PasswordCheckListItemElement} from './password_check_list_item.js'; import {PasswordCheckMixin, PasswordCheckMixinInterface} from './password_check_mixin.js'; -import {PasswordCheckInteraction, PasswordManagerImpl, PasswordManagerProxy, SavedPasswordListChangedListener} from './password_manager_proxy.js'; +import {PasswordCheckInteraction, SavedPasswordListChangedListener} from './password_manager_proxy.js'; const CheckState = chrome.passwordsPrivate.PasswordCheckState;
diff --git a/chrome/browser/resources/settings/autofill_page/password_check_mixin.ts b/chrome/browser/resources/settings/autofill_page/password_check_mixin.ts index f50ece00..22435fa 100644 --- a/chrome/browser/resources/settings/autofill_page/password_check_mixin.ts +++ b/chrome/browser/resources/settings/autofill_page/password_check_mixin.ts
@@ -3,7 +3,6 @@ // found in the LICENSE file. import {assert} from 'chrome://resources/js/assert.m.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {PluralStringProxyImpl} from 'chrome://resources/js/plural_string_proxy.js'; import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/autofill_page/password_list_item.ts b/chrome/browser/resources/settings/autofill_page/password_list_item.ts index 161d106..c10e148 100644 --- a/chrome/browser/resources/settings/autofill_page/password_list_item.ts +++ b/chrome/browser/resources/settings/autofill_page/password_list_item.ts
@@ -15,7 +15,6 @@ import '../site_favicon.js'; import './passwords_shared_css.js'; -import {FocusRowBehavior} from 'chrome://resources/js/cr/ui/focus_row_behavior.m.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from '../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts b/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts index 80f5eb7..eb78b690 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts +++ b/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts
@@ -26,7 +26,7 @@ import {PluralStringProxyImpl} from 'chrome://resources/js/plural_string_proxy.js'; import {getDeepActiveElement} from 'chrome://resources/js/util.m.js'; import {WebUIListenerMixin, WebUIListenerMixinInterface} from 'chrome://resources/js/web_ui_listener_mixin.js'; -import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {GlobalScrollTargetMixin} from '../global_scroll_target_mixin.js'; import {loadTimeData} from '../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts b/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts index 15171773..ee5cd22 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts +++ b/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts
@@ -8,6 +8,7 @@ * editing, removal, moving to account). */ +import '../i18n_setup.js'; import './password_edit_dialog.js'; import './password_move_to_account_dialog.js'; import './password_remove_dialog.js'; @@ -26,7 +27,6 @@ import {WebUIListenerMixin} from 'chrome://resources/js/web_ui_listener_mixin.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; import {StoredAccount, SyncBrowserProxyImpl} from '../people_page/sync_browser_proxy.js'; // <if expr="chromeos or lacros">
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.html b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.html index 36fb1f2..a616e59 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.html +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.html
@@ -8,7 +8,7 @@ text-align: end; } </style> -<cr-link-row hidden="[[!showSetupGuide_()]]" +<cr-link-row on-click="onSetupGuideRerunClick_" label="$i18n{switchAccessSetupGuideLabel}" id="setupGuideLink"> </cr-link-row>
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js index a1109f4..85ad603 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js
@@ -234,9 +234,7 @@ /** @private */ onSetupGuideRerunClick_() { - if (this.showSetupGuide_()) { - this.showSwitchAccessSetupGuideWarningDialog_ = true; - } + this.showSwitchAccessSetupGuideWarningDialog_ = true; }, /** @private */ @@ -257,9 +255,7 @@ /** @private */ openSetupGuide_() { this.showSwitchAccessSetupGuideWarningDialog_ = false; - if (this.showSetupGuide_()) { - this.showSwitchAccessSetupGuideDialog_ = true; - } + this.showSwitchAccessSetupGuideDialog_ = true; }, /** @private */ @@ -308,8 +304,7 @@ // Any complete assignment will have at least one switch assigned to SELECT. // If this method is called with no SELECT switches, then the page has just // loaded, and we should open the setup guide. - if (Object.keys(this.selectAssignments_).length === 0 && - this.showSetupGuide_()) { + if (Object.keys(this.selectAssignments_).length === 0) { this.openSetupGuide_(); } }, @@ -365,15 +360,6 @@ }, /** - * @return {boolean} Whether to show the Switch Access setup guide. - * @private - */ - showSetupGuide_() { - return loadTimeData.getBoolean('showSwitchAccessSetupGuide') && - !this.showSwitchAccessActionAssignmentDialog_; - }, - - /** * @param {number} scanSpeedValueMs * @return {string} a string representing the scan speed in seconds. * @private
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts index d7c41c1..55ab9a0 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts
@@ -615,7 +615,7 @@ private shouldShowFooter_(): boolean { let showFooter = false; - // <if expr="not chromeos"> + // <if expr="not chromeos and not lacros"> showFooter = !!this.syncStatus && !!this.syncStatus!.signedIn; // </if> return showFooter;
diff --git a/chrome/browser/resources/settings/controls/controlled_button.ts b/chrome/browser/resources/settings/controls/controlled_button.ts index b8d4b6d..188761ae 100644 --- a/chrome/browser/resources/settings/controls/controlled_button.ts +++ b/chrome/browser/resources/settings/controls/controlled_button.ts
@@ -9,8 +9,6 @@ import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; - import {CrPolicyPrefMixin} from './cr_policy_pref_mixin.js'; import {PrefControlMixin} from './pref_control_mixin.js';
diff --git a/chrome/browser/resources/settings/controls/settings_dropdown_menu.ts b/chrome/browser/resources/settings/controls/settings_dropdown_menu.ts index c4d27c2..e789fc36 100644 --- a/chrome/browser/resources/settings/controls/settings_dropdown_menu.ts +++ b/chrome/browser/resources/settings/controls/settings_dropdown_menu.ts
@@ -19,7 +19,6 @@ import {assert} from '//resources/js/assert.m.js'; import {html, microTask, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; import {prefToString, stringToPrefValue} from '../prefs/pref_util.js'; import {CrPolicyPrefMixin} from './cr_policy_pref_mixin.js';
diff --git a/chrome/browser/resources/settings/controls/settings_radio_group.ts b/chrome/browser/resources/settings/controls/settings_radio_group.ts index 03f4c554..78988ed 100644 --- a/chrome/browser/resources/settings/controls/settings_radio_group.ts +++ b/chrome/browser/resources/settings/controls/settings_radio_group.ts
@@ -20,7 +20,7 @@ import {prefToString, stringToPrefValue} from '../prefs/pref_util.js'; -import {PrefControlMixin, PrefControlMixinInterface} from './pref_control_mixin.js'; +import {PrefControlMixin} from './pref_control_mixin.js'; const SettingsRadioGroupElementBase = PrefControlMixin(PolymerElement);
diff --git a/chrome/browser/resources/settings/controls/settings_slider.ts b/chrome/browser/resources/settings/controls/settings_slider.ts index 4b05fa6..8ba665a 100644 --- a/chrome/browser/resources/settings/controls/settings_slider.ts +++ b/chrome/browser/resources/settings/controls/settings_slider.ts
@@ -17,7 +17,7 @@ import {loadTimeData} from '../i18n_setup.js'; -import {CrPolicyPrefMixin, CrPolicyPrefMixinInterface} from './cr_policy_pref_mixin.js'; +import {CrPolicyPrefMixin} from './cr_policy_pref_mixin.js'; export interface SettingsSliderElement { $: {
diff --git a/chrome/browser/resources/settings/controls/settings_toggle_button.ts b/chrome/browser/resources/settings/controls/settings_toggle_button.ts index 0bb4bb3..a55ae84 100644 --- a/chrome/browser/resources/settings/controls/settings_toggle_button.ts +++ b/chrome/browser/resources/settings/controls/settings_toggle_button.ts
@@ -13,7 +13,7 @@ import '../settings_shared_css.js'; import {CrToggleElement} from '//resources/cr_elements/cr_toggle/cr_toggle.m.js'; -import {afterNextRender, html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; // <if expr="chromeos"> import {sanitizeInnerHtml} from 'chrome://resources/js/parse_html_subset.m.js'; // </if>
diff --git a/chrome/browser/resources/settings/downloads_page/downloads_browser_proxy.ts b/chrome/browser/resources/settings/downloads_page/downloads_browser_proxy.ts index 14a25807..4cfd4fde 100644 --- a/chrome/browser/resources/settings/downloads_page/downloads_browser_proxy.ts +++ b/chrome/browser/resources/settings/downloads_page/downloads_browser_proxy.ts
@@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// clang-format off +// <if expr="chromeos"> import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; -// clang-format on +// </if> export interface DownloadsBrowserProxy { initializeDownloads(): void;
diff --git a/chrome/browser/resources/settings/downloads_page/downloads_page.ts b/chrome/browser/resources/settings/downloads_page/downloads_page.ts index a93ec971..914313da 100644 --- a/chrome/browser/resources/settings/downloads_page/downloads_page.ts +++ b/chrome/browser/resources/settings/downloads_page/downloads_page.ts
@@ -14,7 +14,6 @@ import '../controls/settings_toggle_button.js'; import '../settings_shared_css.js'; -import {assert} from 'chrome://resources/js/assert.m.js'; import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js'; import {listenOnce} from 'chrome://resources/js/util.m.js'; import {WebUIListenerMixin} from 'chrome://resources/js/web_ui_listener_mixin.js';
diff --git a/chrome/browser/resources/settings/languages_page/languages.ts b/chrome/browser/resources/settings/languages_page/languages.ts index f0a5a02..a8201b8df 100644 --- a/chrome/browser/resources/settings/languages_page/languages.ts +++ b/chrome/browser/resources/settings/languages_page/languages.ts
@@ -13,9 +13,8 @@ import '../prefs/prefs.js'; import {assert} from '//resources/js/assert.m.js'; -import {loadTimeData} from '//resources/js/load_time_data.m.js'; import {PromiseResolver} from '//resources/js/promise_resolver.m.js'; -import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {PrefsMixin} from '../prefs/prefs_mixin.js'; import {CrSettingsPrefs} from '../prefs/prefs_types.js';
diff --git a/chrome/browser/resources/settings/languages_page/languages_browser_proxy.ts b/chrome/browser/resources/settings/languages_page/languages_browser_proxy.ts index 3bc607e0..fa236e4 100644 --- a/chrome/browser/resources/settings/languages_page/languages_browser_proxy.ts +++ b/chrome/browser/resources/settings/languages_page/languages_browser_proxy.ts
@@ -7,9 +7,9 @@ * to interact with the browser. */ -// clang-format off +// <if expr="is_win"> import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; -// clang-format on +// </if> export interface LanguagesBrowserProxy { // <if expr="is_win">
diff --git a/chrome/browser/resources/settings/languages_page/languages_page.ts b/chrome/browser/resources/settings/languages_page/languages_page.ts index 255dbc8..2f7da93 100644 --- a/chrome/browser/resources/settings/languages_page/languages_page.ts +++ b/chrome/browser/resources/settings/languages_page/languages_page.ts
@@ -38,15 +38,15 @@ import {assert} from 'chrome://resources/js/assert.m.js'; import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js'; import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js'; -import {flush, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {BaseMixin} from '../base_mixin.js'; import {loadTimeData} from '../i18n_setup.js'; import {PrefsMixin} from '../prefs/prefs_mixin.js'; import {routes} from '../route.js'; -import {Route, Router} from '../router.js'; +import {Router} from '../router.js'; -import {LanguageSettingsActionType, LanguageSettingsMetricsProxy, LanguageSettingsMetricsProxyImpl, LanguageSettingsPageImpressionType} from './languages_settings_metrics_proxy.js'; +import {LanguageSettingsMetricsProxy, LanguageSettingsMetricsProxyImpl, LanguageSettingsPageImpressionType} from './languages_settings_metrics_proxy.js'; import {LanguageHelper, LanguagesModel, LanguageState, SpellCheckLanguageState} from './languages_types.js'; interface RepeaterEvent extends Event {
diff --git a/chrome/browser/resources/settings/languages_page/languages_subpage.ts b/chrome/browser/resources/settings/languages_page/languages_subpage.ts index 4f1444b..2c0718b 100644 --- a/chrome/browser/resources/settings/languages_page/languages_subpage.ts +++ b/chrome/browser/resources/settings/languages_page/languages_subpage.ts
@@ -35,11 +35,17 @@ import {isWindows} from 'chrome://resources/js/cr.m.js'; import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js'; import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js'; -import {flush, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +// <if expr="is_win"> +import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +// </if> import {SettingsToggleButtonElement} from '../controls/settings_toggle_button.js'; import {loadTimeData} from '../i18n_setup.js'; +// <if expr="is_win"> import {LifetimeBrowserProxyImpl} from '../lifetime_browser_proxy.js'; +// </if> import {PrefsMixin} from '../prefs/prefs_mixin.js'; import {LanguageSettingsActionType, LanguageSettingsMetricsProxy, LanguageSettingsMetricsProxyImpl, LanguageSettingsPageImpressionType} from './languages_settings_metrics_proxy.js'; @@ -431,9 +437,7 @@ * Handler for the restart button. */ private onRestartTap_() { - // <if expr="is_win"> LifetimeBrowserProxyImpl.getInstance().restart(); - // </if> } // </if>
diff --git a/chrome/browser/resources/settings/people_page/import_data_dialog.ts b/chrome/browser/resources/settings/people_page/import_data_dialog.ts index 567bc7f4..f5d3b02 100644 --- a/chrome/browser/resources/settings/people_page/import_data_dialog.ts +++ b/chrome/browser/resources/settings/people_page/import_data_dialog.ts
@@ -15,6 +15,7 @@ import '../controls/settings_toggle_button.js'; import '../icons.js'; import '../settings_vars_css.js'; +import '../i18n_setup.js'; import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js'; @@ -22,7 +23,6 @@ import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {SettingsCheckboxElement} from '../controls/settings_checkbox.js'; -import {loadTimeData} from '../i18n_setup.js'; import {PrefsMixin} from '../prefs/prefs_mixin.js'; import {BrowserProfile, ImportDataBrowserProxy, ImportDataBrowserProxyImpl, ImportDataStatus} from './import_data_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/people_page/people_page.ts b/chrome/browser/resources/settings/people_page/people_page.ts index d718d705..c838869 100644 --- a/chrome/browser/resources/settings/people_page/people_page.ts +++ b/chrome/browser/resources/settings/people_page/people_page.ts
@@ -43,7 +43,7 @@ // <if expr="chromeos"> import {AccountManagerBrowserProxyImpl} from './account_manager_browser_proxy.js'; // </if> -import {ProfileInfo, ProfileInfoBrowserProxy, ProfileInfoBrowserProxyImpl} from './profile_info_browser_proxy.js'; +import {ProfileInfo, ProfileInfoBrowserProxyImpl} from './profile_info_browser_proxy.js'; import {StoredAccount, SyncBrowserProxy, SyncBrowserProxyImpl, SyncStatus} from './sync_browser_proxy.js'; type FocusConfig = Map<string, (string|(() => void))>;
diff --git a/chrome/browser/resources/settings/people_page/sync_account_control.ts b/chrome/browser/resources/settings/people_page/sync_account_control.ts index d1b80f0..2fe25f3 100644 --- a/chrome/browser/resources/settings/people_page/sync_account_control.ts +++ b/chrome/browser/resources/settings/people_page/sync_account_control.ts
@@ -18,7 +18,6 @@ import '../prefs/prefs.js'; import '../settings_shared_css.js'; -import {CrActionMenuElement} from '//resources/cr_elements/cr_action_menu/cr_action_menu.js'; import {assert} from '//resources/js/assert.m.js'; import {WebUIListenerMixin} from '//resources/js/web_ui_listener_mixin.js'; import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/people_page/sync_controls.ts b/chrome/browser/resources/settings/people_page/sync_controls.ts index 4414a9a..584299e 100644 --- a/chrome/browser/resources/settings/people_page/sync_controls.ts +++ b/chrome/browser/resources/settings/people_page/sync_controls.ts
@@ -15,7 +15,10 @@ import {WebUIListenerMixin} from '//resources/js/web_ui_listener_mixin.js'; import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +// <if expr="chromeos or lacros"> import {loadTimeData} from '../i18n_setup.js'; +// </if> + import {Route, Router} from '../router.js'; import {StatusAction, SyncBrowserProxy, SyncBrowserProxyImpl, SyncPrefs, syncPrefsIndividualDataTypes, SyncStatus} from './sync_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/people_page/sync_encryption_options.ts b/chrome/browser/resources/settings/people_page/sync_encryption_options.ts index e08cc80..e884d69 100644 --- a/chrome/browser/resources/settings/people_page/sync_encryption_options.ts +++ b/chrome/browser/resources/settings/people_page/sync_encryption_options.ts
@@ -11,14 +11,14 @@ import '../settings_vars_css.js'; import {CrInputElement} from '//resources/cr_elements/cr_input/cr_input.m.js'; -import {assert, assertNotReached} from '//resources/js/assert.m.js'; -import {I18nBehavior} from '//resources/js/i18n_behavior.m.js'; -import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; // <if expr="chromeos"> import {CrRadioGroupElement} from '//resources/cr_elements/cr_radio_group/cr_radio_group.m.js'; // </if> +import {assert} from '//resources/js/assert.m.js'; +import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + import {SyncBrowserProxyImpl, SyncPrefs, SyncStatus} from './sync_browser_proxy.js'; /**
diff --git a/chrome/browser/resources/settings/people_page/sync_page.ts b/chrome/browser/resources/settings/people_page/sync_page.ts index 1366c38..2a07f62 100644 --- a/chrome/browser/resources/settings/people_page/sync_page.ts +++ b/chrome/browser/resources/settings/people_page/sync_page.ts
@@ -32,11 +32,18 @@ import {I18nMixin, I18nMixinInterface} from 'chrome://resources/js/i18n_mixin.js'; import {loadTimeData} from '../i18n_setup.js'; + +// <if expr="chromeos"> import {SettingsPersonalizationOptionsElement} from '../privacy_page/personalization_options.js'; +// </if> + import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js'; import {PageStatus, StatusAction, SyncBrowserProxy, SyncBrowserProxyImpl, SyncPrefs, SyncStatus} from './sync_browser_proxy.js'; + +// <if expr="chromeos"> import {SettingsSyncEncryptionOptionsElement} from './sync_encryption_options.js'; +// </if> // TODO(rbpotter): Remove this typedef when this file is no longer needed by OS // Settings.
diff --git a/chrome/browser/resources/settings/prefs/prefs.ts b/chrome/browser/resources/settings/prefs/prefs.ts index 391551ff..5cdc7b1 100644 --- a/chrome/browser/resources/settings/prefs/prefs.ts +++ b/chrome/browser/resources/settings/prefs/prefs.ts
@@ -13,7 +13,7 @@ */ import {assert} from '//resources/js/assert.m.js'; -import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {CrSettingsPrefs} from './prefs_types.js';
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.ts b/chrome/browser/resources/settings/privacy_page/privacy_page.ts index 6541ef8..4f9be6f 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_page.ts +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.ts
@@ -33,11 +33,11 @@ import {SettingsToggleButtonElement} from '../controls/settings_toggle_button.js'; import {HatsBrowserProxyImpl, TrustSafetyInteraction} from '../hats_browser_proxy.js'; import {loadTimeData} from '../i18n_setup.js'; -import {MetricsBrowserProxy, MetricsBrowserProxyImpl, PrivacyElementInteractions} from '../metrics_browser_proxy.js'; +import {MetricsBrowserProxy, MetricsBrowserProxyImpl} from '../metrics_browser_proxy.js'; import {PrefsMixin, PrefsMixinInterface} from '../prefs/prefs_mixin.js'; import {routes} from '../route.js'; import {RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js'; -import {ChooserType, ContentSettingsTypes, CookieControlsMode, NotificationSetting} from '../site_settings/constants.js'; +import {ChooserType, ContentSettingsTypes, NotificationSetting} from '../site_settings/constants.js'; import {SiteSettingsPrefsBrowserProxyImpl} from '../site_settings/site_settings_prefs_browser_proxy.js'; import {PrivacyPageBrowserProxy, PrivacyPageBrowserProxyImpl} from './privacy_page_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_clear_on_exit_fragment.html b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_clear_on_exit_fragment.html index f2e90dd..6efc2d5f 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_clear_on_exit_fragment.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_clear_on_exit_fragment.html
@@ -1,4 +1,13 @@ <style include="privacy-review-fragment-shared"></style> +<div class="header"> + <picture> + <source + srcset="./images/privacy_review/clear_on_exit_graphic_dark.svg" + media="(prefers-color-scheme: dark)"> + <img alt="" src="./images/privacy_review/clear_on_exit_graphic.svg"> + </picture> + <div class="header-label">$i18n{privacyReviewClearOnExitCardHeader}</div> +</div> <div class="embedded-setting-wrapper"> <settings-toggle-button id="clearOnExit" pref="{{prefs.generated.cookie_session_only}}"
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_cookies_fragment.html b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_cookies_fragment.html index 4ad9293c..c6a646a 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_cookies_fragment.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_cookies_fragment.html
@@ -1,4 +1,13 @@ <style include="privacy-review-fragment-shared"></style> +<div class="header"> + <picture> + <source + srcset="./images/privacy_review/cookies_graphic_dark.svg" + media="(prefers-color-scheme: dark)"> + <img alt="" src="./images/privacy_review/cookies_graphic.svg"> + </picture> + <div class="header-label">$i18n{privacyReviewCookiesCardHeader}</div> +</div> <settings-radio-group id="cookiesRadioGroup" pref="{{prefs.generated.cookie_primary_setting}}" selectable-elements="settings-collapse-radio-button">
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_fragment_shared_css.html b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_fragment_shared_css.html index 251914c..a2fbc689 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_fragment_shared_css.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_fragment_shared_css.html
@@ -37,6 +37,21 @@ --settings-collapse-separator-line: var(--cr-separator-line); } + .header { + align-items: center; + column-gap: 16px; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + padding: 24px 0 16px 0; + } + + .header-label { + flex: 1; + font-size: 123%; /* Should be 16px when 100% is 13px. */ + } + .headline { color: var(--google-grey-800); font-size: 22px;
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_history_sync_fragment.html b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_history_sync_fragment.html index ed54bc9..6bd9918 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_history_sync_fragment.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_history_sync_fragment.html
@@ -1,4 +1,13 @@ <style include="privacy-review-fragment-shared"></style> +<div class="header"> + <picture> + <source + srcset="./images/privacy_review/history_sync_graphic_dark.svg" + media="(prefers-color-scheme: dark)"> + <img alt="" src="./images/privacy_review/history_sync_graphic.svg"> + </picture> + <div class="header-label">$i18n{privacyReviewHistorySyncCardHeader}</div> +</div> <div class="embedded-setting-wrapper"> <settings-toggle-button id="historyToggle" pref="{{historySyncVirtualPref_}}"
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_history_sync_fragment.ts b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_history_sync_fragment.ts index 644026b2..f618a90 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_history_sync_fragment.ts +++ b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_history_sync_fragment.ts
@@ -13,7 +13,6 @@ import './privacy_review_fragment_shared_css.js'; import '../../controls/settings_toggle_button.js'; -import {assert} from 'chrome://resources/js/assert.m.js'; import {WebUIListenerMixin, WebUIListenerMixinInterface} from 'chrome://resources/js/web_ui_listener_mixin.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_msbb_fragment.html b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_msbb_fragment.html index b9a35a19..bc1110e 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_msbb_fragment.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_msbb_fragment.html
@@ -1,4 +1,13 @@ <style include="privacy-review-fragment-shared"></style> +<div class="header"> + <picture> + <source + srcset="./images/privacy_review/msbb_graphic_dark.svg" + media="(prefers-color-scheme: dark)"> + <img alt="" src="./images/privacy_review/msbb_graphic.svg"> + </picture> + <div class="header-label">$i18n{privacyReviewMsbbCardHeader}</div> +</div> <div class="embedded-setting-wrapper"> <settings-toggle-button id="urlCollectionToggle" pref="{{prefs.url_keyed_anonymized_data_collection.enabled}}"
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_page.html b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_page.html index ee208afe..6d3c80b 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_page.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_page.html
@@ -1,19 +1,4 @@ <style include="cr-shared-style settings-shared"> - #header { - align-items: center; - column-gap: 16px; - display: flex; - flex-direction: row; - flex-wrap: nowrap; - justify-content: space-between; - padding: 24px 24px 16px 24px; - } - - #headerLabel { - flex: 1; - font-size: 123%; /* Should be 16px when 100% is 13px. */ - } - .footer { align-items: center; display: flex; @@ -40,15 +25,6 @@ } </style> <div class="privacy-review-card"> - <div id="header" hidden="[[hideHeader_]]"> - <picture> - <source - srcset="[[headerModel_.darkImage]]" - media="(prefers-color-scheme: dark)"> - <img id="headerImage" alt="" src="[[headerModel_.lightImage]]"> - </picture> - <div id="headerLabel">[[headerModel_.title]]</div> - </div> <template is="dom-if" if="[[showFragment_( privacyReviewStepEnum_.WELCOME, privacyReviewStep_)]]">
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_page.ts b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_page.ts index bb6031a..056e25ca 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_page.ts +++ b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_page.ts
@@ -36,14 +36,7 @@ import {PrivacyReviewStep} from './constants.js'; import {StepIndicatorModel} from './step_indicator.js'; -type HeaderModel = { - title: string, - lightImage: string, - darkImage: string, -}; - interface PrivacyReviewStepComponents { - headerModel?: HeaderModel; onForwardNavigation(): void; onBackNavigation?(): void; isAvailable(): boolean; @@ -88,7 +81,6 @@ privacyReviewStep_: { type: String, value: PrivacyReviewStep.WELCOME, - observer: 'onPrivacyReviewStepChanged_', }, /** @@ -115,8 +107,6 @@ private syncBrowserProxy_: SyncBrowserProxy = SyncBrowserProxyImpl.getInstance(); private syncStatus_: SyncStatus; - private hideHeader_: boolean; - private headerModel_?: HeaderModel; constructor() { super(); @@ -175,11 +165,6 @@ [ PrivacyReviewStep.MSBB, { - headerModel: { - title: this.i18n('privacyReviewMsbbCardHeader'), - lightImage: './images/privacy_review/msbb_graphic.svg', - darkImage: './images/privacy_review/msbb_graphic_dark.svg', - }, onForwardNavigation: () => { this.navigateToCard_(PrivacyReviewStep.CLEAR_ON_EXIT); }, @@ -189,11 +174,6 @@ [ PrivacyReviewStep.CLEAR_ON_EXIT, { - headerModel: { - title: this.i18n('privacyReviewClearOnExitCardHeader'), - lightImage: './images/privacy_review/clear_on_exit_graphic.svg', - darkImage: './images/privacy_review/clear_on_exit_graphic_dark.svg', - }, onForwardNavigation: () => { this.navigateToCard_(PrivacyReviewStep.HISTORY_SYNC); }, @@ -207,11 +187,6 @@ [ PrivacyReviewStep.HISTORY_SYNC, { - headerModel: { - title: this.i18n('privacyReviewHistorySyncCardHeader'), - lightImage: './images/privacy_review/history_sync_graphic.svg', - darkImage: './images/privacy_review/history_sync_graphic_dark.svg', - }, onForwardNavigation: () => { this.navigateToCard_(PrivacyReviewStep.SAFE_BROWSING); }, @@ -224,11 +199,6 @@ [ PrivacyReviewStep.SAFE_BROWSING, { - headerModel: { - title: this.i18n('privacyReviewSafeBrowsingCardHeader'), - lightImage: './images/privacy_review/safe_browsing_graphic.svg', - darkImage: './images/privacy_review/safe_browsing_graphic_dark.svg', - }, onForwardNavigation: () => { this.navigateToCard_(PrivacyReviewStep.COOKIES); }, @@ -241,11 +211,6 @@ [ PrivacyReviewStep.COOKIES, { - headerModel: { - title: this.i18n('privacyReviewCookiesCardHeader'), - lightImage: './images/privacy_review/cookies_graphic.svg', - darkImage: './images/privacy_review/cookies_graphic_dark.svg', - }, onForwardNavigation: () => { this.navigateToCard_(PrivacyReviewStep.COMPLETION); HatsBrowserProxyImpl.getInstance().trustSafetyInteractionOccurred( @@ -361,12 +326,6 @@ }; } - private onPrivacyReviewStepChanged_() { - this.headerModel_ = this.privacyReviewStepToComponentsMap_ - .get(this.privacyReviewStep_)!.headerModel; - this.hideHeader_ = this.headerModel_ === undefined; - } - private isSyncOn_(): boolean { return !!this.syncStatus_ && !!this.syncStatus_.signedIn && !this.syncStatus_.hasError;
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_safe_browsing_fragment.html b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_safe_browsing_fragment.html index 0b4b6b4..4af4b2a 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_safe_browsing_fragment.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_review/privacy_review_safe_browsing_fragment.html
@@ -1,4 +1,13 @@ <style include="privacy-review-fragment-shared"></style> +<div class="header"> + <picture> + <source + srcset="./images/privacy_review/safe_browsing_graphic_dark.svg" + media="(prefers-color-scheme: dark)"> + <img alt="" src="./images/privacy_review/safe_browsing_graphic.svg"> + </picture> + <div class="header-label">$i18n{privacyReviewSafeBrowsingCardHeader}</div> +</div> <settings-radio-group id="safeBrowsingRadioGroup" pref="{{prefs.generated.safe_browsing}}" selectable-elements="settings-collapse-radio-button"> @@ -76,4 +85,4 @@ </div> </div> </settings-collapse-radio-button> -</settings-radio-group> \ No newline at end of file +</settings-radio-group>
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.ts b/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.ts index 1c80309..9c0bb306 100644 --- a/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.ts +++ b/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.ts
@@ -19,6 +19,7 @@ import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; import '../settings_shared_css.js'; import '../site_favicon.js'; +import '../i18n_setup.js'; import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; @@ -31,8 +32,6 @@ import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; import {afterNextRender, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; - import {Ctap2Status, Enrollment, EnrollmentResponse, SampleResponse, SampleStatus, SecurityKeysBioEnrollProxy, SecurityKeysBioEnrollProxyImpl,} from './security_keys_browser_proxy.js'; import {SettingsSecurityKeysPinFieldElement} from './security_keys_pin_field.js';
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.ts b/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.ts index f622fabe..37fcff30 100644 --- a/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.ts +++ b/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.ts
@@ -15,6 +15,7 @@ import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; import '../settings_shared_css.js'; import '../site_favicon.js'; +import '../i18n_setup.js'; import './security_keys_pin_field.js'; import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; @@ -27,8 +28,6 @@ import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; - import {Credential, SecurityKeysCredentialBrowserProxy, SecurityKeysCredentialBrowserProxyImpl, StartCredentialManagementResponse} from './security_keys_browser_proxy.js'; import {SettingsSecurityKeysPinFieldElement} from './security_keys_pin_field.js';
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.ts b/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.ts index 06a1be9e..ee8ef07d 100644 --- a/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.ts +++ b/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.ts
@@ -10,14 +10,13 @@ import 'chrome://resources/cr_elements/cr_input/cr_input.m.js'; import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import '../settings_shared_css.js'; +import '../i18n_setup.js'; import {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.m.js'; import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js'; import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js'; import {afterNextRender, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; - /** * A function that submits a PIN to a security key. It returns a Promise which * resolves with null if the PIN was correct, or with the number of retries
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_reset_dialog.ts b/chrome/browser/resources/settings/privacy_page/security_keys_reset_dialog.ts index 985a14b..14611793 100644 --- a/chrome/browser/resources/settings/privacy_page/security_keys_reset_dialog.ts +++ b/chrome/browser/resources/settings/privacy_page/security_keys_reset_dialog.ts
@@ -12,13 +12,12 @@ import 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js'; import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; import '../settings_shared_css.js'; +import '../i18n_setup.js'; import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; - import {SecurityKeysResetBrowserProxy, SecurityKeysResetBrowserProxyImpl} from './security_keys_browser_proxy.js'; export enum ResetDialogPage {
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.ts b/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.ts index 7cccf75..e999259 100644 --- a/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.ts +++ b/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.ts
@@ -15,6 +15,7 @@ import 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js'; import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; import '../settings_shared_css.js'; +import '../i18n_setup.js'; import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; @@ -23,8 +24,6 @@ import {PluralStringProxyImpl} from 'chrome://resources/js/plural_string_proxy.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; - import {SecurityKeysPINBrowserProxy, SecurityKeysPINBrowserProxyImpl} from './security_keys_browser_proxy.js'; export enum SetPINDialogPage {
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.ts b/chrome/browser/resources/settings/privacy_page/security_page.ts index 7d58fe0..64efbc4 100644 --- a/chrome/browser/resources/settings/privacy_page/security_page.ts +++ b/chrome/browser/resources/settings/privacy_page/security_page.ts
@@ -23,13 +23,16 @@ import {SettingsToggleButtonElement} from '../controls/settings_toggle_button.js'; import {loadTimeData} from '../i18n_setup.js'; import {MetricsBrowserProxy, MetricsBrowserProxyImpl, PrivacyElementInteractions, SafeBrowsingInteractions} from '../metrics_browser_proxy.js'; + +// <if expr="chromeos or lacros"> import {OpenWindowProxyImpl} from '../open_window_proxy.js'; +// </if> + import {PrefsMixin, PrefsMixinInterface} from '../prefs/prefs_mixin.js'; import {routes} from '../route.js'; import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js'; import {SettingsCollapseRadioButtonElement} from './collapse_radio_button.js'; -import {SettingsDisableSafebrowsingDialogElement} from './disable_safebrowsing_dialog.js'; import {PrivacyPageBrowserProxy, PrivacyPageBrowserProxyImpl} from './privacy_page_browser_proxy.js'; /**
diff --git a/chrome/browser/resources/settings/privacy_sandbox/app.ts b/chrome/browser/resources/settings/privacy_sandbox/app.ts index 3d6b79f..5aa36ae2 100644 --- a/chrome/browser/resources/settings/privacy_sandbox/app.ts +++ b/chrome/browser/resources/settings/privacy_sandbox/app.ts
@@ -12,7 +12,7 @@ // Those resources are loaded through settings.js as the privacy sandbox page // lives outside regular settings, hence can't access those resources directly // with |optimize_webui="true"|. -import {CrButtonElement, CrSettingsPrefs, HatsBrowserProxy, HatsBrowserProxyImpl, loadTimeData, MetricsBrowserProxy, MetricsBrowserProxyImpl, PrefsMixin, SettingsToggleButtonElement, TrustSafetyInteraction} from '../settings.js'; +import {CrButtonElement, CrSettingsPrefs, HatsBrowserProxyImpl, loadTimeData, MetricsBrowserProxy, MetricsBrowserProxyImpl, PrefsMixin, SettingsToggleButtonElement, TrustSafetyInteraction} from '../settings.js'; import {FlocIdentifier, PrivacySandboxBrowserProxy, PrivacySandboxBrowserProxyImpl} from './privacy_sandbox_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/reset_page/reset_page.ts b/chrome/browser/resources/settings/reset_page/reset_page.ts index 985416c..70f3377 100644 --- a/chrome/browser/resources/settings/reset_page/reset_page.ts +++ b/chrome/browser/resources/settings/reset_page/reset_page.ts
@@ -23,7 +23,11 @@ import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {BaseMixin} from '../base_mixin.js'; + +// <if expr="_google_chrome and is_win"> import {loadTimeData} from '../i18n_setup.js'; +// </if> + import {routes} from '../route.js'; import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
diff --git a/chrome/browser/resources/settings/safety_check_page/safety_check_page.ts b/chrome/browser/resources/settings/safety_check_page/safety_check_page.ts index b89dd9c..0951ca0 100644 --- a/chrome/browser/resources/settings/safety_check_page/safety_check_page.ts +++ b/chrome/browser/resources/settings/safety_check_page/safety_check_page.ts
@@ -27,11 +27,9 @@ import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js'; import {WebUIListenerMixin} from 'chrome://resources/js/web_ui_listener_mixin.js'; -import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js'; import {flush, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {HatsBrowserProxyImpl, TrustSafetyInteraction} from '../hats_browser_proxy.js'; -import {loadTimeData} from '../i18n_setup.js'; import {MetricsBrowserProxy, MetricsBrowserProxyImpl, SafetyCheckInteractions} from '../metrics_browser_proxy.js'; import {routes} from '../route.js';
diff --git a/chrome/browser/resources/settings/safety_check_page/safety_check_passwords_child.ts b/chrome/browser/resources/settings/safety_check_page/safety_check_passwords_child.ts index 80bdccbd..7d03ae6 100644 --- a/chrome/browser/resources/settings/safety_check_page/safety_check_passwords_child.ts +++ b/chrome/browser/resources/settings/safety_check_page/safety_check_passwords_child.ts
@@ -12,7 +12,7 @@ import {WebUIListenerMixin} from 'chrome://resources/js/web_ui_listener_mixin.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {PasswordCheckReferrer, PasswordManagerImpl, PasswordManagerProxy} from '../autofill_page/password_manager_proxy.js'; +import {PasswordCheckReferrer, PasswordManagerImpl} from '../autofill_page/password_manager_proxy.js'; import {MetricsBrowserProxy, MetricsBrowserProxyImpl, SafetyCheckInteractions} from '../metrics_browser_proxy.js'; import {routes} from '../route.js'; import {Router} from '../router.js';
diff --git a/chrome/browser/resources/settings/search_engines_page/search_engines_page.ts b/chrome/browser/resources/settings/search_engines_page/search_engines_page.ts index 3555af2..fe488d6e 100644 --- a/chrome/browser/resources/settings/search_engines_page/search_engines_page.ts +++ b/chrome/browser/resources/settings/search_engines_page/search_engines_page.ts
@@ -19,7 +19,6 @@ import '../settings_shared_css.js'; import '../settings_vars_css.js'; -import {assert} from 'chrome://resources/js/assert.m.js'; import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js'; import {WebUIListenerMixin, WebUIListenerMixinInterface} from 'chrome://resources/js/web_ui_listener_mixin.js'; import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
diff --git a/chrome/browser/resources/settings/setting_id_param_util.ts b/chrome/browser/resources/settings/setting_id_param_util.ts index 5cb4872f..c524439 100644 --- a/chrome/browser/resources/settings/setting_id_param_util.ts +++ b/chrome/browser/resources/settings/setting_id_param_util.ts
@@ -7,7 +7,6 @@ * from the Url parameter. */ -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {Router} from './router.js'; const SETTING_ID_URL_PARAM_NAME: string = 'settingId';
diff --git a/chrome/browser/resources/settings/settings.ts b/chrome/browser/resources/settings/settings.ts index f050e49..702cce06 100644 --- a/chrome/browser/resources/settings/settings.ts +++ b/chrome/browser/resources/settings/settings.ts
@@ -11,7 +11,10 @@ export {CrToolbarSearchFieldElement} from 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js'; export {PluralStringProxyImpl as SettingsPluralStringProxyImpl} from 'chrome://resources/js/plural_string_proxy.js'; export {SettingsAboutPageElement} from './about_page/about_page.js'; -export {AboutPageBrowserProxy, AboutPageBrowserProxyImpl, PromoteUpdaterStatus, UpdateStatus} from './about_page/about_page_browser_proxy.js'; +export {AboutPageBrowserProxy, AboutPageBrowserProxyImpl, UpdateStatus} from './about_page/about_page_browser_proxy.js'; +// <if expr="_google_chrome and is_macosx"> +export {PromoteUpdaterStatus} from './about_page/about_page_browser_proxy.js'; +// </if> export {AppearanceBrowserProxy, AppearanceBrowserProxyImpl} from './appearance_page/appearance_browser_proxy.js'; export {SettingsAppearancePageElement} from './appearance_page/appearance_page.js'; export {HomeUrlInputElement} from './appearance_page/home_url_input.js';
diff --git a/chrome/browser/resources/settings/settings_main/settings_main.ts b/chrome/browser/resources/settings/settings_main/settings_main.ts index 6a5d4fe8..3c88087 100644 --- a/chrome/browser/resources/settings/settings_main/settings_main.ts +++ b/chrome/browser/resources/settings/settings_main/settings_main.ts
@@ -19,12 +19,10 @@ import '../settings_shared_css.js'; import '../settings_vars_css.js'; -import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js'; -import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js'; +import {assert} from 'chrome://resources/js/assert.m.js'; import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {SettingsBasicPageElement} from '../basic_page/basic_page.js'; import {loadTimeData} from '../i18n_setup.js'; import {PageVisibility} from '../page_visibility.js'; import {routes} from '../route.js';
diff --git a/chrome/browser/resources/settings/settings_page/settings_animated_pages.ts b/chrome/browser/resources/settings/settings_page/settings_animated_pages.ts index 5469a6cc..92096574 100644 --- a/chrome/browser/resources/settings/settings_page/settings_animated_pages.ts +++ b/chrome/browser/resources/settings/settings_page/settings_animated_pages.ts
@@ -18,12 +18,20 @@ import {assert} from '//resources/js/assert.m.js'; import {focusWithoutInk} from '//resources/js/cr/ui/focus_without_ink.m.js'; + +// <if expr="chromeos"> import {loadTimeData} from '//resources/js/load_time_data.m.js'; +// </if> + import {IronPagesElement} from '//resources/polymer/v3_0/iron-pages/iron-pages.js'; -import {dom, DomIf, FlattenedNodesObserver, html, microTask, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {DomIf, FlattenedNodesObserver, html, microTask, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js'; + +// <if expr="chromeos"> import {getSettingIdParameter} from '../setting_id_param_util.js'; +// </if> + import {SettingsSubpageElement} from './settings_subpage.js'; type FocusConfig = Map<string, (string|Element|(() => void))>;
diff --git a/chrome/browser/resources/settings/settings_ui/settings_ui.ts b/chrome/browser/resources/settings/settings_ui/settings_ui.ts index 03d098cf..047bbc8 100644 --- a/chrome/browser/resources/settings/settings_ui/settings_ui.ts +++ b/chrome/browser/resources/settings/settings_ui/settings_ui.ts
@@ -26,12 +26,9 @@ import {CrContainerShadowMixin, CrContainerShadowMixinInterface} from 'chrome://resources/cr_elements/cr_container_shadow_mixin.js'; import {CrDrawerElement} from 'chrome://resources/cr_elements/cr_drawer/cr_drawer.js'; import {CrToolbarElement} from 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar.js'; -import {CrToolbarSearchFieldElement} from 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js'; import {FindShortcutMixin, FindShortcutMixinInterface} from 'chrome://resources/cr_elements/find_shortcut_mixin.js'; -import {assert} from 'chrome://resources/js/assert.m.js'; -import {isChromeOS} from 'chrome://resources/js/cr.m.js'; import {listenOnce} from 'chrome://resources/js/util.m.js'; -import {Debouncer, DomIf, html, PolymerElement, timeOut} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {DomIf, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {resetGlobalScrollTargetForTesting, setGlobalScrollTarget} from '../global_scroll_target_mixin.js'; import {loadTimeData} from '../i18n_setup.js'; @@ -44,8 +41,6 @@ declare global { interface HTMLElementEventMap { - 'scroll-to-top': CustomEvent<{top: number, callback: () => void}>; - 'scroll-to-bottom': CustomEvent<{bottom: number, callback: () => void}>; 'refresh-pref': CustomEvent<string>; } @@ -127,7 +122,6 @@ private narrow_: boolean; private pageVisibility_: PageVisibility; private lastSearchQuery_: string; - private debouncer_: Debouncer|null = null; constructor() { super(); @@ -198,39 +192,6 @@ // https://github.com/microsoft/TypeScript/issues/13569 (document as any).fonts.load('bold 12px Roboto'); setGlobalScrollTarget(this.$.container); - - const scrollToTop = (top: number) => new Promise<void>(resolve => { - if (this.$.container.scrollTop === top) { - resolve(); - return; - } - - // When transitioning back to main page from a subpage on ChromeOS, - // using 'smooth' scroll here results in the scroll changing to whatever - // is last value of |top|. This happens even after setting the scroll - // position the UI or programmatically. - const behavior = isChromeOS ? 'auto' : 'smooth'; - this.$.container.scrollTo({top: top, behavior: behavior}); - const onScroll = () => { - this.debouncer_ = - Debouncer.debounce(this.debouncer_, timeOut.after(75), () => { - this.$.container.removeEventListener('scroll', onScroll); - resolve(); - }); - }; - this.$.container.addEventListener('scroll', onScroll); - }); - this.addEventListener( - 'scroll-to-top', - (e: CustomEvent<{top: number, callback: () => void}>) => { - scrollToTop(e.detail.top).then(e.detail.callback); - }); - this.addEventListener( - 'scroll-to-bottom', - (e: CustomEvent<{bottom: number, callback: () => void}>) => { - scrollToTop(e.detail.bottom - this.$.container.clientHeight) - .then(e.detail.callback); - }); } disconnectedCallback() {
diff --git a/chrome/browser/resources/settings/site_settings/all_sites.ts b/chrome/browser/resources/settings/site_settings/all_sites.ts index 5ac06c6d..4930e99 100644 --- a/chrome/browser/resources/settings/site_settings/all_sites.ts +++ b/chrome/browser/resources/settings/site_settings/all_sites.ts
@@ -34,7 +34,7 @@ import {routes} from '../route.js'; import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js'; -import {ALL_SITES_DIALOG, AllSitesAction2, ContentSetting, ContentSettingsTypes, SortMethod} from './constants.js'; +import {ALL_SITES_DIALOG, AllSitesAction2, ContentSetting, SortMethod} from './constants.js'; import {LocalDataBrowserProxy, LocalDataBrowserProxyImpl} from './local_data_browser_proxy.js'; import {SiteSettingsMixin, SiteSettingsMixinInterface} from './site_settings_mixin.js'; import {OriginInfo, SiteGroup} from './site_settings_prefs_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/site_settings/category_default_setting.ts b/chrome/browser/resources/settings/site_settings/category_default_setting.ts index f98c844..4460039 100644 --- a/chrome/browser/resources/settings/site_settings/category_default_setting.ts +++ b/chrome/browser/resources/settings/site_settings/category_default_setting.ts
@@ -42,7 +42,6 @@ import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from '../i18n_setup.js'; -import {routes} from '../route.js'; import {ContentSetting, ContentSettingsTypes} from './constants.js'; import {SiteSettingsMixin} from './site_settings_mixin.js';
diff --git a/chrome/browser/resources/settings/site_settings/chooser_exception_list.ts b/chrome/browser/resources/settings/site_settings/chooser_exception_list.ts index 66270e8..a8e9b92 100644 --- a/chrome/browser/resources/settings/site_settings/chooser_exception_list.ts +++ b/chrome/browser/resources/settings/site_settings/chooser_exception_list.ts
@@ -11,6 +11,7 @@ import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js'; import '../settings_shared_css.js'; +import '../i18n_setup.js'; import './chooser_exception_list_entry.js'; import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js'; @@ -19,8 +20,6 @@ import {PaperTooltipElement} from 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; - import {ChooserType, ContentSettingsTypes} from './constants.js'; import {SiteSettingsMixin} from './site_settings_mixin.js'; import {ChooserException, RawChooserException, SiteException} from './site_settings_prefs_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/site_settings/edit_exception_dialog.ts b/chrome/browser/resources/settings/site_settings/edit_exception_dialog.ts index 38e6ca1..fec19a1 100644 --- a/chrome/browser/resources/settings/site_settings/edit_exception_dialog.ts +++ b/chrome/browser/resources/settings/site_settings/edit_exception_dialog.ts
@@ -14,8 +14,6 @@ import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; - import {SITE_EXCEPTION_WILDCARD} from './constants.js'; import {SiteException, SiteSettingsPrefsBrowserProxy, SiteSettingsPrefsBrowserProxyImpl} from './site_settings_prefs_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/site_settings/protocol_handlers.ts b/chrome/browser/resources/settings/site_settings/protocol_handlers.ts index 9af492db..6c373729 100644 --- a/chrome/browser/resources/settings/site_settings/protocol_handlers.ts +++ b/chrome/browser/resources/settings/site_settings/protocol_handlers.ts
@@ -22,13 +22,10 @@ import '../settings_shared_css.js'; import '../site_favicon.js'; -import {CrActionMenuElement} from '//resources/cr_elements/cr_action_menu/cr_action_menu.js'; import {WebUIListenerMixin} from 'chrome://resources/js/web_ui_listener_mixin.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; - -import {SiteSettingsMixin, SiteSettingsMixinInterface} from './site_settings_mixin.js'; +import {SiteSettingsMixin} from './site_settings_mixin.js'; /** * All possible actions in the menu.
diff --git a/chrome/browser/resources/settings/site_settings/site_data.ts b/chrome/browser/resources/settings/site_settings/site_data.ts index cc0caef..7642c68c 100644 --- a/chrome/browser/resources/settings/site_settings/site_data.ts +++ b/chrome/browser/resources/settings/site_settings/site_data.ts
@@ -25,7 +25,7 @@ import {WebUIListenerMixin} from 'chrome://resources/js/web_ui_listener_mixin.js'; import {html, microTask, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {BaseMixin, BaseMixinInterface} from '../base_mixin.js'; +import {BaseMixin} from '../base_mixin.js'; import {GlobalScrollTargetMixin} from '../global_scroll_target_mixin.js'; import {loadTimeData} from '../i18n_setup.js'; import {MetricsBrowserProxyImpl, PrivacyElementInteractions} from '../metrics_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/site_settings/site_data_entry.ts b/chrome/browser/resources/settings/site_settings/site_data_entry.ts index 69292e3d..75e975c6 100644 --- a/chrome/browser/resources/settings/site_settings/site_data_entry.ts +++ b/chrome/browser/resources/settings/site_settings/site_data_entry.ts
@@ -21,7 +21,7 @@ import {MetricsBrowserProxyImpl, PrivacyElementInteractions} from '../metrics_browser_proxy.js'; -import {LocalDataBrowserProxy, LocalDataBrowserProxyImpl, LocalDataItem} from './local_data_browser_proxy.js'; +import {LocalDataBrowserProxyImpl, LocalDataItem} from './local_data_browser_proxy.js'; const SiteDataEntryElementBase = mixinBehaviors([FocusRowBehavior], I18nMixin(PolymerElement)) as
diff --git a/chrome/browser/resources/settings/site_settings/site_details_permission.ts b/chrome/browser/resources/settings/site_settings/site_details_permission.ts index 8594dca1..80322650 100644 --- a/chrome/browser/resources/settings/site_settings/site_details_permission.ts +++ b/chrome/browser/resources/settings/site_settings/site_details_permission.ts
@@ -11,16 +11,13 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import '../settings_shared_css.js'; import '../settings_vars_css.js'; +import '../i18n_setup.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js'; -import {I18nMixin, I18nMixinInterface} from 'chrome://resources/js/i18n_mixin.js'; -import {sanitizeInnerHtml} from 'chrome://resources/js/parse_html_subset.m.js'; +import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js'; import {WebUIListenerMixin} from 'chrome://resources/js/web_ui_listener_mixin.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; -import {routes} from '../route.js'; - import {ContentSetting, ContentSettingsTypes, SiteSettingSource} from './constants.js'; import {SiteSettingsMixin} from './site_settings_mixin.js'; import {RawSiteException} from './site_settings_prefs_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/site_settings/site_list.ts b/chrome/browser/resources/settings/site_settings/site_list.ts index 41ea972..802b9dea 100644 --- a/chrome/browser/resources/settings/site_settings/site_list.ts +++ b/chrome/browser/resources/settings/site_settings/site_list.ts
@@ -20,7 +20,6 @@ import './edit_exception_dialog.js'; import './site_list_entry.js'; -import {CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js'; import {assert} from 'chrome://resources/js/assert.m.js'; import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js'; import {ListPropertyUpdateMixin} from 'chrome://resources/js/list_property_update_mixin.js'; @@ -28,9 +27,8 @@ import {PaperTooltipElement} from 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; - // <if expr="chromeos"> +import {loadTimeData} from '../i18n_setup.js'; import {AndroidInfoBrowserProxyImpl, AndroidSmsInfo} from './android_info_browser_proxy.js'; // </if> import {ContentSetting, ContentSettingsTypes, INVALID_CATEGORY_SUBTYPE} from './constants.js';
diff --git a/chrome/browser/resources/settings/site_settings/site_settings_mixin.ts b/chrome/browser/resources/settings/site_settings/site_settings_mixin.ts index d24b489..993eb614 100644 --- a/chrome/browser/resources/settings/site_settings/site_settings_mixin.ts +++ b/chrome/browser/resources/settings/site_settings/site_settings_mixin.ts
@@ -7,7 +7,6 @@ */ // clang-format off -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ContentSetting,ContentSettingsTypes, SiteSettingSource} from './constants.js'; import {RawSiteException,SiteException,SiteSettingsPrefsBrowserProxy,SiteSettingsPrefsBrowserProxyImpl} from './site_settings_prefs_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/site_settings/zoom_levels.ts b/chrome/browser/resources/settings/site_settings/zoom_levels.ts index 497b9ac..2bcf21f 100644 --- a/chrome/browser/resources/settings/site_settings/zoom_levels.ts +++ b/chrome/browser/resources/settings/site_settings/zoom_levels.ts
@@ -20,8 +20,6 @@ import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../i18n_setup.js'; - import {SiteSettingsMixin} from './site_settings_mixin.js'; import {ZoomLevelEntry} from './site_settings_prefs_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.ts b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.ts index af4fd9d8..148a277b 100644 --- a/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.ts +++ b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.ts
@@ -6,12 +6,12 @@ import 'chrome://resources/cr_elements/shared_style_css.m.js'; import 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js'; import '../settings_shared_css.js'; +import '../i18n_setup.js'; import {CrTooltipIconElement} from 'chrome://resources/cr_elements/policy/cr_tooltip_icon.m.js'; import {assert} from 'chrome://resources/js/assert.m.js'; import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js'; import {I18nMixin, I18nMixinInterface} from 'chrome://resources/js/i18n_mixin.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {WebUIListenerMixin, WebUIListenerMixinInterface} from 'chrome://resources/js/web_ui_listener_mixin.js'; import {PaperTooltipElement} from 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts b/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts index 4ffebec..93a79b7 100644 --- a/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts +++ b/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts
@@ -6,6 +6,7 @@ import 'chrome://resources/cr_elements/icons.m.js'; import '../icons.js'; import '../settings_shared_css.js'; +import '../i18n_setup.js'; import {assert} from 'chrome://resources/js/assert.m.js'; import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js'; @@ -14,7 +15,6 @@ import {html, microTask, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {BaseMixin} from '../base_mixin.js'; -import {loadTimeData} from '../i18n_setup.js'; import {PrefsMixin} from '../prefs/prefs_mixin.js'; import {Route, Router} from '../router.js'; import {ContentSetting, ContentSettingsTypes, NotificationSetting} from '../site_settings/constants.js';
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts b/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts index 9022ce3..f06ea2b 100644 --- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts +++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts
@@ -21,7 +21,7 @@ import {loadTimeData} from '../i18n_setup.js'; import {routes} from '../route.js'; -import {Route, Router} from '../router.js'; +import {Router} from '../router.js'; import {ContentSettingsTypes} from '../site_settings/constants.js'; import {CategoryListItem} from './site_settings_list.js';
diff --git a/chrome/browser/resources/tab_search/tab_search_group_item.ts b/chrome/browser/resources/tab_search/tab_search_group_item.ts index a6f4c57..dd30d53 100644 --- a/chrome/browser/resources/tab_search/tab_search_group_item.ts +++ b/chrome/browser/resources/tab_search/tab_search_group_item.ts
@@ -7,7 +7,7 @@ import 'chrome://resources/cr_elements/mwb_shared_icons.js'; import 'chrome://resources/cr_elements/mwb_shared_vars.js'; -import {MouseHoverableMixin, MouseHoverableMixinInterface} from 'chrome://resources/cr_elements/mouse_hoverable_mixin.js'; +import {MouseHoverableMixin} from 'chrome://resources/cr_elements/mouse_hoverable_mixin.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; @@ -15,8 +15,7 @@ import {colorName} from './tab_group_color_helper.js'; import {highlightText} from './tab_search_utils.js'; -const TabSearchGroupItemBase = MouseHoverableMixin(PolymerElement) as - {new (): PolymerElement & MouseHoverableMixinInterface}; +const TabSearchGroupItemBase = MouseHoverableMixin(PolymerElement); export interface TabSearchGroupItem { $: {
diff --git a/chrome/browser/resources/tab_search/tab_search_item.ts b/chrome/browser/resources/tab_search/tab_search_item.ts index f7b86fa1..7f45492f 100644 --- a/chrome/browser/resources/tab_search/tab_search_item.ts +++ b/chrome/browser/resources/tab_search/tab_search_item.ts
@@ -9,7 +9,7 @@ import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import './strings.m.js'; -import {MouseHoverableMixin, MouseHoverableMixinInterface} from 'chrome://resources/cr_elements/mouse_hoverable_mixin.js'; +import {MouseHoverableMixin} from 'chrome://resources/cr_elements/mouse_hoverable_mixin.js'; import {getFaviconForPageURL} from 'chrome://resources/js/icon.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {get as deepGet, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; @@ -28,8 +28,7 @@ }; } -const TabSearchItemBase = MouseHoverableMixin(PolymerElement) as - {new (): PolymerElement & MouseHoverableMixinInterface}; +const TabSearchItemBase = MouseHoverableMixin(PolymerElement); export class TabSearchItem extends TabSearchItemBase {
diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsing/BUILD.gn index 368de41..ebf319ae 100644 --- a/chrome/browser/safe_browsing/BUILD.gn +++ b/chrome/browser/safe_browsing/BUILD.gn
@@ -130,6 +130,8 @@ "tailored_security/tailored_security_outcome.h", "tailored_security/tailored_security_service_factory.cc", "tailored_security/tailored_security_service_factory.h", + "tailored_security/tailored_security_url_observer.cc", + "tailored_security/tailored_security_url_observer.h", "telemetry/telemetry_service.cc", "telemetry/telemetry_service.h", "test_safe_browsing_blocking_page_quiet.cc", @@ -290,6 +292,8 @@ "incident_reporting/tracked_preference_incident.h", "services_delegate_desktop.cc", "services_delegate_desktop.h", + "tailored_security/consented_notification_desktop.cc", + "tailored_security/consented_notification_desktop.h", ] if (is_mac) { sources += [ @@ -321,6 +325,7 @@ ":verdict_cache_manager_factory", "//build:branding_buildflags", "//build:chromeos_buildflags", + "//chrome/app/vector_icons:vector_icons", "//chrome/common", "//chrome/common/safe_browsing:archive_analyzer_results", "//chrome/common/safe_browsing:binary_feature_extractor",
diff --git a/chrome/browser/safe_browsing/android/safe_browsing_bridge.cc b/chrome/browser/safe_browsing/android/safe_browsing_bridge.cc index e8e9983..a7ff3aa 100644 --- a/chrome/browser/safe_browsing/android/safe_browsing_bridge.cc +++ b/chrome/browser/safe_browsing/android/safe_browsing_bridge.cc
@@ -69,7 +69,8 @@ static void JNI_SafeBrowsingBridge_SetSafeBrowsingState(JNIEnv* env, jint state) { return safe_browsing::SetSafeBrowsingState( - GetPrefService(), static_cast<SafeBrowsingState>(state)); + GetPrefService(), static_cast<SafeBrowsingState>(state), + /*is_esb_enabled_in_sync=*/false); } static jboolean JNI_SafeBrowsingBridge_IsSafeBrowsingManaged(JNIEnv* env) {
diff --git a/chrome/browser/safe_browsing/generated_safe_browsing_pref.cc b/chrome/browser/safe_browsing/generated_safe_browsing_pref.cc index 28d4fc7..d9a1494d 100644 --- a/chrome/browser/safe_browsing/generated_safe_browsing_pref.cc +++ b/chrome/browser/safe_browsing/generated_safe_browsing_pref.cc
@@ -73,6 +73,12 @@ profile_->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnhanced, selection == SafeBrowsingSetting::ENHANCED); + // Set ESB not set in sync with Account ESB through TailoredSecurity. + if (selection == SafeBrowsingSetting::ENHANCED) { + profile_->GetPrefs()->SetBoolean( + prefs::kEnhancedProtectionEnabledViaTailoredSecurity, false); + } + return extensions::settings_private::SetPrefResult::SUCCESS; }
diff --git a/chrome/browser/safe_browsing/tailored_security/consented_notification_desktop.cc b/chrome/browser/safe_browsing/tailored_security/consented_notification_desktop.cc new file mode 100644 index 0000000..e22a1399 --- /dev/null +++ b/chrome/browser/safe_browsing/tailored_security/consented_notification_desktop.cc
@@ -0,0 +1,171 @@ +// 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/safe_browsing/tailored_security/consented_notification_desktop.h" + +#include "base/metrics/histogram_functions.h" +#include "chrome/app/vector_icons/vector_icons.h" +#include "chrome/browser/notifications/notification_display_service.h" +#include "chrome/browser/notifications/notification_display_service_factory.h" +#include "chrome/browser/notifications/notification_handler.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/safe_browsing/tailored_security/tailored_security_outcome.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_finder.h" +#include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/chrome_pages.h" +#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" +#include "chrome/grit/chromium_strings.h" +#include "chrome/grit/generated_resources.h" +#include "components/prefs/pref_service.h" +#include "components/safe_browsing/core/common/safe_browsing_prefs.h" +#include "components/strings/grit/components_strings.h" +#include "content/public/common/referrer.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/base/page_transition_types.h" +#include "ui/base/window_open_disposition.h" +#include "ui/color/color_provider.h" +#include "ui/message_center/public/cpp/message_center_constants.h" +#include "ui/message_center/public/cpp/notification.h" +#include "ui/native_theme/common_theme.h" +#include "ui/native_theme/native_theme.h" + +namespace safe_browsing { + +namespace { +const char kTailoredSecurityEnableNotificationId[] = + "TailoredSecurityEnableNotification"; +const char kTailoredSecurityDisableNotificationId[] = + "TailoredSecurityDisableNotification"; +const char kTailoredSecurityNotifierId[] = + "chrome://settings/security/notification/id-notifier"; +const char kTailoredSecurityNotificationOrigin[] = + "chrome://settings/security?q=enhanced"; + +// |is_esb_enabled_in_sync| records if ESB was enabled in sync with Account-ESB +void TurnOnESBAndOpenSettings(Profile* profile, bool is_esb_enabled_in_sync) { + SetSafeBrowsingState(profile->GetPrefs(), + SafeBrowsingState::ENHANCED_PROTECTION, + is_esb_enabled_in_sync); + Browser* browser = chrome::ScopedTabbedBrowserDisplayer(profile).browser(); + chrome::ShowSafeBrowsingEnhancedProtection(browser); +} + +void LogOutcome(TailoredSecurityOutcome outcome, bool enable) { + if (enable) { + base::UmaHistogramEnumeration( + "SafeBrowsing.TailoredSecurityConsentedEnabledNotificationOutcome", + outcome); + } else { + base::UmaHistogramEnumeration( + "SafeBrowsing.TailoredSecurityConsentedDisabledNotificationOutcome", + outcome); + } +} + +} // namespace + +TailoredSecurityConsentedNotificationHandler:: + TailoredSecurityConsentedNotificationHandler() = default; + +TailoredSecurityConsentedNotificationHandler:: + ~TailoredSecurityConsentedNotificationHandler() = default; + +void TailoredSecurityConsentedNotificationHandler::OnClose( + Profile* profile, + const GURL& origin, + const std::string& notification_id, + bool by_user, + base::OnceClosure completed_closure) { + bool is_enable = (notification_id == kTailoredSecurityEnableNotificationId); + LogOutcome(TailoredSecurityOutcome::kDismissed, is_enable); + std::move(completed_closure).Run(); +} + +void TailoredSecurityConsentedNotificationHandler::OnClick( + Profile* profile, + const GURL& origin, + const std::string& notification_id, + const absl::optional<int>& action_index, + const absl::optional<std::u16string>& reply, + base::OnceClosure completed_closure) { + bool is_enable = (notification_id == kTailoredSecurityEnableNotificationId); + if (action_index) { + if (*action_index == 0) { + // Enable: Pressed Turn on is acceptance, Disable: Turn back on is + // rejection + TailoredSecurityOutcome outcome = + is_enable ? TailoredSecurityOutcome::kAccepted + : TailoredSecurityOutcome::kRejected; + LogOutcome(outcome, is_enable); + TurnOnESBAndOpenSettings(profile, is_enable); + } else { + // Enable: Pressed No Thanks is rejection, Disable: Pressed OK is + // acceptance + TailoredSecurityOutcome outcome = + is_enable ? TailoredSecurityOutcome::kRejected + : TailoredSecurityOutcome::kAccepted; + LogOutcome(outcome, is_enable); + } + } + std::move(completed_closure).Run(); +} + +void DisplayTailoredSecurityConsentedModalDesktop(Profile* profile, + bool enable) { + Browser* browser = chrome::FindLastActiveWithProfile(profile); + if (!browser) + return; + + const ui::ColorProvider* color_provider = + browser->window()->GetColorProvider(); + + std::u16string title, description, primary_button, secondary_button; + gfx::Image icon; + std::string notification_id; + if (enable) { + notification_id = kTailoredSecurityEnableNotificationId; + title = l10n_util::GetStringUTF16( + IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE); + description = l10n_util::GetStringUTF16( + IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION); + primary_button = l10n_util::GetStringUTF16( + IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_ACCEPT); + secondary_button = l10n_util::GetStringUTF16(IDS_NO_THANKS); + // TODO(crbug/1257621): Confirm with UX that it's appropriate to use the + // blue color here. + SkColor icon_color = color_provider->GetColor(ui::kColorAccent); + icon = gfx::Image(gfx::CreateVectorIcon( + kSafetyCheckIcon, message_center::kNotificationIconSize, icon_color)); + } else { + notification_id = kTailoredSecurityDisableNotificationId; + title = l10n_util::GetStringUTF16( + IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TITLE); + description = l10n_util::GetStringUTF16( + IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_DESCRIPTION); + primary_button = l10n_util::GetStringUTF16( + IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_ON); + secondary_button = l10n_util::GetStringUTF16(IDS_OK); + SkColor icon_color = color_provider->GetColor(ui::kColorAlertHighSeverity); + icon = gfx::Image(gfx::CreateVectorIcon( + kShieldBadIcon, message_center::kNotificationIconSize, icon_color)); + } + LogOutcome(TailoredSecurityOutcome::kShown, enable); + message_center::Notification notification( + message_center::NOTIFICATION_TYPE_SIMPLE, notification_id, title, + description, icon, + l10n_util::GetStringUTF16(IDS_TAILORED_SECURITY_DISPLAY_SOURCE), + GURL(kTailoredSecurityNotificationOrigin), + message_center::NotifierId(message_center::NotifierType::SYSTEM_COMPONENT, + kTailoredSecurityNotifierId), + message_center::RichNotificationData(), + /*delegate=*/nullptr); + notification.set_buttons({message_center::ButtonInfo(primary_button), + message_center::ButtonInfo(secondary_button)}); + NotificationDisplayServiceFactory::GetForProfile(profile)->Display( + NotificationHandler::Type::TAILORED_SECURITY_CONSENTED, notification, + /*metadata=*/nullptr); +} + +} // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/tailored_security/consented_notification_desktop.h b/chrome/browser/safe_browsing/tailored_security/consented_notification_desktop.h new file mode 100644 index 0000000..01d3df5 --- /dev/null +++ b/chrome/browser/safe_browsing/tailored_security/consented_notification_desktop.h
@@ -0,0 +1,47 @@ +// 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_SAFE_BROWSING_TAILORED_SECURITY_CONSENTED_NOTIFICATION_DESKTOP_H_ +#define CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_CONSENTED_NOTIFICATION_DESKTOP_H_ + +#include "chrome/browser/notifications/notification_handler.h" + +class Profile; + +namespace safe_browsing { + +// Handler for notifications shown for TailoredSecurity on Desktop platforms. +// Will be created and owned by the NativeNotificationDisplayService. +class TailoredSecurityConsentedNotificationHandler + : public NotificationHandler { + public: + TailoredSecurityConsentedNotificationHandler(); + + TailoredSecurityConsentedNotificationHandler( + const TailoredSecurityConsentedNotificationHandler&) = delete; + TailoredSecurityConsentedNotificationHandler& operator=( + const TailoredSecurityConsentedNotificationHandler&) = delete; + + ~TailoredSecurityConsentedNotificationHandler() override; + + // NotificationHandler implementation. + void OnClose(Profile* profile, + const GURL& origin, + const std::string& notification_id, + bool by_user, + base::OnceClosure completed_closure) override; + void OnClick(Profile* profile, + const GURL& origin, + const std::string& notification_id, + const absl::optional<int>& action_index, + const absl::optional<std::u16string>& reply, + base::OnceClosure completed_closure) override; +}; + +void DisplayTailoredSecurityConsentedModalDesktop(Profile* profile, + bool enable); + +} // namespace safe_browsing + +#endif // CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_CONSENTED_NOTIFICATION_DESKTOP_H_
diff --git a/chrome/browser/safe_browsing/tailored_security/tailored_security_outcome.h b/chrome/browser/safe_browsing/tailored_security/tailored_security_outcome.h index 7968e40..f0d9acf 100644 --- a/chrome/browser/safe_browsing/tailored_security/tailored_security_outcome.h +++ b/chrome/browser/safe_browsing/tailored_security/tailored_security_outcome.h
@@ -14,7 +14,8 @@ kDismissed = 1, kSettings = 2, kShown = 3, - kMaxValue = kShown, + kRejected = 4, + kMaxValue = kRejected, }; #endif // CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_TAILORED_SECURITY_OUTCOME_H_
diff --git a/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.cc b/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.cc index 8975651..e3765a3 100644 --- a/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.cc +++ b/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.cc
@@ -30,7 +30,9 @@ TailoredSecurityServiceFactory::TailoredSecurityServiceFactory() : BrowserContextKeyedServiceFactory( "SafeBrowsingTailoredSecurityService", - BrowserContextDependencyManager::GetInstance()) {} + BrowserContextDependencyManager::GetInstance()) { + DependsOn(IdentityManagerFactory::GetInstance()); +} KeyedService* TailoredSecurityServiceFactory::BuildServiceInstanceFor( content::BrowserContext* context) const {
diff --git a/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer.cc b/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer.cc new file mode 100644 index 0000000..f59ea93 --- /dev/null +++ b/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer.cc
@@ -0,0 +1,125 @@ +// 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/safe_browsing/tailored_security/tailored_security_url_observer.h" + +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.h" +#include "components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h" +#include "components/safe_browsing/core/common/safe_browsing_prefs.h" +#include "content/public/browser/render_widget_host_view.h" + +#if defined(OS_ANDROID) +#include "chrome/browser/safe_browsing/tailored_security/unconsented_message_android.h" +#else +#include "chrome/browser/ui/views/safe_browsing/tailored_security_unconsented_modal.h" +#endif + +namespace safe_browsing { + +namespace { + +const int kThresholdForInFlowNotificationMinutes = 5; + +bool CanQueryTailoredSecurity(GURL url) { + return url.DomainIs("google.com") || url.DomainIs("youtube.com"); +} + +} // namespace + +TailoredSecurityUrlObserver::~TailoredSecurityUrlObserver() { + if (service_) { + service_->RemoveObserver(this); + if (focused_ && CanQueryTailoredSecurity(last_url_)) { + service_->RemoveQueryRequest(); + } + } +} + +// content::WebContentsObserver: +void TailoredSecurityUrlObserver::PrimaryPageChanged(content::Page& page) { + UpdateFocusAndURL(true, page.GetMainDocument().GetLastCommittedURL()); +} + +void TailoredSecurityUrlObserver::OnWebContentsFocused( + content::RenderWidgetHost* render_widget_host) { + UpdateFocusAndURL(true, last_url_); +} + +void TailoredSecurityUrlObserver::OnWebContentsLostFocus( + content::RenderWidgetHost* render_widget_host) { + UpdateFocusAndURL(false, last_url_); +} + +void TailoredSecurityUrlObserver::OnTailoredSecurityBitChanged( + bool enabled, + base::Time previous_update) { + Profile* profile = + Profile::FromBrowserContext(web_contents()->GetBrowserContext()); + if (enabled && !IsEnhancedProtectionEnabled(*profile->GetPrefs())) { + if (base::Time::Now() - previous_update <= + base::Minutes(kThresholdForInFlowNotificationMinutes)) { +#if defined(OS_ANDROID) + message_ = std::make_unique<TailoredSecurityUnconsentedModalAndroid>( + web_contents(), + base::BindOnce(&TailoredSecurityUrlObserver::MessageDismissed, + // Unretained is safe because |this| owns |message_|. + base::Unretained(this))); +#else + TailoredSecurityUnconsentedModal::ShowForWebContents(web_contents()); +#endif + } else { + // TODO(drubery): Add out-of-flow UX here. + } + } +} + +void TailoredSecurityUrlObserver::OnTailoredSecurityServiceDestroyed() { + service_->RemoveObserver(this); + service_ = nullptr; +} + +TailoredSecurityUrlObserver::TailoredSecurityUrlObserver( + content::WebContents* web_contents, + TailoredSecurityService* service) + : WebContentsObserver(web_contents), + WebContentsUserData(*web_contents), + service_(service) { + bool focused = false; + + if (service_) { + service_->AddObserver(this); + } + + if (web_contents && web_contents->GetMainFrame() && + web_contents->GetMainFrame()->GetView()) { + focused = web_contents->GetMainFrame()->GetView()->HasFocus(); + } + UpdateFocusAndURL(focused, web_contents->GetLastCommittedURL()); +} + +void TailoredSecurityUrlObserver::UpdateFocusAndURL(bool focused, + const GURL& url) { + if (service_) { + bool should_query = focused && CanQueryTailoredSecurity(url); + bool old_should_query = focused_ && CanQueryTailoredSecurity(last_url_); + if (should_query && !old_should_query) + service_->AddQueryRequest(); + if (!should_query && old_should_query) + service_->RemoveQueryRequest(); + } + + focused_ = focused; + last_url_ = url; +} + +#if defined(OS_ANDROID) +void TailoredSecurityUrlObserver::MessageDismissed() { + message_.reset(); +} +#endif + +WEB_CONTENTS_USER_DATA_KEY_IMPL(TailoredSecurityUrlObserver); + +} // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer.h b/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer.h new file mode 100644 index 0000000..4581bcd6 --- /dev/null +++ b/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer.h
@@ -0,0 +1,79 @@ +// 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_SAFE_BROWSING_TAILORED_SECURITY_TAILORED_SECURITY_URL_OBSERVER_H_ +#define CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_TAILORED_SECURITY_URL_OBSERVER_H_ + +#include "build/build_config.h" +#include "components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_observer.h" +#include "content/public/browser/web_contents_observer.h" +#include "content/public/browser/web_contents_user_data.h" + +#if defined(OS_ANDROID) +#include "chrome/browser/safe_browsing/tailored_security/unconsented_message_android.h" +#endif + +namespace content { +class RenderWidgetHost; +} // namespace content + +namespace safe_browsing { + +class TailoredSecurityService; + +// This class handles the observation of whether the user is on a Google +// property or not, so we can query the user's Tailored Security setting when +// they are on a Google property. +class TailoredSecurityUrlObserver + : public TailoredSecurityServiceObserver, + public content::WebContentsObserver, + public content::WebContentsUserData<TailoredSecurityUrlObserver> { + public: + TailoredSecurityUrlObserver(const TailoredSecurityUrlObserver&) = delete; + TailoredSecurityUrlObserver& operator=(const TailoredSecurityUrlObserver&) = + delete; + + ~TailoredSecurityUrlObserver() override; + + // content::WebContentsObserver: + void PrimaryPageChanged(content::Page& page) override; + void OnWebContentsFocused( + content::RenderWidgetHost* render_widget_host) override; + void OnWebContentsLostFocus( + content::RenderWidgetHost* render_widget_host) override; + + // TailoredSecurityServiceObserver + void OnTailoredSecurityBitChanged(bool enabled, + base::Time previous_update) override; + void OnTailoredSecurityServiceDestroyed() override; + + private: + TailoredSecurityUrlObserver(content::WebContents* web_contents, + TailoredSecurityService* service); + + void UpdateFocusAndURL(bool focused, const GURL& url); + + friend class content::WebContentsUserData<TailoredSecurityUrlObserver>; + +#if defined(OS_ANDROID) + void MessageDismissed(); + + std::unique_ptr<TailoredSecurityUnconsentedModalAndroid> message_; +#endif + + // Reference to the TailoredSecurityService for this profile. + TailoredSecurityService* service_; + + // Whether the WebContents is currently in focus. + bool focused_ = false; + + // The most recent URL the WebContents navigated to. + GURL last_url_; + + WEB_CONTENTS_USER_DATA_KEY_DECL(); +}; + +} // namespace safe_browsing + +#endif // CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_TAILORED_SECURITY_URL_OBSERVER_H_
diff --git a/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer_unittest.cc b/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer_unittest.cc new file mode 100644 index 0000000..0ce9249 --- /dev/null +++ b/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer_unittest.cc
@@ -0,0 +1,58 @@ +// 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/safe_browsing/tailored_security/tailored_security_url_observer.h" + +#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace safe_browsing { + +namespace { + +class MockTailoredSecurityService : public TailoredSecurityService { + public: + MockTailoredSecurityService() : TailoredSecurityService(nullptr, nullptr) {} + MOCK_METHOD0(AddQueryRequest, void()); + MOCK_METHOD0(RemoveQueryRequest, void()); +}; + +} // namespace + +using TailoredSecurityUrlObserverTest = ChromeRenderViewHostTestHarness; + +TEST_F(TailoredSecurityUrlObserverTest, QueryRequestOnFocus) { + MockTailoredSecurityService mock_service; + TailoredSecurityUrlObserver::CreateForWebContents(web_contents(), + &mock_service); + TailoredSecurityUrlObserver* url_observer = + TailoredSecurityUrlObserver::FromWebContents(web_contents()); + + EXPECT_CALL(mock_service, AddQueryRequest()); + NavigateAndCommit(GURL("https://google.com")); + + EXPECT_CALL(mock_service, RemoveQueryRequest()); + url_observer->OnWebContentsLostFocus(nullptr); +} + +TEST_F(TailoredSecurityUrlObserverTest, QueryRequestOnNavigation) { + MockTailoredSecurityService mock_service; + TailoredSecurityUrlObserver::CreateForWebContents(web_contents(), + &mock_service); + TailoredSecurityUrlObserver* url_observer = + TailoredSecurityUrlObserver::FromWebContents(web_contents()); + + url_observer->OnWebContentsFocused(nullptr); + + EXPECT_CALL(mock_service, AddQueryRequest()); + NavigateAndCommit(GURL("https://google.com")); + + EXPECT_CALL(mock_service, RemoveQueryRequest()); + NavigateAndCommit(GURL("https://example.com")); +} + +} // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/tailored_security/unconsented_message_android.cc b/chrome/browser/safe_browsing/tailored_security/unconsented_message_android.cc index 237a84d0..f39e5838 100644 --- a/chrome/browser/safe_browsing/tailored_security/unconsented_message_android.cc +++ b/chrome/browser/safe_browsing/tailored_security/unconsented_message_android.cc
@@ -70,8 +70,10 @@ } // namespace TailoredSecurityUnconsentedModalAndroid:: - TailoredSecurityUnconsentedModalAndroid(content::WebContents* web_contents) - : web_contents_(web_contents) { + TailoredSecurityUnconsentedModalAndroid(content::WebContents* web_contents, + base::OnceClosure dismiss_callback_) + : dismiss_callback_(std::move(dismiss_callback_)), + web_contents_(web_contents) { message_ = std::make_unique<messages::MessageWrapper>( messages::MessageIdentifier::TAILORED_SECURITY_ENABLED, base::BindOnce( @@ -135,6 +137,8 @@ if (message_) { messages::MessageDispatcherBridge::Get()->DismissMessage( message_.get(), messages::DismissReason::UNKNOWN); + if (dismiss_callback_) + std::move(dismiss_callback_).Run(); } } @@ -144,7 +148,8 @@ Profile* profile = Profile::FromBrowserContext(web_contents_->GetBrowserContext()); SetSafeBrowsingState(profile->GetPrefs(), - SafeBrowsingState::ENHANCED_PROTECTION); + SafeBrowsingState::ENHANCED_PROTECTION, + /*is_esb_enabled_in_sync=*/false); ShowSafeBrowsingSettings(web_contents_); } @@ -155,15 +160,21 @@ "SafeBrowsing.TailoredSecurityUnconsentedMessageDismissReason", dismiss_reason, messages::DismissReason::COUNT); message_.reset(); + // `dismiss_callback_` may delete `this`. + if (dismiss_callback_) + std::move(dismiss_callback_).Run(); } void TailoredSecurityUnconsentedModalAndroid::HandleSettingsClicked() { + LogMessageOutcome(TailoredSecurityOutcome::kSettings); + ShowSafeBrowsingSettings(web_contents_); if (message_) { messages::MessageDispatcherBridge::Get()->DismissMessage( message_.get(), messages::DismissReason::SECONDARY_ACTION); + // `dismiss_callback_` may delete `this`. + if (dismiss_callback_) + std::move(dismiss_callback_).Run(); } - LogMessageOutcome(TailoredSecurityOutcome::kSettings); - ShowSafeBrowsingSettings(web_contents_); } } // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/tailored_security/unconsented_message_android.h b/chrome/browser/safe_browsing/tailored_security/unconsented_message_android.h index 2222cc1..f4e0bfe 100644 --- a/chrome/browser/safe_browsing/tailored_security/unconsented_message_android.h +++ b/chrome/browser/safe_browsing/tailored_security/unconsented_message_android.h
@@ -17,12 +17,14 @@ namespace safe_browsing { // This class encapsulates the process of showing a message to a user prompting -// them to enable Enhacned Safe Browsing when the Tailored Security preference +// them to enable Enhanced Safe Browsing when the Tailored Security preference // changes. class TailoredSecurityUnconsentedModalAndroid { public: - explicit TailoredSecurityUnconsentedModalAndroid( - content::WebContents* web_contents); + // Creates and shows a message for |web_contents| and calls |dismiss_callback| + // once the message is complete. + TailoredSecurityUnconsentedModalAndroid(content::WebContents* web_contents, + base::OnceClosure dismiss_callback); ~TailoredSecurityUnconsentedModalAndroid(); private: @@ -30,6 +32,7 @@ void HandleMessageDismissed(messages::DismissReason dismiss_reason); void HandleSettingsClicked(); + base::OnceClosure dismiss_callback_; raw_ptr<content::WebContents> web_contents_; std::unique_ptr<messages::MessageWrapper> message_; gfx::ImageSkia icon_;
diff --git a/chrome/browser/segmentation_platform/segmentation_platform_config.cc b/chrome/browser/segmentation_platform/segmentation_platform_config.cc index 22b79553..692b33a 100644 --- a/chrome/browser/segmentation_platform/segmentation_platform_config.cc +++ b/chrome/browser/segmentation_platform/segmentation_platform_config.cc
@@ -14,6 +14,7 @@ #include "components/segmentation_platform/public/features.h" #if defined(OS_ANDROID) +#include "chrome/browser/flags/android/cached_feature_flags.h" #include "chrome/browser/flags/android/chrome_feature_list.h" #endif @@ -119,7 +120,8 @@ chrome::android::kAdaptiveButtonInTopToolbarCustomizationV2)) { configs.emplace_back(GetConfigForAdaptiveToolbar()); } - if (base::FeatureList::IsEnabled(chrome::android::kStartSurfaceAndroid)) { + if (chrome::android::IsJavaDrivenFeatureEnabled( + chrome::android::kStartSurfaceAndroid)) { configs.emplace_back(GetConfigForChromeStartAndroid()); } if (base::FeatureList::IsEnabled(
diff --git a/chrome/browser/sharesheet/sharesheet_metrics.cc b/chrome/browser/sharesheet/sharesheet_metrics.cc index 69c19f0..02dadd7a 100644 --- a/chrome/browser/sharesheet/sharesheet_metrics.cc +++ b/chrome/browser/sharesheet/sharesheet_metrics.cc
@@ -28,6 +28,8 @@ "ChromeOS.Sharesheet.IsDriveFolder"; const char kSharesheetIsImagePressedResultHistogram[] = "ChromeOS.Sharesheet.IsImagePreviewPressed"; +const char kSharesheetCopyToClipboardMimeTypeResultHistogram[] = + "ChromeOS.Sharesheet.CopyToClipboard.MimeType"; SharesheetMetrics::SharesheetMetrics() = default; @@ -81,4 +83,10 @@ is_pressed); } +void SharesheetMetrics::RecordCopyToClipboardShareActionMimeType( + const MimeType mime_type) { + base::UmaHistogramEnumeration( + kSharesheetCopyToClipboardMimeTypeResultHistogram, mime_type); +} + } // namespace sharesheet
diff --git a/chrome/browser/sharesheet/sharesheet_metrics.h b/chrome/browser/sharesheet/sharesheet_metrics.h index 6c52b8d..272a6bb 100644 --- a/chrome/browser/sharesheet/sharesheet_metrics.h +++ b/chrome/browser/sharesheet/sharesheet_metrics.h
@@ -17,6 +17,7 @@ extern const char kSharesheetFileCountResultHistogram[]; extern const char kSharesheetIsDriveFolderResultHistogram[]; extern const char kSharesheetIsImagePressedResultHistogram[]; +extern const char kSharesheetCopyToClipboardMimeTypeResultHistogram[]; class SharesheetMetrics { public: @@ -55,6 +56,20 @@ kMaxValue = kOmniboxShare, }; + // The mime type that is being shared. + // This enum is for recording histograms and must be treated as append-only. + enum class MimeType { + kUnknown = 0, + kText = 1, + kUrl = 2, + kTextFile = 3, + kImageFile = 4, + kVideoFile = 5, + kAudioFile = 6, + kPdfFile = 7, + kMaxValue = kPdfFile + }; + SharesheetMetrics(); static void RecordSharesheetActionMetrics(const UserAction action); @@ -76,6 +91,9 @@ // Records true if the image preview was pressed in the current invocation. // False otherwise. static void RecordSharesheetImagePreviewPressed(const bool is_pressed); + + static void RecordCopyToClipboardShareActionMimeType( + const MimeType mime_type); }; } // namespace sharesheet
diff --git a/chrome/browser/sharesheet/sharesheet_service.cc b/chrome/browser/sharesheet/sharesheet_service.cc index fad7ca5..0d3cb06 100644 --- a/chrome/browser/sharesheet/sharesheet_service.cc +++ b/chrome/browser/sharesheet/sharesheet_service.cc
@@ -197,7 +197,6 @@ CloseCallback close_callback) { SharesheetMetrics::RecordSharesheetLaunchSource(source); auto targets = GetActionsForIntent(intent, contains_hosted_document); - RecordTargetCountMetrics(targets); OnReadyToShowBubble(native_window, std::move(intent), std::move(delivered_callback), std::move(close_callback), std::move(targets)); @@ -324,9 +323,6 @@ DeliveredCallback delivered_callback, CloseCallback close_callback, std::vector<TargetInfo> targets) { - RecordTargetCountMetrics(targets); - RecordShareDataMetrics(intent); - if (!web_contents) { std::move(delivered_callback).Run(SharesheetResult::kErrorWindowClosed); return; @@ -344,6 +340,9 @@ std::vector<TargetInfo> targets) { auto* delegator = GetOrCreateDelegator(native_window); + RecordTargetCountMetrics(targets); + RecordShareDataMetrics(intent); + // If SetSelectedAppForTesting() has been called, immediately launch the app. const std::u16string selected_app = GetSelectedApp(); if (!selected_app.empty()) { @@ -446,7 +445,6 @@ case apps::mojom::AppType::kRemote: case apps::mojom::AppType::kBorealis: case apps::mojom::AppType::kStandaloneBrowserChromeApp: - case apps::mojom::AppType::kExtension: case apps::mojom::AppType::kUnknown: NOTREACHED(); }
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelObserver.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelObserver.java index 843664f..a710850d 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelObserver.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelObserver.java
@@ -9,6 +9,20 @@ */ public interface IncognitoTabModelObserver { /** + * A delegate to control whether to show or hide the Incognito reauth dialog. + */ + interface IncognitoReauthDialogDelegate { + /** + * An event which is fired to control the visibility of the Incognito re-authentication + * dialog. + * + * @param oldModel The previous {@link TabModel} which was active. + * @param newModel The new {@link TabModel} which is now active. + */ + void onAfterTabModelSelected(TabModel oldModel, TabModel newModel); + } + + /** * Called when the first tab of the {@link IncognitoTabModel} is created. */ default void wasFirstTabCreated() {}
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelector.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelector.java index 97f892c..a96b222 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelector.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelector.java
@@ -193,6 +193,17 @@ void removeIncognitoTabModelObserver(IncognitoTabModelObserver incognitoObserver); /** + * Sets the delegate to handle {@link TabModel} events that triggers an Incognito + * re-authentication. This delegate is invoked when all the observers observing + * onTabModelSelected event have been notified. + * + * @param incognitoReauthDialogDelegate A delegate which takes care of triggering an Incognito + * re-authentication. + */ + void setIncognitoReauthDialogDelegate( + IncognitoTabModelObserver.IncognitoReauthDialogDelegate incognitoReauthDialogDelegate); + + /** * Destroy all owned {@link TabModel}s and {@link Tab}s referenced by this selector. */ void destroy();
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 8463149..cb8ecf2 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -472,6 +472,7 @@ "//components/country_codes", "//components/crash/core/browser", "//components/crx_file", + "//components/custom_handlers", "//components/data_reduction_proxy/core/browser", "//components/device_event_log", "//components/dom_distiller/content/browser", @@ -1696,6 +1697,7 @@ "//chrome/browser/profile_resetter:profile_reset_report_proto", "//chrome/browser/resource_coordinator:tab_metrics_event_proto", "//chrome/browser/resource_coordinator/tab_ranker", + "//chrome/browser/safe_browsing", "//chrome/browser/safe_browsing:advanced_protection", "//chrome/browser/ui/color:color_headers", "//chrome/browser/ui/commander:fuzzy_finder",
diff --git a/chrome/browser/ui/android/night_mode/BUILD.gn b/chrome/browser/ui/android/night_mode/BUILD.gn index c0362127..f19ee6a 100644 --- a/chrome/browser/ui/android/night_mode/BUILD.gn +++ b/chrome/browser/ui/android/night_mode/BUILD.gn
@@ -8,6 +8,7 @@ android_library("java") { sources = [ + "java/src/org/chromium/chrome/browser/night_mode/AutoDarkFeedbackSource.java", "java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateController.java", "java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateProviderHolder.java", "java/src/org/chromium/chrome/browser/night_mode/NightModeMetrics.java", @@ -107,6 +108,7 @@ bypass_platform_checks = true testonly = true sources = [ + "java/src/org/chromium/chrome/browser/night_mode/AutoDarkFeedbackSourceUnitTest.java", "java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeControllerUnitTest.java", "java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeMessageControllerUnitTest.java", ]
diff --git a/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/AutoDarkFeedbackSource.java b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/AutoDarkFeedbackSource.java new file mode 100644 index 0000000..64b098d --- /dev/null +++ b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/AutoDarkFeedbackSource.java
@@ -0,0 +1,80 @@ +// 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.night_mode; + +import android.content.Context; + +import androidx.annotation.VisibleForTesting; + +import org.chromium.chrome.browser.feedback.FeedbackSource; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.night_mode.WebContentsDarkModeController.AutoDarkModeEnabledState; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.url.GURL; + +import java.util.HashMap; +import java.util.Map; + +/** Feedback Source around relevant user and UI settings for auto dark mode. */ +public class AutoDarkFeedbackSource implements FeedbackSource { + @VisibleForTesting + static final String AUTO_DARK_FEEDBACK_KEY = "auto_dark_web_content_enabled"; + @VisibleForTesting + static final String ENABLED_VALUE = "Enabled"; + + /** Feature flag for auto dark is disabled. */ + @VisibleForTesting + static final String DISABLED_FEATURE_VALUE = "DisabledFeatureGroup"; + + /** User settings for auto dark is disabled. */ + @VisibleForTesting + static final String DISABLED_GLOBAL_SETTINGS_VALUE = "DisabledGlobalSettings"; + + /** Whether the current URL has auto dark enabled. */ + @VisibleForTesting + static final String DISABLED_URL_SETTINGS_VALUE = "DisabledUrlSettings"; + + /** Settings is enabled, theme is in light */ + @VisibleForTesting + static final String DISABLED_BY_LIGHT_MODE_VALUE = "DisabledByLightMode"; + + private final HashMap<String, String> mMap; + + public AutoDarkFeedbackSource(Profile profile, Context context, GURL url) { + mMap = new HashMap<String, String>(1); + + // Ignore user settings in incognito, or not in auto dark feature is not enabled. + if (profile.isOffTheRecord()) return; + + if (!ChromeFeatureList.isEnabled( + ChromeFeatureList.DARKEN_WEBSITES_CHECKBOX_IN_THEMES_SETTING)) { + mMap.put(AUTO_DARK_FEEDBACK_KEY, DISABLED_FEATURE_VALUE); + } else { + @AutoDarkModeEnabledState + int enabledState = WebContentsDarkModeController.getEnabledState(profile, context, url); + mMap.put(AUTO_DARK_FEEDBACK_KEY, toFeedbackValue(enabledState)); + } + } + + private String toFeedbackValue(@AutoDarkModeEnabledState int enabledState) { + switch (enabledState) { + case AutoDarkModeEnabledState.ENABLED: + return ENABLED_VALUE; + case AutoDarkModeEnabledState.DISABLED_GLOBAL_SETTINGS: + return DISABLED_GLOBAL_SETTINGS_VALUE; + case AutoDarkModeEnabledState.DISABLED_URL_SETTINGS: + return DISABLED_URL_SETTINGS_VALUE; + case AutoDarkModeEnabledState.DISABLED_LIGHT_MODE: + return DISABLED_BY_LIGHT_MODE_VALUE; + default: + throw new RuntimeException("Invalid enabled state."); + } + } + + @Override + public Map<String, String> getFeedback() { + return mMap; + } +}
diff --git a/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/AutoDarkFeedbackSourceUnitTest.java b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/AutoDarkFeedbackSourceUnitTest.java new file mode 100644 index 0000000..1943944 --- /dev/null +++ b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/AutoDarkFeedbackSourceUnitTest.java
@@ -0,0 +1,115 @@ +// 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. + +package org.chromium.chrome.browser.night_mode; + +import android.content.Context; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TestRule; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; + +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.night_mode.AutoDarkFeedbackSourceUnitTest.ShadowWebContentsDarkModeController; +import org.chromium.chrome.browser.night_mode.WebContentsDarkModeController.AutoDarkModeEnabledState; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.test.util.browser.Features; +import org.chromium.content_public.browser.BrowserContextHandle; +import org.chromium.url.GURL; + +/** Unit test for {@link AutoDarkFeedbackSource}. */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(shadows = ShadowWebContentsDarkModeController.class) +@Features.EnableFeatures(ChromeFeatureList.DARKEN_WEBSITES_CHECKBOX_IN_THEMES_SETTING) +public class AutoDarkFeedbackSourceUnitTest { + @Implements(WebContentsDarkModeController.class) + static class ShadowWebContentsDarkModeController { + static @AutoDarkModeEnabledState int sEnabledState; + + @Implementation + public static @AutoDarkModeEnabledState int getEnabledState( + BrowserContextHandle browserContextHandle, Context context, GURL url) { + return sEnabledState; + } + } + + @Rule + public MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Rule + public TestRule mProcessor = new Features.JUnitProcessor(); + + @Mock + Profile mProfile; + @Mock + Context mContext; + + @Before + public void setup() { + ShadowWebContentsDarkModeController.sEnabledState = AutoDarkModeEnabledState.INVALID; + } + + @After + public void tearDown() { + ShadowWebContentsDarkModeController.sEnabledState = -1; + } + + @Test + public void testIncognitoProfile() { + Mockito.doReturn(true).when(mProfile).isOffTheRecord(); + doTestFeedbackSource(""); + } + + @Test + @Features.DisableFeatures(ChromeFeatureList.DARKEN_WEBSITES_CHECKBOX_IN_THEMES_SETTING) + public void testDisabled_FeatureNotEnabled() { + doTestFeedbackSource(AutoDarkFeedbackSource.DISABLED_FEATURE_VALUE); + } + + @Test + public void testAutoDarkEnabledState_Enabled() { + ShadowWebContentsDarkModeController.sEnabledState = AutoDarkModeEnabledState.ENABLED; + doTestFeedbackSource(AutoDarkFeedbackSource.ENABLED_VALUE); + } + + @Test + public void testAutoDarkEnabledState_DisabledGlobalSettings() { + ShadowWebContentsDarkModeController.sEnabledState = + AutoDarkModeEnabledState.DISABLED_GLOBAL_SETTINGS; + doTestFeedbackSource(AutoDarkFeedbackSource.DISABLED_GLOBAL_SETTINGS_VALUE); + } + + @Test + public void testAutoDarkEnabledState_DisabledLightMode() { + ShadowWebContentsDarkModeController.sEnabledState = + AutoDarkModeEnabledState.DISABLED_LIGHT_MODE; + doTestFeedbackSource(AutoDarkFeedbackSource.DISABLED_BY_LIGHT_MODE_VALUE); + } + + @Test + public void testAutoDarkEnabledState_DisabledUrlSettings() { + ShadowWebContentsDarkModeController.sEnabledState = + AutoDarkModeEnabledState.DISABLED_URL_SETTINGS; + doTestFeedbackSource(AutoDarkFeedbackSource.DISABLED_URL_SETTINGS_VALUE); + } + + private void doTestFeedbackSource(String expectedPsdValue) { + AutoDarkFeedbackSource source = new AutoDarkFeedbackSource(mProfile, mContext, null); + String feedbackPsdValue = source.getFeedback().getOrDefault( + AutoDarkFeedbackSource.AUTO_DARK_FEEDBACK_KEY, ""); + Assert.assertEquals( + "Expected PSD value does not match.", feedbackPsdValue, expectedPsdValue); + } +}
diff --git a/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeController.java b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeController.java index b248da7..0f5fd64 100644 --- a/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeController.java +++ b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeController.java
@@ -6,6 +6,8 @@ import android.content.Context; +import androidx.annotation.IntDef; + import org.chromium.components.browser_ui.site_settings.AutoDarkMetrics; import org.chromium.components.browser_ui.site_settings.AutoDarkMetrics.AutoDarkSettingsChangeSource; import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge; @@ -17,12 +19,32 @@ import org.chromium.ui.util.ColorUtils; import org.chromium.url.GURL; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * A controller class could enable or disable web content dark mode feature based on the content * settings {@link ContentSettingsType.AUTO_DARK_WEB_CONTENT}. */ public class WebContentsDarkModeController { /** + * Enum class that explained the enabled state for auto dark mode. See {@link #getEnabledState} + */ + @IntDef({AutoDarkModeEnabledState.INVALID, AutoDarkModeEnabledState.ENABLED, + AutoDarkModeEnabledState.DISABLED_GLOBAL_SETTINGS, + AutoDarkModeEnabledState.DISABLED_LIGHT_MODE, + AutoDarkModeEnabledState.DISABLED_URL_SETTINGS}) + @Retention(RetentionPolicy.SOURCE) + public @interface AutoDarkModeEnabledState { + // INVALID state used as test placeholder. + int INVALID = -1; + int ENABLED = 0; + int DISABLED_GLOBAL_SETTINGS = 1; + int DISABLED_LIGHT_MODE = 2; + int DISABLED_URL_SETTINGS = 3; + } + + /** * Return whether auto dark mode is enable for a given URL. * @param browserContextHandle Current browser context handle. * @param url Queried URL to check whether auto dark is enabled. @@ -108,4 +130,26 @@ new UkmRecorder.Bridge().recordEventWithBooleanMetric( webContents, "Android.DarkTheme.AutoDarkMode", "DisabledByUser"); } + + /** + * Return the current enabled state for auto dark mode. If the input {@link GURL} is not null, + * the enabled state will also check if auto dark is enabled for URL. + * @param browserContextHandle Current browser context handle. + * @param context {@link Context} used to check whether UI is in night mode. + * @param url Queried URL whether auto dark is enabled. + * @return The current enabled state in {@link AutoDarkModeEnabledState}. + */ + public static @AutoDarkModeEnabledState int getEnabledState( + BrowserContextHandle browserContextHandle, Context context, GURL url) { + if (!isGlobalUserSettingsEnabled(browserContextHandle)) { + return AutoDarkModeEnabledState.DISABLED_GLOBAL_SETTINGS; + } + if (!ColorUtils.inNightMode(context)) { + return AutoDarkModeEnabledState.DISABLED_LIGHT_MODE; + } + if (!url.isEmpty() && !isEnabledForUrl(browserContextHandle, url)) { + return AutoDarkModeEnabledState.DISABLED_URL_SETTINGS; + } + return AutoDarkModeEnabledState.ENABLED; + } }
diff --git a/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeControllerUnitTest.java b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeControllerUnitTest.java index 65502ed..473b72e 100644 --- a/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeControllerUnitTest.java +++ b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeControllerUnitTest.java
@@ -26,6 +26,7 @@ import org.chromium.base.metrics.test.ShadowRecordHistogram; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.JniMocker; +import org.chromium.chrome.browser.night_mode.WebContentsDarkModeController.AutoDarkModeEnabledState; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.browser_ui.site_settings.AutoDarkMetrics.AutoDarkSettingsChangeSource; import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge; @@ -92,10 +93,39 @@ public void tearDown() { GlobalNightModeStateProviderHolder.setInstanceForTesting(null); Profile.setLastUsedProfileForTesting(null); + ShadowColorUtils.sInNightMode = false; ShadowRecordHistogram.reset(); } + @Test + public void testFeatureEnabled() { + ShadowColorUtils.sInNightMode = true; + mIsGlobalSettingsEnabled = true; + Assert.assertTrue( + "Feature should be enabled, if both global settings and night mode enabled.", + WebContentsDarkModeController.isFeatureEnabled(mMockContext, mMockProfile)); + assertEnabledState(GURL.emptyGURL(), AutoDarkModeEnabledState.ENABLED); + } + + @Test + public void testFeatureEnabled_LightMode() { + ShadowColorUtils.sInNightMode = false; + mIsGlobalSettingsEnabled = true; + Assert.assertFalse("Feature should be disabled when not in night mode.", + WebContentsDarkModeController.isFeatureEnabled(mMockContext, mMockProfile)); + assertEnabledState(GURL.emptyGURL(), AutoDarkModeEnabledState.DISABLED_LIGHT_MODE); + } + + @Test + public void testFeatureEnabled_NoUserSettings() { + ShadowColorUtils.sInNightMode = true; + mIsGlobalSettingsEnabled = false; + Assert.assertFalse("Feature should be disabled when global settings disabled.", + WebContentsDarkModeController.isFeatureEnabled(mMockContext, mMockProfile)); + assertEnabledState(GURL.emptyGURL(), AutoDarkModeEnabledState.DISABLED_GLOBAL_SETTINGS); + } + private void doTestSetAutoDarkGlobalSettingsEnabled(boolean enabled) { WebContentsDarkModeController.setGlobalUserSettings(mMockProfile, enabled); Assert.assertEquals("Auto dark settings state incorrect.", enabled, @@ -107,31 +137,6 @@ } @Test - public void testFeatureEnabled() { - ShadowColorUtils.sInNightMode = true; - mIsGlobalSettingsEnabled = true; - Assert.assertTrue( - "Feature should be enabled, if both global settings and night mode enabled.", - WebContentsDarkModeController.isFeatureEnabled(mMockContext, mMockProfile)); - } - - @Test - public void testFeatureEnabled_LightMode() { - ShadowColorUtils.sInNightMode = false; - mIsGlobalSettingsEnabled = true; - Assert.assertFalse("Feature should be disabled when not in night mode.", - WebContentsDarkModeController.isFeatureEnabled(mMockContext, mMockProfile)); - } - - @Test - public void testFeatureEnabled_NoUserSettings() { - ShadowColorUtils.sInNightMode = true; - mIsGlobalSettingsEnabled = false; - Assert.assertFalse("Feature should be disabled when global settings disabled.", - WebContentsDarkModeController.isFeatureEnabled(mMockContext, mMockProfile)); - } - - @Test public void testGlobalSettingsEnabled() { doTestSetAutoDarkGlobalSettingsEnabled(true); } @@ -165,6 +170,22 @@ doTestSetAutoDarkForUrl(false); } + @Test + public void testGetEnableStateForUrl_Enabled() { + ShadowColorUtils.sInNightMode = true; + mIsGlobalSettingsEnabled = true; + mIsAutoDarkEnabledForUrlContentSettingValue = ContentSettingValues.ALLOW; + assertEnabledState(mMockGurl, AutoDarkModeEnabledState.ENABLED); + } + + @Test + public void testGetEnableStateForUrl_Disabled() { + ShadowColorUtils.sInNightMode = true; + mIsGlobalSettingsEnabled = true; + mIsAutoDarkEnabledForUrlContentSettingValue = ContentSettingValues.BLOCK; + assertEnabledState(mMockGurl, AutoDarkModeEnabledState.DISABLED_URL_SETTINGS); + } + private void assertAutoDarkModeChangeSourceRecorded( @AutoDarkSettingsChangeSource int source, boolean enabled, int expectedCounts) { String histogramName = "Android.DarkTheme.AutoDarkMode.SettingsChangeSource." @@ -174,4 +195,11 @@ + "> is not recorded correctly.", expectedCounts, actualCount); } + + private void assertEnabledState(GURL url, @AutoDarkModeEnabledState int expectedEnabledState) { + int actualEnabledState = + WebContentsDarkModeController.getEnabledState(mMockProfile, mMockContext, url); + Assert.assertEquals("AutoDarkModeEnabledState does not match.", expectedEnabledState, + actualEnabledState); + } }
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index 3624ab7..14f45e1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Светлая</translation> <translation id="1810845389119482123">Першапачатковая наладка сінхранізацыі не завершана</translation> <translation id="1829244130665387512">Пошук на старонцы</translation> +<translation id="1832459821645506983">Так, згаджаюся</translation> <translation id="1843805151597803366">Дазвольце Google Пошуку выкарыстаць бягучую старонку для паляпшэння перакладу</translation> <translation id="1856325424225101786">Скінуць налады лёгкага рэжыму?</translation> <translation id="1868024384445905608">Chrome цяпер спампоўвае файлы хутчэй</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">Каб паказваць змесціва на выбраных вамі мовах, сайты, якія вы наведваеце, могуць праглядаць зададзеныя вамі параметры</translation> <translation id="2723001399770238859">аўдыя</translation> <translation id="2728754400939377704">Сартаваць па сайце</translation> +<translation id="2732063072010454421">Зрабіце галасавы пошук яшчэ зручнейшым</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Каб выканаць імгненны пошук або паглядзець звязаныя са словам дзеянні, націсніце на яго</translation> <translation id="2760989362628427051">Выкарыстоўваць цёмную тэму, калі на прыладзе ўключаны рэжым эканоміі зараду або цёмная тэма</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Каб падпісацца на сайт, перайдзіце на яго, адкрыйце меню Chrome і націсніце "Падпісацца".</translation> <translation id="5880748256563468367">Перайсці да стужкі</translation> <translation id="5884076754568147479">Каб дапамагаць вам выконваць задачы, Google будзе збіраць URL-адрасы і змесціва сайтаў, на якіх вы выкарыстоўваеце Памочніка, а таксама інфармацыю, якую вы перадаяце праз яго</translation> +<translation id="5906513782029855931">Маючы URL-адрасы сайтаў, Памочнік Google можа дапамагаць вам выконваць задачы. Выключыць Памочніка можна ў наладах Chrome.</translation> <translation id="5916664084637901428">Уключана</translation> <translation id="5919204609460789179">Каб запусціць сінхранізацыю, абнавіце <ph name="PRODUCT_NAME" /></translation> <translation id="5937580074298050696">Эканомія: <ph name="AMOUNT" /></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 2e71e7d..06417aa 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
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Clar</translation> <translation id="1810845389119482123">La configuració de la sincronització inicial no ha finalitzat</translation> <translation id="1829244130665387512">Cerca a la pàgina</translation> +<translation id="1832459821645506983">Sí, ho accepto</translation> <translation id="1843805151597803366">Per obtenir traduccions millors, deixa que la Cerca de Google utilitzi la pàgina actual</translation> <translation id="1856325424225101786">Vols restablir el mode bàsic?</translation> <translation id="1868024384445905608">Ara Chrome baixa els fitxers més ràpid</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">Els llocs web que visites poden veure les teves preferències per mostrar-te contingut en els teus idiomes preferits</translation> <translation id="2723001399770238859">àudio</translation> <translation id="2728754400939377704">Ordena per lloc web</translation> +<translation id="2732063072010454421">Gaudeix d'una experiència de veu millor</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Toca una paraula per fer una cerca a l'instant o per veure accions relacionades</translation> <translation id="2760989362628427051">Activa el tema fosc quan el teu dispositiu tingui activat aquest tema o el mode d'estalvi de bateria</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Per seguir un lloc web, ves al lloc web, obre el menú de Chrome i toca Segueix.</translation> <translation id="5880748256563468367">Ves al feed</translation> <translation id="5884076754568147479">Per ajudar-te a dur a terme tasques, Google rebrà els URL i el contingut dels llocs web en què facis servir l'Assistent, així com la informació que enviïs amb l'Assistent</translation> +<translation id="5906513782029855931">Saber els URL dels llocs web permet que l'Assistent de Google t'ajudi a completar tasques. Pots desactivar l'Assistent a la configuració de Chrome.</translation> <translation id="5916664084637901428">Activat</translation> <translation id="5919204609460789179">Actualitza <ph name="PRODUCT_NAME" /> per iniciar la sincronització</translation> <translation id="5937580074298050696">Dades estalviades: <ph name="AMOUNT" /></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 c8f4ca94..3a24222 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
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Lys</translation> <translation id="1810845389119482123">Indledende konfiguration af synkronisering er ikke afsluttet</translation> <translation id="1829244130665387512">Find på siden</translation> +<translation id="1832459821645506983">Ja tak</translation> <translation id="1843805151597803366">Du kan få bedre oversættelser ved at lade Google Søgning bruge den aktuelle side</translation> <translation id="1856325424225101786">Vil du nulstille Lite-tilstand?</translation> <translation id="1868024384445905608">Chrome downloader nu filer endnu hurtigere</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">For at vise indhold på dine foretrukne sprog kan de websites, du besøger, se dine præferencer</translation> <translation id="2723001399770238859">lyd</translation> <translation id="2728754400939377704">Sortér efter website</translation> +<translation id="2732063072010454421">Få en bedre brugeroplevelse med stemmesøgning</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Tryk på et ord for at søge øjeblikkeligt eller se relaterede handlinger</translation> <translation id="2760989362628427051">Aktivér mørkt tema, når enhedens mørke tema eller batterisparefunktion er aktiveret</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Følg et website ved at gå til websitet, åbne Chrome-menuen og trykke på Følg.</translation> <translation id="5880748256563468367">Gå til feed</translation> <translation id="5884076754568147479">For at hjælpe dig med at udføre opgaver modtager Google webadresser for og indhold på websites, hvor du bruger Assistent, samt oplysninger du indsender via Assistent</translation> +<translation id="5906513782029855931">Hvis Google Assistent får indsigt i sidernes webadresser, kan du få hjælp med at udføre opgaver. Du kan deaktivere Assistent i indstillingerne for Chrome.</translation> <translation id="5916664084637901428">Til</translation> <translation id="5919204609460789179">Opdater <ph name="PRODUCT_NAME" /> for at starte synkroniseringen</translation> <translation id="5937580074298050696">Du har sparet <ph name="AMOUNT" /></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 420d4596..475b3f5 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
@@ -94,6 +94,7 @@ <translation id="1506061864768559482">Motor de búsqueda</translation> <translation id="1513352483775369820">Favoritos e historial web</translation> <translation id="1513858653616922153">Borrar contraseña</translation> +<translation id="1518421282666914498">GIF de emoción <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Activo hoy</translation> <translation id="1538801903729528855">Obtén una mejor experiencia de voz en la Web</translation> <translation id="1544826120773021464">Para administrar tu Cuenta de Google, presiona el botón "Administrar cuenta"</translation> @@ -116,6 +117,7 @@ <translation id="1702543251015153180">¿Quieres cambiar la configuración del Tema oscuro?</translation> <translation id="1718835860248848330">Última hora</translation> <translation id="1724977129262658800">Desbloquea la pantalla para editar tu contraseña.</translation> +<translation id="1726477445370128854">Puedes navegar y realizar búsquedas más rápidas cuando Chrome precarga las páginas que considera que puedes visitar</translation> <translation id="173522743738009831">Información sobre Privacy Sandbox</translation> <translation id="1736419249208073774">Explorar</translation> <translation id="1749561566933687563">Sincroniza tus favoritos</translation> @@ -130,6 +132,7 @@ <translation id="1807246157184219062">Claro</translation> <translation id="1810845389119482123">No se completó la configuración de la sincronización inicial</translation> <translation id="1829244130665387512">Buscar en la página</translation> +<translation id="1832459821645506983">Sí, acepto</translation> <translation id="1843805151597803366">Para obtener mejores traducciones, permite que la Búsqueda de Google use la página actual</translation> <translation id="1856325424225101786">¿Quieres restablecer el modo lite?</translation> <translation id="1868024384445905608">Ahora Chrome descarga los archivos más rápido</translation> @@ -276,6 +279,7 @@ <translation id="2649068648233607930"><ph name="DOMAIN" /> administra tu navegador</translation> <translation id="2650751991977523696">¿Deseas volver a descargar el archivo?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# archivo de audio}other{# archivos de audio}}</translation> +<translation id="265156376773362237">Precarga estándar</translation> <translation id="2656405586795711023">Aplicaciones web</translation> <translation id="2689830683995595741">Si usas Chrome, aceptas las <ph name="BEGIN_LINK1" />Condiciones del Servicio de Google<ph name="END_LINK1" /> y las <ph name="BEGIN_LINK2" />Condiciones del Servicio Adicionales de Google Chrome y el Sistema operativo Chrome<ph name="END_LINK2" />. También se aplica el <ph name="BEGIN_LINK3" />Aviso de Privacidad para las Cuentas de Google administradas con Family Link<ph name="END_LINK3" />.</translation> <translation id="2702516483241149200">Nuevo: Comparte un vínculo directo a este texto.</translation> @@ -286,6 +290,7 @@ <translation id="2718846868787000099">Para poder mostrar contenido en tus idiomas preferidos, los sitios que visitas deberán acceder a tus preferencias</translation> <translation id="2723001399770238859">audio</translation> <translation id="2728754400939377704">Ordenar por sitio</translation> +<translation id="2732063072010454421">Obtén una mejor experiencia de búsqueda por voz</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Presiona una palabra para realizar una búsqueda instantánea o ver acciones relacionadas</translation> <translation id="2760989362628427051">Activa el tema oscuro cuando esté activado el Ahorro de batería o el tema oscuro de tu dispositivo</translation> @@ -311,6 +316,7 @@ <translation id="2856503607207334158">No se pudo acceder.</translation> <translation id="2860954141821109167">Comprueba que este dispositivo tenga una app de teléfono habilitada</translation> <translation id="2870560284913253234">Sitio</translation> +<translation id="2871733351037274014">Precargar páginas</translation> <translation id="2888126860611144412">Acerca de Chrome</translation> <translation id="2891154217021530873">Detener la carga de la página</translation> <translation id="2892647708214602204">Cuando el archivo esté listo, se te mostrará una notificación</translation> @@ -340,10 +346,12 @@ <translation id="2992473221983447149">Descripciones de imágenes</translation> <translation id="2996291259634659425">Crear frase de contraseña</translation> <translation id="2996809686854298943">URL obligatoria</translation> +<translation id="2997081575621687554">Cuando un sitio de Google te pregunta si quieres precargar de forma privada los vínculos de su página, Chrome encripta y precarga las páginas por medio de los servidores de Google sin cookies. De esta forma, se oculta tu identidad del sitio precargado.</translation> <translation id="3006881078666935414">No hay datos de uso</translation> <translation id="301080557829842765">Guía sobre privacidad</translation> <translation id="3016635187733453316">Comprueba que este dispositivo tenga conexión a Internet</translation> <translation id="3026955690410463085">Incluir vínculo</translation> +<translation id="3029276696788198026">Sin precarga</translation> <translation id="3029704984691124060">Las frases de contraseña no coinciden.</translation> <translation id="3031225630520268969">IU de consentimiento de la búsqueda por voz de Asistente</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Obtener ayuda<ph name="END_LINK" /></translation> @@ -377,6 +385,7 @@ <translation id="3232754137068452469">Aplicación web</translation> <translation id="3234978181857588512">Guardar en el dispositivo</translation> <translation id="3236059992281584593">1 minuto restante</translation> +<translation id="3237087289225714896">Precarga estándar:</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">Si también compartes los informes de uso de Chrome, estos incluirán las URL que visites.</translation> <translation id="3250563604907490871">Se reanudarán las descripciones de imágenes cuando te conectes a una red Wi-Fi.</translation> @@ -410,6 +419,7 @@ <translation id="3389286852084373014">El texto es demasiado largo</translation> <translation id="3391512812407811893">Pruebas de Privacy Sandbox</translation> <translation id="3398320232533725830">Abrir el administrador de favoritos</translation> +<translation id="3407392651057365886">Se precargan más páginas. Las páginas pueden precargarse mediante servidores de Google cuando las solicitan otros sitios.</translation> <translation id="3414952576877147120">Tamaño:</translation> <translation id="3421726884497337397">Decide cuándo bloquear las cookies de terceros</translation> <translation id="3429160811076349561">Las funciones de prueba están desactivadas</translation> @@ -532,6 +542,7 @@ <translation id="4196597275619698563">Crear tarjeta</translation> <translation id="4198423547019359126">No hay ubicaciones de descarga disponibles</translation> <translation id="4209895695669353772">Para obtener contenido personalizado y sugerido por Google, activa la sincronización</translation> +<translation id="4214315110991671325">Si permites las cookies, Chrome puede usarlas para la precarga.</translation> <translation id="4225895483398857530">Acceso directo a la barra de herramientas</translation> <translation id="4242533952199664413">Abrir la configuración</translation> <translation id="4248098802131000011">Mantén protegidas tus contraseñas ante violaciones de la seguridad de los datos y otros problemas de seguridad.</translation> @@ -581,6 +592,7 @@ <translation id="4532845899244822526">Seleccionar carpeta</translation> <translation id="4538018662093857852">Activar el modo lite</translation> <translation id="4547551584605870320">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> pestaña}other{<ph name="TAB_COUNT_MANY" /> pestañas, <ph name="TAB_COUNT_INCOGNITO" /> de incógnito}}</translation> +<translation id="4549903594034243526">chrome_emotion_gif_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="4550003330909367850">Para ver o copiar tu contraseña aquí, establece un bloqueo de pantalla en este dispositivo.</translation> <translation id="4554077758708533499">Conectado con cable USB</translation> <translation id="4557685098773234337">Para acceder aquí más rápido, agrega esta página a la pantalla principal</translation> @@ -723,6 +735,7 @@ <translation id="5317780077021120954">Guardar</translation> <translation id="5319359161174645648">Google recomienda Chrome</translation> <translation id="5324858694974489420">Configuración parental</translation> +<translation id="5326921373682845375">Debido a que las páginas precargadas están encriptadas, y que el sitio vinculado a las páginas es un sitio de Google, los servidores de Google no recibirán información nueva cuando se precarguen estas páginas de forma privada.</translation> <translation id="5329858041417644019">Tu navegador no está administrado</translation> <translation id="5342314432463739672">Solicitudes de permisos</translation> <translation id="5355191726083956201">Se activó la protección mejorada</translation> @@ -824,6 +837,7 @@ <translation id="587735546353481577">Para seguir un sitio, visítalo, abre el menú de Chrome y presiona Seguir.</translation> <translation id="5880748256563468367">Ir al feed</translation> <translation id="5884076754568147479">Para ayudarte a completar tareas, Google recibirá las URL y los contenidos de los sitios en los que uses el Asistente, así como la información que envías a través de este servicio</translation> +<translation id="5906513782029855931">Conocer las URLs de los sitios permite a Asistente de Google ayudarlo a completar las tareas. En la configuración de Chrome, puedes desactivar Asistente.</translation> <translation id="5916664084637901428">Activado</translation> <translation id="5919204609460789179">Actualiza <ph name="PRODUCT_NAME" /> para iniciar la sincronización</translation> <translation id="5937580074298050696">Datos ahorrados: <ph name="AMOUNT" /></translation> @@ -874,6 +888,7 @@ <translation id="6154478581116148741">Para exportar tus contraseñas de este dispositivo, activa el bloqueo de pantalla en Configuración</translation> <translation id="6159335304067198720"><ph name="PERCENT" /> de ahorro de datos</translation> <translation id="6159729262978459665">Borra el historial de todos tus dispositivos sincronizados.</translation> +<translation id="6162892189396105610">Precarga las páginas que Chrome considera que posiblemente visites.</translation> <translation id="6186394685773237175">No se encontraron contraseñas hackeadas</translation> <translation id="6192907950379606605">Obtener descripción de imágenes</translation> <translation id="6203593061661911168">Se iniciará la descarga cuando el dispositivo se conecte a Wi-Fi.</translation> @@ -908,6 +923,7 @@ <translation id="6364438453358674297">¿Borrar la sugerencia del historial?</translation> <translation id="6378173571450987352">Detalles: Ordenados por cantidad de datos utilizados</translation> <translation id="6379829913050047669">Se abrirá <ph name="APP_NAME" /> en Chrome. Si continúas, aceptas las <ph name="BEGIN_LINK1" />Condiciones del Servicio de Google<ph name="END_LINK1" /> y las <ph name="BEGIN_LINK2" />Condiciones del Servicio Adicionales de Google Chrome y el Sistema operativo Chrome<ph name="END_LINK2" />.</translation> +<translation id="6380100320871303656">Precarga con más frecuencia las páginas que Chrome considera que posiblemente visites. Esta configuración puede generar un mayor uso de datos.</translation> <translation id="6395288395575013217">VÍNCULO</translation> <translation id="6397616442223433927">De nuevo en línea</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" /> de <ph name="VIOLATED_URL" /></translation> @@ -941,6 +957,7 @@ <translation id="6532866250404780454">No se mostrarán los sitios que visites en Chrome. Se borrarán todos los temporizadores.</translation> <translation id="6534565668554028783">Google tardó demasiado en responder</translation> <translation id="6539092367496845964">Se produjo un error; vuelve a intentarlo más tarde.</translation> +<translation id="6541042852576515209">Cambiar el tamaño y rotar</translation> <translation id="6541983376925655882">{NUM_HOURS,plural, =1{Se verificó hace 1 hora}other{Se verificó hace # horas}}</translation> <translation id="6545017243486555795">Borrar todos los datos</translation> <translation id="6546511553472444032">Es posible que el archivo sea dañino</translation> @@ -1014,6 +1031,7 @@ <translation id="6896758677409633944">Copiar</translation> <translation id="6900532703269623216">Protección mejorada</translation> <translation id="6903907808598579934">Activar la sincronización</translation> +<translation id="6909589135458168665">Precargar páginas</translation> <translation id="6929699136511445623">Habilitar la sincronización del sistema Android</translation> <translation id="6942665639005891494">Cambia la ubicación predeterminada de las descargas en cualquier momento en la opción de menú de Configuración</translation> <translation id="694267552845942083">Estás personalizando la configuración de sincronización. Para activar la sincronización, presiona el botón Confirmar que se encuentra cerca de la parte inferior de la pantalla. Subir</translation> @@ -1098,6 +1116,8 @@ <translation id="7444811645081526538">Más categorías</translation> <translation id="7453467225369441013">Esta acción te hace salir de la mayoría de los sitios. No saldrás de tu cuenta de Google.</translation> <translation id="7454641608352164238">No hay suficiente espacio</translation> +<translation id="7456774706094330779">Precarga extendida</translation> +<translation id="7468819939926272717">Elegir una emoción</translation> <translation id="7474822150871987353">Obtén información sobre los temas en sitios web sin salir de la página. Selecciona una o más palabras en la página para buscarlas.</translation> <translation id="7475192538862203634">Si el mensaje aparece con frecuencia, prueba estas <ph name="BEGIN_LINK" />sugerencias<ph name="END_LINK" />.</translation> <translation id="7475688122056506577">No se encontró la tarjeta SD. Es posible que falten algunos archivos.</translation> @@ -1146,6 +1166,7 @@ <translation id="7665369617277396874">Agregar cuenta</translation> <translation id="766587987807204883">Los artículos aparecen aquí, y puedes leerlos incluso cuando estás sin conexión</translation> <translation id="7682724950699840886">Intenta las siguientes sugerencias: Antes de exportar las contraseñas nuevamente, asegúrate de que haya espacio suficiente en tu dispositivo.</translation> +<translation id="768618399695552958">Algunas de las páginas que visitas están precargadas. Las páginas pueden precargarse por medio de servidores de Google cuando están vinculadas desde un sitio de Google.</translation> <translation id="7698359219371678927">Crear correo electrónico en <ph name="APP_NAME" /></translation> <translation id="7704317875155739195">Autocompletar búsquedas y URL</translation> <translation id="7707922173985738739">Usa los datos móviles.</translation> @@ -1218,6 +1239,7 @@ <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB disponibles</translation> <translation id="8058655154417507695">Año de vencimiento</translation> <translation id="8058746566562539958">Abrir en una nueva pestaña de Chrome</translation> +<translation id="8062594758852531064">Precarga extendida:</translation> <translation id="8063895661287329888">Se produjo un error al agregar el marcador.</translation> <translation id="806745655614357130">Mantener mis datos separados</translation> <translation id="8073388330009372546">Abrir imagen en pestaña nueva</translation> @@ -1253,6 +1275,7 @@ <translation id="8250920743982581267">Documentos</translation> <translation id="825412236959742607">Chrome quitó parte del contenido de esta página porque usa demasiada memoria.</translation> <translation id="8255617931166444521">Los sitios solo pueden utilizar las cookies para ver tu actividad de navegación en su propio sitio.</translation> +<translation id="8259179246279078674">Debido a que las páginas precargadas están encriptadas, Google no analizará el contenido de esas páginas. Los servidores de Google sabrán qué sitios se precargaron de forma privada. Esta información solo se usará para precargar las páginas y no se vincula a otra información de tu Cuenta de Google.</translation> <translation id="8260126382462817229">Intenta volver a acceder</translation> <translation id="8261506727792406068">Borrar</translation> <translation id="82619448491672958">Ver otras pestañas</translation> @@ -1311,6 +1334,7 @@ <translation id="8551513938758868521">Bloquear las pestañas de incógnito cuando abandonas Chrome</translation> <translation id="8555836665334561807">Con Wi‑Fi</translation> <translation id="8559990750235505898">Ofrecer la traducción de páginas en otros idiomas</translation> +<translation id="8560560256644480257">Creando GIF: <ph name="PERCENT" />%%</translation> <translation id="8560602726703398413">Encuentra tu lista de lectura en favoritos.</translation> <translation id="8562452229998620586">Las contraseñas guardadas aparecerán aquí.</translation> <translation id="856481929701340285">Solicitar versión de escritorio</translation> @@ -1329,6 +1353,7 @@ <translation id="8636825310635137004">Activa la sincronización para obtener las pestañas de tus otros dispositivos.</translation> <translation id="8641930654639604085">Tratar de bloquear los sitios para adultos</translation> <translation id="864544049772947936">Administrar ventanas (<ph name="INSTANCE_COUNTS" />)</translation> +<translation id="8646467750715887511">Las páginas se cargan una vez que las abres.</translation> <translation id="8655129584991699539">Puedes borrar los datos en la Configuración de Chrome</translation> <translation id="8656747343598256512">Accede a este sitio y a Chrome con tu Cuenta de Google. Puedes activar la sincronización más tarde.</translation> <translation id="8659579665266920523">Cómo realizar búsquedas en Chrome</translation> @@ -1425,6 +1450,7 @@ <translation id="9209888181064652401">No se pueden realizar llamadas</translation> <translation id="9212845824145208577">No se puede ir más abajo. Intenta tomar la captura desde más abajo en la página.</translation> <translation id="9219103736887031265">Imágenes</translation> +<translation id="92381315203627188">Cuando un sitio te pregunta si quieres precargar de forma privada los vínculos de su página, Chrome encripta y precarga las páginas por medio de los servidores de Google sin cookies. De esta forma, se oculta tu identidad del sitio precargado.</translation> <translation id="926205370408745186">Quita tu actividad en Chrome de Bienestar digital</translation> <translation id="927968626442779827">Usa el modo lite en Google Chrome</translation> <translation id="928550791203542716">Siguiendo <ph name="SITE_NAME" /></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 a8e7bb95..1deea39 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
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Claro</translation> <translation id="1810845389119482123">La configuración de sincronización inicial no ha terminado</translation> <translation id="1829244130665387512">Buscar en la página</translation> +<translation id="1832459821645506983">Sí, acepto</translation> <translation id="1843805151597803366">Para obtener mejores traducciones, permite que la Búsqueda de Google use la página actual</translation> <translation id="1856325424225101786">¿Restablecer el modo básico?</translation> <translation id="1868024384445905608">Ahora Chrome descarga los archivos más rápido</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">Para mostrar contenido en los idiomas que has seleccionado, los sitios que visites pueden ver tus preferencias</translation> <translation id="2723001399770238859">audio</translation> <translation id="2728754400939377704">Ordenar por sitio web</translation> +<translation id="2732063072010454421">Mejora tu experiencia con la voz</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Toca una palabra para buscarla de forma instantánea o ver acciones relacionadas</translation> <translation id="2760989362628427051">Habilita el tema oscuro cuando esté activado el tema oscuro del dispositivo o el dispositivo esté en modo de ahorro de batería</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Para seguir un sitio, visítalo, abre el menú de Chrome y toca Seguir.</translation> <translation id="5880748256563468367">Ir al feed</translation> <translation id="5884076754568147479">Para ayudarte a completar tareas, Google recibirá las URL y los contenidos de los sitios en los que uses el Asistente, así como la información que envíes a través del Asistente.</translation> +<translation id="5906513782029855931">Conocer las URLs de los sitios permite al Asistente de Google ayudarte a hacer tareas. Puedes desactivar el Asistente en la configuración de Chrome.</translation> <translation id="5916664084637901428">Activado</translation> <translation id="5919204609460789179">Actualiza <ph name="PRODUCT_NAME" /> para iniciar la sincronización</translation> <translation id="5937580074298050696">Ahorro: <ph name="AMOUNT" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index 4fdafb2..73c9e86 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Vaalea</translation> <translation id="1810845389119482123">Synkronoinnin alkumääritys ei valmis</translation> <translation id="1829244130665387512">Haku sivulta</translation> +<translation id="1832459821645506983">Kyllä</translation> <translation id="1843805151597803366">Anna Google Haun käyttää nykyistä sivua, jotta saat parempia käännöksiä</translation> <translation id="1856325424225101786">Palautetaanko yksinkertaistettu tila?</translation> <translation id="1868024384445905608">Chrome lataa tiedostot nyt nopeammin</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">Avaamasi sivustot voivat nähdä asetuksesi, jotta ne voivat näyttää sisältöä haluamillasi kielillä</translation> <translation id="2723001399770238859">ääni</translation> <translation id="2728754400939377704">Lajittele sivuston mukaan</translation> +<translation id="2732063072010454421">Parempi kokemus puhehaulla</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Napauta sanaa etsiäksesi välittömästi tai nähdäksesi asiaan liittyviä toimia.</translation> <translation id="2760989362628427051">Ota tumma teema käyttöön, kun laitteen tumma teema tai virransäästö on käytössä</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Jos haluat seurata sivustoa, siirry sille, avaa Chrome-valikko ja valitse Seuraa.</translation> <translation id="5880748256563468367">Siirry fiidiin</translation> <translation id="5884076754568147479">Jotta tehtävien hoitaminen sujuisi helpommin, Google saa tiedot niiden sivustojen URL-osoitteista ja sisällöstä, joilla käytät Assistantia, sekä Assistantin kautta lähettämäsi tiedot</translation> +<translation id="5906513782029855931">Sivustojen URL-osoitteiden avulla Google Assistantia voi auttaa sinua tekemään asioita. Voit poistaa Assistantin käytöstä Chromen asetuksissa.</translation> <translation id="5916664084637901428">Päällä</translation> <translation id="5919204609460789179">Aloita synkronointi päivittämällä <ph name="PRODUCT_NAME" /></translation> <translation id="5937580074298050696"><ph name="AMOUNT" /> säästetty</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 09e1f32..5e788cf 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
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Világos</translation> <translation id="1810845389119482123">A szinkronizálás kezdeti beállítása nem fejeződött be</translation> <translation id="1829244130665387512">Keresés ezen az oldalon</translation> +<translation id="1832459821645506983">Benne vagyok!</translation> <translation id="1843805151597803366">A jobb fordítások érdekében engedélyezze a Google Keresőnek a jelenlegi oldal használatát</translation> <translation id="1856325424225101786">Visszaállítja az Egyszerűsített módot?</translation> <translation id="1868024384445905608">Mostantól a Chrome gyorsabban tölti le a fájlokat</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">A felkeresett webhelyek láthatják az Ön preferenciáit, hogy a kívánt nyelveken jeleníthessék meg a tartalmakat</translation> <translation id="2723001399770238859">audio</translation> <translation id="2728754400939377704">Rendezés webhely szerint</translation> +<translation id="2732063072010454421">Jobb hangalapú élményben lehet része</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Az azonnali kereséshez koppintson a kívánt szóra, vagy tekintse meg a kapcsolódó műveleteket</translation> <translation id="2760989362628427051">Sötét téma bekapcsolása, amikor az eszköz sötét témája vagy Akkumulátorkímélő módja be van kapcsolva</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Webhely követéséhez lépjen a kívánt webhelyhez, nyissa meg a Chrome menüjét, majd koppintson a Követés pontra.</translation> <translation id="5880748256563468367">Hírcsatorna megnyitása</translation> <translation id="5884076754568147479">Annak érdekében, hogy segíteni tudjon a feladatok elvégzésében, a Google megkapja azoknak a webhelyeknek az URL-jeit és tartalmait, amelyeken Ön használta Segédjét, valamint megkapja a Segéden keresztül elküldött információkat</translation> +<translation id="5906513782029855931">A webhelyek URL-jeinek ismerete lehetővé teszi a Google Segédnek, hogy segítsen bizonyos műveletek elvégzésében. A Segédet a Chrome beállításai között kapcsolhatja ki.</translation> <translation id="5916664084637901428">Be</translation> <translation id="5919204609460789179">A szinkronizálás megkezdéséhez frissítse a következőt: <ph name="PRODUCT_NAME" /></translation> <translation id="5937580074298050696"><ph name="AMOUNT" /> megtakarított adatmennyiség</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index cc266b0..5f629ab 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Terang</translation> <translation id="1810845389119482123">Penyiapan sinkronisasi awal belum selesai</translation> <translation id="1829244130665387512">Cari di halaman</translation> +<translation id="1832459821645506983">Ya, saya setuju</translation> <translation id="1843805151597803366">Untuk mendapatkan terjemahan yang lebih baik, izinkan Google Penelusuran menggunakan halaman saat ini</translation> <translation id="1856325424225101786">Reset Mode Ringan?</translation> <translation id="1868024384445905608">Chrome sekarang mendownload file lebih cepat</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">Untuk menampilkan konten dalam bahasa pilihan Anda, situs yang dikunjungi dapat melihat preferensi Anda</translation> <translation id="2723001399770238859">audio</translation> <translation id="2728754400939377704">Urutkan menurut situs</translation> +<translation id="2732063072010454421">Dapatkan pengalaman suara yang lebih baik</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Ketuk sebuah kata untuk menelusuri secara instan atau melihat tindakan terkait</translation> <translation id="2760989362628427051">Mengaktifkan tema gelap ketika tema gelap perangkat atau Penghemat Baterai aktif</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Untuk mengikuti situs, buka situs, buka menu Chrome, dan ketuk Ikuti.</translation> <translation id="5880748256563468367">Buka feed</translation> <translation id="5884076754568147479">Untuk membantu Anda menyelesaikan tugas, Google akan menerima URL dan konten situs tempat Anda menggunakan Asisten, serta informasi yang Anda kirimkan melalui Asisten</translation> +<translation id="5906513782029855931">Dengan mengetahui URL situs, Asisten Google dapat membantu Anda menyelesaikan tugas. Anda dapat menonaktifkan Asisten di setelan Chrome.</translation> <translation id="5916664084637901428">Aktif</translation> <translation id="5919204609460789179">Perbarui <ph name="PRODUCT_NAME" /> untuk memulai sinkronisasi</translation> <translation id="5937580074298050696"><ph name="AMOUNT" /> dihemat</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 25d72767..57453cc 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
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Ljóst</translation> <translation id="1810845389119482123">Fyrstu uppsetningu samstillingar ekki lokið</translation> <translation id="1829244130665387512">Finna á síðu</translation> +<translation id="1832459821645506983">Já, ég vil vera með</translation> <translation id="1843805151597803366">Til að fá betri þýðingar skaltu leyfa Google leit að nota núverandi síðu</translation> <translation id="1856325424225101786">Viltu endurstilla léttútgáfu?</translation> <translation id="1868024384445905608">Chrome er nú fljótara að sækja skrár</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">Vefsvæðin sem þú opnar geta séð kjörstillingarnar þínar til að sýna þér efni á þeim tungumálum sem þú hefur valið.</translation> <translation id="2723001399770238859">hljóð</translation> <translation id="2728754400939377704">Raða eftir vefsvæði</translation> +<translation id="2732063072010454421">Láttu röddina þjóna þér betur</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Ýttu á orð til að leita að því eða sjá tengdar aðgerðir</translation> <translation id="2760989362628427051">Kveikja á dökku þema þegar kveikt er á dökku þema eða rafhlöðusparnaði í tækinu</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Til að fylgja vefsvæði skaltu opna vefsvæðið, opna Chrome valmyndina og smella á „Fylgja“.</translation> <translation id="5880748256563468367">Opna straum</translation> <translation id="5884076754568147479">Google fær vefslóðir og innihald vefsvæða þar sem þú notar hjálparann, auk upplýsinga sem þú sendir með hjálparanum, til að hjálpa þér að ljúka við verkefni</translation> +<translation id="5906513782029855931">Þegar Google hjálparinn fær upplýsingar um vefslóðir vefsvæða getur hann aðstoðað þig við að ljúka verkefnum. Þú getur slökkt á Hjálparanum í stillingum Chrome.</translation> <translation id="5916664084637901428">Kveikt</translation> <translation id="5919204609460789179">Uppfærðu <ph name="PRODUCT_NAME" /> til að hefja samstillingu</translation> <translation id="5937580074298050696"><ph name="AMOUNT" /> spöruð</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index 1cc22d5f..4b18e52 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">בהיר</translation> <translation id="1810845389119482123">ההגדרה הראשונית של הסנכרון לא הושלמה</translation> <translation id="1829244130665387512">חיפוש בדף</translation> +<translation id="1832459821645506983">כן, אני רוצה</translation> <translation id="1843805151597803366">כדי לשפר את התרגומים, יש לאפשר לחיפוש Google להשתמש בדף הנוכחי</translation> <translation id="1856325424225101786">לאפס את מצב הטעינה המהירה?</translation> <translation id="1868024384445905608">הורדת קבצים ב-Chrome מתבצעת עכשיו מהר יותר</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">כדי שנוכל להציג תוכן בשפות המועדפות עליך, ההעדפות שלך גלויות לאתרים שביקרת בהם</translation> <translation id="2723001399770238859">אודיו</translation> <translation id="2728754400939377704">מיון לפי אתר</translation> +<translation id="2732063072010454421">אפשר ליהנות מחוויה טובה יותר בחיפוש קולי</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">כדי לחפש באופן מיידי או לראות פעולות קשורות, צריך להקיש על מילה</translation> <translation id="2760989362628427051">עיצוב כהה מופעל כשבמכשיר פועלת האפשרות 'עיצוב כהה' או 'חיסכון בסוללה'</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">כדי לעקוב אחר אתר כלשהו, עוברים אליו, פותחים את תפריט Chrome ומקישים על 'מעקב'.</translation> <translation id="5880748256563468367">לכניסה אל הפיד</translation> <translation id="5884076754568147479">כדי לעזור לך להשלים משימות, Google תקבל את כתובות ה-URL והתוכן של האתרים שבהם נעשה שימוש ב-Assistant, וכן את המידע שנשלח דרך Assistant</translation> +<translation id="5906513782029855931">אם מכירים כתובות של אתרים, Google Assistant יכולה לעזור להשלים משימות. ניתן להשבית את Assistant דרך ההגדרות של Chrome.</translation> <translation id="5916664084637901428">פועל</translation> <translation id="5919204609460789179">יש לעדכן את <ph name="PRODUCT_NAME" /> כדי להתחיל סנכרון</translation> <translation id="5937580074298050696"><ph name="AMOUNT" /> נחסכו</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index cac5a40..fac3e3af 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -1152,7 +1152,7 @@ <translation id="7596558890252710462">オペレーティング システム</translation> <translation id="7605594153474022051">同期が機能していません</translation> <translation id="7606077192958116810">ライトモードはオンです。[設定] で管理できます。</translation> -<translation id="7612619742409846846">次のユーザーとして Google にログインしています</translation> +<translation id="7612619742409846846">Google にログイン済みのユーザー</translation> <translation id="7616551326690708776">ハイライト表示のテンプレートを選択します。</translation> <translation id="7619072057915878432">ネットワーク障害が発生したため、<ph name="FILE_NAME" /> をダウンロードできませんでした。</translation> <translation id="7626032353295482388">Chrome へようこそ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index be93f03f..6e02039a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -623,6 +623,7 @@ <translation id="4696983787092045100">Мәтінді құрылғыларға жіберу</translation> <translation id="4699172675775169585">Кэштелген кескіндер мен файлдар</translation> <translation id="4714588616299687897">Трафикті 60%-ға дейін үнемдеңіз</translation> +<translation id="471759387343966120">Жалғастыру арқылы <ph name="BEGIN_TOS_LINK" />Қызмет көрсету шарттарына<ph name="END_TOS_LINK" /> және <ph name="BEGIN_PRIVACY_LINK" />Құпиялылық\u00A0саясатына<ph name="END_PRIVACY_LINK" /> келісесіз.\nҚолданбаны жақсартуға көмектесу үшін, Chrome пайдалану және бұзылу туралы деректерді Google-ға жібереді. <ph name="BEGIN_UMA_LINK" />Басқару<ph name="END_UMA_LINK" /></translation> <translation id="4719927025381752090">Аудармасын ұсыну</translation> <translation id="4720023427747327413"><ph name="PRODUCT_NAME" /> ішінен ашу</translation> <translation id="4720982865791209136">Chrome браузерін жақсартуға көмектесіңіз. <ph name="BEGIN_LINK" />Сауалнамаға қатысыңыз<ph name="END_LINK" /></translation> @@ -1062,6 +1063,7 @@ <translation id="7106762743910369165">Браузеріңізді ұйым басқарады.</translation> <translation id="7121362699166175603">Мекенжай жолағында тарих пен автотолтыруларды өшіреді. <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> сайтында Google аккаунтымен шолу тарихының басқа да үлгілері болуы мүмкін.</translation> <translation id="7138678301420049075">Басқа</translation> +<translation id="7143462160780459030">Скриншот түсірілмеді. Қайталап көріңіз.</translation> <translation id="7146622961999026732">Бұл сайттар мен қолданбалар маңызды болуы мүмкін:</translation> <translation id="7149893636342594995">Соңғы 24 сағат</translation> <translation id="7155317020660659215">QR кодын сканерлеу үшін Chrome параметрлерін камера пайдалана алатындай етіп өзгертіңіз.</translation> @@ -1248,6 +1250,7 @@ <translation id="808747664143081553">Құрылғыға қосылды</translation> <translation id="8088176524274673045">Жаныңыздағы адамдармен бөлісу үшін олар осы QR кодын сканерлеуі қажет.</translation> <translation id="8103578431304235997">Инкогнито қойындысы</translation> +<translation id="8105613260829665809">Жалғастыру арқылы <ph name="BEGIN_TOS_LINK" />Қызмет көрсету шарттарына<ph name="END_TOS_LINK" /> келісесіз.\nҚолданбаны жақсартуға көмектесу үшін, Chrome пайдалану және бұзылу туралы деректерді Google-ға жібереді. <ph name="BEGIN_UMA_LINK" />Басқару<ph name="END_UMA_LINK" /></translation> <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Бетбелгілерді барлық құрылғылардан пайдалану үшін синхрондау функциясын қосыңыз</translation> <translation id="8110024788458304985">Chrome-ның функциялары мен өнімділігін жақсартуға көмектесу</translation> @@ -1286,6 +1289,7 @@ <translation id="831192587911042850">Ағымдағы веб-сайтты сіз жазылған веб-сайттардың тізіміне енгізеді.</translation> <translation id="834313815369870491">Ешқашан сайттарды аудармау</translation> <translation id="8349013245300336738">Пайдаланылған деректер көлемі бойынша сұрыптау</translation> +<translation id="8352996530981010042">Эмоциялар жүктеп алынбады. Қайталап көріңіз.</translation> <translation id="8354977102499939946">Дауыспен жылдам іздеу. Бұл таңбашаны өзгерту үшін "Параметрлер" бөліміне өтіңіз.</translation> <translation id="835847953965672673"><ph name="NUMBER_OF_DOWNLOADS" /> жүктеп алынған файл қалпына келтірілді.</translation> <translation id="8364299278605033898">Танымал веб-сайттарды көріңіз.</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 4653ec0..489859f 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
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Šviesi</translation> <translation id="1810845389119482123">Pradinė sinchronizavimo sąranka nebaigta</translation> <translation id="1829244130665387512">Surasti puslapyje</translation> +<translation id="1832459821645506983">Taip, sutinku</translation> <translation id="1843805151597803366">Kad gautumėte geresnių vertimų, leiskite „Google“ paieškai naudoti dabartinį puslapį</translation> <translation id="1856325424225101786">Nustatyti supaprastintąjį režimą iš naujo?</translation> <translation id="1868024384445905608">Dabar „Chrome“ failus atsisiunčia greičiau</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">Kad turinys būtų rodomas pageidaujamomis kalbomis, svetainės, kuriose lankotės, gali matyti jūsų nuostatas</translation> <translation id="2723001399770238859">garso įrašas</translation> <translation id="2728754400939377704">Rūšiuoti pagal svetainę</translation> +<translation id="2732063072010454421">Ieškoti balsu gali būti dar patogiau</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Palieskite žodį ir ieškokite akimirksniu arba peržiūrėkite susijusius veiksmus</translation> <translation id="2760989362628427051">Įjungti tamsiąją temą, kai įjungta įrenginio tamsioji tema arba akumuliatoriaus tausojimo priemonė</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Jei norite stebėti svetainę, eikite į svetainę, atidarykite „Chrome“ meniu ir palieskite „Stebėti“.</translation> <translation id="5880748256563468367">Eiti į sklaidos kanalą</translation> <translation id="5884076754568147479">Kad padėtų atlikti užduotis, „Google“ gaus svetainių, kuriose naudojate Padėjėją, URL ir turinį bei informaciją, kurią pateikiate naudodami Padėjėją.</translation> +<translation id="5906513782029855931">Žinodamas svetainių URL, „Google“ padėjėjas gali padėti jums atlikti užduotis. Padėjėją galite išjungti „Chrome“ nustatymuose.</translation> <translation id="5916664084637901428">Įjungta</translation> <translation id="5919204609460789179">Atnaujinkite „<ph name="PRODUCT_NAME" />“, kad galėtumėte pradėti sinchronizuoti</translation> <translation id="5937580074298050696">Išsaugota <ph name="AMOUNT" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb index b44ca313..b132517 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Gaišs</translation> <translation id="1810845389119482123">Sākotnējā sinhronizācijas iestatīšana nav pabeigta</translation> <translation id="1829244130665387512">Atrast lapā</translation> +<translation id="1832459821645506983">Jā, labi</translation> <translation id="1843805151597803366">Lai iegūtu labākus tulkojumus, ļaujiet pakalpojumam “Google meklēšana” izmantot pašreizējo lapu</translation> <translation id="1856325424225101786">Vai atiestatīt vienkāršoto režīmu?</translation> <translation id="1868024384445905608">Tagad pārlūkā Chrome faili tiek lejupielādēti ātrāk.</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">Apmeklētajām vietnēm ir atļauta piekļuve jūsu preferencēm, lai nodrošinātu satura rādīšanu jūsu izvēlētajā valodā.</translation> <translation id="2723001399770238859">audio</translation> <translation id="2728754400939377704">Kārtot pēc vietnes</translation> +<translation id="2732063072010454421">Labāka pieredze meklēšanā ar balsi</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Pieskarieties vārdam, lai meklētu tūlīt vai skatītu saistītas darbības.</translation> <translation id="2760989362628427051">Ieslēgt tumšo motīvu, kad ierīcē ir ieslēgts tumšais motīvs vai akumulatora enerģijas taupīšanas režīms</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Lai sekotu kādai vietnei, atveriet attiecīgo vietni, atveriet Chrome izvēlni un pieskarieties vienumam Sekot.</translation> <translation id="5880748256563468367">Pāriet uz plūsmu</translation> <translation id="5884076754568147479">Lai palīdzētu jums paveikt uzdevumus, Google saņems to vietņu vietrāžus URL un saturu, kurās izmantojat Asistentu, kā arī informāciju, ko iesniedzat, izmantojot Asistentu.</translation> +<translation id="5906513782029855931">Zinot vietņu vietrāžus URL, Google asistents var palīdzēt jums veikt uzdevumus. Chrome iestatījumos varat izslēgt Asistentu.</translation> <translation id="5916664084637901428">Iesl.</translation> <translation id="5919204609460789179">Lai sāktu sinhronizēšanu, atjauniniet <ph name="PRODUCT_NAME" /></translation> <translation id="5937580074298050696">Saglabāts: <ph name="AMOUNT" /></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 a6e8b3b..4161b7b1 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
@@ -94,6 +94,7 @@ <translation id="1506061864768559482">Søkemotor</translation> <translation id="1513352483775369820">Bokmerker og nettlogg</translation> <translation id="1513858653616922153">Slett passordet</translation> +<translation id="1518421282666914498">GIF med uttrykksikoner – <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktiv i dag</translation> <translation id="1538801903729528855">Bruk stemmen til å oppleve nettet på en ny måte</translation> <translation id="1544826120773021464">For å administrere Google-kontoen din, trykk på «Administrer kontoen»-knappen</translation> @@ -116,6 +117,7 @@ <translation id="1702543251015153180">Vil du endre innstillingene for mørkt tema?</translation> <translation id="1718835860248848330">Siste time</translation> <translation id="1724977129262658800">Lås opp for å redigere passordet ditt</translation> +<translation id="1726477445370128854">Du kan surfe og søke raskere når Chrome forhåndslaster sider du kanskje kommer til å besøke</translation> <translation id="173522743738009831">Om Privacy Sandbox</translation> <translation id="1736419249208073774">Utforsk</translation> <translation id="1749561566933687563">Synkroniser bokmerkene dine</translation> @@ -277,6 +279,7 @@ <translation id="2649068648233607930">Nettleseren administreres av <ph name="DOMAIN" /></translation> <translation id="2650751991977523696">Vil du laste ned filen på nytt?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# lydfil}other{# lydfiler}}</translation> +<translation id="265156376773362237">Standard forhåndslasting</translation> <translation id="2656405586795711023">Nettprogrammer</translation> <translation id="2689830683995595741">Ved å bruke Chrome samtykker du i <ph name="BEGIN_LINK1" />Googles vilkår for bruk<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />tilleggsvilkårene for bruk av Google Chrome og Chrome OS<ph name="END_LINK2" />. <ph name="BEGIN_LINK3" />Merknaden om personvern for Google-kontoer som administreres via Family Link<ph name="END_LINK3" />, gjelder også.</translation> <translation id="2702516483241149200">Ny: del en link som ruller til denne teksten</translation> @@ -313,6 +316,7 @@ <translation id="2856503607207334158">Pålogging mislyktes</translation> <translation id="2860954141821109167">Kontrollér at en telefon-app er påslått på denne enheten</translation> <translation id="2870560284913253234">Nettsted</translation> +<translation id="2871733351037274014">Forhåndslasting av sider</translation> <translation id="2888126860611144412">Om Chrome</translation> <translation id="2891154217021530873">Stopp innlastingen av siden</translation> <translation id="2892647708214602204">Du får et varsel når filen er klar</translation> @@ -342,10 +346,12 @@ <translation id="2992473221983447149">Bildebeskrivelser</translation> <translation id="2996291259634659425">Opprett en passordfrase</translation> <translation id="2996809686854298943">Nettadresse kreves</translation> +<translation id="2997081575621687554">Når Google-nettsteder ber om privat forhåndslasting av linker på sidene sine, medfører det at Chrome krypterer og forhåndslaster sider gjennom Googles tjenere uten informasjonskapsler. Dermed skjules identiteten din for det forhåndslastede nettstedet.</translation> <translation id="3006881078666935414">Ingen bruksdata</translation> <translation id="301080557829842765">Personvernveiledning</translation> <translation id="3016635187733453316">Kontrollér at enheten er koblet til internett</translation> <translation id="3026955690410463085">Inkluder link</translation> +<translation id="3029276696788198026">Ingen forhåndslasting</translation> <translation id="3029704984691124060">Passordfrasene stemmer ikke overens</translation> <translation id="3031225630520268969">UI for samtykke til talesøk med assistenten</translation> <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Få hjelp<ph name="END_LINK" /></translation> @@ -379,6 +385,7 @@ <translation id="3232754137068452469">Nettprogram</translation> <translation id="3234978181857588512">Lagre på enheten</translation> <translation id="3236059992281584593">1 minutt igjen</translation> +<translation id="3237087289225714896">Standard forhåndslasting:</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">Hvis du også deler Chrome-bruksrapporter, inneholder disse rapportene nettadressene du besøker</translation> <translation id="3250563604907490871">Bildebeskrivelser gjenopptas når du kobler til Wi-Fi</translation> @@ -412,6 +419,7 @@ <translation id="3389286852084373014">Teksten er for stor</translation> <translation id="3391512812407811893">Prøvefunksjoner i Privacy Sandbox</translation> <translation id="3398320232533725830">Åpne bokmerkebehandlingen</translation> +<translation id="3407392651057365886">Flere sider forhåndslastes. Sider kan bli forhåndslastet via Googles tjenere når andre nettsteder ber om det.</translation> <translation id="3414952576877147120">Størrelse:</translation> <translation id="3421726884497337397">Velg når informasjonskapsler fra tredjeparter skal blokkeres</translation> <translation id="3429160811076349561">Prøvefunksjoner er avslått</translation> @@ -534,6 +542,7 @@ <translation id="4196597275619698563">Opprett et kort</translation> <translation id="4198423547019359126">Ingen tilgjengelige nedlastingssteder</translation> <translation id="4209895695669353772">For å få forslag om personlig tilpasset innhold fra Google, slå på synkronisering</translation> +<translation id="4214315110991671325">Hvis du tillater informasjonskapsler, kan Chrome bruke dem ved forhåndslasting.</translation> <translation id="4225895483398857530">Verktøylinje-snarvei</translation> <translation id="4242533952199664413">Åpne innstillingene</translation> <translation id="4248098802131000011">Beskytt passordene dine mot databrudd og andre sikkerhetsproblemer</translation> @@ -583,6 +592,7 @@ <translation id="4532845899244822526">Velg en mappe</translation> <translation id="4538018662093857852">Slå på forenklet modus</translation> <translation id="4547551584605870320">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> fane}other{<ph name="TAB_COUNT_MANY" /> faner, <ph name="TAB_COUNT_INCOGNITO" /> inkognito}}</translation> +<translation id="4549903594034243526">chrome_emotion_gif_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="4550003330909367850">For å se eller kopiere passordet ditt her, angi skjermlås på denne enheten.</translation> <translation id="4554077758708533499">Tilkoblet med USB-kabel</translation> <translation id="4557685098773234337">For å komme hit raskere, legg til denne siden på startskjermen</translation> @@ -725,6 +735,7 @@ <translation id="5317780077021120954">Lagre</translation> <translation id="5319359161174645648">Google anbefaler Chrome</translation> <translation id="5324858694974489420">Foreldreinnstillinger</translation> +<translation id="5326921373682845375">Siden de forhåndslastede sidene er krypterte og nettstedet som linker til sidene, er et Google-nettsted, får ikke Googles tjenere noen ny informasjon ved privat forhåndslasting av disse sidene.</translation> <translation id="5329858041417644019">Nettleseren din administreres ikke</translation> <translation id="5342314432463739672">Tillatelsesforespørsler</translation> <translation id="5355191726083956201">Økt beskyttelse er på</translation> @@ -877,6 +888,7 @@ <translation id="6154478581116148741">Slå på skjermlåsen i Innstillinger for å eksportere passordene dine fra denne enheten</translation> <translation id="6159335304067198720"><ph name="PERCENT" /> datasparing</translation> <translation id="6159729262978459665">Tømmer loggen på alle synkroniserte enheter.</translation> +<translation id="6162892189396105610">Forhåndslaster sider som Chrome tror du kanskje kommer til å besøke.</translation> <translation id="6186394685773237175">Fant ingen passord som er utsatt for sikkerhetsbrudd</translation> <translation id="6192907950379606605">Få bildebeskrivelser</translation> <translation id="6203593061661911168">Nedlastingen starter når du er tilkoblet Wi-Fi</translation> @@ -911,6 +923,7 @@ <translation id="6364438453358674297">Vil du fjerne forslaget fra loggen?</translation> <translation id="6378173571450987352">Informasjon: Sortert etter mengden data som er brukt</translation> <translation id="6379829913050047669"><ph name="APP_NAME" /> åpnes i Chrome. Ved å fortsette samtykker du i <ph name="BEGIN_LINK1" />Googles vilkår for bruk<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />tilleggsvilkårene for bruk av Google Chrome og Chrome OS<ph name="END_LINK2" />.</translation> +<translation id="6380100320871303656">Forhåndslaster oftere sider som Chrome tror du sannsynligvis kommer til å besøke. Denne innstillingen kan medføre høyere databruk.</translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">På nettet igjen</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" /> på <ph name="VIOLATED_URL" /></translation> @@ -944,6 +957,7 @@ <translation id="6532866250404780454">Nettsteder du besøker i Chrome, vises ikke. Alle tidtakere for nettsteder blir slettet.</translation> <translation id="6534565668554028783">Google brukte for lang tid på å svare</translation> <translation id="6539092367496845964">Noe gikk galt. Prøv på nytt senere.</translation> +<translation id="6541042852576515209">Endre størrelse og rotér</translation> <translation id="6541983376925655882">{NUM_HOURS,plural, =1{Sjekket for en time siden}other{Sjekket for # timer siden}}</translation> <translation id="6545017243486555795">Slett alle data</translation> <translation id="6546511553472444032">Filen kan være skadelig</translation> @@ -1017,6 +1031,7 @@ <translation id="6896758677409633944">Kopiér</translation> <translation id="6900532703269623216">Økt beskyttelse</translation> <translation id="6903907808598579934">Slå på synkronisering</translation> +<translation id="6909589135458168665">Forhåndslasting av sider</translation> <translation id="6929699136511445623">Slå på Android-systemsynkronisering</translation> <translation id="6942665639005891494">Endre standard nedlastingssted når som helst via menyalternativet Innstillinger</translation> <translation id="694267552845942083">Du holder på å tilpasse innstillingene for Synkronisering. For å gjøre deg ferdig med å slå på synkronisering, trykk på Bekreft-knappen nederst på skjermen. Gå opp</translation> @@ -1101,6 +1116,8 @@ <translation id="7444811645081526538">Flere kategorier</translation> <translation id="7453467225369441013">Logger deg av de fleste nettsteder. Du blir ikke logget av Google-kontoen din.</translation> <translation id="7454641608352164238">Det er ikke nok plass</translation> +<translation id="7456774706094330779">Utvidet forhåndslasting</translation> +<translation id="7468819939926272717">Velg et uttrykksikon</translation> <translation id="7474822150871987353">Finn ut mer om emner på nettsteder uten å forlate siden. Merk ett eller flere ord på siden for å søke etter dem.</translation> <translation id="7475192538862203634">Hvis du ser dette ofte, kan du prøve disse <ph name="BEGIN_LINK" />forslagene<ph name="END_LINK" />.</translation> <translation id="7475688122056506577">Finner ikke SD-kort. Noen av filene dine kan mangle.</translation> @@ -1149,6 +1166,7 @@ <translation id="7665369617277396874">Legg til konto</translation> <translation id="766587987807204883">Her vises artikler, som du kan lese selv om du er uten nett</translation> <translation id="7682724950699840886">Prøv dette: Sørg for at det er nok plass på enheten, og prøv å eksportere på nytt.</translation> +<translation id="768618399695552958">Noen av sidene du besøker, er forhåndslastede. Sider kan bli forhåndslastet via Googles tjenere når de er linket på Google-nettsteder.</translation> <translation id="7698359219371678927">Opprett en e-post i <ph name="APP_NAME" /></translation> <translation id="7704317875155739195">Autofullfør søk og nettadresser</translation> <translation id="7707922173985738739">Bruk mobildata</translation> @@ -1221,6 +1239,7 @@ <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB tilgjengelig</translation> <translation id="8058655154417507695">Utløpsår</translation> <translation id="8058746566562539958">Åpne i en ny Chrome-fane</translation> +<translation id="8062594758852531064">Utvidet forhåndslasting:</translation> <translation id="8063895661287329888">Kunne ikke legge til bokmerket.</translation> <translation id="806745655614357130">Hold dataene mine adskilt</translation> <translation id="8073388330009372546">Åpne bildet i en ny fane</translation> @@ -1256,6 +1275,7 @@ <translation id="8250920743982581267">Dokumenter</translation> <translation id="825412236959742607">Denne siden bruker for mye minne, så Chrome har fjernet noe av innholdet.</translation> <translation id="8255617931166444521">Nettsteder kan bare bruke informasjonskapslene dine til å se surfeaktiviteten din på sitt eget nettsted</translation> +<translation id="8259179246279078674">Siden de forhåndslastede sidene er krypterte, får ikke Google vite noe om det forhåndslastede sideinnholdet. Googles tjenere får vite hvilke nettsteder som forhåndslastes privat. Denne informasjonen brukes bare til å forhåndslaste sidene og blir ikke knyttet til annen informasjon i Google-kontoen din.</translation> <translation id="8260126382462817229">Prøv å logge på igjen</translation> <translation id="8261506727792406068">Slett</translation> <translation id="82619448491672958">Se andre faner</translation> @@ -1314,6 +1334,7 @@ <translation id="8551513938758868521">Lås inkognitofaner når du går ut av Chrome</translation> <translation id="8555836665334561807">Via Wi-Fi</translation> <translation id="8559990750235505898">Tilby å oversette sider på andre språk</translation> +<translation id="8560560256644480257">Oppretter GIF <ph name="PERCENT" /> %%</translation> <translation id="8560602726703398413">Finn leselisten din i Bokmerker</translation> <translation id="8562452229998620586">Lagrede passord listes opp her.</translation> <translation id="856481929701340285">Bruk skrivebordsversjon</translation> @@ -1332,6 +1353,7 @@ <translation id="8636825310635137004">For å få fanene dine fra de andre enhetene du bruker, slå på synkronisering.</translation> <translation id="8641930654639604085">Prøv å blokkere nettsteder med voksent innhold</translation> <translation id="864544049772947936">Administrer vinduer (<ph name="INSTANCE_COUNTS" />)</translation> +<translation id="8646467750715887511">Sider lastes bare inn etter at du har åpnet dem.</translation> <translation id="8655129584991699539">Du kan slette dataene i Chrome-innstillingene</translation> <translation id="8656747343598256512">Logg på dette nettstedet og Chrome med Google-kontoen din. Du kan slå på synkronisering senere.</translation> <translation id="8659579665266920523">Slik søker du med Chrome</translation> @@ -1428,6 +1450,7 @@ <translation id="9209888181064652401">Kan ikke ringe</translation> <translation id="9212845824145208577">Kan ikke gå lavere. Prøv å starte fra lenger ned på siden.</translation> <translation id="9219103736887031265">Bilder</translation> +<translation id="92381315203627188">Når nettsteder ber om privat forhåndslasting av linker på sidene sine, medfører det at Chrome krypterer og forhåndslaster sider gjennom Googles tjenere uten informasjonskapsler. Dermed skjules identiteten din for det forhåndslastede nettstedet.</translation> <translation id="926205370408745186">Fjerne Chrome-aktiviteten din fra Digital balanse</translation> <translation id="927968626442779827">Bruk forenklet modus i Google Chrome</translation> <translation id="928550791203542716">Følger <ph name="SITE_NAME" /></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 e7430f9..2d3985b 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
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">ଫିକା</translation> <translation id="1810845389119482123">ପ୍ରାରମ୍ଭିକ ସିଙ୍କ୍ ସେଟ୍ଅପ୍ ସମାପ୍ତ ହୋଇ ନାହିଁ</translation> <translation id="1829244130665387512">ପୃଷ୍ଠାରେ ଖୋଜି ପାଆନ୍ତୁ</translation> +<translation id="1832459821645506983">ହଁ, ମୁଁ ରାଜି</translation> <translation id="1843805151597803366">ଆହୁରି ଭଲ ଅନୁବାଦ ପାଇବା ପାଇଁ, Google Searchକୁ ବର୍ତ୍ତମାନର ପୃଷ୍ଠା ବ୍ୟବହାର କରିବାକୁ ଦିଅନ୍ତୁ</translation> <translation id="1856325424225101786">ଲାଇଟ୍ ମୋଡ୍ ରିସେଟ୍ କରିବେ?</translation> <translation id="1868024384445905608">ପୂର୍ବାପେକ୍ଷା Chrome ବର୍ତ୍ତମାନ ଦ୍ରୁତତର ଭାବେ ଫାଇଲ୍ଗୁଡ଼ିକ ଡାଉନ୍ଲୋଡ୍ କରୁଛି</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">ଆପଣଙ୍କ ପସନ୍ଦର ଭାଷାଗୁଡ଼ିକରେ ବିଷୟବସ୍ତୁ ଦେଖାଇବା ପାଇଁ, ଆପଣ ଭିଜିଟ୍ କରୁଥିବା ସାଇଟଗୁଡ଼ିକ ଆପଣଙ୍କ ପସନ୍ଦଗୁଡ଼ିକୁ ଦେଖିପାରିବ</translation> <translation id="2723001399770238859">ଅଡିଓ</translation> <translation id="2728754400939377704">ସାଇଟ୍ ଅନୁସାରେ ସଜାନ୍ତୁ</translation> +<translation id="2732063072010454421">ଏକ ଉନ୍ନତ ଭଏସ ଅନୁଭୂତି ପାଆନ୍ତୁ</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">ତତ୍କ୍ଷଣାତ୍ ସର୍ଚ୍ଚ କରିବାକୁ କିମ୍ବା ସେହି ସମ୍ବନ୍ଧିତ କାର୍ଯ୍ୟ ଦେଖିବାକୁ ଏକ ଶଦ୍ଦ ଟାପ୍ କରନ୍ତୁ</translation> <translation id="2760989362628427051">ଆପଣଙ୍କ ଡିଭାଇସ୍ର ଗାଢା ଥିମ୍ ବା ବ୍ୟାଟେରୀ ସେଭର୍ ଚାଲୁଥିବା ସମୟରେ ଗାଢା ଥିମ୍ ଚାଲୁ କରନ୍ତୁ</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">ଏକ ସାଇଟର ଅନୁସରଣ କରିବା ପାଇଁ ସାଇଟକୁ ଯାଆନ୍ତୁ, Chrome ମେନୁ ଖୋଲି 'ଅନୁସରଣ କରନ୍ତୁ'ରେ ଟାପ୍ କରନ୍ତୁ।</translation> <translation id="5880748256563468367">ଫିଡକୁ ଯାଆନ୍ତୁ</translation> <translation id="5884076754568147479">କାର୍ଯ୍ୟଗୁଡ଼ିକୁ ସମ୍ପୂର୍ଣ୍ଣ କରିବାରେ ଆପଣଙ୍କୁ ସାହାଯ୍ୟ କରିବା ନିମନ୍ତେ, ଆପଣ Assistant ବ୍ୟବହାର କରିଥିବା ସାଇଟଗୁଡ଼ିକର URL ଏବଂ ବିଷୟବସ୍ତୁଗୁଡ଼ିକ ସହିତ Assistant ମାଧ୍ୟମରେ ଆପଣ ଦାଖଲ କରିଥିବା ସୂଚନା Google ପ୍ରାପ୍ତ କରିବ</translation> +<translation id="5906513782029855931">ସାଇଟଗୁଡ଼ିକର URL ଜାଣିବା, Google Assistantକୁ ଟାସ୍କଗୁଡ଼ିକୁ ସମ୍ପୂର୍ଣ୍ଣ କରିବାରେ ଆପଣଙ୍କୁ ସାହାଯ୍ୟ କରିବାକୁ ଦିଏ। ଆପଣ Chrome ସେଟିଂସରେ Assistantକୁ ବନ୍ଦ କରିପାରିବେ।</translation> <translation id="5916664084637901428">ଚାଲୁ</translation> <translation id="5919204609460789179">ସିଙ୍କ ଆରମ୍ଭ କରିବା ପାଇଁ <ph name="PRODUCT_NAME" /> ଅପ୍ଡେଟ୍ କରନ୍ତୁ</translation> <translation id="5937580074298050696"><ph name="AMOUNT" />କୁ ସେଭ୍ କରାଗଲା</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index 0e1a354..595a2165 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">ਹਲਕਾ</translation> <translation id="1810845389119482123">ਸ਼ੁਰੂਆਤੀ ਸਮਕਾਲੀਕਰਨ ਸੈੱਟਅੱਪ ਪੂਰਾ ਨਹੀਂ ਹੋਇਆ</translation> <translation id="1829244130665387512">ਸਫ਼ੇ ਵਿੱਚ ਲੱਭੋ</translation> +<translation id="1832459821645506983">ਹਾਂ, ਮੈਂ ਸਹਿਮਤ ਹਾਂ</translation> <translation id="1843805151597803366">ਬਿਹਤਰ ਅਨੁਵਾਦ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, Google Search ਨੂੰ ਮੌਜੂਦਾ ਪੰਨੇ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦਿਓ</translation> <translation id="1856325424225101786">ਕੀ ਲਾਈਟ ਮੋਡ ਰੀਸੈੱਟ ਕਰਨਾ ਹੈ?</translation> <translation id="1868024384445905608">Chrome ਹੁਣ ਫ਼ਾਈਲਾਂ ਵਧੇਰੇ ਤੇਜ਼ੀ ਨਾਲ ਡਾਊਨਲੋਡ ਕਰਦਾ ਹੈ</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">ਤੁਹਾਡੀਆਂ ਤਰਜੀਹੀ ਭਾਸ਼ਾਵਾਂ ਵਿੱਚ ਸਮੱਗਰੀ ਦਿਖਾਉਣ ਲਈ, ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੀਆਂ ਜਾਣ ਵਾਲੀਆਂ ਸਾਈਟਾਂ ਤੁਹਾਡੀਆਂ ਤਰਜੀਹਾਂ ਨੂੰ ਦੇਖ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="2723001399770238859">ਆਡੀਓ</translation> <translation id="2728754400939377704">ਸਾਈਟ ਮੁਤਾਬਕ ਕ੍ਰਮ-ਬੱਧ ਕਰੋ</translation> +<translation id="2732063072010454421">ਬਿਹਤਰ ਅਵਾਜ਼ੀ ਅਨੁਭਵ ਪ੍ਰਾਪਤ ਕਰੋ</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">ਤਤਕਾਲ ਖੋਜ ਲਈ ਕਿਸੇ ਸ਼ਬਦ 'ਤੇ ਟੈਪ ਕਰੋ ਜਾਂ ਸੰਬੰਧਿਤ ਕਾਰਵਾਈਆਂ ਦੇਖੋ</translation> <translation id="2760989362628427051">ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਗੂੜ੍ਹਾ ਥੀਮ ਜਾਂ ਬੈਟਰੀ ਸੇਵਰ ਮੋਡ ਚਾਲੂ ਹੋਣ 'ਤੇ ਗੂੜ੍ਹੇ ਥੀਮ ਨੂੰ ਚਾਲੂ ਕਰੋ</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">ਕਿਸੇ ਸਾਈਟ ਦਾ ਅਨੁਸਰਣ ਕਰਨ ਲਈ, ਸਾਈਟ 'ਤੇ ਜਾਓ, Chrome ਮੀਨੂ ਖੋਲ੍ਹੋ, ਅਤੇ 'ਅਨੁਸਰਣ ਕਰੋ' 'ਤੇ ਟੈਪ ਕਰੋ।</translation> <translation id="5880748256563468367">ਫ਼ੀਡ 'ਤੇ ਜਾਓ</translation> <translation id="5884076754568147479">ਕਾਰਜ ਪੂਰੇ ਕਰਨ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਕਰਨ ਲਈ, Google ਨੂੰ ਉਹਨਾਂ ਸਾਈਟਾਂ ਦੇ URL ਅਤੇ ਸਮੱਗਰੀਆਂ ਮਿਲਣਗੀਆਂ ਜਿਨ੍ਹਾਂ 'ਤੇ ਤੁਸੀਂ Assistant ਨੂੰ ਵਰਤਦੇ ਹੋ, ਨਾਲ ਹੀ ਤੁਹਾਡੇ ਵੱਲੋਂ Assistant ਰਾਹੀਂ ਸਪੁਰਦ ਕੀਤੀ ਜਾਣਕਾਰੀ ਵੀ ਮਿਲੇਗੀ</translation> +<translation id="5906513782029855931">ਸਾਈਟਾਂ ਦੇ URL ਬਾਰੇ ਜਾਣਕਾਰੀ ਹੋਣ 'ਤੇ, ਕਾਰਜਾਂ ਨੂੰ ਪੂਰਾ ਕਰਨ ਵਿੱਚ Google Assistant ਤੁਹਾਡੀ ਮਦਦ ਕਰਦੀ ਹੈ। ਤੁਸੀਂ Chrome ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ Assistant ਨੂੰ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ।</translation> <translation id="5916664084637901428">ਚਾਲੂ</translation> <translation id="5919204609460789179">ਸਮਕਾਲੀਕਰਨ ਸ਼ੁਰੂ ਕਰਨ ਲਈ <ph name="PRODUCT_NAME" /> ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ</translation> <translation id="5937580074298050696"><ph name="AMOUNT" /> ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index 1907aea..6d4e44ca 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Светлая</translation> <translation id="1810845389119482123">Синхронизация не настроена</translation> <translation id="1829244130665387512">Найти на странице</translation> +<translation id="1832459821645506983">ОК</translation> <translation id="1843805151597803366">Чтобы обеспечить более высокое качество переводов, предоставьте Google Поиску доступ к содержанию этой страницы.</translation> <translation id="1856325424225101786">Сбросить упрощенный режим?</translation> <translation id="1868024384445905608">Теперь файлы в Chrome будут скачиваться ещё быстрее</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">Сайты, которые вы посещаете, могут видеть выбранные вами настройки, чтобы показывать контент на нужном языке.</translation> <translation id="2723001399770238859">аудио</translation> <translation id="2728754400939377704">Сортировать по имени домена</translation> +<translation id="2732063072010454421">Улучшенный голосовой поиск</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Нажмите на слово, чтобы увидеть связанные с ним результаты поиска и действия.</translation> <translation id="2760989362628427051">Использовать тёмную тему, когда на устройстве включена тёмная тема или режим энергосбережения.</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Чтобы подписаться на сайт, откройте его, перейдите в меню Google Chrome и нажмите "Подписаться".</translation> <translation id="5880748256563468367">Перейти к ленте</translation> <translation id="5884076754568147479">Выполнять действия в Chrome с помощью Ассистента: отправлять в Google контент и URL сайтов, а также информацию, сообщаемую Ассистенту</translation> +<translation id="5906513782029855931">Ассистент сможет больше вам помогать, если получит доступ к URL сайтов. Отключить Ассистента можно в настройках Chrome.</translation> <translation id="5916664084637901428">ВКЛ</translation> <translation id="5919204609460789179">Обновите <ph name="PRODUCT_NAME" />, чтобы начать синхронизацию</translation> <translation id="5937580074298050696">Сохранено: <ph name="AMOUNT" /></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 5f96be91..e4546410b 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
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">I lehtë</translation> <translation id="1810845389119482123">Konfigurimi i sinkronizimit fillestar nuk ka përfunduar</translation> <translation id="1829244130665387512">Gjej në faqe</translation> +<translation id="1832459821645506983">Po, jam dakord</translation> <translation id="1843805151597803366">Për të marrë përkthime më të mira, lejo që "Kërko në Google" të përdorë faqen aktuale</translation> <translation id="1856325424225101786">Të rivendoset "Modaliteti i lehtë"?</translation> <translation id="1868024384445905608">Chrome tani i shkarkon skedarët më shpejt</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">Për të shfaqur përmbajtje në gjuhët e tua të preferuara, sajtet që viziton mund të shikojnë preferencat e tua</translation> <translation id="2723001399770238859">audio</translation> <translation id="2728754400939377704">Rendit sipas sajtit</translation> +<translation id="2732063072010454421">Merr një përvojë më të mirë zanore</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Trokit një fjalë për të kërkuar në çast ose për të parë veprimet e lidhura</translation> <translation id="2760989362628427051">Aktivizo temën e errët kur tema e errët ose "Kursyesi i baterisë" i pajisjes është aktiv</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Për të ndjekur një sajt, shko te sajti, hap menynë e Chrome dhe trokit te Ndiq.</translation> <translation id="5880748256563468367">Shko te furnizimi</translation> <translation id="5884076754568147479">Për të të ndihmuar të përfundosh detyrat, Google do të marrë URL-të dhe përmbajtjet e sajteve ku ti përdor "Asistentin", si dhe informacionet që dërgon nëpërmjet "Asistentit"</translation> +<translation id="5906513782029855931">Njohja e URL-ve të sajteve lejon që "Asistenti i Google" të të ndihmojë të përfundosh detyrat. "Asistentin" mund ta çaktivizosh te cilësimet e Chrome.</translation> <translation id="5916664084637901428">Aktiv</translation> <translation id="5919204609460789179">Përditëso <ph name="PRODUCT_NAME" /> për të nisur sinkronizimin</translation> <translation id="5937580074298050696"><ph name="AMOUNT" /> të ruajtura</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 8b61f50..3c58c01 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
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Ljus</translation> <translation id="1810845389119482123">Konfigurationen av synkronisering har inte slutförts</translation> <translation id="1829244130665387512">Hitta på sida</translation> +<translation id="1832459821645506983">Ja</translation> <translation id="1843805151597803366">Låt Google Sök använda den aktuella sidan så att du får bättre översättningar</translation> <translation id="1856325424225101786">Vill du återställa begränsat läge?</translation> <translation id="1868024384445905608">Nu laddas filer ned snabbare i Chrome</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">Webbplatserna du besöker kan se dina inställningar, så att innehållet visas på önskat språk</translation> <translation id="2723001399770238859">ljud</translation> <translation id="2728754400939377704">Sortera efter webbplats</translation> +<translation id="2732063072010454421">Få en bättre upplevelse vid sökning med rösten</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Tryck på ett ord om du vill söka direkt eller visa relaterade åtgärder</translation> <translation id="2760989362628427051">Aktivera mörkt tema när batterisparläget eller mörkt tema aktiveras på enheten</translation> @@ -836,6 +838,7 @@ <translation id="587735546353481577">Om du vill följa en webbplats besöker du den, öppnar Chrome-menyn och trycker på Följ.</translation> <translation id="5880748256563468367">Visa flödet</translation> <translation id="5884076754568147479">Innehållet på en webbplats där du använder Google Assistent, dess webbadress samt information som du skickar via assistenten överförs till Google så att du kan få uppgifterna utförda</translation> +<translation id="5906513782029855931">Om Google-assistenten känner till webbplatsers webbadress kan du få hjälp med olika uppgifter. Du kan inaktivera Google Assistent i Chrome-inställningarna.</translation> <translation id="5916664084637901428">På</translation> <translation id="5919204609460789179">Uppdatera <ph name="PRODUCT_NAME" /> för att starta synkronisering</translation> <translation id="5937580074298050696"><ph name="AMOUNT" /> har sparats</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index 57b9b12..cb763940 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Açık</translation> <translation id="1810845389119482123">İlk senkronizasyon kurulumu tamamlanmadı</translation> <translation id="1829244130665387512">Sayfada bul</translation> +<translation id="1832459821645506983">Evet, kabul ediyorum</translation> <translation id="1843805151597803366">Daha iyi çeviriler için Google Arama'nın geçerli sayfayı kullanmasına izin verin</translation> <translation id="1856325424225101786">Basit mod sıfırlansın mı?</translation> <translation id="1868024384445905608">Chrome artık dosyaları daha hızlı indiriyor</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">Siteler, tercih ettiğiniz dillerde içerik göstermek için tercihlerinizi görebilir</translation> <translation id="2723001399770238859">ses</translation> <translation id="2728754400939377704">Siteye göre sırala</translation> +<translation id="2732063072010454421">Daha iyi bir sesli deneyim elde edin</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Anında aramak veya ilgili işlemleri görmek için bir kelimeye dokunun</translation> <translation id="2760989362628427051">Cihazınızın koyu tema veya Pil Tasarrufu özelliği açık olduğunda koyu tema açılır</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Bir siteyi takip etmek için siteye gidin, Chrome menüsünü açıp Takip et'e dokunun.</translation> <translation id="5880748256563468367">Feed'e git</translation> <translation id="5884076754568147479">Google, görevleri tamamlamanıza yardımcı olmak için Asistan'ı kullandığınız sitelerin URL'lerinin ve içeriklerinin yanı sıra Asistan aracılığıyla gönderdiğiniz bilgileri alır</translation> +<translation id="5906513782029855931">Sitelerin URL'lerini bilmek, Google Asistan'ın görevleri tamamlamanıza yardımcı olmasını sağlar. Asistan'ı Chrome ayarlarından kapatabilirsiniz.</translation> <translation id="5916664084637901428">Açık</translation> <translation id="5919204609460789179">Senkronizasyonu başlatmak için <ph name="PRODUCT_NAME" /> adlı uygulamayı güncelleyin</translation> <translation id="5937580074298050696"><ph name="AMOUNT" /> tasarruf edildi</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 82bb42e..8a2989a3 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
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">Світла</translation> <translation id="1810845389119482123">Початкове налаштування синхронізації не завершено</translation> <translation id="1829244130665387512">Знайти на сторінці</translation> +<translation id="1832459821645506983">Гаразд</translation> <translation id="1843805151597803366">Щоб отримати кращий переклад, надайте Пошуку Google доступ до поточної сторінки</translation> <translation id="1856325424225101786">Скинути спрощений режим?</translation> <translation id="1868024384445905608">Тепер Chrome завантажує файли швидше</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">Сайти, які ви відвідуєте, можуть переглядати ваші налаштування, щоб показувати контент вибраними мовами</translation> <translation id="2723001399770238859">аудіо</translation> <translation id="2728754400939377704">Сортувати за сайтом</translation> +<translation id="2732063072010454421">Покращений голосовий пошук</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">Торкніться слова для миттєвого пошуку або перегляду схожих дій</translation> <translation id="2760989362628427051">Використовувати темну тему, якщо на пристрої ввімкнено темну тему або режим енергозбереження</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">Щоб підписатися на сайт, перейдіть на нього, відкрийте меню Chrome і натисніть "Підписатися".</translation> <translation id="5880748256563468367">Перейти до фіду</translation> <translation id="5884076754568147479">Щоб допомагати вам виконувати завдання, Google отримуватиме URL-адреси та вміст веб-сайтів, на яких ви користуєтесь Асистентом, а також інформацію, яку надсилаєте через нього</translation> +<translation id="5906513782029855931">Якщо ви вкажете URL-адреси сайтів, Google Асистент допоможе вам виконати завдання. Ви можете вимкнути Асистента в налаштуваннях Chrome.</translation> <translation id="5916664084637901428">Увімкнено</translation> <translation id="5919204609460789179">Оновіть <ph name="PRODUCT_NAME" />, щоб почати синхронізацію</translation> <translation id="5937580074298050696">Заощаджено <ph name="AMOUNT" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index ad791967..80151c8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">浅色调</translation> <translation id="1810845389119482123">未完成初始同步设置</translation> <translation id="1829244130665387512">在网页中查找</translation> +<translation id="1832459821645506983">是的,我同意</translation> <translation id="1843805151597803366">如果想获得更好的译文,请允许 Google 搜索使用当前网页</translation> <translation id="1856325424225101786">重置精简模式?</translation> <translation id="1868024384445905608">Chrome 现可更快速地下载文件</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">您访问的网站可查看您的偏好设置,以便能够以您的首选语言显示网页内容</translation> <translation id="2723001399770238859">音频</translation> <translation id="2728754400939377704">按网站排序</translation> +<translation id="2732063072010454421">享受更佳的语音搜索体验</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">点按某个字词可立即开始搜索或查看相关操作</translation> <translation id="2760989362628427051">在设备开启深色主题背景或省电模式时启用深色主题背景</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">若要关注某个网站,请转到该网站,打开 Chrome 菜单,然后点按“关注”。</translation> <translation id="5880748256563468367">转到 Feed</translation> <translation id="5884076754568147479">为了帮助您执行各种操作,Google 将会收到您使用 Google 助理时所在网站的网址和内容,以及您通过 Google 助理提交的信息</translation> +<translation id="5906513782029855931">知道网站网址后,Google 助理便可帮助您完成任务。您可在 Chrome 的“设置”中停用 Google 助理。</translation> <translation id="5916664084637901428">启用</translation> <translation id="5919204609460789179">需更新 <ph name="PRODUCT_NAME" />,才能开始同步</translation> <translation id="5937580074298050696">已节省 <ph name="AMOUNT" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index 097db54a..3af1721 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -132,6 +132,7 @@ <translation id="1807246157184219062">淺色</translation> <translation id="1810845389119482123">尚未完成初始同步處理設定</translation> <translation id="1829244130665387512">在網頁中尋找</translation> +<translation id="1832459821645506983">是,我同意</translation> <translation id="1843805151597803366">如要取得更佳的翻譯,請允許 Google 搜尋使用目前的網頁</translation> <translation id="1856325424225101786">要重設精簡模式嗎?</translation> <translation id="1868024384445905608">Chrome 現在的檔案下載速度更快了</translation> @@ -289,6 +290,7 @@ <translation id="2718846868787000099">如要以偏好的語言顯示內容,你所造訪的網站將可查看你的偏好設定</translation> <translation id="2723001399770238859">音訊</translation> <translation id="2728754400939377704">依網站排序</translation> +<translation id="2732063072010454421">享受更優質的語音搜尋體驗</translation> <translation id="2739256783402597439">2G</translation> <translation id="2744248271121720757">只要輕觸字詞就能立即展開搜尋或查看相關的動作</translation> <translation id="2760989362628427051">當裝置開啟深色主題或省電模式時,啟用深色主題</translation> @@ -835,6 +837,7 @@ <translation id="587735546353481577">如要追蹤網站,只要前往該網站並開啟 Chrome 選單,然後輕觸 [追蹤] 即可。</translation> <translation id="5880748256563468367">前往動態饋給</translation> <translation id="5884076754568147479">為協助你完成工作,系統會將你使用 Google 助理時所在網站的網址與互動的內容,以及你透過 Google 助理提交的資訊,一併傳送給 Google。</translation> +<translation id="5906513782029855931">允許 Google 助理取得網站的網址,以便協助你完成工作。你可以在 Chrome 設定中停用 Google 助理。</translation> <translation id="5916664084637901428">開啟</translation> <translation id="5919204609460789179">更新 <ph name="PRODUCT_NAME" /> 即可開始同步處理</translation> <translation id="5937580074298050696">已儲存 <ph name="AMOUNT" /></translation>
diff --git a/chrome/browser/ui/app_list/app_list_client_impl.cc b/chrome/browser/ui/app_list/app_list_client_impl.cc index a745326..323677b 100644 --- a/chrome/browser/ui/app_list/app_list_client_impl.cc +++ b/chrome/browser/ui/app_list/app_list_client_impl.cc
@@ -644,7 +644,8 @@ DCHECK(launched_from == ash::AppListLaunchedFrom::kLaunchedFromGrid || launched_from == ash::AppListLaunchedFrom::kLaunchedFromSuggestionChip || - launched_from == ash::AppListLaunchedFrom::kLaunchedFromSearchBox); + launched_from == ash::AppListLaunchedFrom::kLaunchedFromSearchBox || + launched_from == ash::AppListLaunchedFrom::kLaunchedFromContinueTask); // Return early if the current user is not new. if (!user_manager::UserManager::Get()->IsCurrentUserNew()) {
diff --git a/chrome/browser/ui/app_list/app_service/app_service_app_item.cc b/chrome/browser/ui/app_list/app_service/app_service_app_item.cc index ff48539d4..9121f74 100644 --- a/chrome/browser/ui/app_list/app_service/app_service_app_item.cc +++ b/chrome/browser/ui/app_list/app_service/app_service_app_item.cc
@@ -50,7 +50,6 @@ case apps::mojom::AppType::kArc: case apps::mojom::AppType::kCrostini: case apps::mojom::AppType::kChromeApp: - case apps::mojom::AppType::kExtension: case apps::mojom::AppType::kWeb: case apps::mojom::AppType::kPluginVm: case apps::mojom::AppType::kRemote:
diff --git a/chrome/browser/ui/app_list/search/app_service_app_result.cc b/chrome/browser/ui/app_list/search/app_service_app_result.cc index 3f3e932..be6fd5f 100644 --- a/chrome/browser/ui/app_list/search/app_service_app_result.cc +++ b/chrome/browser/ui/app_list/search/app_service_app_result.cc
@@ -142,7 +142,6 @@ return ash::REMOTE_APP; case apps::mojom::AppType::kBorealis: return ash::BOREALIS_APP; - case apps::mojom::AppType::kExtension: case apps::mojom::AppType::kMacOs: case apps::mojom::AppType::kUnknown: NOTREACHED();
diff --git a/chrome/browser/ui/app_list/search/os_settings_provider.cc b/chrome/browser/ui/app_list/search/os_settings_provider.cc index 13d84c1..fc55ebb 100644 --- a/chrome/browser/ui/app_list/search/os_settings_provider.cc +++ b/chrome/browser/ui/app_list/search/os_settings_provider.cc
@@ -10,6 +10,7 @@ #include "ash/public/cpp/app_list/app_list_config.h" #include "ash/public/cpp/app_list/app_list_features.h" +#include "base/containers/flat_map.h" #include "base/containers/flat_set.h" #include "base/metrics/field_trial_params.h" #include "base/metrics/histogram_macros.h" @@ -41,7 +42,7 @@ using Section = chromeos::settings::mojom::Section; constexpr char kOsSettingsResultPrefix[] = "os-settings://"; -constexpr float kScoreEps = 1e-5f; +constexpr double kScoreEps = 1.0e-5; constexpr size_t kNumRequestedResults = 5u; constexpr size_t kMaxShownResults = 2u; @@ -65,34 +66,36 @@ UMA_HISTOGRAM_ENUMERATION("Apps.AppList.OsSettingsProvider.Error", error); } -bool ContainsAncestor(Subpage subpage, - const chromeos::settings::Hierarchy* hierarchy, - const base::flat_set<Subpage>& subpages, - const base::flat_set<Section>& sections) { - // Returns whether or not an ancestor subpage or section of |subpage| is - // present within |subpages| or |sections|. +bool ContainsBetterAncestor(Subpage subpage, + const double score, + const chromeos::settings::Hierarchy* hierarchy, + const base::flat_map<Subpage, double>& subpages, + const base::flat_map<Section, double>& sections) { + // Returns whether or not a higher-scoring ancestor subpage or section of + // |subpage| is present within |subpages| or |sections|. const auto& metadata = hierarchy->GetSubpageMetadata(subpage); // Check parent subpage if one exists. if (metadata.parent_subpage) { const auto it = subpages.find(metadata.parent_subpage); - if (it != subpages.end() || - ContainsAncestor(metadata.parent_subpage.value(), hierarchy, subpages, - sections)) + if ((it != subpages.end() && it->second >= score) || + ContainsBetterAncestor(metadata.parent_subpage.value(), score, + hierarchy, subpages, sections)) return true; } // Check section. const auto it = sections.find(metadata.section); - return it != sections.end(); + return it != sections.end() && it->second >= score; } -bool ContainsAncestor(Setting setting, - const chromeos::settings::Hierarchy* hierarchy, - const base::flat_set<Subpage>& subpages, - const base::flat_set<Section>& sections) { - // Returns whether or not an ancestor subpage or section of |setting| is - // present within |subpages| or |sections|. +bool ContainsBetterAncestor(Setting setting, + const double score, + const chromeos::settings::Hierarchy* hierarchy, + const base::flat_map<Subpage, double>& subpages, + const base::flat_map<Section, double>& sections) { + // Returns whether or not a higher-scoring ancestor subpage or section of + // |setting| is present within |subpages| or |sections|. const auto& metadata = hierarchy->GetSettingMetadata(setting); // Check primary subpage only. Alternate subpages aren't used enough for the @@ -100,14 +103,15 @@ if (metadata.primary.second) { const auto parent_subpage = metadata.primary.second.value(); const auto it = subpages.find(parent_subpage); - if (it != subpages.end() || - ContainsAncestor(parent_subpage, hierarchy, subpages, sections)) + if ((it != subpages.end() && it->second >= score) || + ContainsBetterAncestor(parent_subpage, score, hierarchy, subpages, + sections)) return true; } // Check section. const auto it = sections.find(metadata.primary.first); - return it != sections.end(); + return it != sections.end() && it->second >= score; } } // namespace @@ -115,7 +119,7 @@ OsSettingsResult::OsSettingsResult( Profile* profile, const chromeos::settings::mojom::SearchResultPtr& result, - const float relevance_score, + const double relevance_score, const gfx::ImageSkia& icon, const std::u16string& query) : profile_(profile), url_path_(result->url_path_with_parameters) { @@ -298,7 +302,7 @@ int i = 0; for (const auto& result : FilterResults(query, sorted_results, hierarchy_)) { - const float score = 1.0f - i * kScoreEps; + const double score = 1.0 - i * kScoreEps; search_results.emplace_back(std::make_unique<OsSettingsResult>( profile_, result, score, icon_, last_query_)); ++i; @@ -361,8 +365,8 @@ const std::vector<chromeos::settings::mojom::SearchResultPtr>& results, const chromeos::settings::Hierarchy* hierarchy) { base::flat_set<std::string> seen_urls; - base::flat_set<Subpage> seen_subpages; - base::flat_set<Section> seen_sections; + base::flat_map<Subpage, double> seen_subpages; + base::flat_map<Section, double> seen_sections; std::vector<SettingsResultPtr> clean_results; for (const SettingsResultPtr& result : results) { @@ -391,22 +395,26 @@ seen_urls.insert(url); clean_results.push_back(result.Clone()); if (result->type == SettingsResultType::kSubpage) - seen_subpages.insert(result->id->get_subpage()); + seen_subpages.insert( + std::make_pair(result->id->get_subpage(), result->relevance_score)); if (result->type == SettingsResultType::kSection) - seen_sections.insert(result->id->get_section()); + seen_sections.insert( + std::make_pair(result->id->get_section(), result->relevance_score)); } // Iterate through the clean results a second time. Remove subpage or setting - // results that have an ancestor subpage or section also present in the - // results. + // results that have a higher-scoring ancestor subpage or section also present + // in the results. for (size_t i = 0; i < clean_results.size(); ++i) { const auto& result = clean_results[i]; if ((result->type == SettingsResultType::kSubpage && - ContainsAncestor(result->id->get_subpage(), hierarchy_, seen_subpages, - seen_sections)) || + ContainsBetterAncestor(result->id->get_subpage(), + result->relevance_score, hierarchy_, + seen_subpages, seen_sections)) || (result->type == SettingsResultType::kSetting && - ContainsAncestor(result->id->get_setting(), hierarchy_, seen_subpages, - seen_sections))) { + ContainsBetterAncestor(result->id->get_setting(), + result->relevance_score, hierarchy_, + seen_subpages, seen_sections))) { clean_results.erase(clean_results.begin() + i); --i; }
diff --git a/chrome/browser/ui/app_list/search/os_settings_provider.h b/chrome/browser/ui/app_list/search/os_settings_provider.h index f3ff8aa..3424fc18 100644 --- a/chrome/browser/ui/app_list/search/os_settings_provider.h +++ b/chrome/browser/ui/app_list/search/os_settings_provider.h
@@ -41,7 +41,7 @@ public: OsSettingsResult(Profile* profile, const chromeos::settings::mojom::SearchResultPtr& result, - float relevance_score, + double relevance_score, const gfx::ImageSkia& icon, const std::u16string& query); ~OsSettingsResult() override;
diff --git a/chrome/browser/ui/app_list/search/ranking/ranker_delegate.cc b/chrome/browser/ui/app_list/search/ranking/ranker_delegate.cc index ae6d67fb..43ebbfa9 100644 --- a/chrome/browser/ui/app_list/search/ranking/ranker_delegate.cc +++ b/chrome/browser/ui/app_list/search/ranking/ranker_delegate.cc
@@ -15,9 +15,34 @@ #include "chrome/browser/ui/app_list/search/util/score_normalizer.pb.h" namespace app_list { +namespace { + +// A standard write delay used for protos without time-sensitive writes. This is +// intended to be slightly longer than the longest conceivable latency for a +// search. +constexpr base::TimeDelta kStandardWriteDelay = base::Seconds(3); + +// No write delay for protos with time-sensitive writes. +constexpr base::TimeDelta kNoWriteDelay = base::Seconds(0); + +} // namespace RankerDelegate::RankerDelegate(Profile* profile, SearchController* controller) { - // TODO(crbug.com/1274853): Ranking removed due to stability concerns. + const auto state_dir = RankerStateDirectory(profile); + + // Main result and category ranking. + AddRanker(std::make_unique<ScoreNormalizingRanker>( + PersistentProto<ScoreNormalizerProto>( + state_dir.AppendASCII("score_norm.pb"), kStandardWriteDelay))); + + // Result post-processing. + AddRanker(std::make_unique<TopMatchRanker>()); + AddRanker(std::make_unique<FilteringRanker>()); + + // Result removal. + AddRanker(std::make_unique<RemovedResultsRanker>( + PersistentProto<RemovedResultsProto>( + state_dir.AppendASCII("removed_results.pb"), kNoWriteDelay))); } RankerDelegate::~RankerDelegate() {}
diff --git a/chrome/browser/ui/app_list/search/util/persistent_proto.h b/chrome/browser/ui/app_list/search/util/persistent_proto.h index 0fb78ed..18de4ad 100644 --- a/chrome/browser/ui/app_list/search/util/persistent_proto.h +++ b/chrome/browser/ui/app_list/search/util/persistent_proto.h
@@ -22,20 +22,6 @@ #include "base/time/time.h" namespace app_list { -namespace { - -template <class T> -class MessageStorage; - -template <class T> -class RootMessageStorage; - -template <class T> -class EmbeddedMessageStorage; - -} // namespace - -// API ------------------------------------------------------------------------ // The result of reading a backing file from disk. These values persist to logs. // Entries should not be renumbered and numeric values should never be reused. @@ -44,7 +30,8 @@ kMissing = 1, kReadError = 2, kParseError = 3, - // Provided when an embedded message completes a no-op 'read'. + // kNoop is currently unused, but was previously used when no read was + // required. kNoop = 4, kMaxValue = kNoop, }; @@ -58,130 +45,6 @@ kMaxValue = kSerializationError, }; -using PersistentProtoReadCallback = base::OnceCallback<void(ReadStatus)>; -using PersistentProtoWriteCallback = base::RepeatingCallback<void(WriteStatus)>; - -// PersistentProto wraps a proto class and persists it to disk. Usage summary: -// -// - PProtos are constructed with a file path and a write delay. No logic -// happens at construction, instead Init must be called. -// -// - Callbacks registered with RegisterOnRead and RegisterOnWrite will be -// called when appropriate. It is recommended to register these before -// calling Init. -// -// - Init is asynchronous, and usage before RegisterOnRead callbacks are -// called will crash. -// -// - After initialization, a PProto acts identically to a regular proto. Use -// my_pproto->method() to access methods. -// -// - Call QueueWrite or StartWrite to write to disk. -// -// READING -// The backing file is read asynchronously from disk once at initialization, -// and RegisterOnRead callbacks are run once this is done. Until they are -// called, has_value is false and get() will always return nullptr. If no proto -// file exists on disk, or it is invalid, a blank proto is constructed and -// immediately written to disk. -// -// WRITING -// Writes must be triggered manually. Two methods are available: -// - QueueWrite delays writing to disk for |write_delay| time, in order to -// batch successive writes. -// - StartWrite writes to disk as soon as the task scheduler allows. -// RegisterOnWrite callbacks are run each time a write has completed. -// -// EMBEDDED MESSAGES -// To pass around a sub-message of a PProto that can do writes, use the Wrap -// method as follows. -// -// PersistentProto<MyMessage> my_message = -// pproto.Wrap(pproto->mutable_my_message()); -// -// These are a drop-in replacement for a regular PProto, except that: -// -// - Calling Init is not necessary, because a Wrap'd PProto must have been -// created from an existing, initialized PProto. If Init is called, it -// immediately calls all RegisterOnRead callbacks and is otherwise a -// no-op. -// -// - The root PProto and embedded message PProtos form a tree. Writes called -// on any node of the tree trickle up to the root, and cause a write of the -// entire tree. This will trigger write callbacks that were registered from -// anywhere in the tree. Take care that the data in the embedded message is -// safe to be serialized at any moment. -// -// Warning: The top-level PProto object must outlive all PProtos generated with -// Wrap. -// -// Warning: Because a Wrap'd PProto object only retains a pointer to a message, -// reassigning that field in the parent PProto will silently invalidate it. -// This includes calling Purge. -// -// Warning: It is possible to Wrap a message that is part of another proto, eg. -// pproto_1.Wrap(proto_2->...). Don't do this! -template <class T> -class PersistentProto { - public: - PersistentProto<T>(const base::FilePath& path, - const base::TimeDelta write_delay) - : storage_(std::make_unique<RootMessageStorage<T>>(path, write_delay)) {} - ~PersistentProto<T>() {} - - PersistentProto(PersistentProto&& other) { - storage_ = std::move(other.storage_); - } - - PersistentProto& operator=(PersistentProto&& other) { - storage_ = std::move(other.storage_); - } - - PersistentProto(const PersistentProto&) = delete; - PersistentProto& operator=(const PersistentProto&) = delete; - - template <class U> - PersistentProto<U> Wrap(U* message) { - DCHECK(initialized()); - return PersistentProto<U>( - std::make_unique<EmbeddedMessageStorage<U>>(storage_.get(), message)); - } - - // Initialization. - void Init() { storage_->Init(); } - void RegisterOnRead(PersistentProtoReadCallback on_read) { - storage_->RegisterOnRead(std::move(on_read)); - } - void RegisterOnWrite(PersistentProtoWriteCallback on_write) { - storage_->RegisterOnWrite(std::move(on_write)); - } - - // Getters. - T* get() { return storage_->get(); } - T* operator->() { return storage_->get(); } - const T* operator->() const { return storage_->get(); } - T operator*() { return *(storage_->get()); } - - // Testing initialization and value. - bool initialized() const { return storage_ && storage_->initialized(); } - constexpr bool has_value() const { return storage_ && storage_->has_value(); } - constexpr explicit operator bool() const { return has_value(); } - - // Writing and deletion. - void QueueWrite() { storage_->QueueWrite(); } - void StartWrite() { storage_->StartWrite(); } - void Purge() { storage_->Purge(); } - - private: - template <class U> - friend class PersistentProto; - - PersistentProto<T>(std::unique_ptr<MessageStorage<T>> storage) - : storage_(std::move(storage)) {} - - std::unique_ptr<MessageStorage<T>> storage_; -}; - namespace { template <class T> @@ -221,98 +84,94 @@ return WriteStatus::kOk; } -// STORAGE INTERFACES ---------------------------------------------------------- +} // namespace -// All methods that don't require knowing the underlying proto's type. -class GenericMessageStorage { - public: - virtual bool initialized() const = 0; - virtual constexpr bool has_value() const = 0; - virtual constexpr explicit operator bool() const = 0; - - virtual void RegisterOnRead(PersistentProtoReadCallback on_read) = 0; - virtual void RegisterOnWrite(PersistentProtoWriteCallback on_write) = 0; - - virtual void Init() = 0; - virtual void QueueWrite() = 0; - virtual void StartWrite() = 0; - virtual void Purge() = 0; -}; - -// Storage base class that abstracts over both root protos and embedded -// messages. +// PersistentProto wraps a proto class and persists it to disk. Usage summary: +// - Init is asynchronous, usage before |on_read| is called will crash. +// - pproto->Method() will call Method on the underlying proto. +// - Call QueueWrite() to write to disk. +// +// Reading. The backing file is read asynchronously from disk once at +// initialization, and the |on_read| callback is run once this is done. Until +// |on_read| is called, has_value is false and get() will always return nullptr. +// If no proto file exists on disk, or it is invalid, a blank proto is +// constructed and immediately written to disk. +// +// Writing. Writes must be triggered manually. Two methods are available: +// - QueueWrite() delays writing to disk for |write_delay| time, in order to +// batch successive writes. +// - StartWrite() writes to disk as soon as the task scheduler allows. +// The |on_write| callback is run each time a write has completed. template <class T> -class MessageStorage : public GenericMessageStorage { +class PersistentProto { public: - MessageStorage() {} - virtual ~MessageStorage() {} + using ReadCallback = base::OnceCallback<void(ReadStatus)>; + using WriteCallback = base::RepeatingCallback<void(WriteStatus)>; - MessageStorage(const MessageStorage&) = delete; - MessageStorage& operator=(const MessageStorage&) = delete; - - virtual T* get() = 0; - virtual T* operator->() = 0; - virtual const T* operator->() const = 0; - virtual T operator*() = 0; -}; - -// ROOT MESSAGE STORAGE -------------------------------------------------------- - -// Storage for a top-level proto. This actually controls reading and writing. -template <class T> -class RootMessageStorage : public MessageStorage<T> { - public: - RootMessageStorage(const base::FilePath& path, - const base::TimeDelta write_delay) + PersistentProto(const base::FilePath& path, const base::TimeDelta write_delay) : path_(path), write_delay_(write_delay), task_runner_(base::ThreadPool::CreateSequencedTaskRunner( {base::TaskPriority::BEST_EFFORT, base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) {} - ~RootMessageStorage() override {} + ~PersistentProto() = default; - void Init() override { - DCHECK(!initialized_); + PersistentProto(const PersistentProto&) = delete; + PersistentProto& operator=(const PersistentProto&) = delete; + + PersistentProto(PersistentProto&& other) { + path_ = other.path_; + write_delay_ = other.write_delay_; + initialized_ = other.initialized_; + write_is_queued_ = false; + purge_after_reading_ = other.purge_after_reading_; + read_callbacks_ = std::move(other.read_callbacks_); + write_callbacks_ = std::move(other.write_callbacks_); + task_runner_ = std::move(other.task_runner_); + proto_ = std::move(other.proto_); + } + + void Init() { task_runner_->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&Read<T>, path_), - base::BindOnce(&RootMessageStorage<T>::OnReadComplete, + base::BindOnce(&PersistentProto<T>::OnReadComplete, weak_factory_.GetWeakPtr())); } - void RegisterOnRead(PersistentProtoReadCallback on_read) override { + void RegisterOnRead(ReadCallback on_read) { read_callbacks_.push_back(std::move(on_read)); } - void RegisterOnWrite(PersistentProtoWriteCallback on_write) override { + void RegisterOnWrite(WriteCallback on_write) { write_callbacks_.push_back(std::move(on_write)); } - T* get() override { return proto_.get(); } + T* get() { return proto_.get(); } - T* operator->() override { + T* operator->() { CHECK(proto_); return proto_.get(); } - const T* operator->() const override { + const T* operator->() const { CHECK(proto_); return proto_.get(); } - T operator*() override { + T operator*() { CHECK(proto_); return *proto_; } - bool initialized() const override { return initialized_; } + bool initialized() const { return initialized_; } - constexpr bool has_value() const override { return proto_.get() != nullptr; } + constexpr bool has_value() const { return proto_.get() != nullptr; } - constexpr explicit operator bool() const override { return has_value(); } + constexpr explicit operator bool() const { return has_value(); } // Write the backing proto to disk after |save_delay_ms_| has elapsed. - void QueueWrite() override { + void QueueWrite() { DCHECK(proto_); if (!proto_) return; @@ -324,13 +183,13 @@ base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, - base::BindOnce(&RootMessageStorage<T>::OnQueueWrite, + base::BindOnce(&PersistentProto<T>::OnQueueWrite, weak_factory_.GetWeakPtr()), write_delay_); } // Write the backing proto to disk 'now'. - void StartWrite() override { + void StartWrite() { DCHECK(proto_); if (!proto_) return; @@ -348,7 +207,7 @@ // active. task_runner_->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&Write, path_, proto_str), - base::BindOnce(&RootMessageStorage<T>::OnWriteComplete, + base::BindOnce(&PersistentProto<T>::OnWriteComplete, weak_factory_.GetWeakPtr())); } @@ -357,7 +216,7 @@ // backing file is read from disk. In this case, the file is overwritten after // it has been read. In either case, the file is written as soon as possible, // skipping the |save_delay_ms_| wait time. - void Purge() override { + void Purge() { if (proto_) { proto_.reset(); proto_ = std::make_unique<T>(); @@ -389,6 +248,7 @@ for (auto& cb : read_callbacks_) { std::move(cb).Run(result.first); } + read_callbacks_.clear(); } void OnWriteComplete(const WriteStatus status) { @@ -424,76 +284,18 @@ bool purge_after_reading_ = false; // Run when the cache finishes reading from disk. - std::vector<PersistentProtoReadCallback> read_callbacks_; + std::vector<ReadCallback> read_callbacks_; // Run when the cache finishes writing to disk. - std::vector<PersistentProtoWriteCallback> write_callbacks_; + std::vector<WriteCallback> write_callbacks_; // The proto itself. std::unique_ptr<T> proto_; scoped_refptr<base::SequencedTaskRunner> task_runner_; - base::WeakPtrFactory<RootMessageStorage> weak_factory_{this}; + base::WeakPtrFactory<PersistentProto> weak_factory_{this}; }; -// EMBEDDED MESSAGE STORAGE ---------------------------------------------------- - -// Storage for an embedded message, which delegates writes to another storage -// object. -template <class T> -class EmbeddedMessageStorage : public MessageStorage<T> { - public: - EmbeddedMessageStorage(GenericMessageStorage* storage, T* message) - : storage_(storage), message_(message) {} - - ~EmbeddedMessageStorage() override {} - - void Init() override { - // Initialization is a no-op for embedded messages because, to be - // constructed, the root message must have already been initialized. So - // immediately call all read callbacks. - for (auto& cb : read_callbacks_) { - std::move(cb).Run(ReadStatus::kNoop); - } - } - - void RegisterOnRead(PersistentProtoReadCallback on_read) override { - read_callbacks_.push_back(std::move(on_read)); - } - - void RegisterOnWrite(PersistentProtoWriteCallback on_write) override { - // Delegate calling the write callback to the storage. - storage_->RegisterOnWrite(std::move(on_write)); - } - - T* get() override { return message_; } - T* operator->() override { return message_; } - const T* operator->() const override { return message_; } - T operator*() override { return *message_; } - - // For this have been constructed, the parent proto must have been initialized - // and have a value. So all init-querying methods can trivially return true. - bool initialized() const override { return true; } - constexpr bool has_value() const override { return true; } - constexpr explicit operator bool() const override { return true; } - - void QueueWrite() override { storage_->QueueWrite(); } - void StartWrite() override { storage_->StartWrite(); } - - void Purge() override { - message_->Clear(); - StartWrite(); - } - - private: - GenericMessageStorage* storage_; - T* message_; - - // All callbacks passed to |RegisterOnRead|. - std::vector<PersistentProtoReadCallback> read_callbacks_; -}; - -} // namespace } // namespace app_list #endif // CHROME_BROWSER_UI_APP_LIST_SEARCH_UTIL_PERSISTENT_PROTO_H_
diff --git a/chrome/browser/ui/app_list/search/util/persistent_proto_test.proto b/chrome/browser/ui/app_list/search/util/persistent_proto_test.proto index 423c433..d67d2d4 100644 --- a/chrome/browser/ui/app_list/search/util/persistent_proto_test.proto +++ b/chrome/browser/ui/app_list/search/util/persistent_proto_test.proto
@@ -8,14 +8,7 @@ package app_list; -// Test protos used for the PersistentProto unit tests. - +// A proto used with the PersistentProto class in unit tests. message TestProto { optional int64 value = 1; - optional TestProto msg_one = 2; - optional AnotherTestProto msg_two = 3; -} - -message AnotherTestProto { - optional int64 value = 1; }
diff --git a/chrome/browser/ui/app_list/search/util/persistent_proto_unittest.cc b/chrome/browser/ui/app_list/search/util/persistent_proto_unittest.cc index 3cfbb72..eb889e7 100644 --- a/chrome/browser/ui/app_list/search/util/persistent_proto_unittest.cc +++ b/chrome/browser/ui/app_list/search/util/persistent_proto_unittest.cc
@@ -22,18 +22,6 @@ // Populate |proto| with some test data. void PopulateTestProto(TestProto* proto) { proto->set_value(12345); - - // A sub-proto - TestProto* child = proto->mutable_msg_one(); - child->set_value(54321); - - // A sub-proto of the sub-proto. - TestProto* grandchild = child->mutable_msg_one(); - grandchild->set_value(54321); - - // A sibling to the sub-proto. - AnotherTestProto* sibling = proto->mutable_msg_two(); - sibling->set_value(15243); } // Make a proto with test data. @@ -45,30 +33,9 @@ // Returns whether |actual| and |expected| are equal. bool ProtoEquals(const TestProto* actual, const TestProto* expected) { - bool ok = true; - - if (!actual->has_value() || !expected->has_value()) { - ok &= actual->has_value() == expected->has_value(); - } else { - ok &= actual->value() == expected->value(); - } - - if (!actual->has_msg_one() || !expected->has_msg_one()) { - ok &= actual->has_msg_one() == expected->has_msg_one(); - } else { - ok &= ProtoEquals(&actual->msg_one(), &expected->msg_one()); - } - - if (!actual->has_msg_two()) { - ok &= !expected->has_msg_two(); - } else if (!actual->msg_two().has_value() || - !expected->msg_two().has_value()) { - ok &= expected->msg_two().has_value() == actual->msg_two().has_value(); - } else { - ok &= actual->msg_two().value() == expected->msg_two().value(); - } - - return ok; + if (!actual->has_value()) + return !expected->has_value(); + return actual->value() == expected->value(); } base::TimeDelta WriteDelay() { @@ -101,31 +68,28 @@ ASSERT_TRUE(base::WriteFile(GetPath(), proto.SerializeAsString())); } - void RegisterOnRead(const ReadStatus status) { + void OnRead(const ReadStatus status) { read_status_ = status; ++read_count_; } base::OnceCallback<void(ReadStatus)> ReadCallback() { - return base::BindOnce(&PersistentProtoTest::RegisterOnRead, - base::Unretained(this)); + return base::BindOnce(&PersistentProtoTest::OnRead, base::Unretained(this)); } - void RegisterOnWrite(const WriteStatus status) { + void OnWrite(const WriteStatus status) { ASSERT_EQ(status, WriteStatus::kOk); ++write_count_; } base::RepeatingCallback<void(WriteStatus)> WriteCallback() { - return base::BindRepeating(&PersistentProtoTest::RegisterOnWrite, + return base::BindRepeating(&PersistentProtoTest::OnWrite, base::Unretained(this)); } void Wait() { task_environment_.RunUntilIdle(); } // Records the information passed to the callbacks for later expectation. - // |read_status_| is left intentionally unassigned so all states can be - // distinguished. ReadStatus read_status_; int read_count_ = 0; int write_count_ = 0; @@ -140,17 +104,19 @@ // after that. TEST_F(PersistentProtoTest, Initialization) { PersistentProto<TestProto> pproto(GetPath(), WriteDelay()); + pproto.RegisterOnRead(ReadCallback()); + pproto.RegisterOnWrite(WriteCallback()); pproto.Init(); EXPECT_EQ(pproto.get(), nullptr); - EXPECT_FALSE(pproto.initialized()); Wait(); - EXPECT_TRUE(pproto.initialized()); EXPECT_NE(pproto.get(), nullptr); } // Test bool conversion and has_value. TEST_F(PersistentProtoTest, BoolTests) { PersistentProto<TestProto> pproto(GetPath(), WriteDelay()); + pproto.RegisterOnRead(ReadCallback()); + pproto.RegisterOnWrite(WriteCallback()); pproto.Init(); EXPECT_EQ(pproto.get(), nullptr); EXPECT_FALSE(pproto); @@ -164,6 +130,8 @@ // Test -> and *. TEST_F(PersistentProtoTest, Getters) { PersistentProto<TestProto> pproto(GetPath(), WriteDelay()); + pproto.RegisterOnRead(ReadCallback()); + pproto.RegisterOnWrite(WriteCallback()); pproto.Init(); Wait(); // We're really just checking these don't crash. @@ -174,41 +142,8 @@ EXPECT_EQ(val.value(), 1); } -// Test that the pproto correctly loads an on-disk proto into memory. -TEST_F(PersistentProtoTest, Read) { - const auto test_proto = MakeTestProto(); - WriteToDisk(test_proto); - - PersistentProto<TestProto> pproto(GetPath(), WriteDelay()); - pproto.RegisterOnRead(ReadCallback()); - pproto.RegisterOnWrite(WriteCallback()); - pproto.Init(); - EXPECT_EQ(pproto.get(), nullptr); - - Wait(); - EXPECT_EQ(read_status_, ReadStatus::kOk); - EXPECT_EQ(read_count_, 1); - EXPECT_EQ(write_count_, 0); - EXPECT_NE(pproto.get(), nullptr); - EXPECT_TRUE(ProtoEquals(pproto.get(), &test_proto)); -} - -// Test that invalid files on disk are handled correctly. -TEST_F(PersistentProtoTest, ReadInvalidProto) { - ASSERT_TRUE(base::WriteFile(GetPath(), "this isn't a valid proto")); - - PersistentProto<TestProto> pproto(GetPath(), WriteDelay()); - pproto.RegisterOnRead(ReadCallback()); - pproto.RegisterOnWrite(WriteCallback()); - pproto.Init(); - Wait(); - EXPECT_EQ(read_status_, ReadStatus::kParseError); - EXPECT_EQ(read_count_, 1); - EXPECT_EQ(write_count_, 1); -} - // Test that the pproto correctly saves the in-memory proto to disk. -TEST_F(PersistentProtoTest, Write) { +TEST_F(PersistentProtoTest, Read) { PersistentProto<TestProto> pproto(GetPath(), WriteDelay()); pproto.RegisterOnRead(ReadCallback()); pproto.RegisterOnWrite(WriteCallback()); @@ -230,6 +165,39 @@ EXPECT_TRUE(ProtoEquals(&written, pproto.get())); } +// Test that invalid files on disk are handled correctly. +TEST_F(PersistentProtoTest, ReadInvalidProto) { + ASSERT_TRUE(base::WriteFile(GetPath(), "this isn't a valid proto")); + + PersistentProto<TestProto> pproto(GetPath(), WriteDelay()); + pproto.RegisterOnRead(ReadCallback()); + pproto.RegisterOnWrite(WriteCallback()); + pproto.Init(); + Wait(); + EXPECT_EQ(read_status_, ReadStatus::kParseError); + EXPECT_EQ(read_count_, 1); + EXPECT_EQ(write_count_, 1); +} + +// Test that the pproto correctly loads an on-disk proto into memory. +TEST_F(PersistentProtoTest, Write) { + const auto test_proto = MakeTestProto(); + WriteToDisk(test_proto); + + PersistentProto<TestProto> pproto(GetPath(), WriteDelay()); + pproto.RegisterOnRead(ReadCallback()); + pproto.RegisterOnWrite(WriteCallback()); + pproto.Init(); + EXPECT_EQ(pproto.get(), nullptr); + + Wait(); + EXPECT_EQ(read_status_, ReadStatus::kOk); + EXPECT_EQ(read_count_, 1); + EXPECT_EQ(write_count_, 0); + EXPECT_NE(pproto.get(), nullptr); + EXPECT_TRUE(ProtoEquals(pproto.get(), &test_proto)); +} + // Test that several saves all happen correctly. TEST_F(PersistentProtoTest, MultipleWrites) { PersistentProto<TestProto> pproto(GetPath(), WriteDelay()); @@ -277,94 +245,4 @@ EXPECT_EQ(write_count_, 1); } -// Test that a call to Purge deletes a proto from memory and disk. -TEST_F(PersistentProtoTest, Purge) { - WriteToDisk(MakeTestProto()); - - PersistentProto<TestProto> pproto(GetPath(), WriteDelay()); - pproto.Init(); - Wait(); - - // Values read from disk. - EXPECT_TRUE(pproto); - EXPECT_EQ(pproto->value(), 12345); - - pproto.Purge(); - - // The backing proto should now be initialized but blank. - EXPECT_TRUE(pproto); - EXPECT_FALSE(pproto->has_value()); - - // The on-disk proto should have also been replaced with a blank copy after - // writes have been completed. - Wait(); - EXPECT_FALSE(ReadFromDisk().has_value()); -} - -// Tests that an embedded message can be created and used. -TEST_F(PersistentProtoTest, EmbeddedMessage) { - WriteToDisk(MakeTestProto()); - - PersistentProto<TestProto> pproto(GetPath(), WriteDelay()); - pproto.Init(); - Wait(); - - // Check that the embedded message has the correct data. - PersistentProto<TestProto> msg_one = pproto.Wrap(pproto->mutable_msg_one()); - EXPECT_EQ(msg_one->value(), 54321); - - // Check that modifying the embedded message also modifies the parent. - msg_one->set_value(1123); - EXPECT_EQ(pproto->msg_one().value(), 1123); - - // Check that calling write on the message object actually results in a write. - msg_one->set_value(3211); - msg_one.StartWrite(); - Wait(); - EXPECT_EQ(ReadFromDisk().msg_one().value(), 3211); - - // Check that calling write on a sibling message object results in a write. - PersistentProto<AnotherTestProto> msg_two = - pproto.Wrap(pproto->mutable_msg_two()); - msg_one->set_value(1231); - msg_two.StartWrite(); - Wait(); - EXPECT_EQ(ReadFromDisk().msg_one().value(), 1231); -} - -// Tests that callbacks on embedded messages are handled correctly. -TEST_F(PersistentProtoTest, EmbeddedMessageCallbacks) { - PersistentProto<TestProto> pproto(GetPath(), WriteDelay()); - pproto.Init(); - Wait(); - - auto msg_one = pproto.Wrap(pproto->mutable_msg_one()); - msg_one.RegisterOnRead(ReadCallback()); - msg_one.RegisterOnWrite(WriteCallback()); - - // Running Init on the embedded message should immediately run read callbacks. - msg_one.Init(); - EXPECT_EQ(read_status_, ReadStatus::kNoop); - EXPECT_EQ(read_count_, 1); - - // Write callbacks registered on the embedded message should be triggered from - // a write on the... - - // ... parent pproto. - pproto.StartWrite(); - Wait(); - EXPECT_EQ(write_count_, 1); - - // ... embedded message. - msg_one.StartWrite(); - Wait(); - EXPECT_EQ(write_count_, 2); - - // ... embedded message within embedded message. - auto grandchild = msg_one.Wrap(msg_one->mutable_msg_one()); - grandchild.StartWrite(); - Wait(); - EXPECT_EQ(write_count_, 3); -} - } // namespace app_list
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_instance_registry_helper.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_instance_registry_helper.cc index a299455..a1c33d12 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_instance_registry_helper.cc +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_instance_registry_helper.cc
@@ -417,11 +417,6 @@ if (app_type == apps::mojom::AppType::kUnknown) continue; - // Skip extensions because the browser controller is responsible for - // extension windows. - if (app_type == apps::mojom::AppType::kExtension) - return true; - if (app_type != apps::mojom::AppType::kChromeApp && app_type != apps::mojom::AppType::kSystemWeb && app_type != apps::mojom::AppType::kWeb) {
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc index 1031223..2f4e0ce 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc
@@ -581,7 +581,6 @@ return false; case apps::mojom::AppType::kMacOs: case apps::mojom::AppType::kRemote: - case apps::mojom::AppType::kExtension: NOTREACHED() << "Type " << app_type_ << " should not appear in shelf."; return false; }
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.cc index fc563a9..acfaa229 100644 --- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.cc +++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.cc
@@ -171,6 +171,10 @@ shelf_controller->shelf_model()->UnpinAppWithID(app_id); } +bool IsAppWithIDPinnedToShelf(const std::string& app_id) { + return ChromeShelfController::instance()->shelf_model()->IsAppPinned(app_id); +} + apps::mojom::LaunchSource ShelfLaunchSourceToAppsLaunchSource( ash::ShelfLaunchSource source) { switch (source) {
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.h b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.h index fb4a3339..27176bf 100644 --- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.h +++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.h
@@ -48,6 +48,9 @@ // Unpins an app from the shelf, if it is in the shelf. Otherwise does nothing. void UnpinAppWithIDFromShelf(const std::string& app_id); +// Returns whether the app with `app_id` has been pinned to the shelf. +bool IsAppWithIDPinnedToShelf(const std::string& app_id); + apps::mojom::LaunchSource ShelfLaunchSourceToAppsLaunchSource( ash::ShelfLaunchSource source);
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc index 9c76ab2f..164f457a 100644 --- a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc +++ b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc
@@ -13,12 +13,15 @@ #include "ash/constants/ash_pref_names.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/app_list/internal_app_id_constants.h" +#include "base/metrics/histogram_functions.h" #include "base/strings/string_util.h" #include "base/values.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/apps/app_service/publishers/extension_apps_util.h" #include "chrome/browser/ash/crosapi/browser_util.h" +#include "chrome/browser/ash/file_manager/app_id.h" +#include "chrome/browser/ash/file_manager/prefs_migration_uma.h" #include "chrome/browser/ash/login/demo_mode/demo_session.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/prefs/pref_service_syncable_util.h" @@ -382,6 +385,7 @@ if (ShouldPerformConsistencyMigrations()) { needs_consistency_migrations_ = false; + MigrateFilesChromeAppToSWA(syncable_service); EnsureChromePinned(syncable_service); } @@ -525,6 +529,38 @@ skip_pinned_apps_from_sync_for_test = true; } +void ChromeShelfPrefs::MigrateFilesChromeAppToSWA( + app_list::AppListSyncableService* syncable_service) { + bool is_swa_enabled = chromeos::features::IsFileManagerSwaEnabled(); + + if (!is_swa_enabled || + (is_swa_enabled && + GetPrefs()->GetBoolean(ash::prefs::kFilesAppUIPrefsMigrated))) { + return; + } + + // Avoid migrating the user prefs (even if the migration fails) to avoid + // overriding preferences that a user may set on the SWA explicitly. + GetPrefs()->SetBoolean(ash::prefs::kFilesAppUIPrefsMigrated, true); + + using MigrationStatus = file_manager::FileManagerPrefsMigrationStatus; + if (!syncable_service->GetSyncItem(extension_misc::kFilesManagerAppId)) { + base::UmaHistogramEnumeration(file_manager::kPrefsMigrationStatusUMA, + MigrationStatus::kFailNoExistingPreferences); + return; + } + if (!syncable_service->TransferItemAttributes( + /*from_app=*/extension_misc::kFilesManagerAppId, + /*to_app=*/file_manager::kFileManagerSwaAppId)) { + base::UmaHistogramEnumeration(file_manager::kPrefsMigrationStatusUMA, + MigrationStatus::kFailMigratingPreferences); + return; + } + + base::UmaHistogramEnumeration(file_manager::kPrefsMigrationStatusUMA, + MigrationStatus::kSuccess); +} + void ChromeShelfPrefs::EnsureChromePinned( app_list::AppListSyncableService* syncable_service) { syncer::StringOrdinal chrome_position =
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.h b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.h index 9ac9417..7a0cb84d 100644 --- a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.h +++ b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.h
@@ -80,6 +80,11 @@ // https://crbug.com/1085597 static void SkipPinnedAppsFromSyncForTest(); + // Ensure the Files Chrome app pinned positions are appropriately migrated to + // the Files System Web App. + void MigrateFilesChromeAppToSWA( + app_list::AppListSyncableService* syncable_service); + // This is run once each time ash launches. If the chrome app is not pinned // then this creates a pin for the chrome app. void EnsureChromePinned(app_list::AppListSyncableService* syncable_service);
diff --git a/chrome/browser/ui/ash/shelf/shelf_context_menu.cc b/chrome/browser/ui/ash/shelf/shelf_context_menu.cc index 14d9d949..ced3d33 100644 --- a/chrome/browser/ui/ash/shelf/shelf_context_menu.cc +++ b/chrome/browser/ui/ash/shelf/shelf_context_menu.cc
@@ -68,22 +68,18 @@ DCHECK(item); DCHECK(!item->id.IsNull()); - auto app_type = - apps::AppServiceProxyFactory::GetForProfile(controller->profile()) - ->AppRegistryCache() - .GetAppType(item->id.app_id); // AppServiceShelfContextMenu supports context menus for apps registered in // AppService, Arc shortcuts and Crostini apps with the prefix "crostini:". - if ((app_type != apps::mojom::AppType::kUnknown && - app_type != apps::mojom::AppType::kExtension) || + if (apps::AppServiceProxyFactory::GetForProfile(controller->profile()) + ->AppRegistryCache() + .GetAppType(item->id.app_id) != apps::mojom::AppType::kUnknown || crostini::IsUnmatchedCrostiniShelfAppId(item->id.app_id) || arc::IsArcItem(controller->profile(), item->id.app_id)) { return std::make_unique<AppServiceShelfContextMenu>(controller, item, display_id); } - // Create an ExtensionShelfContextMenu for other items, including browser - // extensions. + // Create an ExtensionShelfContextMenu for other items. return std::make_unique<ExtensionShelfContextMenu>(controller, item, display_id); }
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 9ce6abd..8f6301f1 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -44,7 +44,6 @@ #include "chrome/browser/content_settings/mixed_content_settings_tab_helper.h" #include "chrome/browser/content_settings/page_specific_content_settings_delegate.h" #include "chrome/browser/content_settings/sound_content_setting_observer.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/custom_handlers/register_protocol_handler_permission_request.h" #include "chrome/browser/defaults.h" @@ -166,6 +165,7 @@ #include "components/captive_portal/core/buildflags.h" #include "components/content_settings/browser/page_specific_content_settings.h" #include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/favicon/content/content_favicon_driver.h" #include "components/find_in_page/find_tab_helper.h" #include "components/infobars/content/content_infobar_manager.h" @@ -1970,7 +1970,7 @@ if (!handler.IsValid()) return; - ProtocolHandlerRegistry* registry = + custom_handlers::ProtocolHandlerRegistry* registry = ProtocolHandlerRegistryFactory::GetForBrowserContext(context); if (registry->SilentlyHandleRegisterHandlerRequest(handler)) return; @@ -2024,7 +2024,7 @@ ProtocolHandler handler = ProtocolHandler::CreateProtocolHandler( protocol, url, GetProtocolHandlerSecurityLevel(requesting_frame)); - ProtocolHandlerRegistry* registry = + custom_handlers::ProtocolHandlerRegistry* registry = ProtocolHandlerRegistryFactory::GetForBrowserContext(context); registry->RemoveHandler(handler); }
diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h index 985a5be..69bcd2a 100644 --- a/chrome/browser/ui/browser_window.h +++ b/chrome/browser/ui/browser_window.h
@@ -83,6 +83,7 @@ } // namespace sharing_hub namespace ui { +class ColorProvider; class NativeTheme; } @@ -192,6 +193,9 @@ // Returns the native theme associated with the frame. virtual ui::NativeTheme* GetNativeTheme() = 0; + // Returns the ColorProvider associated with the frame. + virtual const ui::ColorProvider* GetColorProvider() const = 0; + // Returns the height of the browser's top controls. This height doesn't // change with the current shown ratio above. Renderers will call this to // calculate the top-chrome shown ratio from the gesture scroll offset.
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc index 190d03b..df80cdd 100644 --- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc +++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
@@ -23,7 +23,6 @@ #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/content_settings/mixed_content_settings_tab_helper.h" #include "chrome/browser/content_settings/page_specific_content_settings_delegate.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/download/download_request_limiter.h" #include "chrome/browser/external_protocol/external_protocol_handler.h" @@ -48,6 +47,7 @@ #include "components/content_settings/core/browser/cookie_settings.h" #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_utils.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/infobars/content/content_infobar_manager.h" #include "components/permissions/permission_decision_auto_blocker.h" #include "components/permissions/permission_manager.h" @@ -406,7 +406,7 @@ ContentSettingRPHBubbleModel::ContentSettingRPHBubbleModel( Delegate* delegate, WebContents* web_contents, - ProtocolHandlerRegistry* registry) + custom_handlers::ProtocolHandlerRegistry* registry) : ContentSettingSimpleBubbleModel(delegate, web_contents, ContentSettingsType::PROTOCOL_HANDLERS), @@ -1757,7 +1757,7 @@ web_contents); } if (content_type == ContentSettingsType::PROTOCOL_HANDLERS) { - ProtocolHandlerRegistry* registry = + custom_handlers::ProtocolHandlerRegistry* registry = ProtocolHandlerRegistryFactory::GetForBrowserContext( web_contents->GetBrowserContext()); return std::make_unique<ContentSettingRPHBubbleModel>(
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.h b/chrome/browser/ui/content_settings/content_setting_bubble_model.h index 049027a..3260a49 100644 --- a/chrome/browser/ui/content_settings/content_setting_bubble_model.h +++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.h
@@ -30,7 +30,9 @@ class ContentSettingBubbleModelDelegate; class Profile; +namespace custom_handlers { class ProtocolHandlerRegistry; +} namespace content { class WebContents; @@ -326,9 +328,10 @@ // RPH stands for Register Protocol Handler. class ContentSettingRPHBubbleModel : public ContentSettingSimpleBubbleModel { public: - ContentSettingRPHBubbleModel(Delegate* delegate, - content::WebContents* web_contents, - ProtocolHandlerRegistry* registry); + ContentSettingRPHBubbleModel( + Delegate* delegate, + content::WebContents* web_contents, + custom_handlers::ProtocolHandlerRegistry* registry); ContentSettingRPHBubbleModel(const ContentSettingRPHBubbleModel&) = delete; ContentSettingRPHBubbleModel& operator=(const ContentSettingRPHBubbleModel&) = @@ -346,7 +349,7 @@ void ClearOrSetPreviousHandler(); void PerformActionForSelectedItem(); - raw_ptr<ProtocolHandlerRegistry> registry_; + raw_ptr<custom_handlers::ProtocolHandlerRegistry> registry_; ProtocolHandler pending_handler_; ProtocolHandler previous_handler_; };
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc index 97ddabf2..48a7fe9 100644 --- a/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc +++ b/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
@@ -13,7 +13,6 @@ #include "build/build_config.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/content_settings/page_specific_content_settings_delegate.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/test_protocol_handler_registry_delegate.h" #include "chrome/browser/history/history_service_factory.h" #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" @@ -37,6 +36,7 @@ #include "components/content_settings/browser/page_specific_content_settings.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/infobars/content/content_infobar_manager.h" #include "components/infobars/core/infobar_delegate.h" #include "components/permissions/permission_decision_auto_blocker.h" @@ -1042,7 +1042,7 @@ } TEST_F(ContentSettingBubbleModelTest, RPHAllow) { - ProtocolHandlerRegistry registry( + custom_handlers::ProtocolHandlerRegistry registry( profile(), std::make_unique<TestProtocolHandlerRegistryDelegate>()); registry.InitProtocolSettings(); @@ -1109,7 +1109,7 @@ } TEST_F(ContentSettingBubbleModelTest, RPHDefaultDone) { - ProtocolHandlerRegistry registry( + custom_handlers::ProtocolHandlerRegistry registry( profile(), std::make_unique<TestProtocolHandlerRegistryDelegate>()); registry.InitProtocolSettings();
diff --git a/chrome/browser/ui/global_media_controls/media_notification_service.cc b/chrome/browser/ui/global_media_controls/media_notification_service.cc index c738862c..a2a7ce5 100644 --- a/chrome/browser/ui/global_media_controls/media_notification_service.cc +++ b/chrome/browser/ui/global_media_controls/media_notification_service.cc
@@ -152,18 +152,15 @@ if (!media_router::MediaRouterEnabled(profile)) { return; } + // base::Unretained() is safe here because cast_notification_producer_ is + // deleted before item_manager_. + cast_notification_producer_ = std::make_unique<CastMediaNotificationProducer>( + profile, item_manager_.get(), + base::BindRepeating( + &global_media_controls::MediaItemManager::OnItemsChanged, + base::Unretained(item_manager_.get()))); + item_manager_->AddItemProducer(cast_notification_producer_.get()); - if (base::FeatureList::IsEnabled(media::kGlobalMediaControlsForCast)) { - // base::Unretained() is safe here because cast_notification_producer_ is - // deleted before item_manager_. - cast_notification_producer_ = - std::make_unique<CastMediaNotificationProducer>( - profile, item_manager_.get(), - base::BindRepeating( - &global_media_controls::MediaItemManager::OnItemsChanged, - base::Unretained(item_manager_.get()))); - item_manager_->AddItemProducer(cast_notification_producer_.get()); - } if (media_router::GlobalMediaControlsCastStartStopEnabled(profile)) { presentation_request_notification_producer_ = std::make_unique<PresentationRequestNotificationProducer>(this);
diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc index bad4e4b..16ad496 100644 --- a/chrome/browser/ui/startup/startup_browser_creator.cc +++ b/chrome/browser/ui/startup/startup_browser_creator.cc
@@ -41,7 +41,6 @@ #include "chrome/browser/ash/app_mode/kiosk_app_types.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/extensions/startup_helper.h" #include "chrome/browser/first_run/first_run.h"
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc index c4eadbf3..de33d53 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
@@ -22,7 +22,6 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/buildflags.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/defaults.h" #include "chrome/browser/infobars/simple_alert_infobar_creator.h" @@ -56,6 +55,7 @@ #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/infobars/content/content_infobar_manager.h" #include "components/prefs/pref_service.h" #include "content/public/browser/child_process_security_policy.h" @@ -247,8 +247,9 @@ } bool first_tab = true; - ProtocolHandlerRegistry* registry = profile_ ? - ProtocolHandlerRegistryFactory::GetForBrowserContext(profile_) : NULL; + custom_handlers::ProtocolHandlerRegistry* registry = + profile_ ? ProtocolHandlerRegistryFactory::GetForBrowserContext(profile_) + : NULL; for (size_t i = 0; i < tabs.size(); ++i) { // We skip URLs that we'd have to launch an external protocol handler for. // This avoids us getting into an infinite loop asking ourselves to open
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc index 279afd0..2059d1c 100644 --- a/chrome/browser/ui/tab_helpers.cc +++ b/chrome/browser/ui/tab_helpers.cc
@@ -63,6 +63,8 @@ #include "chrome/browser/safe_browsing/chrome_safe_browsing_tab_observer_delegate.h" #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager_factory.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" +#include "chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.h" +#include "chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer.h" #include "chrome/browser/safe_browsing/trigger_creator.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/sessions/session_tab_helper_factory.h" @@ -119,6 +121,7 @@ #include "components/permissions/permission_request_manager.h" #include "components/safe_browsing/content/browser/safe_browsing_navigation_observer.h" #include "components/safe_browsing/content/browser/safe_browsing_tab_observer.h" +#include "components/safe_browsing/core/common/features.h" #include "components/site_engagement/content/site_engagement_helper.h" #include "components/site_engagement/content/site_engagement_service.h" #include "components/sync/engine/sync_engine_switches.h" @@ -353,6 +356,12 @@ safe_browsing::SafeBrowsingNavigationObserverManagerFactory:: GetForBrowserContext(profile), profile->GetPrefs(), g_browser_process->safe_browsing_service()); + if (base::FeatureList::IsEnabled( + safe_browsing::kTailoredSecurityIntegration)) { + safe_browsing::TailoredSecurityUrlObserver::CreateForWebContents( + web_contents, + safe_browsing::TailoredSecurityServiceFactory::GetForProfile(profile)); + } safe_browsing::SafeBrowsingTabObserver::CreateForWebContents( web_contents, std::make_unique<safe_browsing::ChromeSafeBrowsingTabObserverDelegate>());
diff --git a/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc b/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc index 71c91c3..1bf0fea 100644 --- a/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc +++ b/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc
@@ -152,7 +152,6 @@ case apps::mojom::AppType::kStandaloneBrowser: case apps::mojom::AppType::kRemote: case apps::mojom::AppType::kStandaloneBrowserChromeApp: - case apps::mojom::AppType::kExtension: NOTREACHED(); break; case apps::mojom::AppType::kArc:
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc index a27db54f..50ce688 100644 --- a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc +++ b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc
@@ -1082,10 +1082,12 @@ } // GetCornerRadius adds extra height to the footer to account for rounded - // corners. + // corners. If the feature UseImprovedSuggestionUi is used, this is not + // necessary because there is an additional padding. layout_manager->set_minimum_cross_axis_size( views::MenuConfig::instance().touchable_menu_height + - AutofillPopupBaseView::GetCornerRadius()); + (UseImprovedSuggestionUi() ? 0 + : AutofillPopupBaseView::GetCornerRadius())); auto main_text_label = CreateMainTextView(); main_text_label->SetEnabled(!suggestion.is_loading); @@ -1465,6 +1467,36 @@ } } + // Convenience pointers to the content area view and layout that are used to + // add top-level content. Note that those are replaced below if the feature + // kAutofillVisualImprovementsForSuggestionUi is enabled. + // TODO(crbug.com/1274134): Clean up once improvements are launched. + raw_ptr<views::View> content_view = this; + raw_ptr<views::BoxLayout> content_layout = layout_; + + // If kAutofillVisualImprovementsForSuggestionUi is enabled, introduce an + // additional view with a vertical padding that wraps the full content of the + // bubble. This is similar to the padding_wrapper used in the scroll area, but + // it allows to add a padding below the footer. + if (UseImprovedSuggestionUi()) { + // Create the view and set the convenience pointers defined above. + std::unique_ptr<views::View> content_padding_wrapper = + std::make_unique<views::View>(); + + content_layout = content_padding_wrapper->SetLayoutManager( + std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kVertical)); + + // This adds a padding area on the top and the bottom of the bubble content. + content_padding_wrapper->SetBorder( + views::CreateEmptyBorder(gfx::Insets(GetContentsVerticalPadding(), 0))); + + content_view = AddChildView(std::move(content_padding_wrapper)); + + content_layout->set_main_axis_alignment( + views::BoxLayout::MainAxisAlignment::kStart); + } + if (!rows_.empty()) { // Create a container to wrap the "regular" (non-footer) rows. std::unique_ptr<views::View> body_container = @@ -1485,26 +1517,31 @@ scroll_view_->SetDrawOverflowIndicator(false); scroll_view_->ClipHeightTo(0, body_container_->GetPreferredSize().height()); - // Use an additional container to apply padding outside the scroll view, so - // that the padding area is stationary. This ensures that the rounded - // corners appear properly; on Mac, the clipping path will not apply - // properly to a scrollable area. NOTE: GetContentsVerticalPadding is - // guaranteed to return a size which accommodates the rounded corners. - // Add the padding to the top unconditionally, but only add a padding to the - // bottom if there are no footer items to follow or if the feature to - // improve the UI is not enabled. // TODO(crbug.com/1274134): Clean up once improvements are launched. - views::View* padding_wrapper = new views::View(); - padding_wrapper->SetBorder(views::CreateEmptyBorder(gfx::Insets( - GetContentsVerticalPadding(), 0, - (!UseImprovedSuggestionUi() || footer_item_line_numbers.empty()) - ? GetContentsVerticalPadding() - : 0, - 0))); - padding_wrapper->SetLayoutManager(std::make_unique<views::FillLayout>()); - padding_wrapper->AddChildView(scroll_view_.get()); - AddChildView(padding_wrapper); - layout_->SetFlexForView(padding_wrapper, 1); + // Note, the padding wrapper is not needed if the content_padding_wrapper is + // used. + if (UseImprovedSuggestionUi()) { + content_view->AddChildView(scroll_view_.get()); + content_layout->SetFlexForView(scroll_view_.get(), 1); + } else { + // Use an additional container to apply padding outside the scroll view, + // so that the padding area is stationary. This ensures that the rounded + // corners appear properly; on Mac, the clipping path will not apply + // properly to a scrollable area. NOTE: GetContentsVerticalPadding is + // guaranteed to return a size which accommodates the rounded corners. + // Add the padding to the top unconditionally, but only add a padding to + // the bottom if there are no footer items to follow. + views::View* padding_wrapper = new views::View(); + padding_wrapper->SetBorder(views::CreateEmptyBorder(gfx::Insets( + GetContentsVerticalPadding(), 0, + (footer_item_line_numbers.empty()) ? GetContentsVerticalPadding() : 0, + 0))); + + padding_wrapper->SetLayoutManager(std::make_unique<views::FillLayout>()); + padding_wrapper->AddChildView(scroll_view_.get()); + content_view->AddChildView(padding_wrapper); + content_layout->SetFlexForView(padding_wrapper, 1); + } } if (footer_item_line_numbers.empty()) { @@ -1533,8 +1570,8 @@ footer_container->AddChildView(rows_.back()); } - footer_container_ = AddChildView(footer_container); - layout_->SetFlexForView(footer_container_, 0); + footer_container_ = content_view->AddChildView(footer_container); + content_layout->SetFlexForView(footer_container_, 0); } int AutofillPopupViewNativeViews::AdjustWidth(int width) const {
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h index 907fd3b..7c0c56d 100644 --- a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h +++ b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h
@@ -112,8 +112,7 @@ // Creates child views based on the suggestions given by |controller_|. // This method expects that all non-footer suggestions precede footer - // suggestions. Separator views can be both a footer or non-footer suggestion - // but they are not allowed to be the first or last item. + // suggestions. void CreateChildViews(); // Applies certain rounding rules to the given width, such as matching the
diff --git a/chrome/browser/ui/views/chrome_views_delegate.cc b/chrome/browser/ui/views/chrome_views_delegate.cc index f2c2340..1b8b688 100644 --- a/chrome/browser/ui/views/chrome_views_delegate.cc +++ b/chrome/browser/ui/views/chrome_views_delegate.cc
@@ -129,9 +129,7 @@ bounds->SetRect(*left, *top, *right - *left, *bottom - *top); - bool maximized = false; - if (dictionary) - dictionary->GetBoolean("maximized", &maximized); + const bool maximized = dictionary->FindBoolKey("maximized").value_or(false); *show_state = maximized ? ui::SHOW_STATE_MAXIMIZED : ui::SHOW_STATE_NORMAL; #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 1f700ee..3c6fcbe 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -1165,6 +1165,10 @@ return views::ClientView::GetNativeTheme(); } +const ui::ColorProvider* BrowserView::GetColorProvider() const { + return views::ClientView::GetColorProvider(); +} + int BrowserView::GetTopControlsHeight() const { if (top_controls_slide_controller_ && top_controls_slide_controller_->IsEnabled()) {
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index 003434b..6eea8b4 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -403,6 +403,7 @@ bool DoBrowserControlsShrinkRendererSize( const content::WebContents* contents) const override; ui::NativeTheme* GetNativeTheme() override; + const ui::ColorProvider* GetColorProvider() const override; int GetTopControlsHeight() const override; void SetTopControlsGestureScrollInProgress(bool in_progress) override; StatusBubble* GetStatusBubble() override;
diff --git a/chrome/browser/ui/views/global_media_controls/media_dialog_view_interactive_browsertest.cc b/chrome/browser/ui/views/global_media_controls/media_dialog_view_interactive_browsertest.cc index 6c55363..7b30320 100644 --- a/chrome/browser/ui/views/global_media_controls/media_dialog_view_interactive_browsertest.cc +++ b/chrome/browser/ui/views/global_media_controls/media_dialog_view_interactive_browsertest.cc
@@ -353,8 +353,8 @@ void SetUp() override { feature_list_.InitWithFeatures( - {media::kGlobalMediaControls, media::kGlobalMediaControlsForCast, - media::kLiveCaption, feature_engagement::kIPHLiveCaptionFeature, + {media::kGlobalMediaControls, media::kLiveCaption, + feature_engagement::kIPHLiveCaptionFeature, media::kLiveCaptionMultiLanguage, media::kUseSodaForLiveCaption}, {});
diff --git a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc index 40e539f..021331c 100644 --- a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc
@@ -30,6 +30,7 @@ #include "chrome/test/base/ui_test_utils.h" #include "chrome/test/permissions/permission_request_manager_test_api.h" #include "components/content_settings/core/common/pref_names.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/permissions/features.h" #include "components/permissions/permission_request.h" #include "components/permissions/permission_ui_selector.h" @@ -160,7 +161,7 @@ std::string protocol = "mailto"; ProtocolHandler handler = ProtocolHandler::CreateProtocolHandler(protocol, GetTestUrl()); - ProtocolHandlerRegistry* registry = + custom_handlers::ProtocolHandlerRegistry* registry = ProtocolHandlerRegistryFactory::GetForBrowserContext( browser()->profile()); // Deleted in RegisterProtocolHandlerPermissionRequest::RequestFinished().
diff --git a/chrome/browser/ui/views/safe_browsing/tailored_security_unconsented_modal.cc b/chrome/browser/ui/views/safe_browsing/tailored_security_unconsented_modal.cc index 1eed9e3..904ea33 100644 --- a/chrome/browser/ui/views/safe_browsing/tailored_security_unconsented_modal.cc +++ b/chrome/browser/ui/views/safe_browsing/tailored_security_unconsented_modal.cc
@@ -31,7 +31,8 @@ Profile* profile = Profile::FromBrowserContext(web_contents->GetBrowserContext()); SetSafeBrowsingState(profile->GetPrefs(), - SafeBrowsingState::ENHANCED_PROTECTION); + SafeBrowsingState::ENHANCED_PROTECTION, + /*is_esb_enabled_in_sync=*/false); if (!chrome::FindBrowserWithWebContents(web_contents)) return; chrome::ShowSafeBrowsingEnhancedProtection(
diff --git a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc index 2045433..dbfc270 100644 --- a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc +++ b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
@@ -47,7 +47,6 @@ #include "ui/base/pointer/touch_ui_controller.h" #include "ui/events/types/event_type.h" #include "ui/gfx/color_palette.h" -#include "ui/gfx/color_utils.h" #include "ui/gfx/geometry/insets.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/paint_vector_icon.h" @@ -318,14 +317,12 @@ } void TabGroupEditorBubbleView::AddedToWidget() { - for (auto menu_item : menu_items_) { - const bool enabled = menu_item->GetEnabled(); - const SkColor text_color = menu_item->GetCurrentTextColor(); - const SkColor icon_color = - enabled ? color_utils::DeriveDefaultIconColor(text_color) : text_color; - menu_item->SetImageModel( - enabled ? views::Button::STATE_NORMAL : views::Button::STATE_DISABLED, - ui::ImageModel::FromVectorIcon(kMoveGroupToNewWindowIcon, icon_color)); + if (!move_menu_item_->GetEnabled()) { + const SkColor disabled_color = move_menu_item_->GetCurrentTextColor(); + move_menu_item_->SetImageModel( + views::Button::STATE_DISABLED, + ui::ImageModel::FromVectorIcon(kMoveGroupToNewWindowIcon, + disabled_color)); } } @@ -418,23 +415,22 @@ base::BindRepeating(&TabGroupEditorBubbleView::NewTabInGroupPressed, base::Unretained(this)), &kNewTabInGroupIcon)); - menu_items_.push_back(new_tab_menu_item); - menu_items_.push_back(AddChildView(CreateMenuItem( + AddChildView(CreateMenuItem( TAB_GROUP_HEADER_CXMENU_UNGROUP, l10n_util::GetStringUTF16(IDS_TAB_GROUP_HEADER_CXMENU_UNGROUP), base::BindRepeating(&TabGroupEditorBubbleView::UngroupPressed, base::Unretained(this), header_view), - &kUngroupIcon))); + &kUngroupIcon)); - menu_items_.push_back(AddChildView(CreateMenuItem( + AddChildView(CreateMenuItem( TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP, l10n_util::GetStringUTF16(IDS_TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP), base::BindRepeating(&TabGroupEditorBubbleView::CloseGroupPressed, base::Unretained(this)), - &kCloseGroupIcon))); + &kCloseGroupIcon)); - auto* move_menu_item = AddChildView( + move_menu_item_ = AddChildView( CreateMenuItem(TAB_GROUP_HEADER_CXMENU_MOVE_GROUP_TO_NEW_WINDOW, l10n_util::GetStringUTF16( IDS_TAB_GROUP_HEADER_CXMENU_MOVE_GROUP_TO_NEW_WINDOW), @@ -442,10 +438,9 @@ &TabGroupEditorBubbleView::MoveGroupToNewWindowPressed, base::Unretained(this)), &kMoveGroupToNewWindowIcon)); - move_menu_item->SetEnabled( + move_menu_item_->SetEnabled( tab_strip_model->count() != tab_strip_model->group_model()->GetTabGroup(group_)->tab_count()); - menu_items_.push_back(move_menu_item); // Setting up the layout.
diff --git a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h index 30270e5..5b81363 100644 --- a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h +++ b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h
@@ -132,7 +132,7 @@ raw_ptr<ColorPickerView> color_selector_; raw_ptr<views::ToggleButton> save_group_toggle_ = nullptr; - std::vector<raw_ptr<views::LabelButton>> menu_items_; + raw_ptr<views::LabelButton> move_menu_item_ = nullptr; // If true will use the |anchor_rect_| provided in the constructor, otherwise // fall back to using the anchor view bounds.
diff --git a/chrome/browser/ui/views/task_manager_view.cc b/chrome/browser/ui/views/task_manager_view.cc index eb7ca4f..eaccb01 100644 --- a/chrome/browser/ui/views/task_manager_view.cc +++ b/chrome/browser/ui/views/task_manager_view.cc
@@ -385,10 +385,11 @@ if (!g_browser_process->local_state()) return; - const base::DictionaryValue* dictionary = - g_browser_process->local_state()->GetDictionary(GetWindowName()); - if (dictionary) - dictionary->GetBoolean("always_on_top", &is_always_on_top_); + if (const base::DictionaryValue* dictionary = + g_browser_process->local_state()->GetDictionary(GetWindowName())) { + is_always_on_top_ = + dictionary->FindBoolKey("always_on_top").value_or(false); + } } BEGIN_METADATA(TaskManagerView, views::DialogDelegateView)
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.cc b/chrome/browser/ui/views/translate/translate_bubble_view.cc index b1127364..aaa5c56 100644 --- a/chrome/browser/ui/views/translate/translate_bubble_view.cc +++ b/chrome/browser/ui/views/translate/translate_bubble_view.cc
@@ -54,6 +54,7 @@ #include "ui/gfx/geometry/insets.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/strings/grit/ui_strings.h" +#include "ui/views/accessibility/view_accessibility.h" #include "ui/views/border.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/button/checkbox.h" @@ -1127,6 +1128,15 @@ UpdateChildVisibilities(); SizeToContents(); + + if (view_state == TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE) { + GetViewAccessibility().AnnounceText(l10n_util::GetStringFUTF16( + IDS_TRANSLATE_BUBBLE_TRANSLATION_COMPLETE_ANNOUNCEMENT, + model_->GetTargetLanguageNameAt(model_->GetTargetLanguageIndex()))); + } else if (view_state == TranslateBubbleModel::VIEW_STATE_ERROR) { + GetViewAccessibility().AnnounceText(l10n_util::GetStringUTF16( + IDS_TRANSLATE_BUBBLE_COULD_NOT_TRANSLATE_TITLE)); + } } void TranslateBubbleView::SwitchTabForViewState(
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc index 110d2bf..e9bfaefb 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc
@@ -496,10 +496,10 @@ gfx::Rect GetWindowControlOverlayBoundingClientRect() { const std::string kRectValueList = "var rect = " - "[navigator.windowControlsOverlay.getBoundingClientRect().x, " - "navigator.windowControlsOverlay.getBoundingClientRect().y, " - "navigator.windowControlsOverlay.getBoundingClientRect().width, " - "navigator.windowControlsOverlay.getBoundingClientRect().height];"; + "[navigator.windowControlsOverlay.getTitlebarAreaRect().x, " + "navigator.windowControlsOverlay.getTitlebarAreaRect().y, " + "navigator.windowControlsOverlay.getTitlebarAreaRect().width, " + "navigator.windowControlsOverlay.getTitlebarAreaRect().height];"; return helper()->GetXYWidthHeightRect( helper()->browser_view()->GetActiveWebContents(), kRectValueList, "rect");
diff --git a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc index 83ee759..cf7f41a2 100644 --- a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc +++ b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
@@ -341,6 +341,17 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) } +bool WebAppUiManagerImpl::IsAppInQuickLaunchBar(const AppId& app_id) const { + DCHECK(CanAddAppToQuickLaunchBar()); +#if BUILDFLAG(IS_CHROMEOS_ASH) + // ChromeShelfController does not exist in unit tests. + if (auto* controller = ChromeShelfController::instance()) { + return IsAppWithIDPinnedToShelf(app_id); + } +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + return false; +} + bool WebAppUiManagerImpl::IsInAppWindow(content::WebContents* web_contents, const AppId* app_id) const { Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
diff --git a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h index 9f32b30..09ebb95 100644 --- a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h +++ b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h
@@ -52,6 +52,7 @@ const AppId& to_app) override; bool CanAddAppToQuickLaunchBar() const override; void AddAppToQuickLaunchBar(const AppId& app_id) override; + bool IsAppInQuickLaunchBar(const AppId& app_id) const override; bool IsInAppWindow(content::WebContents* web_contents, const AppId* app_id) const override; void NotifyOnAssociatedAppChanged(content::WebContents* web_contents,
diff --git a/chrome/browser/ui/webui/history/history_ui.cc b/chrome/browser/ui/webui/history/history_ui.cc index caa6e79..69122c9 100644 --- a/chrome/browser/ui/webui/history/history_ui.cc +++ b/chrome/browser/ui/webui/history/history_ui.cc
@@ -15,6 +15,7 @@ #include "base/memory/ref_counted_memory.h" #include "base/values.h" #include "build/build_config.h" +#include "chrome/browser/history_clusters/history_clusters_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/ui/ui_features.h" @@ -37,6 +38,7 @@ #include "components/grit/components_scaled_resources.h" #include "components/history_clusters/core/features.h" #include "components/history_clusters/core/history_clusters_prefs.h" +#include "components/history_clusters/core/history_clusters_service.h" #include "components/prefs/pref_service.h" #include "components/signin/public/base/signin_pref_names.h" #include "components/signin/public/identity_manager/identity_manager.h" @@ -132,8 +134,11 @@ : ""); // History clusters + auto* history_clusters_service = + HistoryClustersServiceFactory::GetForBrowserContext(profile); source->AddBoolean("isHistoryClustersEnabled", - base::FeatureList::IsEnabled(history_clusters::kJourneys)); + history_clusters_service && + history_clusters_service->IsJourneysEnabled()); source->AddBoolean( kIsHistoryClustersVisibleKey, profile->GetPrefs()->GetBoolean(history_clusters::prefs::kVisible));
diff --git a/chrome/browser/ui/webui/history_clusters/history_clusters_handler_browsertest.cc b/chrome/browser/ui/webui/history_clusters/history_clusters_handler_browsertest.cc index d665d80..fa3fd23 100644 --- a/chrome/browser/ui/webui/history_clusters/history_clusters_handler_browsertest.cc +++ b/chrome/browser/ui/webui/history_clusters/history_clusters_handler_browsertest.cc
@@ -22,7 +22,7 @@ class HistoryClustersHandlerBrowserTest : public InProcessBrowserTest { public: HistoryClustersHandlerBrowserTest() { - feature_list_.InitWithFeatures({history_clusters::kJourneys}, {}); + feature_list_.InitWithFeatures({history_clusters::internal::kJourneys}, {}); } ~HistoryClustersHandlerBrowserTest() override = default;
diff --git a/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc b/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc index 3abf88a..ce65688 100644 --- a/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc
@@ -337,10 +337,6 @@ ::switches::kEnableExperimentalAccessibilitySwitchAccessText); } -bool IsSwitchAccessSetupGuideAllowed() { - return ::features::IsExperimentalAccessibilitySwitchAccessSetupGuideEnabled(); -} - bool AreTabletNavigationButtonsAllowed() { return ash::features::IsHideShelfControlsInTabletModeEnabled() && ash::TabletMode::IsBoardTypeMarkedAsTabletCapable(); @@ -763,9 +759,6 @@ "showExperimentalAccessibilitySwitchAccessImprovedTextInput", IsSwitchAccessTextAllowed()); - html_source->AddBoolean("showSwitchAccessSetupGuide", - IsSwitchAccessSetupGuideAllowed()); - html_source->AddBoolean("showTabletModeShelfNavigationButtonsSettings", AreTabletNavigationButtonsAllowed());
diff --git a/chrome/browser/ui/webui/settings/chromeos/apps_section.cc b/chrome/browser/ui/webui/settings/chromeos/apps_section.cc index b62cad3..fa09b48 100644 --- a/chrome/browser/ui/webui/settings/chromeos/apps_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/apps_section.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ui/webui/settings/chromeos/apps_section.h" +#include "ash/components/arc/arc_features.h" #include "ash/components/arc/arc_prefs.h" #include "ash/components/arc/arc_util.h" #include "ash/constants/ash_features.h" @@ -358,7 +359,10 @@ "showOsSettingsAppNotificationsRow", base::FeatureList::IsEnabled( chromeos::features::kOsSettingsAppNotificationsPage)); - html_source->AddBoolean("showArcvmManageUsb", arc::IsArcVmEnabled()); + html_source->AddBoolean( + "showArcvmManageUsb", + arc::IsArcVmEnabled() && + base::FeatureList::IsEnabled(arc::kUsbDeviceDefaultAttachToArcVm)); AddAppManagementStrings(html_source); AddGuestOsStrings(html_source); @@ -372,8 +376,9 @@ web_ui->AddMessageHandler( std::make_unique<chromeos::settings::AndroidAppsHandler>( profile(), app_service_proxy_)); - if (arc::IsArcVmEnabled()) - web_ui->AddMessageHandler(std::make_unique<PluginVmHandler>(profile())); + if (arc::IsArcVmEnabled() && + base::FeatureList::IsEnabled(arc::kUsbDeviceDefaultAttachToArcVm)) + web_ui->AddMessageHandler(std::make_unique<GuestOsHandler>(profile())); if (ShowPluginVm(profile(), *pref_service_)) { web_ui->AddMessageHandler(std::make_unique<GuestOsHandler>(profile()));
diff --git a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc index 0666665..cbeb0c7 100644 --- a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc +++ b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
@@ -27,8 +27,9 @@ // TODO(https://crbug.com/1251039): Remove usages of base::ListValue void GetHandlersAsListValue( - const ProtocolHandlerRegistry* registry, - const ProtocolHandlerRegistry::ProtocolHandlerList& handlers, + const custom_handlers::ProtocolHandlerRegistry* registry, + const custom_handlers::ProtocolHandlerRegistry::ProtocolHandlerList& + handlers, base::ListValue* handler_list) { for (const auto& handler : handlers) { base::DictionaryValue handler_value; @@ -124,9 +125,11 @@ void ProtocolHandlersHandler::GetHandlersForProtocol( const std::string& protocol, base::DictionaryValue* handlers_value) { - ProtocolHandlerRegistry* registry = GetProtocolHandlerRegistry(); - handlers_value->SetString("protocol_display_name", - ProtocolHandler::GetProtocolDisplayName(protocol)); + custom_handlers::ProtocolHandlerRegistry* registry = + GetProtocolHandlerRegistry(); + handlers_value->SetString( + "protocol_display_name", + content::ProtocolHandler::GetProtocolDisplayName(protocol)); handlers_value->SetString("protocol", protocol); base::ListValue handlers_list; @@ -136,14 +139,16 @@ } void ProtocolHandlersHandler::GetIgnoredHandlers(base::ListValue* handlers) { - ProtocolHandlerRegistry* registry = GetProtocolHandlerRegistry(); - ProtocolHandlerRegistry::ProtocolHandlerList ignored_handlers = - registry->GetIgnoredHandlers(); + custom_handlers::ProtocolHandlerRegistry* registry = + GetProtocolHandlerRegistry(); + custom_handlers::ProtocolHandlerRegistry::ProtocolHandlerList + ignored_handlers = registry->GetIgnoredHandlers(); return GetHandlersAsListValue(registry, ignored_handlers, handlers); } void ProtocolHandlersHandler::UpdateHandlerList() { - ProtocolHandlerRegistry* registry = GetProtocolHandlerRegistry(); + custom_handlers::ProtocolHandlerRegistry* registry = + GetProtocolHandlerRegistry(); std::vector<std::string> protocols; registry->GetRegisteredProtocols(&protocols); @@ -219,7 +224,8 @@ return ProtocolHandler::CreateProtocolHandler(protocol, GURL(url)); } -ProtocolHandlerRegistry* ProtocolHandlersHandler::GetProtocolHandlerRegistry() { +custom_handlers::ProtocolHandlerRegistry* +ProtocolHandlersHandler::GetProtocolHandlerRegistry() { return ProtocolHandlerRegistryFactory::GetForBrowserContext(profile_); } @@ -228,7 +234,7 @@ std::unique_ptr<base::DictionaryValue> ProtocolHandlersHandler::GetAppHandlersForProtocol( const std::string& protocol, - ProtocolHandlerRegistry::ProtocolHandlerList handlers) { + custom_handlers::ProtocolHandlerRegistry::ProtocolHandlerList handlers) { auto handlers_value = std::make_unique<base::DictionaryValue>(); if (!handlers.empty()) { @@ -255,8 +261,9 @@ base::Value handlers(base::Value::Type::LIST); for (auto& protocol : protocols) { - ProtocolHandlerRegistry::ProtocolHandlerList protocol_handlers = - os_integration_manager.GetAllowedHandlersForProtocol(protocol); + custom_handlers::ProtocolHandlerRegistry::ProtocolHandlerList + protocol_handlers = + os_integration_manager.GetAllowedHandlersForProtocol(protocol); auto handler_value(GetAppHandlersForProtocol(protocol, protocol_handlers)); handlers.Append(std::move(*handler_value)); @@ -276,8 +283,9 @@ base::Value handlers(base::Value::Type::LIST); for (auto& protocol : protocols) { - ProtocolHandlerRegistry::ProtocolHandlerList protocol_handlers = - os_integration_manager.GetDisallowedHandlersForProtocol(protocol); + custom_handlers::ProtocolHandlerRegistry::ProtocolHandlerList + protocol_handlers = + os_integration_manager.GetDisallowedHandlersForProtocol(protocol); auto handler_value(GetAppHandlersForProtocol(protocol, protocol_handlers)); handlers.Append(std::move(*handler_value)); }
diff --git a/chrome/browser/ui/webui/settings/protocol_handlers_handler.h b/chrome/browser/ui/webui/settings/protocol_handlers_handler.h index 5cc1bdb..4a512f10 100644 --- a/chrome/browser/ui/webui/settings/protocol_handlers_handler.h +++ b/chrome/browser/ui/webui/settings/protocol_handlers_handler.h
@@ -9,12 +9,12 @@ #include "base/memory/raw_ptr.h" #include "base/scoped_observation.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" #include "chrome/browser/web_applications/app_registrar_observer.h" #include "chrome/browser/web_applications/web_app_id.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/browser/web_applications/web_app_registrar.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "content/public/common/custom_handlers/protocol_handler.h" //////////////////////////////////////////////////////////////////////////////// @@ -33,9 +33,10 @@ namespace settings { -class ProtocolHandlersHandler : public SettingsPageUIHandler, - public ProtocolHandlerRegistry::Observer, - public web_app::AppRegistrarObserver { +class ProtocolHandlersHandler + : public SettingsPageUIHandler, + public custom_handlers::ProtocolHandlerRegistry::Observer, + public web_app::AppRegistrarObserver { public: explicit ProtocolHandlersHandler(Profile* profile); @@ -95,10 +96,10 @@ // |args| is a list of [protocol, url]. void HandleRemoveHandler(const base::ListValue* args); - ProtocolHandlerRegistry* GetProtocolHandlerRegistry(); + custom_handlers::ProtocolHandlerRegistry* GetProtocolHandlerRegistry(); - base::ScopedObservation<ProtocolHandlerRegistry, - ProtocolHandlerRegistry::Observer> + base::ScopedObservation<custom_handlers::ProtocolHandlerRegistry, + custom_handlers::ProtocolHandlerRegistry::Observer> registry_observation_{this}; // Web App Protocol Handler specific functions: @@ -115,7 +116,7 @@ // the given |protocol| in the given |handlers| list. std::unique_ptr<base::DictionaryValue> GetAppHandlersForProtocol( const std::string& protocol, - ProtocolHandlerRegistry::ProtocolHandlerList handlers); + custom_handlers::ProtocolHandlerRegistry::ProtocolHandlerList handlers); // Called when OnWebAppProtocolSettingsChanged() is notified or on page load. void UpdateAllAllowedLaunchProtocols();
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn index 262ed616..194a7bf 100644 --- a/chrome/browser/web_applications/BUILD.gn +++ b/chrome/browser/web_applications/BUILD.gn
@@ -306,7 +306,10 @@ } if (is_win) { - deps += [ "//chrome/browser/web_applications/chrome_pwa_launcher:util" ] + deps += [ + "//chrome/browser/web_applications/chrome_pwa_launcher:util", + "//components/custom_handlers", + ] } if (is_chromeos_ash) {
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc index b959abb..8fe681d 100644 --- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc +++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
@@ -295,6 +295,7 @@ void WebAppPublisherHelper::Shutdown() { registrar_observation_.Reset(); content_settings_observation_.Reset(); + is_shutting_down_ = true; } void WebAppPublisherHelper::SetWebAppShowInFields(apps::mojom::AppPtr& app, @@ -413,6 +414,7 @@ apps::mojom::AppPtr WebAppPublisherHelper::ConvertWebApp( const WebApp* web_app) { + DCHECK(!IsShuttingDown()); apps::mojom::Readiness readiness = web_app->is_locally_installed() ? (web_app->is_uninstalling() @@ -524,6 +526,10 @@ apps::mojom::UninstallSource uninstall_source, bool clear_site_data, bool report_abuse) { + if (IsShuttingDown()) { + return; + } + auto origin = url::Origin::Create(web_app->start_url()); DCHECK(provider_); @@ -612,6 +618,10 @@ int32_t size_hint_in_dip, LoadIconCallback callback) { DCHECK(provider_); + if (IsShuttingDown()) { + return; + } + LoadIconFromWebApp(profile_, icon_type, size_hint_in_dip, app_id, static_cast<IconEffects>(icon_key.icon_effects), std::move(callback)); @@ -622,7 +632,7 @@ int32_t event_flags, apps::mojom::LaunchSource launch_source, apps::mojom::WindowInfoPtr window_info) { - if (!profile_) { + if (IsShuttingDown()) { return nullptr; } @@ -704,6 +714,10 @@ int32_t event_flags, apps::mojom::LaunchSource launch_source, apps::mojom::FilePathsPtr file_paths) { + if (IsShuttingDown()) { + return; + } + DisplayMode display_mode = registrar().GetAppEffectiveDisplayMode(app_id); apps::AppLaunchParams params = apps::CreateAppIdLaunchParamsWithEventFlags( app_id, event_flags, launch_source, display::kInvalidDisplayId, @@ -728,6 +742,11 @@ apps::mojom::Publisher::LaunchAppWithIntentCallback callback) { CHECK(intent); + if (IsShuttingDown()) { + std::move(callback).Run(false); + return; + } + #if BUILDFLAG(IS_CHROMEOS_ASH) if (app_id == crostini::kCrostiniTerminalSystemAppId) { DCHECK(base::FeatureList::IsEnabled(chromeos::features::kTerminalSSH)); @@ -773,6 +792,10 @@ content::WebContents* WebAppPublisherHelper::LaunchAppWithParams( apps::AppLaunchParams params) { + if (IsShuttingDown()) { + return nullptr; + } + apps::AppLaunchParams params_for_restore( params.app_id, params.container, params.disposition, params.launch_source, params.display_id, params.launch_files, params.intent); @@ -813,7 +836,7 @@ void WebAppPublisherHelper::SetPermission( const std::string& app_id, apps::mojom::PermissionPtr permission) { - if (!profile_) { + if (IsShuttingDown()) { return; } @@ -856,6 +879,10 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) void WebAppPublisherHelper::StopApp(const std::string& app_id) { + if (IsShuttingDown()) { + return; + } + #if BUILDFLAG(IS_CHROMEOS_ASH) if (!IsWebAppsCrosapiEnabled()) { return; @@ -876,7 +903,7 @@ #endif void WebAppPublisherHelper::OpenNativeSettings(const std::string& app_id) { - if (!profile_) { + if (IsShuttingDown()) { return; } @@ -987,6 +1014,10 @@ return provider_->registrar(); } +bool WebAppPublisherHelper::IsShuttingDown() const { + return is_shutting_down_; +} + void WebAppPublisherHelper::OnWebAppInstalled(const AppId& app_id) { const WebApp* web_app = GetWebApp(app_id); if (web_app && Accepts(app_id)) { @@ -1205,6 +1236,7 @@ const ContentSettingsPattern& primary_pattern, const ContentSettingsPattern& secondary_pattern, ContentSettingsTypeSet content_type_set) { + DCHECK(!IsShuttingDown()); // If content_type is not one of the supported permissions, do nothing. if (!content_type_set.ContainsAllTypes() && !IsSupportedWebAppPermissionType(content_type_set.GetType())) { @@ -1312,11 +1344,6 @@ apps::mojom::LaunchSource launch_source, int64_t display_id, base::OnceCallback<void(content::WebContents*)> callback) { - if (!profile_) { - std::move(callback).Run(nullptr); - return; - } - content::WebContents* web_contents = MaybeNavigateExistingWindow(app_id, intent->url); if (web_contents) {
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.h b/chrome/browser/web_applications/app_service/web_app_publisher_helper.h index bc10d01e..168b93d 100644 --- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.h +++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.h
@@ -232,6 +232,8 @@ WebAppRegistrar& registrar() const; + bool IsShuttingDown() const; + private: #if defined(OS_CHROMEOS) class BadgeManagerDelegate : public badging::BadgeManagerDelegate { @@ -360,6 +362,8 @@ std::unique_ptr<WebAppLaunchManager> web_app_launch_manager_; + bool is_shutting_down_ = false; + apps_util::IncrementingIconKeyFactory icon_key_factory_; apps::PausedApps paused_apps_;
diff --git a/chrome/browser/web_applications/app_service/web_apps.cc b/chrome/browser/web_applications/app_service/web_apps.cc index e2cff0dd..e536077 100644 --- a/chrome/browser/web_applications/app_service/web_apps.cc +++ b/chrome/browser/web_applications/app_service/web_apps.cc
@@ -295,6 +295,9 @@ void WebApps::ConvertWebApps(std::vector<apps::mojom::AppPtr>* apps_out) { DCHECK(provider_); + if (publisher_helper().IsShuttingDown()) { + return; + } for (const WebApp& web_app : provider_->registrar().GetApps()) { if (Accepts(web_app.app_id())) {
diff --git a/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc b/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc index 20c64611..cf07fa21 100644 --- a/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc +++ b/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc
@@ -128,7 +128,7 @@ } void WebAppsPublisherHost::OnReady() { - if (!remote_publisher_) { + if (!remote_publisher_ || publisher_helper().IsShuttingDown()) { return; }
diff --git a/chrome/browser/web_applications/extension_status_utils.h b/chrome/browser/web_applications/extension_status_utils.h index fc193d0..8b35eef2 100644 --- a/chrome/browser/web_applications/extension_status_utils.h +++ b/chrome/browser/web_applications/extension_status_utils.h
@@ -32,6 +32,11 @@ const std::string& extension_id, std::u16string* reason); +// Returns whether the extension with `extension_id` was installed as a default +// extension/app. +bool IsExtensionDefaultInstalled(content::BrowserContext* context, + const std::string& extension_id); + // Returns whether the user has uninstalled an externally installed extension // with |extension_id|. bool IsExternalExtensionUninstalled(content::BrowserContext* context,
diff --git a/chrome/browser/web_applications/extensions/extension_status_utils.cc b/chrome/browser/web_applications/extensions/extension_status_utils.cc index ae8a932..9812226e 100644 --- a/chrome/browser/web_applications/extensions/extension_status_utils.cc +++ b/chrome/browser/web_applications/extensions/extension_status_utils.cc
@@ -16,6 +16,7 @@ #include "extensions/browser/management_policy.h" #include "extensions/browser/pref_names.h" #include "extensions/common/constants.h" +#include "extensions/common/extension.h" namespace { @@ -68,6 +69,17 @@ reason); } +bool IsExtensionDefaultInstalled(content::BrowserContext* context, + const std::string& extension_id) { + auto* registry = ExtensionRegistry::Get(context); + // May be nullptr in unit tests. + if (!registry) + return false; + const Extension* extension = registry->GetInstalledExtension(extension_id); + return extension && + (extension->creation_flags() & Extension::WAS_INSTALLED_BY_DEFAULT); +} + bool IsExternalExtensionUninstalled(content::BrowserContext* context, const std::string& extension_id) { auto* prefs = ExtensionPrefs::Get(context);
diff --git a/chrome/browser/web_applications/preinstalled_web_app_manager.cc b/chrome/browser/web_applications/preinstalled_web_app_manager.cc index 5100042b..088f7f1a 100644 --- a/chrome/browser/web_applications/preinstalled_web_app_manager.cc +++ b/chrome/browser/web_applications/preinstalled_web_app_manager.cc
@@ -22,7 +22,7 @@ #include "base/json/json_file_value_serializer.h" #include "base/json/json_reader.h" #include "base/memory/scoped_refptr.h" -#include "base/metrics/histogram_macros.h" +#include "base/metrics/histogram_functions.h" #include "base/no_destructor.h" #include "base/path_service.h" #include "base/strings/strcat.h" @@ -46,6 +46,7 @@ #include "chrome/browser/web_applications/web_app_constants.h" #include "chrome/browser/web_applications/web_app_install_utils.h" #include "chrome/browser/web_applications/web_app_registrar.h" +#include "chrome/browser/web_applications/web_app_ui_manager.h" #include "chrome/browser/web_applications/web_app_utils.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_paths.h" @@ -345,6 +346,12 @@ const char* PreinstalledWebAppManager::kHistogramAppToReplaceStillInstalledCount = "WebApp.Preinstalled.AppToReplaceStillInstalledCount"; +const char* + PreinstalledWebAppManager::kHistogramAppToReplaceStillSyncInstalledCount = + "WebApp.Preinstalled.AppToReplaceStillSyncInstalledCount"; +const char* PreinstalledWebAppManager:: + kHistogramAppToReplaceStillInstalledInShelfCount = + "WebApp.Preinstalled.AppToReplaceStillInstalledInShelfCount"; void PreinstalledWebAppManager::RegisterProfilePrefs( user_prefs::PrefRegistrySyncable* registry) { @@ -393,8 +400,10 @@ void PreinstalledWebAppManager::SetSubsystems( WebAppRegistrar* registrar, + const WebAppUiManager* ui_manager, ExternallyManagedAppManager* externally_managed_app_manager) { registrar_ = registrar; + ui_manager_ = ui_manager; externally_managed_app_manager_ = externally_managed_app_manager; } @@ -579,11 +588,11 @@ } } - UMA_HISTOGRAM_COUNTS_100(kHistogramEnabledCount, - parsed_configs.options_list.size()); - UMA_HISTOGRAM_COUNTS_100(kHistogramDisabledCount, disabled_count); - UMA_HISTOGRAM_COUNTS_100(kHistogramConfigErrorCount, - parsed_configs.errors.size()); + base::UmaHistogramCounts100(kHistogramEnabledCount, + parsed_configs.options_list.size()); + base::UmaHistogramCounts100(kHistogramDisabledCount, disabled_count); + base::UmaHistogramCounts100(kHistogramConfigErrorCount, + parsed_configs.errors.size()); std::move(callback).Run(parsed_configs.options_list); } @@ -624,16 +633,22 @@ size_t uninstall_and_replace_count = 0; size_t app_to_replace_still_installed_count = 0; + size_t app_to_replace_still_sync_installed_count = 0; + size_t app_to_replace_still_installed_in_shelf_count = 0; + for (const auto& url_and_result : install_results) { - UMA_HISTOGRAM_ENUMERATION(kHistogramInstallResult, - url_and_result.second.code); - if (url_and_result.second.did_uninstall_and_replace) { + const ExternallyManagedAppManager::InstallResult& result = + url_and_result.second; + base::UmaHistogramEnumeration(kHistogramInstallResult, result.code); + if (result.did_uninstall_and_replace) { ++uninstall_and_replace_count; } - if (!IsSuccess(url_and_result.second.code)) + if (!IsSuccess(result.code)) continue; + DCHECK(result.app_id.has_value()); + auto iter = desired_uninstalls.find(url_and_result.first); if (iter == desired_uninstalls.end()) continue; @@ -648,22 +663,37 @@ // Track whether the app to replace is still present. This is // possibly due to getting reinstalled by the user or by Chrome app // sync. See https://crbug.com/1266234 for context. - if (proxy && url_and_result.second.code == - InstallResultCode::kSuccessAlreadyInstalled) { + if (proxy && result.code == InstallResultCode::kSuccessAlreadyInstalled) { + bool is_installed = false; proxy->AppRegistryCache().ForOneApp( - replace_id, [&app_to_replace_still_installed_count]( - const apps::AppUpdate& app) { - if (apps_util::IsInstalled(app.Readiness())) - ++app_to_replace_still_installed_count; + replace_id, [&is_installed](const apps::AppUpdate& app) { + is_installed = apps_util::IsInstalled(app.Readiness()); }); + + if (!is_installed) + continue; + + ++app_to_replace_still_installed_count; + + if (!extensions::IsExtensionDefaultInstalled(profile_, replace_id)) + ++app_to_replace_still_sync_installed_count; + + if (ui_manager_->CanAddAppToQuickLaunchBar()) { + if (ui_manager_->IsAppInQuickLaunchBar(result.app_id.value())) + ++app_to_replace_still_installed_in_shelf_count; + } } } } - UMA_HISTOGRAM_COUNTS_100(kHistogramUninstallAndReplaceCount, - uninstall_and_replace_count); + base::UmaHistogramCounts100(kHistogramUninstallAndReplaceCount, + uninstall_and_replace_count); - UMA_HISTOGRAM_COUNTS_100(kHistogramAppToReplaceStillInstalledCount, - app_to_replace_still_installed_count); + base::UmaHistogramCounts100(kHistogramAppToReplaceStillInstalledCount, + app_to_replace_still_installed_count); + base::UmaHistogramCounts100(kHistogramAppToReplaceStillSyncInstalledCount, + app_to_replace_still_sync_installed_count); + base::UmaHistogramCounts100(kHistogramAppToReplaceStillInstalledInShelfCount, + app_to_replace_still_installed_in_shelf_count); SetMigrationRun(profile_, kMigrateDefaultChromeAppToWebAppsGSuite.name, IsPreinstalledAppInstallFeatureEnabled(
diff --git a/chrome/browser/web_applications/preinstalled_web_app_manager.h b/chrome/browser/web_applications/preinstalled_web_app_manager.h index 29e61931..82e966aa 100644 --- a/chrome/browser/web_applications/preinstalled_web_app_manager.h +++ b/chrome/browser/web_applications/preinstalled_web_app_manager.h
@@ -71,6 +71,8 @@ static const char* kHistogramInstallResult; static const char* kHistogramUninstallAndReplaceCount; static const char* kHistogramAppToReplaceStillInstalledCount; + static const char* kHistogramAppToReplaceStillSyncInstalledCount; + static const char* kHistogramAppToReplaceStillInstalledInShelfCount; static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); @@ -88,6 +90,7 @@ void SetSubsystems( WebAppRegistrar* registrar, + const WebAppUiManager* ui_manager, ExternallyManagedAppManager* externally_managed_app_manager); // Loads the preinstalled app configs and synchronizes them with the device's @@ -155,6 +158,7 @@ int force_reinstall_for_milestone); raw_ptr<WebAppRegistrar> registrar_ = nullptr; + raw_ptr<const WebAppUiManager> ui_manager_ = nullptr; raw_ptr<ExternallyManagedAppManager> externally_managed_app_manager_ = nullptr; const raw_ptr<Profile> profile_;
diff --git a/chrome/browser/web_applications/preinstalled_web_app_manager_unittest.cc b/chrome/browser/web_applications/preinstalled_web_app_manager_unittest.cc index f844b3c..70a4e54 100644 --- a/chrome/browser/web_applications/preinstalled_web_app_manager_unittest.cc +++ b/chrome/browser/web_applications/preinstalled_web_app_manager_unittest.cc
@@ -127,7 +127,8 @@ auto* provider = WebAppProvider::GetForWebApps(profile); DCHECK(provider); preinstalled_web_app_manager->SetSubsystems( - &provider->registrar(), &provider->externally_managed_app_manager()); + &provider->registrar(), &provider->ui_manager(), + &provider->externally_managed_app_manager()); std::vector<ExternalInstallOptions> result; base::RunLoop run_loop;
diff --git a/chrome/browser/web_applications/preinstalled_web_app_migration_browsertest.cc b/chrome/browser/web_applications/preinstalled_web_app_migration_browsertest.cc index 7656fbb..3a4db16f 100644 --- a/chrome/browser/web_applications/preinstalled_web_app_migration_browsertest.cc +++ b/chrome/browser/web_applications/preinstalled_web_app_migration_browsertest.cc
@@ -46,6 +46,7 @@ #include "chrome/browser/ui/app_list/app_list_syncable_service.h" #include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h" #include "chrome/browser/ui/app_list/chrome_app_list_item.h" +#include "chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.h" #endif namespace { @@ -585,6 +586,14 @@ histograms.ExpectUniqueSample( PreinstalledWebAppManager::kHistogramAppToReplaceStillInstalledCount, 0, 1); + histograms.ExpectUniqueSample( + PreinstalledWebAppManager:: + kHistogramAppToReplaceStillSyncInstalledCount, + 0, 1); + histograms.ExpectUniqueSample( + PreinstalledWebAppManager:: + kHistogramAppToReplaceStillInstalledInShelfCount, + 0, 1); } // Manually install Extension app to be replaced. @@ -598,7 +607,35 @@ histograms.ExpectUniqueSample( PreinstalledWebAppManager::kHistogramAppToReplaceStillInstalledCount, 1, 1); + histograms.ExpectUniqueSample( + PreinstalledWebAppManager:: + kHistogramAppToReplaceStillSyncInstalledCount, + 1, 1); + + // Neither app has been added to the shelf. + histograms.ExpectUniqueSample( + PreinstalledWebAppManager:: + kHistogramAppToReplaceStillInstalledInShelfCount, + 0, 1); } + +#if BUILDFLAG(IS_CHROMEOS_ASH) + // Pin both apps to the shelf. + PinAppWithIDToShelf(GetWebAppId()); + PinAppWithIDToShelf(kExtensionId); + + // Re-sync preinstalled web apps. + { + base::HistogramTester histograms; + SyncExternalWebApps(/*expect_install=*/true, /*expect_uninstall=*/false); + + // Apps have been added to the shelf. + histograms.ExpectUniqueSample( + PreinstalledWebAppManager:: + kHistogramAppToReplaceStillInstalledInShelfCount, + 1, 1); + } +#endif // BUILDFLAG(IS_CHROMEOS_ASH) } // Tests the migration from an extension-app to a preinstalled web app provided
diff --git a/chrome/browser/web_applications/test/fake_web_app_ui_manager.cc b/chrome/browser/web_applications/test/fake_web_app_ui_manager.cc index c40cadb..32daf13 100644 --- a/chrome/browser/web_applications/test/fake_web_app_ui_manager.cc +++ b/chrome/browser/web_applications/test/fake_web_app_ui_manager.cc
@@ -70,6 +70,10 @@ void FakeWebAppUiManager::AddAppToQuickLaunchBar(const AppId& app_id) {} +bool FakeWebAppUiManager::IsAppInQuickLaunchBar(const AppId& app_id) const { + return false; +} + bool FakeWebAppUiManager::IsInAppWindow(content::WebContents* web_contents, const AppId* app_id) const { return false;
diff --git a/chrome/browser/web_applications/test/fake_web_app_ui_manager.h b/chrome/browser/web_applications/test/fake_web_app_ui_manager.h index b434128..efbb2d6e 100644 --- a/chrome/browser/web_applications/test/fake_web_app_ui_manager.h +++ b/chrome/browser/web_applications/test/fake_web_app_ui_manager.h
@@ -35,6 +35,7 @@ const AppId& to_app) override; bool CanAddAppToQuickLaunchBar() const override; void AddAppToQuickLaunchBar(const AppId& app_id) override; + bool IsAppInQuickLaunchBar(const AppId& app_id) const override; bool IsInAppWindow(content::WebContents* web_contents, const AppId* app_id) const override; void NotifyOnAssociatedAppChanged(content::WebContents* web_contents,
diff --git a/chrome/browser/web_applications/web_app_protocol_handler_manager.cc b/chrome/browser/web_applications/web_app_protocol_handler_manager.cc index 94215203..c5f3e66 100644 --- a/chrome/browser/web_applications/web_app_protocol_handler_manager.cc +++ b/chrome/browser/web_applications/web_app_protocol_handler_manager.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/web_applications/web_app_protocol_handler_manager.h" #include "base/containers/contains.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/web_app.h"
diff --git a/chrome/browser/web_applications/web_app_protocol_handler_registration_win.cc b/chrome/browser/web_applications/web_app_protocol_handler_registration_win.cc index 4cc0db1..8e6653e0 100644 --- a/chrome/browser/web_applications/web_app_protocol_handler_registration_win.cc +++ b/chrome/browser/web_applications/web_app_protocol_handler_registration_win.cc
@@ -20,7 +20,6 @@ #include "base/task/post_task.h" #include "base/task/thread_pool.h" #include "base/threading/thread_restrictions.h" -#include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/chrome_pwa_launcher/chrome_pwa_launcher_util.h"
diff --git a/chrome/browser/web_applications/web_app_provider.cc b/chrome/browser/web_applications/web_app_provider.cc index 7c3c5462..d748f67 100644 --- a/chrome/browser/web_applications/web_app_provider.cc +++ b/chrome/browser/web_applications/web_app_provider.cc
@@ -312,7 +312,8 @@ registrar_.get(), os_integration_manager_.get(), ui_manager_.get(), install_finalizer_.get(), install_manager_.get()); preinstalled_web_app_manager_->SetSubsystems( - registrar_.get(), externally_managed_app_manager_.get()); + registrar_.get(), ui_manager_.get(), + externally_managed_app_manager_.get()); system_web_app_manager_->SetSubsystems( externally_managed_app_manager_.get(), registrar_.get(), sync_bridge_.get(), ui_manager_.get(), web_app_policy_manager_.get());
diff --git a/chrome/browser/web_applications/web_app_ui_manager.h b/chrome/browser/web_applications/web_app_ui_manager.h index cfbfaf59..83a43fe8 100644 --- a/chrome/browser/web_applications/web_app_ui_manager.h +++ b/chrome/browser/web_applications/web_app_ui_manager.h
@@ -57,6 +57,7 @@ virtual bool CanAddAppToQuickLaunchBar() const = 0; virtual void AddAppToQuickLaunchBar(const AppId& app_id) = 0; + virtual bool IsAppInQuickLaunchBar(const AppId& app_id) const = 0; // Returns whether |web_contents| is in a web app window belonging to // |app_id|, or any web app window if |app_id| is nullptr.
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index eddd8abb..8383ad3f 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1638986360-dcb686fe2f19a20ce5033972698466fe68264518.profdata +chrome-linux-main-1639049961-fdc94ce290dda682ac28879c0940e71374c865eb.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 363ed1a..71b5de7 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1638986360-7d63757599394184ed9617721896f34e955250f0.profdata +chrome-mac-main-1639029217-f1f4f0733b4e52445304f4ffee33453bddbd67b0.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 04122683..87c3f351 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1638986360-007651e391bc80b4eefd0805c96788200d0402f5.profdata +chrome-win32-main-1639040057-52c810d54983c91d0e44692d384d033b589c8747.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 0a1ed5e8..a6b3dd1 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1638997181-a0f2b7a8d601f1546ca540a6d84ebc0757124df4.profdata +chrome-win64-main-1639040057-6c5ba69d141dc31c51719a6fb93a4e58e2c284a4.profdata
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 451887d..0d3bece 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -76,8 +76,6 @@ "AppServiceExternalProtocol", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kAppServiceLoadIconWithoutMojom{ "AppServiceLoadIconWithoutMojom", base::FEATURE_ENABLED_BY_DEFAULT}; -const base::Feature kAppServiceExtension{"AppServiceExtension", - base::FEATURE_ENABLED_BY_DEFAULT}; #endif // !defined(OS_ANDROID) #if defined(OS_MAC)
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index 28d0744..b53cde9 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -73,8 +73,6 @@ extern const base::Feature kAppServiceExternalProtocol; COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kAppServiceLoadIconWithoutMojom; -COMPONENT_EXPORT(CHROME_FEATURES) -extern const base::Feature kAppServiceExtension; #endif // !defined(OS_ANDROID) #if defined(OS_MAC)
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index e4341d2..6d134ed4 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -2697,26 +2697,6 @@ const char kHardwareAccelerationModePrevious[] = "hardware_acceleration_mode_previous"; -// List of protocol handlers. -const char kRegisteredProtocolHandlers[] = - "custom_handlers.registered_protocol_handlers"; - -// List of protocol handlers the user has requested not to be asked about again. -const char kIgnoredProtocolHandlers[] = - "custom_handlers.ignored_protocol_handlers"; - -// List of protocol handlers registered by policy. -const char kPolicyRegisteredProtocolHandlers[] = - "custom_handlers.policy.registered_protocol_handlers"; - -// List of protocol handlers the policy has requested to be ignored. -const char kPolicyIgnoredProtocolHandlers[] = - "custom_handlers.policy.ignored_protocol_handlers"; - -// Whether user-specified handlers for protocols and content types can be -// specified. -const char kCustomHandlersEnabled[] = "custom_handlers.enabled"; - // Integer that specifies the policy refresh rate for device-policy in // milliseconds. Not all values are meaningful, so it is clamped to a sane range // by the cloud policy subsystem.
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 7cfc28c..53cc7da3 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -856,12 +856,6 @@ extern const char kDnsOverHttpsTemplates[]; extern const char kAdditionalDnsQueryTypesEnabled[]; -extern const char kRegisteredProtocolHandlers[]; -extern const char kIgnoredProtocolHandlers[]; -extern const char kPolicyRegisteredProtocolHandlers[]; -extern const char kPolicyIgnoredProtocolHandlers[]; -extern const char kCustomHandlersEnabled[]; - #if defined(OS_MAC) extern const char kUserRemovedLoginItem[]; extern const char kChromeCreatedLoginItem[];
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index bddf772..7c601387 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -588,14 +588,13 @@ new webapps::WebPageMetadataAgent(render_frame); #if defined(OS_ANDROID) - const base::Feature& kSearchResultExtractorFeature = - features::kContinuousSearch; + const bool search_result_extractor_enabled = + base::FeatureList::IsEnabled(features::kContinuousSearch); #else - const base::Feature& kSearchResultExtractorFeature = - history_clusters::kJourneys; + const bool search_result_extractor_enabled = + history_clusters::IsJourneysEnabled(RenderThread::Get()->GetLocale()); #endif - if (render_frame->IsMainFrame() && - base::FeatureList::IsEnabled(kSearchResultExtractorFeature)) { + if (render_frame->IsMainFrame() && search_result_extractor_enabled) { continuous_search::SearchResultExtractorImpl::Create(render_frame); }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index ca93132..6c26f0e 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -230,6 +230,7 @@ "//components/captive_portal/core:test_support", "//components/consent_auditor:test_support", "//components/content_settings/core/browser", + "//components/custom_handlers/", "//components/domain_reliability", "//components/federated_learning", "//components/find_in_page", @@ -256,6 +257,7 @@ "//components/profile_metrics", "//components/safe_browsing/core/browser/db:database_manager", "//components/safe_browsing/core/browser/db:v4_test_util", + "//components/safe_browsing/core/browser/tailored_security_service:tailored_security_service", "//components/search_engines:test_support", "//components/sessions:test_support", "//components/signin/public/base:test_support", @@ -5251,6 +5253,7 @@ "//components/content_settings/browser/ui", "//components/content_settings/core/test:test_support", "//components/country_codes", + "//components/custom_handlers", "//components/data_reduction_proxy/core/browser:test_support", "//components/data_use_measurement/core", "//components/download/public/background_service/test:test_support", @@ -7367,6 +7370,7 @@ "../browser/safe_browsing/incident_reporting/tracked_preference_incident_unittest.cc", "../browser/safe_browsing/local_two_phase_testserver.cc", "../browser/safe_browsing/local_two_phase_testserver.h", + "../browser/safe_browsing/tailored_security/tailored_security_url_observer_unittest.cc", "../browser/safe_browsing/verdict_cache_manager_factory_unittest.cc", "../common/safe_browsing/binary_feature_extractor_unittest.cc", "../common/safe_browsing/download_type_util_unittest.cc", @@ -8412,6 +8416,7 @@ "//components/bookmarks/common", "//components/constrained_window", "//components/content_settings/browser", + "//components/custom_handlers", "//components/embedder_support", "//components/enterprise:test_support", "//components/feature_engagement/public",
diff --git a/chrome/test/base/test_browser_window.cc b/chrome/test/base/test_browser_window.cc index 6c07447..9d8ae428 100644 --- a/chrome/test/base/test_browser_window.cc +++ b/chrome/test/base/test_browser_window.cc
@@ -112,6 +112,10 @@ return nullptr; } +const ui::ColorProvider* TestBrowserWindow::GetColorProvider() const { + return nullptr; +} + int TestBrowserWindow::GetTopControlsHeight() const { return 0; }
diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h index 5d37231..3ff5677 100644 --- a/chrome/test/base/test_browser_window.h +++ b/chrome/test/base/test_browser_window.h
@@ -73,6 +73,7 @@ bool DoBrowserControlsShrinkRendererSize( const content::WebContents* contents) const override; ui::NativeTheme* GetNativeTheme() override; + const ui::ColorProvider* GetColorProvider() const override; int GetTopControlsHeight() const override; void SetTopControlsGestureScrollInProgress(bool in_progress) override; StatusBubble* GetStatusBubble() override;
diff --git a/chrome/test/chromedriver/capabilities.cc b/chrome/test/chromedriver/capabilities.cc index 8c04f20..5348f9b 100644 --- a/chrome/test/chromedriver/capabilities.cc +++ b/chrome/test/chromedriver/capabilities.cc
@@ -317,11 +317,11 @@ {"ftpProxy", "ftp"}, {"httpProxy", "http"}, {"sslProxy", "https"}, {"socksProxy", "socks"}}; const std::string kSocksProxy = "socksProxy"; - const base::Value* option_value = NULL; + const base::Value* option_value = nullptr; std::string proxy_servers; for (size_t i = 0; i < base::size(proxy_servers_options); ++i) { - if (!proxy_dict->Get(proxy_servers_options[i][0], &option_value) || - option_value->is_none()) { + option_value = proxy_dict->FindPath(proxy_servers_options[i][0]); + if (option_value == nullptr || option_value->is_none()) { continue; } if (!option_value->is_string()) { @@ -352,7 +352,8 @@ } std::string proxy_bypass_list; - if (proxy_dict->Get("noProxy", &option_value) && !option_value->is_none()) { + option_value = proxy_dict->FindPath("noProxy"); + if (option_value != nullptr && !option_value->is_none()) { // W3C requires noProxy to be a list of strings, while legacy protocol // requires noProxy to be a string of comma-separated items. // In practice, library implementations are not always consistent,
diff --git a/chrome/test/chromedriver/chrome/console_logger.cc b/chrome/test/chromedriver/chrome/console_logger.cc index 0d92a502..83fbd76 100644 --- a/chrome/test/chromedriver/chrome/console_logger.cc +++ b/chrome/test/chromedriver/chrome/console_logger.cc
@@ -155,8 +155,8 @@ if (current_arg.GetString("type", &arg_type) && arg_type == "undefined") { temp_text = "undefined"; } else if (!current_arg.GetString("description", &temp_text)) { - const base::Value* value = nullptr; - if (!current_arg.Get("value", &value)) { + const base::Value* value = current_arg.FindKey("value"); + if (value == nullptr) { return Status(kUnknownError, "missing or invalid arg value"); } if (!base::JSONWriter::Write(*value, &temp_text)) {
diff --git a/chrome/test/chromedriver/chrome/dom_tracker.cc b/chrome/test/chromedriver/chrome/dom_tracker.cc index 1453acee..91b9980 100644 --- a/chrome/test/chromedriver/chrome/dom_tracker.cc +++ b/chrome/test/chromedriver/chrome/dom_tracker.cc
@@ -40,8 +40,7 @@ return status; } - const base::Value* root; - if (result->Get("root", &root)) { + if (const base::Value* root = result->FindKey("root")) { ProcessNode(*root); } else { status = @@ -55,8 +54,8 @@ const std::string& method, const base::DictionaryValue& params) { if (method == "DOM.setChildNodes") { - const base::Value* nodes; - if (!params.Get("nodes", &nodes)) + const base::Value* nodes = params.FindKey("nodes"); + if (nodes == nullptr) return Status(kUnknownError, "DOM.setChildNodes missing 'nodes'"); if (!ProcessNodeList(*nodes)) { @@ -66,8 +65,8 @@ "DOM.setChildNodes has invalid 'nodes': " + json); } } else if (method == "DOM.childNodeInserted") { - const base::Value* node; - if (!params.Get("node", &node)) + const base::Value* node = params.FindKey("node"); + if (node == nullptr) return Status(kUnknownError, "DOM.childNodeInserted missing 'node'"); if (!ProcessNode(*node)) { @@ -105,8 +104,7 @@ if (dict->GetString("frameId", &frame_id)) node_to_frame_map_.insert(std::make_pair(node_id, frame_id)); - const base::Value* children; - if (dict->Get("children", &children)) + if (const base::Value* children = dict->FindKey("children")) return ProcessNodeList(*children); return true; }
diff --git a/chrome/test/chromedriver/chrome/frame_tracker.cc b/chrome/test/chromedriver/chrome/frame_tracker.cc index bccad6f..01919c5 100644 --- a/chrome/test/chromedriver/chrome/frame_tracker.cc +++ b/chrome/test/chromedriver/chrome/frame_tracker.cc
@@ -154,8 +154,7 @@ "missing frameId in Page.frameDetached event"); attached_frames_.erase(frame_id); } else if (method == "Page.frameNavigated") { - const base::Value* unused_value; - if (!params.Get("frame.parentId", &unused_value)) + if (!params.FindPath("frame.parentId")) frame_to_context_map_.clear(); } else if (method == "Target.attachedToTarget") { std::string type, target_id, session_id;
diff --git a/chrome/test/chromedriver/chrome/geolocation_override_manager.cc b/chrome/test/chromedriver/chrome/geolocation_override_manager.cc index 76d9b61..a1ba864 100644 --- a/chrome/test/chromedriver/chrome/geolocation_override_manager.cc +++ b/chrome/test/chromedriver/chrome/geolocation_override_manager.cc
@@ -34,8 +34,7 @@ const std::string& method, const base::DictionaryValue& params) { if (method == "Page.frameNavigated") { - const base::Value* unused_value; - if (!params.Get("frame.parentId", &unused_value)) + if (!params.FindPath("frame.parentId")) return ApplyOverrideIfNeeded(); } return Status(kOk);
diff --git a/chrome/test/chromedriver/chrome/mobile_emulation_override_manager.cc b/chrome/test/chromedriver/chrome/mobile_emulation_override_manager.cc index 7cd27e9..5048628 100644 --- a/chrome/test/chromedriver/chrome/mobile_emulation_override_manager.cc +++ b/chrome/test/chromedriver/chrome/mobile_emulation_override_manager.cc
@@ -30,8 +30,7 @@ const std::string& method, const base::DictionaryValue& params) { if (method == "Page.frameNavigated") { - const base::Value* unused_value; - if (!params.Get("frame.parentId", &unused_value)) + if (!params.FindPath("frame.parentId")) return ApplyOverrideIfNeeded(); } return Status(kOk);
diff --git a/chrome/test/chromedriver/chrome/network_conditions_override_manager.cc b/chrome/test/chromedriver/chrome/network_conditions_override_manager.cc index 5c3b5ac1..22c9256 100644 --- a/chrome/test/chromedriver/chrome/network_conditions_override_manager.cc +++ b/chrome/test/chromedriver/chrome/network_conditions_override_manager.cc
@@ -35,8 +35,7 @@ const std::string& method, const base::DictionaryValue& params) { if (method == "Page.frameNavigated") { - const base::Value* unused_value; - if (!params.Get("frame.parentId", &unused_value)) + if (!params.FindPath("frame.parentId")) return ApplyOverrideIfNeeded(); } return Status(kOk);
diff --git a/chrome/test/chromedriver/chrome/web_view_impl.cc b/chrome/test/chromedriver/chrome/web_view_impl.cc index b868583..389374981 100644 --- a/chrome/test/chromedriver/chrome/web_view_impl.cc +++ b/chrome/test/chromedriver/chrome/web_view_impl.cc
@@ -1244,8 +1244,7 @@ return Status(static_cast<StatusCode>(status_code), message); } - base::Value* value = NULL; - if (result_info->Get("value", &value)) { + if (base::Value* value = result_info->FindKey("value")) { *result = base::Value::ToUniquePtrValue(value->Clone()); return Status(kOk); } @@ -1454,8 +1453,8 @@ if (type == "undefined") { *result = std::make_unique<base::Value>(); } else { - base::Value* value; - if (!temp_result->Get("value", &value)) + base::Value* value = temp_result->FindKey("value"); + if (value == nullptr) return Status(kUnknownError, "Runtime.evaluate missing 'value'"); *result = base::Value::ToUniquePtrValue(value->Clone()); } @@ -1477,8 +1476,8 @@ dict->GetString("value", &message); return Status(static_cast<StatusCode>(status_code), message); } - const base::Value* unscoped_value; - if (!dict->Get("value", &unscoped_value)) { + const base::Value* unscoped_value = dict->FindKey("value"); + if (unscoped_value == nullptr) { // Missing 'value' indicates the JavaScript code didn't return a value. return Status(kOk); }
diff --git a/chrome/test/chromedriver/chrome_launcher.cc b/chrome/test/chromedriver/chrome_launcher.cc index 9865316..711a3de 100644 --- a/chrome/test/chromedriver/chrome_launcher.cc +++ b/chrome/test/chromedriver/chrome_launcher.cc
@@ -895,8 +895,7 @@ std::string bg_page_name; bool persistent = manifest->FindBoolPath("background.persistent").value_or(true); - const base::Value* unused_value; - if (manifest->Get("background.scripts", &unused_value)) + if (manifest->FindPath("background.scripts")) bg_page_name = "_generated_background_page.html"; manifest->GetString("background.page", &bg_page_name); if (bg_page_name.empty() || !persistent)
diff --git a/chrome/test/chromedriver/element_commands.cc b/chrome/test/chromedriver/element_commands.cc index 55304ca8..4a2bbbb 100644 --- a/chrome/test/chromedriver/element_commands.cc +++ b/chrome/test/chromedriver/element_commands.cc
@@ -531,7 +531,8 @@ base::ListValue key_list_local; const base::Value* text = nullptr; if (session->w3c_compliant) { - if (!params.Get("text", &text) || !text->is_string()) + text = params.FindKey("text"); + if (text == nullptr || !text->is_string()) return Status(kInvalidArgument, "'text' must be a string"); key_list_local.Set(0, std::make_unique<base::Value>(text->Clone())); key_list = &key_list_local;
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc index 5b0e74a..09bf933 100644 --- a/chrome/test/chromedriver/session_commands.cc +++ b/chrome/test/chromedriver/session_commands.cc
@@ -452,8 +452,8 @@ // Currently, we only check "browserName", "platformName", and webauthn // capabilities but more can be added as necessary. bool MatchCapabilities(const base::DictionaryValue* capabilities) { - const base::Value* name; - if (capabilities->Get("browserName", &name) && !name->is_none()) { + const base::Value* name = capabilities->FindKey("browserName"); + if (name && !name->is_none()) { if (!(name->is_string() && name->GetString() == kBrowserCapabilityName)) return false; } @@ -465,9 +465,9 @@ bool is_android = has_chrome_options && chrome_options->FindStringKey("androidPackage") != nullptr; - const base::Value* platform_name_value; - if (capabilities->Get("platformName", &platform_name_value) && - !platform_name_value->is_none()) { + const base::Value* platform_name_value = + capabilities->FindPath("platformName"); + if (platform_name_value && !platform_name_value->is_none()) { if (platform_name_value->is_string()) { std::string requested_platform_name = platform_name_value->GetString(); std::string requested_first_token =
diff --git a/chrome/test/chromedriver/util.cc b/chrome/test/chromedriver/util.cc index 78485e3..711269fa 100644 --- a/chrome/test/chromedriver/util.cc +++ b/chrome/test/chromedriver/util.cc
@@ -491,8 +491,8 @@ bool (base::Value::*getter)(T*) const) { if (has_value != nullptr) *has_value = false; - const base::Value* value; - if (!dict->Get(path, &value)) + const base::Value* value = dict->FindPath(path); + if (value == nullptr) return true; if ((value->*getter)(out_value)) { if (has_value != nullptr)
diff --git a/chrome/test/chromedriver/window_commands.cc b/chrome/test/chromedriver/window_commands.cc index cf22fb8..816a11af 100644 --- a/chrome/test/chromedriver/window_commands.cc +++ b/chrome/test/chromedriver/window_commands.cc
@@ -858,8 +858,8 @@ const base::DictionaryValue& params, std::unique_ptr<base::Value>* value, Timeout* timeout) { - const base::Value* id; - if (!params.Get("id", &id)) + const base::Value* id = params.FindKey("id"); + if (id == nullptr) return Status(kInvalidArgument, "missing 'id'"); if (id->is_none()) { @@ -2640,7 +2640,8 @@ double x = 0; double y = 0; - bool has_x = params.Get("x", &temp) && !temp->is_none(); + temp = params.FindKey("x"); + bool has_x = temp && !temp->is_none(); if (has_x) { if (!temp->is_double() && !temp->is_int()) return Status(kInvalidArgument, "'x' must be a number"); @@ -2649,7 +2650,8 @@ return Status(kInvalidArgument, "'x' out of range"); } - bool has_y = params.Get("y", &temp) && !temp->is_none(); + temp = params.FindKey("y"); + bool has_y = temp && !temp->is_none(); if (has_y) { if (!temp->is_double() && !temp->is_int()) return Status(kInvalidArgument, "'y' must be a number"); @@ -2658,7 +2660,8 @@ return Status(kInvalidArgument, "'y' out of range"); } - bool has_width = params.Get("width", &temp) && !temp->is_none(); + temp = params.FindKey("width"); + bool has_width = temp && !temp->is_none(); if (has_width) { if (!temp->is_double() && !temp->is_int()) return Status(kInvalidArgument, "'width' must be a number"); @@ -2667,7 +2670,8 @@ return Status(kInvalidArgument, "'width' out of range"); } - bool has_height = params.Get("height", &temp) && !temp->is_none(); + temp = params.FindKey("height"); + bool has_height = temp && !temp->is_none(); if (has_height) { if (!temp->is_double() && !temp->is_int()) return Status(kInvalidArgument, "'height' must be a number");
diff --git a/chrome/test/data/nacl/BUILD.gn b/chrome/test/data/nacl/BUILD.gn index 0daeac7..b57d6a1 100644 --- a/chrome/test/data/nacl/BUILD.gn +++ b/chrome/test/data/nacl/BUILD.gn
@@ -412,113 +412,3 @@ } } } - -if ((is_linux || is_chromeos) && is_clang) { - if (target_cpu == "x86") { - arch = "x86_32" - } else if (target_cpu == "x64") { - arch = "x86_64" - } else { - arch = target_cpu - } - - # TODO(https://crbug.com/1273132): Can this be deleted? - config("nonsfi_libc_free_nexe_config") { - cflags = [ - "-Wno-sign-compare", - - # Stack-Smashing protector does not work with libc-free context. - "-fno-stack-protector", - - # Optimizers may translate the original code to code which - # requires builtin functions and/or relocations. Specifically, - # the LLVM's optimizer translates for-loop based zero - # clear to memset. - "-O0", - - # ARM GCC emits symbols like __aeabi_unwind_cpp_pr0 in - # .exidx sections without this flag. - "-fno-unwind-tables", - ] - - # Workaround against LLVM bug. - # In short, an LTO optimization pass might recognize - # naive implementations of builtins (such as memset) - # and replace them with references to the real builtins, - # which, in the case of -nostdlib, might cause the binary - # to get undefined references to those symbols. - # - # See more details: - # https://llvm.org/bugs/show_bug.cgi?id=30403 - if (use_thin_lto) { - if (use_lld) { - ldflags = [ "-Wl,--lto-O0" ] - } else { - ldflags = [ "-Wl,-plugin-opt,O0" ] - } - } - } - - executable("nonsfi_libc_free_nexe") { - output_name = "libc_free_$arch" - output_extension = "nexe" - sources = [ "nonsfi/libc_free.c" ] - deps = [ "//ppapi/c" ] - - no_default_deps = true - - # Here, we would like to link a relocatable, libc-free executable. - # -shared/-fPIC make this binary relocatable. -nostdlib ensures - # this is libc-free. - # The program does not apply any dynamic relocations at start up, - # so it cannot rely on relocations having been applied. - # In addition, -fvisibility=hidden avoids creating some types - # of relocation. - cflags = [ - "-fPIC", - "-fvisibility=hidden", - ] - ldflags = [ - "-nostdlib", - "-shared", - - # This binary cannot relocate itself, so we should have no - # undefined references left. - "-Wl,--no-undefined", - - # Silence the warning about the unused '-pthread' argument. - # TODO(gn): Come up with a way to remove the -pthread flag instead. - "-Qunused-arguments", - ] - defines = [ "NACL_LINUX=1" ] - include_dirs = [ "../../../.." ] - - # Do not use any sanitizers or coverage tools, which require a few symbols. - configs -= [ "//build/config/sanitizers:default_sanitizer_flags" ] - configs -= [ "//build/config/coverage:default_coverage" ] - - # Do not use PGO as it also requires a few symbols. - configs -= [ "//build/config/compiler/pgo:default_pgo_flags" ] - - # Disable default_init_stack_vars because it inserts memset() calls, but - # memset() is not available in this libc-free context. - configs -= [ "//build/config/compiler:default_init_stack_vars" ] - configs += [ ":nonsfi_libc_free_nexe_config" ] - } - - copy("nonsfi_libc_free") { - sources = [ - "${root_out_dir}/libc_free_${arch}.nexe", - - # TODO(ncbray) move into chrome/test/data/nacl when all tests are - # converted. - "//ppapi/native_client/tools/browser_tester/browserdata/nacltest.js", - "nonsfi/irt_test.html", - "nonsfi/libc_free.html", - "nonsfi/libc_free.nmf", - ] - outputs = - [ "${root_build_dir}/nacl_test_data/libc-free/{{source_file_part}}" ] - deps = [ ":nonsfi_libc_free_nexe" ] - } -}
diff --git a/chrome/test/data/nacl/nonsfi/irt_test.html b/chrome/test/data/nacl/nonsfi/irt_test.html deleted file mode 100644 index 8094627..0000000 --- a/chrome/test/data/nacl/nonsfi/irt_test.html +++ /dev/null
@@ -1,47 +0,0 @@ -<html> -<!-- -Copyright 2014 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> -<!-- libc_free.html tests for basic load up. This file contains test -about IRT functionality. --> -<head> -<title>NonSFI NaCl IRT Basic Test</title> -</head> -<body> -<h2>NonSFI NaCl IRT Basic Test</h2> -<script type="text/javascript" src="nacltest.js"> </script> -<script> - -function create(manifest_url) { - var embed = document.createElement('embed'); - embed.src = manifest_url; - embed.type = 'application/x-nacl'; - embed.basic_tests = '2'; - embed.stress_tests = '0'; - return embed; -} - -function setupTests(tester, plugin) { - tester.addAsyncTest('TestRandom', function(status) { - plugin.addEventListener('message', function(message_event) { - this.removeEventListener('message', arguments.callee, false); - status.assertEqual(message_event.data, 'randomsuccess'); - status.pass(); - }, false); - plugin.postMessage('random'); - }); -}; - -var embed = create("libc_free.nmf"); -document.body.appendChild(embed); - -var tester = new Tester(); -setupTests(tester, embed); -tester.waitFor(embed); -tester.run(); - -</script> -</body> -</html>
diff --git a/chrome/test/data/nacl/nonsfi/libc_free.c b/chrome/test/data/nacl/nonsfi/libc_free.c deleted file mode 100644 index d6b1a4a..0000000 --- a/chrome/test/data/nacl/nonsfi/libc_free.c +++ /dev/null
@@ -1,240 +0,0 @@ -/* - * Copyright 2014 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -/* - * This is a minimal NaCl program without libc. It uses NaCl's stable IRT ABI. - */ - -#include <stddef.h> -#include <stdint.h> - -#include "native_client/src/include/elf_auxv.h" -#include "native_client/src/untrusted/irt/irt.h" -#include "ppapi/c/pp_errors.h" -#include "ppapi/c/ppb_messaging.h" -#include "ppapi/c/ppb_var.h" -#include "ppapi/c/ppp_instance.h" -#include "ppapi/c/ppp_messaging.h" -#include "ppapi/nacl_irt/public/irt_ppapi.h" - -static struct nacl_irt_basic __libnacl_irt_basic; -static struct nacl_irt_random __libnacl_irt_random; -static TYPE_nacl_irt_query __nacl_irt_query; -static struct PPP_Instance_1_0 ppp_instance; -static struct PPP_Messaging_1_0 ppp_messaging; -static const struct PPB_Messaging_1_0* ppb_messaging; -static const struct PPB_Var_1_2* ppb_var; - -/* - * To support 64bit binary, we declare Elf_auxv_t by using uintptr_t. - * See also native_client/src/include/elf32.h. - */ -typedef struct { - uintptr_t a_type; - union { - uintptr_t a_val; - } a_un; -} Elf_auxv_t; - -/* - * This is simiplar to the one in - * native_client/src/untrusted/nacl/nacl_startup.h, but also supports 64 bit - * pointers. - */ -static Elf_auxv_t* nacl_startup_auxv(const uintptr_t info[]) { - /* The layout of _start's argument is - * info[0]: fini. - * info[1]: envc - * info[2]: argc - * info[3]...[3+argc]: argv (NULL terminated) - * info[3+argc+1]...[3+argc+1+envc]: envv (NULL terminated) - * info[3+argc+1+envc+1]: auxv pairs. - */ - int envc = info[1]; - int argc = info[2]; - return (Elf_auxv_t*) (info + 3 + envc + 1 + argc + 1); -} - -static void grok_auxv(const Elf_auxv_t* auxv) { - const Elf_auxv_t* av; - for (av = auxv; av->a_type != AT_NULL; ++av) { - if (av->a_type == AT_SYSINFO) { - __nacl_irt_query = (TYPE_nacl_irt_query) av->a_un.a_val; - } - } -} - -#define DO_QUERY(ident, name) __nacl_irt_query(ident, &name, sizeof(name)) - -static int my_strcmp(const char* a, const char* b) { - while (*a == *b) { - if (*a == '\0') - return 0; - ++a; - ++b; - } - return (int) (unsigned char) *a - (int) (unsigned char) *b; -} - -static int my_strncmp(const char* a, const char* b, size_t n) { - while (n > 0 && *a == *b) { - if (*a == '\0') - return 0; - ++a; - ++b; - --n; - } - if (n == 0) { - return 0; - } - return (int) (unsigned char) *a - (int) (unsigned char) *b; -} - -static size_t my_strlen(const char* a) { - size_t size = 0; - while (*a++) - size++; - return size; -} - -static PP_Bool DidCreate(PP_Instance instance, - uint32_t argc, - const char* argn[], - const char* argv[]) { - return 1; -} - -static void DidDestroy(PP_Instance instance) { -} - -static void DidChangeView(PP_Instance instance, - const struct PP_Rect* position, - const struct PP_Rect* clip) { -} - -static void DidChangeFocus(PP_Instance instance, PP_Bool has_focus) { -} - -static PP_Bool HandleDocumentLoad(PP_Instance instance, - PP_Resource url_loader) { - return 0; -} - -static int32_t MyPPP_InitializeModule(PP_Module module_id, - PPB_GetInterface get_browser_interface) { - ppb_messaging = get_browser_interface(PPB_MESSAGING_INTERFACE_1_0); - ppb_var = get_browser_interface(PPB_VAR_INTERFACE_1_2); - return PP_OK; -} - -static void MyPPP_ShutdownModule(void) { -} - -static const void* MyPPP_GetInterface(const char* interface_name) { - if (my_strcmp(interface_name, PPP_INSTANCE_INTERFACE_1_0) == 0) - return &ppp_instance; - if (my_strcmp(interface_name, PPP_MESSAGING_INTERFACE_1_0) == 0) - return &ppp_messaging; - return NULL; -} - -static void PostStringMessage(PP_Instance instance, - const char* message_string) { - size_t message_length = my_strlen(message_string); - struct PP_Var message = ppb_var->VarFromUtf8( - message_string, message_length); - ppb_messaging->PostMessage(instance, message); - ppb_var->Release(message); -} - -static void TestRandom(PP_Instance instance) { - // Javascript expects "randomsuccess", we will send back a different - // string via PostMessage to denote a failure, and that will be - // visible in the failure logs. - - char random_buffer[512]; - int i; - // zero-clear the buffer. - for (i = 0; i < sizeof random_buffer; ++i) { - random_buffer[i] = 0; - } - - size_t read_len; - if (__libnacl_irt_random.get_random_bytes(random_buffer, - sizeof random_buffer, - &read_len) != 0) { - PostStringMessage(instance, "Get Random Bytes Failed."); - return; - } - - // Try to see if the buffer looks different from bunch of zeros. - if (read_len != sizeof random_buffer) { - PostStringMessage(instance, "Give me moar random bytes"); - return; - } - int num_zeroes = 0; - for (i = 0; i < sizeof random_buffer; ++i) { - if (random_buffer[i] == 0) { - num_zeroes++; - } - } - if (num_zeroes > 100) { - PostStringMessage(instance, "Too many zeros in this random stream."); - return; - } - - PostStringMessage(instance, "randomsuccess"); -} - -// Handle message from javascript, javascript side will tell me what -// kind of test it wants, and I will respond accordingly. -static void HandleMessage(PP_Instance instance, struct PP_Var message) { - if (!ppb_messaging || !ppb_var || message.type != PP_VARTYPE_STRING) { - __libnacl_irt_basic.exit(1); - } - - uint32_t message_len; - const char* message_string = ppb_var->VarToUtf8(message, &message_len); - - if (!my_strncmp("Message from Javascript to NaCl", - message_string, message_len)) { - // Reply back with what we received. - ppb_messaging->PostMessage(instance, message); - } else if (!my_strncmp("random", message_string, message_len)) { - TestRandom(instance); - } else { - // Unknown message came. - PostStringMessage(instance, "Unknown message type"); - } -} - -void _start(uintptr_t info[]) { - Elf_auxv_t* auxv = nacl_startup_auxv(info); - grok_auxv(auxv); - DO_QUERY(NACL_IRT_BASIC_v0_1, __libnacl_irt_basic); - DO_QUERY(NACL_IRT_RANDOM_v0_1, __libnacl_irt_random); - - struct nacl_irt_ppapihook ppapihook; - DO_QUERY(NACL_IRT_PPAPIHOOK_v0_1, ppapihook); - - /* This is local as a workaround to avoid having to apply - * relocations to global variables. */ - struct PP_StartFunctions start_funcs; - start_funcs.PPP_InitializeModule = MyPPP_InitializeModule; - start_funcs.PPP_ShutdownModule = MyPPP_ShutdownModule; - start_funcs.PPP_GetInterface = MyPPP_GetInterface; - /* Similarly, initialize some global variables, avoiding relocations. */ - ppp_instance.DidCreate = DidCreate; - ppp_instance.DidDestroy = DidDestroy; - ppp_instance.DidChangeView = DidChangeView; - ppp_instance.DidChangeFocus = DidChangeFocus; - ppp_instance.HandleDocumentLoad = HandleDocumentLoad; - ppp_messaging.HandleMessage = HandleMessage; - - ppapihook.ppapi_start(&start_funcs); - - __libnacl_irt_basic.exit(0); -}
diff --git a/chrome/test/data/nacl/nonsfi/libc_free.html b/chrome/test/data/nacl/nonsfi/libc_free.html deleted file mode 100644 index 0ca9e22..0000000 --- a/chrome/test/data/nacl/nonsfi/libc_free.html +++ /dev/null
@@ -1,58 +0,0 @@ -<html> -<!-- -Copyright 2014 The Chromium Authors. All rights reserved. -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> -<!-- This file has tests to make sure Non-SFI NaCl loads and starts -up. libc_free.c is shared with irt_test.html where more IRT tests are -done. --> -<head> -<title>NaCl Load Test</title> -</head> -<body> -<h2>NaCl Load Test</h2> -</body> -<script type="text/javascript" src="nacltest.js"> </script> -<script> - -function report(msg) { - // The automation controller seems to choke on Objects, so turn them into - // strings. - domAutomationController.send(JSON.stringify(msg)); -} - -function create(manifest_url) { - var embed = document.createElement("embed"); - embed.src = manifest_url; - embed.type = "application/x-nacl"; - - embed.addEventListener("error", function(evt) { - report({type: "Log", message: "Load error: " + embed.lastError}); - report({type: "Shutdown", message: "1 test failed.", passed: false}); - }, true); - - embed.addEventListener("load", function(evt) { - report({type: "Log", message: "Load is completed."}); - // The loading is successfully done, so send a message to plugin. - // The message should be relayed back to the Javascript code. - embed.postMessage("Message from Javascript to NaCl"); - }, true); - - embed.addEventListener("message", function(message) { - if (message.data != "Message from Javascript to NaCl") { - report({type: "Log", message: "Post Message error: " + message.data}); - report({type: "Shutdown", message: "1 test failed.", passed: false}); - return; - } - - // Message is sent back. So, the test passes. - report({type: "Shutdown", message: "1 test passed.", passed: true}); - }, true); - - document.body.appendChild(embed); -} - -create("libc_free.nmf"); -</script> -</html>
diff --git a/chrome/test/data/nacl/nonsfi/libc_free.nmf b/chrome/test/data/nacl/nonsfi/libc_free.nmf deleted file mode 100644 index 04bc87a..0000000 --- a/chrome/test/data/nacl/nonsfi/libc_free.nmf +++ /dev/null
@@ -1,13 +0,0 @@ -{ - "program": { - "x86-32-nonsfi": { - "url": "libc_free_x86_32.nexe" - }, - "x86-64-nonsfi": { - "url": "libc_free_x86_64.nexe" - }, - "arm-nonsfi": { - "url": "libc_free_arm.nexe" - } - } -}
diff --git a/chrome/test/data/webui/print_preview/BUILD.gn b/chrome/test/data/webui/print_preview/BUILD.gn index d7090e7..78d9ef68 100644 --- a/chrome/test/data/webui/print_preview/BUILD.gn +++ b/chrome/test/data/webui/print_preview/BUILD.gn
@@ -23,9 +23,9 @@ "native_layer_stub.ts", "policy_test.ts", "preview_generation_test.ts", - "print_button_test.js", - "print_preview_app_test.js", - "print_preview_sidebar_test.js", + "print_button_test.ts", + "print_preview_app_test.ts", + "print_preview_sidebar_test.ts", "print_preview_test_utils.ts", "restore_state_test.js", "user_manager_test.js",
diff --git a/chrome/test/data/webui/print_preview/print_button_test.js b/chrome/test/data/webui/print_preview/print_button_test.ts similarity index 61% rename from chrome/test/data/webui/print_preview/print_button_test.js rename to chrome/test/data/webui/print_preview/print_button_test.ts index 8a004cb..4e1cd3c8 100644 --- a/chrome/test/data/webui/print_preview/print_button_test.js +++ b/chrome/test/data/webui/print_preview/print_button_test.ts
@@ -2,8 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {Destination, GooglePromotedDestinationId, NativeLayerImpl, PluginProxyImpl, PrintPreviewAppElement} from 'chrome://print/print_preview.js'; +import {CrButtonElement, NativeInitialSettings, NativeLayerImpl, PluginProxyImpl, PrintPreviewAppElement, PrintTicket} from 'chrome://print/print_preview.js'; +// <if expr="chromeos or lacros"> +import {GooglePromotedDestinationId} from 'chrome://print/print_preview.js'; +// </if> import {assert} from 'chrome://resources/js/assert.m.js'; +import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; // <if expr="chromeos or lacros"> import {setNativeLayerCrosInstance} from './native_layer_cros_stub.js'; @@ -13,33 +17,28 @@ import {getDefaultInitialSettings} from './print_preview_test_utils.js'; import {TestPluginProxy} from './test_plugin_proxy.js'; - -window.print_button_test = {}; -print_button_test.suiteName = 'PrintButtonTest'; -/** @enum {string} */ -print_button_test.TestNames = { - LocalPrintHidePreview: 'local print hide preview', - PDFPrintVisiblePreview: 'pdf print visible preview', - SaveToDriveVisiblePreviewCros: 'save to drive visible preview cros', +const print_button_test = { + suiteName: 'PrintButtonTest', + TestNames: { + LocalPrintHidePreview: 'local print hide preview', + PDFPrintVisiblePreview: 'pdf print visible preview', + SaveToDriveVisiblePreviewCros: 'save to drive visible preview cros', + }, }; +Object.assign(window, {print_button_test: print_button_test}); + suite(print_button_test.suiteName, function() { - /** @type {?PrintPreviewAppElement} */ - let page = null; + let page: PrintPreviewAppElement; - /** @type {?NativeLayer} */ - let nativeLayer = null; + let nativeLayer: NativeLayerStub; - /** @type {boolean} */ - let printBeforePreviewReady = false; + let printBeforePreviewReady: boolean = false; - /** @type {boolean} */ - let previewHidden = false; + let previewHidden: boolean = false; - /** @type {!NativeInitialSettings} */ - const initialSettings = getDefaultInitialSettings(); + const initialSettings: NativeInitialSettings = getDefaultInitialSettings(); - /** @override */ setup(function() { nativeLayer = new NativeLayerStub(); NativeLayerImpl.setInstance(nativeLayer); @@ -64,11 +63,13 @@ // loading, since previewArea.onPluginLoadComplete_() indicates to the UI // that the preview is ready. if (printBeforePreviewReady) { - const sidebar = page.shadowRoot.querySelector('print-preview-sidebar'); + const sidebar = + page.shadowRoot!.querySelector('print-preview-sidebar')!; const parentElement = - sidebar.shadowRoot.querySelector('print-preview-button-strip'); + sidebar.shadowRoot!.querySelector('print-preview-button-strip')!; const printButton = - parentElement.shadowRoot.querySelector('.action-button'); + parentElement.shadowRoot!.querySelector<CrButtonElement>( + '.action-button')!; assertFalse(printButton.disabled); printButton.click(); } @@ -80,14 +81,12 @@ }); }); - function waitForInitialPreview() { - return nativeLayer.whenCalled('getInitialSettings').then(function() { - // Wait for the preview request. - return Promise.all([ - nativeLayer.whenCalled('getPrinterCapabilities'), - nativeLayer.whenCalled('getPreview') - ]); - }); + function waitForInitialPreview(): Promise<any> { + return Promise.all([ + nativeLayer.whenCalled('getInitialSettings'), + nativeLayer.whenCalled('getPrinterCapabilities'), + nativeLayer.whenCalled('getPreview'), + ]); } // Tests that hidePreview() is called before print() if a local printer is @@ -100,11 +99,12 @@ // Wait for the print request. return nativeLayer.whenCalled('print'); }) - .then(function(printTicket) { + .then(function(printTicket: string) { assertTrue(previewHidden); // Verify that the printer name is correct. - assertEquals('FooDevice', JSON.parse(printTicket).deviceName); + assertEquals( + 'FooDevice', (JSON.parse(printTicket) as PrintTicket).deviceName); return nativeLayer.whenCalled('dialogClose'); }); }); @@ -122,15 +122,16 @@ // Select Save as PDF destination const destinationSettings = - page.shadowRoot.querySelector('print-preview-sidebar') - .shadowRoot.querySelector( - 'print-preview-destination-settings'); + page.shadowRoot!.querySelector('print-preview-sidebar')! + .shadowRoot!.querySelector( + 'print-preview-destination-settings')!; const pdfDestination = - destinationSettings.destinationStore_.destinations().find( - d => d.id === 'Save as PDF'); + destinationSettings.getDestinationStoreForTest() + .destinations() + .find(d => d.id === 'Save as PDF'); assertTrue(!!pdfDestination); - destinationSettings.destinationStore_.selectDestination( - pdfDestination); + destinationSettings.getDestinationStoreForTest().selectDestination( + pdfDestination!); // Reload preview and wait for print. return nativeLayer.whenCalled('print'); @@ -139,11 +140,14 @@ assertFalse(previewHidden); // Verify that the printer name is correct. - assertEquals('Save as PDF', JSON.parse(printTicket).deviceName); + assertEquals( + 'Save as PDF', + (JSON.parse(printTicket) as PrintTicket).deviceName); return nativeLayer.whenCalled('dialogClose'); }); }); + // <if expr="chromeos or lacros"> // Tests that hidePreview() is not called if Save to Drive is selected on // Chrome OS and the user clicks print while the preview is loading because // Save to Drive needs to be treated like Save as PDF. @@ -160,16 +164,18 @@ // Select Save as PDF destination const destinationSettings = - page.shadowRoot.querySelector('print-preview-sidebar') - .shadowRoot.querySelector( - 'print-preview-destination-settings'); + page.shadowRoot!.querySelector('print-preview-sidebar')! + .shadowRoot!.querySelector( + 'print-preview-destination-settings')!; const driveDestination = - destinationSettings.destinationStore_.destinations().find( - d => d.id === - GooglePromotedDestinationId.SAVE_TO_DRIVE_CROS); + destinationSettings.getDestinationStoreForTest() + .destinations() + .find( + d => d.id === + GooglePromotedDestinationId.SAVE_TO_DRIVE_CROS); assertTrue(!!driveDestination); - destinationSettings.destinationStore_.selectDestination( - driveDestination); + destinationSettings.getDestinationStoreForTest() + .selectDestination(driveDestination!); // Reload preview and wait for print. return nativeLayer.whenCalled('print'); @@ -180,8 +186,9 @@ // Verify that the printer name is correct. assertEquals( GooglePromotedDestinationId.SAVE_TO_DRIVE_CROS, - JSON.parse(printTicket).deviceName); + (JSON.parse(printTicket) as PrintTicket).deviceName); return nativeLayer.whenCalled('dialogClose'); }); }); + // </if> });
diff --git a/chrome/test/data/webui/print_preview/print_preview_app_test.js b/chrome/test/data/webui/print_preview/print_preview_app_test.ts similarity index 69% rename from chrome/test/data/webui/print_preview/print_preview_app_test.js rename to chrome/test/data/webui/print_preview/print_preview_app_test.ts index 7f93eab..211c9817 100644 --- a/chrome/test/data/webui/print_preview/print_preview_app_test.js +++ b/chrome/test/data/webui/print_preview/print_preview_app_test.ts
@@ -2,10 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {CloudPrintInterfaceImpl, Destination, DuplexMode, NativeLayerImpl, PluginProxyImpl, PrintPreviewAppElement} from 'chrome://print/print_preview.js'; +import {CloudPrintInterfaceImpl, DuplexMode, NativeInitialSettings, NativeLayerImpl, PluginProxyImpl, PrintPreviewAppElement} from 'chrome://print/print_preview.js'; import {assert} from 'chrome://resources/js/assert.m.js'; import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js'; +import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; + import {CloudPrintInterfaceStub} from './cloud_print_interface_stub.js'; // <if expr="chromeos or lacros"> @@ -17,33 +19,30 @@ import {TestPluginProxy} from './test_plugin_proxy.js'; -window.print_preview_app_test = {}; -print_preview_app_test.suiteName = 'PrintPreviewAppTest'; -/** @enum {string} */ -print_preview_app_test.TestNames = { - PrintToGoogleDrive: 'print to google drive', - PrintPresets: 'print presets', - DestinationsManaged: 'destinations managed', - HeaderFooterManaged: 'header footer managed', - CssBackgroundManaged: 'css background managed', - SheetsManaged: 'sheets managed' +const print_preview_app_test = { + suiteName: 'PrintPreviewAppTest', + TestNames: { + PrintToGoogleDrive: 'print to google drive', + PrintPresets: 'print presets', + DestinationsManaged: 'destinations managed', + HeaderFooterManaged: 'header footer managed', + CssBackgroundManaged: 'css background managed', + SheetsManaged: 'sheets managed' + }, }; +Object.assign(window, {print_preview_app_test: print_preview_app_test}); + suite(print_preview_app_test.suiteName, function() { - /** @type {?PrintPreviewAppElement} */ - let page = null; + let page: PrintPreviewAppElement; - /** @type {?NativeLayer} */ - let nativeLayer = null; + let nativeLayer: NativeLayerStub; - /** @type {?CloudPrintInterface} */ - let cloudPrintInterface = null; + let cloudPrintInterface: CloudPrintInterfaceStub; - /** @type {?TestPluginProxy} */ - let pluginProxy = null; + let pluginProxy: TestPluginProxy; - /** @type {!NativeInitialSettings} */ - const initialSettings = { + const initialSettings: NativeInitialSettings = { isInKioskAutoPrintMode: false, isInAppKioskMode: false, thousandsDelimiter: ',', @@ -59,25 +58,25 @@ pdfPrinterDisabled: false, destinationsManaged: false, cloudPrintURL: 'cloudprint URL', - userAccounts: ['foo@chromium.org'], + previewIsFromArc: false, + uiLocale: 'en-us', }; /** * Set the native layer initial settings and attach the print preview app to * the DOM. - * @return {!Promise} Returns a promise that resolves when the 'getPreview' + * @return Returns a promise that resolves when the 'getPreview' * method is called by the preview area contained inside the app. */ - const initialize = () => { + function initialize(): Promise<void> { nativeLayer.setInitialSettings(initialSettings); nativeLayer.setLocalDestinations( [{deviceName: initialSettings.printerName, printerName: 'FooName'}]); page = document.createElement('print-preview-app'); document.body.appendChild(page); return nativeLayer.whenCalled('getPreview'); - }; + } - /** @override */ setup(function() { // Stub out the native layer, the cloud print interface, and the plugin. document.body.innerHTML = ''; @@ -96,13 +95,17 @@ test( assert(print_preview_app_test.TestNames.PrintToGoogleDrive), async () => { await initialize(); + const sidebar = + page.shadowRoot!.querySelector('print-preview-sidebar')!; + const destinationSettings = sidebar.shadowRoot!.querySelector( + 'print-preview-destination-settings')!; // Set up the UI to have a cloud printer. - page.destination_ = + destinationSettings.destination = getCloudDestination('FooCloud', 'FooName', 'foo@chromium.org'); - page.destination_.capabilities = getCddTemplate(page.destination_.id); + destinationSettings.destination.capabilities = + getCddTemplate(destinationSettings.destination.id)!.capabilities; // Trigger print. - const sidebar = page.shadowRoot.querySelector('print-preview-sidebar'); sidebar.dispatchEvent(new CustomEvent( 'print-requested', {composed: true, bubbles: true})); @@ -123,8 +126,8 @@ const copies = 2; const duplex = DuplexMode.LONG_EDGE; webUIListenerCallback('print-preset-options', true, copies, duplex); - assertEquals(copies, page.getSettingValue('copies')); - assertTrue(page.getSettingValue('duplex')); + assertEquals(copies, page.getSettingValue('copies') as number); + assertTrue(page.getSettingValue('duplex') as boolean); assertFalse(page.getSetting('duplex').setFromUi); assertFalse(page.getSetting('copies').setFromUi); }); @@ -134,7 +137,8 @@ async () => { initialSettings.destinationsManaged = true; await initialize(); - const sidebar = page.shadowRoot.querySelector('print-preview-sidebar'); + const sidebar = + page.shadowRoot!.querySelector('print-preview-sidebar')!; assertTrue(sidebar.controlsManaged); }); @@ -143,7 +147,8 @@ async () => { initialSettings.policies = {headerFooter: {allowedMode: true}}; await initialize(); - const sidebar = page.shadowRoot.querySelector('print-preview-sidebar'); + const sidebar = + page.shadowRoot!.querySelector('print-preview-sidebar')!; assertTrue(sidebar.controlsManaged); }); @@ -152,14 +157,15 @@ async () => { initialSettings.policies = {cssBackground: {allowedMode: 1}}; await initialize(); - const sidebar = page.shadowRoot.querySelector('print-preview-sidebar'); + const sidebar = + page.shadowRoot!.querySelector('print-preview-sidebar')!; assertTrue(sidebar.controlsManaged); }); test(assert(print_preview_app_test.TestNames.SheetsManaged), async () => { initialSettings.policies = {sheets: {value: 2}}; await initialize(); - const sidebar = page.shadowRoot.querySelector('print-preview-sidebar'); + const sidebar = page.shadowRoot!.querySelector('print-preview-sidebar')!; assertTrue(sidebar.controlsManaged); }); });
diff --git a/chrome/test/data/webui/print_preview/print_preview_sidebar_test.js b/chrome/test/data/webui/print_preview/print_preview_sidebar_test.ts similarity index 75% rename from chrome/test/data/webui/print_preview/print_preview_sidebar_test.js rename to chrome/test/data/webui/print_preview/print_preview_sidebar_test.ts index c51aabad..e07e4a1 100644 --- a/chrome/test/data/webui/print_preview/print_preview_sidebar_test.js +++ b/chrome/test/data/webui/print_preview/print_preview_sidebar_test.ts
@@ -4,6 +4,7 @@ import {CloudPrintInterfaceImpl, NativeLayerImpl, PrintPreviewModelElement, PrintPreviewSidebarElement} from 'chrome://print/print_preview.js'; import {assert} from 'chrome://resources/js/assert.m.js'; +import {assertEquals} from 'chrome://webui-test/chai_assert.js'; import {fakeDataBind} from 'chrome://webui-test/test_util.js'; import {CloudPrintInterfaceStub} from './cloud_print_interface_stub.js'; @@ -15,29 +16,26 @@ import {getCddTemplate} from './print_preview_test_utils.js'; -window.print_preview_sidebar_test = {}; -print_preview_sidebar_test.suiteName = 'PrintPreviewSidebarTest'; -/** @enum {string} */ -print_preview_sidebar_test.TestNames = { - SettingsSectionsVisibilityChange: 'settings sections visibility change', - SheetCountWithDuplex: 'sheet count with duplex', - SheetCountWithCopies: 'sheet count with copies', +const print_preview_sidebar_test = { + suiteName: 'PrintPreviewSidebarTest', + TestNames: { + SettingsSectionsVisibilityChange: 'settings sections visibility change', + SheetCountWithDuplex: 'sheet count with duplex', + SheetCountWithCopies: 'sheet count with copies', + }, }; +Object.assign(window, {print_preview_sidebar_test: print_preview_sidebar_test}); + suite(print_preview_sidebar_test.suiteName, function() { - /** @type {?PrintPreviewSidebarElement} */ - let sidebar = null; + let sidebar: PrintPreviewSidebarElement; - /** @type {?PrintPreviewModelElement} */ - let model = null; + let model: PrintPreviewModelElement; - /** @type {?NativeLayer} */ - let nativeLayer = null; + let nativeLayer: NativeLayerStub; - /** @type {CloudPrintInterfaceStub} */ - let cloudPrintInterface = null; + let cloudPrintInterface: CloudPrintInterfaceStub; - /** @override */ setup(function() { // Stub out the native layer and cloud print interface nativeLayer = new NativeLayerStub(); @@ -59,7 +57,7 @@ sidebar.pageCount = 1; fakeDataBind(model, sidebar, 'settings'); document.body.appendChild(sidebar); - sidebar.init(false, 'FooDevice', null); + sidebar.init(false, 'FooDevice', null, false, true); return nativeLayer.whenCalled('getPrinterCapabilities'); }); @@ -69,14 +67,17 @@ .SettingsSectionsVisibilityChange), function() { const moreSettingsElement = - sidebar.shadowRoot.querySelector('print-preview-more-settings'); + sidebar.shadowRoot!.querySelector('print-preview-more-settings')!; moreSettingsElement.$.label.click(); - const camelToKebab = s => s.replace(/([A-Z])/g, '-$1').toLowerCase(); + function camelToKebab(s: string): string { + return s.replace(/([A-Z])/g, '-$1').toLowerCase(); + } + ['copies', 'layout', 'color', 'mediaSize', 'margins', 'dpi', 'scaling', 'duplex', 'otherOptions'] .forEach(setting => { - const element = sidebar.shadowRoot.querySelector( - `print-preview-${camelToKebab(setting)}-settings`); + const element = sidebar.shadowRoot!.querySelector<HTMLElement>( + `print-preview-${camelToKebab(setting)}-settings`)!; // Show, hide and reset. [true, false, true].forEach(value => { sidebar.set(`settings.${setting}.available`, value); @@ -91,7 +92,8 @@ test( assert(print_preview_sidebar_test.TestNames.SheetCountWithDuplex), function() { - const header = sidebar.shadowRoot.querySelector('print-preview-header'); + const header = + sidebar.shadowRoot!.querySelector('print-preview-header')!; assertEquals(1, header.sheetCount); sidebar.setSetting('pages', [1, 2, 3]); assertEquals(3, header.sheetCount); @@ -106,7 +108,8 @@ test( assert(print_preview_sidebar_test.TestNames.SheetCountWithCopies), function() { - const header = sidebar.shadowRoot.querySelector('print-preview-header'); + const header = + sidebar.shadowRoot!.querySelector('print-preview-header')!; assertEquals(1, header.sheetCount); sidebar.setSetting('copies', 4); assertEquals(4, header.sheetCount);
diff --git a/chrome/test/data/webui/settings/about_page_tests.ts b/chrome/test/data/webui/settings/about_page_tests.ts index ee202f4..0254b95 100644 --- a/chrome/test/data/webui/settings/about_page_tests.ts +++ b/chrome/test/data/webui/settings/about_page_tests.ts
@@ -10,7 +10,7 @@ import {TestAboutPageBrowserProxy} from './test_about_page_browser_proxy.js'; import {TestLifetimeBrowserProxy} from './test_lifetime_browser_proxy.js'; -// <if expr="is_macosx"> +// <if expr="_google_chrome and is_macosx"> import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {PromoteUpdaterStatus} from 'chrome://settings/settings.js'; // </if> @@ -325,7 +325,7 @@ return browserProxy.whenCalled('openFeedbackDialog'); }); - // <if expr="is_macosx"> + // <if expr="_google_chrome and is_macosx"> type Scenarios = 'CANT_PROMOTE'|'CAN_PROMOTE'|'IN_BETWEEN'|'PROMOTED'; /**
diff --git a/chrome/test/data/webui/settings/clear_browsing_data_test.ts b/chrome/test/data/webui/settings/clear_browsing_data_test.ts index 0958b98..4878e41 100644 --- a/chrome/test/data/webui/settings/clear_browsing_data_test.ts +++ b/chrome/test/data/webui/settings/clear_browsing_data_test.ts
@@ -7,13 +7,18 @@ import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import { ClearBrowsingDataBrowserProxyImpl, ClearBrowsingDataResult,InstalledApp, SettingsCheckboxElement, SettingsClearBrowsingDataDialogElement, SettingsHistoryDeletionDialogElement, SettingsPasswordsDeletionDialogElement} from 'chrome://settings/lazy_load.js'; -import {CrButtonElement, loadTimeData, Router, routes, StatusAction, SyncBrowserProxyImpl} from 'chrome://settings/settings.js'; +import {CrButtonElement, loadTimeData, StatusAction, SyncBrowserProxyImpl} from 'chrome://settings/settings.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; -import {eventToPromise, isChildVisible, isVisible, whenAttributeIs} from 'chrome://webui-test/test_util.js'; +import {eventToPromise, isVisible, whenAttributeIs} from 'chrome://webui-test/test_util.js'; import {TestClearBrowsingDataBrowserProxy} from './test_clear_browsing_data_browser_proxy.js'; import {TestSyncBrowserProxy} from './test_sync_browser_proxy.js'; +// <if expr="not chromeos and not lacros"> +import {Router, routes} from 'chrome://settings/settings.js'; +import {isChildVisible} from 'chrome://webui-test/test_util.js'; +// </if> + // clang-format on function getClearBrowsingDataPrefs() { @@ -128,6 +133,8 @@ assertFalse(!!element.shadowRoot!.querySelector( '#clearBrowsingDataDialog [slot=footer]')); + // The footer is never shown on Lacros. + // <if expr="not chromeos and not lacros"> // Syncing: the footer is shown, with the normal sync info. webUIListenerCallback('sync-status-changed', { signedIn: true, @@ -176,8 +183,11 @@ assertFalse(isChildVisible(element, '#sync-paused-info')); assertFalse(isChildVisible(element, '#sync-passphrase-error-info')); assertTrue(isChildVisible(element, '#sync-other-error-info')); + // </if> }); + // The footer is never shown on Lacros. + // <if expr="not chromeos and not lacros"> test('ClearBrowsingDataPauseSyncDesktop', function() { webUIListenerCallback('sync-status-changed', { signedIn: true, @@ -230,6 +240,7 @@ passphraseLink!.click(); assertEquals(routes.SYNC, Router.getInstance().getCurrentRoute()); }); + // </if> test('ClearBrowsingDataSearchLabelVisibility', function() { for (const signedIn of [false, true]) { @@ -625,7 +636,7 @@ }); }); - // <if expr="chromeos"> + // <if expr="chromeos or lacros"> // On ChromeOS the footer is never shown. test('ClearBrowsingDataSyncAccountInfo', function() { assertTrue(element.$.clearBrowsingDataDialog.open);
diff --git a/chrome/test/data/webui/settings/privacy_review_page_test.ts b/chrome/test/data/webui/settings/privacy_review_page_test.ts index f0acb32e..d1db1a55 100644 --- a/chrome/test/data/webui/settings/privacy_review_page_test.ts +++ b/chrome/test/data/webui/settings/privacy_review_page_test.ts
@@ -153,8 +153,6 @@ } type AssertCardComponentsVisibleParams = { - headerTextExpected?: string, - headerImgSrcExpected?: string, isSettingFooterVisibleExpected?: boolean, isBackButtonVisibleExpected?: boolean, isWelcomeFragmentVisibleExpected?: boolean, @@ -167,8 +165,6 @@ }; function assertCardComponentsVisible({ - headerTextExpected, - headerImgSrcExpected, isSettingFooterVisibleExpected, isBackButtonVisibleExpected, isWelcomeFragmentVisibleExpected, @@ -179,19 +175,6 @@ isSafeBrowsingFragmentVisibleExpected, isCookiesFragmentVisibleExpected, }: AssertCardComponentsVisibleParams) { - assertEquals(!!headerTextExpected, isChildVisible(page, '#header')); - if (headerTextExpected) { - assertEquals( - headerTextExpected, - page.shadowRoot!.querySelector<HTMLElement>( - '#headerLabel')!.textContent); - assertTrue(!!headerImgSrcExpected); - assertEquals( - 'chrome://settings/privacy/images/privacy_review/' + - headerImgSrcExpected, - page.shadowRoot!.querySelector<HTMLImageElement>( - '#headerImage')!.src); - } assertEquals( !!isSettingFooterVisibleExpected, isChildVisible(page, '#settingFooter')); @@ -267,8 +250,6 @@ function assertMsbbCardVisible() { assertQueryParameter(PrivacyReviewStep.MSBB); assertCardComponentsVisible({ - headerTextExpected: page.i18n('privacyReviewMsbbCardHeader'), - headerImgSrcExpected: 'msbb_graphic.svg', isSettingFooterVisibleExpected: true, isMsbbFragmentVisibleExpected: true, }); @@ -278,8 +259,6 @@ function assertHistorySyncCardVisible() { assertQueryParameter(PrivacyReviewStep.HISTORY_SYNC); assertCardComponentsVisible({ - headerTextExpected: page.i18n('privacyReviewHistorySyncCardHeader'), - headerImgSrcExpected: 'history_sync_graphic.svg', isSettingFooterVisibleExpected: true, isBackButtonVisibleExpected: true, isHistorySyncFragmentVisibleExpected: true, @@ -290,8 +269,6 @@ function assertSafeBrowsingCardVisible() { assertQueryParameter(PrivacyReviewStep.SAFE_BROWSING); assertCardComponentsVisible({ - headerTextExpected: page.i18n('privacyReviewSafeBrowsingCardHeader'), - headerImgSrcExpected: 'safe_browsing_graphic.svg', isSettingFooterVisibleExpected: true, isBackButtonVisibleExpected: true, isSafeBrowsingFragmentVisibleExpected: true, @@ -302,8 +279,6 @@ function assertCookiesCardVisible() { assertQueryParameter(PrivacyReviewStep.COOKIES); assertCardComponentsVisible({ - headerTextExpected: page.i18n('privacyReviewCookiesCardHeader'), - headerImgSrcExpected: 'cookies_graphic.svg', isSettingFooterVisibleExpected: true, isBackButtonVisibleExpected: true, isCookiesFragmentVisibleExpected: true,
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index 7ea5131..8119dec 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -2372,20 +2372,23 @@ </message> <!-- Restock mainboard page --> <message name="IDS_SHIMLESS_RMA_RESTOCK_PAGE_TITLE" translateable="false" desc="The title for the page notifying user device is in a good state for restocking the mainboard."> - Restock mainboard + [Shimless RMA] </message> <message name="IDS_SHIMLESS_RMA_RESTOCK_INSTRUCTIONS" translateable="false" desc="Instructions for what to do in the restock state. As the device will return to this state when rebooted after restocking the user can shutdown or continue RMA"> - Choose to shutdown and restock mainboard or continue to finalize this device. + Continue where you left off, or shut down to restock the board. </message> <message name="IDS_SHIMLESS_RMA_RESTOCK_SHUTDOWN_BUTTON" translateable="false" desc="Label for the button that triggers device shutdown on the restock page."> Shutdown </message> + <message name="IDS_SHIMLESS_RMA_RESTOCK_CONTINUE_BUTTON" translateable="false" desc="Label for the continue button on the restock page."> + Continue + </message> <!-- Manually enable wp page --> <message name="IDS_SHIMLESS_RMA_MANUALLY_ENABLE_WP_TITLE" translateable="false" desc="The title for the page to manually enable write-protect on the device, afer device provisioning completes."> Manually enable write-protect </message> <message name="IDS_SHIMLESS_RMA_MANUALLY_ENABLE_WP_INSTRUCTIONS" translateable="false" desc="The text instructions to manually enable write-protect on the device."> - Enable write-protect to continue to the next screen. + Enable write-protect to continue to the next screen. Learn how to enable write-protect for this device by viewing the manufacturer's instructions. </message> <message name="IDS_SHIMLESS_RMA_MANUALLY_ENABLED_WP_MESSAGE" translateable="false" desc="Message to inform user hardware write protection has been enabled and RMA is ready to continue."> Hardware write protection enabled. Click 'Next' to continue.
diff --git a/chromeos/components/cdm_factory_daemon/chromeos_cdm_context.h b/chromeos/components/cdm_factory_daemon/chromeos_cdm_context.h index 41bbc98..828822d 100644 --- a/chromeos/components/cdm_factory_daemon/chromeos_cdm_context.h +++ b/chromeos/components/cdm_factory_daemon/chromeos_cdm_context.h
@@ -38,6 +38,9 @@ // Gets a CdmContextRef linked with the associated CDM for keeping it alive. virtual std::unique_ptr<media::CdmContextRef> GetCdmContextRef() = 0; + // Returns true if this is coming from a CDM in ARC. + virtual bool UsingArcCdm() const = 0; + protected: virtual ~ChromeOsCdmContext() = default; };
diff --git a/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.cc b/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.cc index 748cde8..0e0ff3ee 100644 --- a/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.cc +++ b/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.cc
@@ -9,13 +9,16 @@ #include "base/bind.h" #include "base/logging.h" #include "base/no_destructor.h" +#include "base/notreached.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "base/unguessable_token.h" #include "chromeos/components/cdm_factory_daemon/cdm_storage_adapter.h" +#include "chromeos/components/cdm_factory_daemon/chromeos_cdm_context.h" #include "chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.h" #include "chromeos/components/cdm_factory_daemon/mojom/content_decryption_module.mojom.h" #include "media/base/content_decryption_module.h" +#include "media/base/decrypt_config.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/generic_pending_receiver.h" #include "mojo/public/cpp/bindings/pending_associated_remote.h" @@ -56,6 +59,44 @@ std::move(output_protection)); } +class SingletonCdmContextRef : public media::CdmContextRef { + public: + explicit SingletonCdmContextRef(media::CdmContext* cdm_context) + : cdm_context_(cdm_context) {} + ~SingletonCdmContextRef() override = default; + + // media::CdmContextRef + media::CdmContext* GetCdmContext() override { + // Safe because we are a singleton for the process. + return cdm_context_; + } + + private: + media::CdmContext* cdm_context_; +}; + +class ArcCdmContext : public ChromeOsCdmContext, public media::CdmContext { + public: + ArcCdmContext() = default; + ~ArcCdmContext() override = default; + + // ChromeOsCdmContext implementation. + void GetHwKeyData(const media::DecryptConfig* decrypt_config, + const std::vector<uint8_t>& hw_identifier, + GetHwKeyDataCB callback) override { + // TODO(jkardatzke): We will need to implement this for Intel, but it is not + // used by AMD. + NOTREACHED(); + } + std::unique_ptr<media::CdmContextRef> GetCdmContextRef() override { + return std::make_unique<SingletonCdmContextRef>(this); + } + bool UsingArcCdm() const override { return true; } + + // media::CdmContext implementation. + ChromeOsCdmContext* GetChromeOsCdmContext() override { return this; } +}; + } // namespace ChromeOsCdmFactory::ChromeOsCdmFactory( @@ -123,6 +164,12 @@ GetBrowserCdmFactoryRemote()->GetScreenResolutions(std::move(callback)); } +// static +media::CdmContext* ChromeOsCdmFactory::GetArcCdmContext() { + static base::NoDestructor<ArcCdmContext> arc_cdm_context; + return arc_cdm_context.get(); +} + void ChromeOsCdmFactory::OnVerifiedAccessEnabled( const media::CdmConfig& cdm_config, const media::SessionMessageCB& session_message_cb,
diff --git a/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.h b/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.h index d2dbdac..0dee087 100644 --- a/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.h +++ b/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.h
@@ -14,6 +14,7 @@ #include "chromeos/components/cdm_factory_daemon/mojom/browser_cdm_factory.mojom.h" #include "chromeos/components/cdm_factory_daemon/mojom/cdm_factory_daemon.mojom.h" #include "media/base/cdm_config.h" +#include "media/base/cdm_context.h" #include "media/base/cdm_factory.h" #include "media/mojo/mojom/cdm_document_service.mojom.h" #include "media/mojo/mojom/frame_interface_factory.mojom.h" @@ -65,6 +66,10 @@ // our decode target size. static void GetScreenResolutions(GetScreenResolutionsCB callback); + // Returns a singleton pointer that can be used as the media::CdmContext for + // ARC video decode operations. + static media::CdmContext* GetArcCdmContext(); + private: void OnVerifiedAccessEnabled( const media::CdmConfig& cdm_config,
diff --git a/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.cc b/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.cc index 866f3f97..ba525799 100644 --- a/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.cc +++ b/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.cc
@@ -244,6 +244,10 @@ return std::make_unique<media::CdmContextRefImpl>(base::WrapRefCounted(this)); } +bool ContentDecryptionModuleAdapter::UsingArcCdm() const { + return false; +} + void ContentDecryptionModuleAdapter::OnSessionMessage( const std::string& session_id, media::CdmMessageType message_type,
diff --git a/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.h b/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.h index 01aa9cb9..0ee4cc2 100644 --- a/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.h +++ b/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.h
@@ -105,6 +105,7 @@ const std::vector<uint8_t>& hw_identifier, GetHwKeyDataCB callback) override; std::unique_ptr<media::CdmContextRef> GetCdmContextRef() override; + bool UsingArcCdm() const override; // cdm::mojom::ContentDecryptionModuleClient: void OnSessionMessage(const std::string& session_id,
diff --git a/chromeos/crosapi/mojom/app_service_types_mojom_traits.cc b/chromeos/crosapi/mojom/app_service_types_mojom_traits.cc index 8170dc34..a0ef154 100644 --- a/chromeos/crosapi/mojom/app_service_types_mojom_traits.cc +++ b/chromeos/crosapi/mojom/app_service_types_mojom_traits.cc
@@ -171,7 +171,6 @@ case apps::mojom::AppType::kBuiltIn: case apps::mojom::AppType::kCrostini: case apps::mojom::AppType::kChromeApp: - case apps::mojom::AppType::kExtension: case apps::mojom::AppType::kMacOs: case apps::mojom::AppType::kPluginVm: case apps::mojom::AppType::kStandaloneBrowser:
diff --git a/chromeos/dbus/fwupd/BUILD.gn b/chromeos/dbus/fwupd/BUILD.gn index de61295..9ffb989 100644 --- a/chromeos/dbus/fwupd/BUILD.gn +++ b/chromeos/dbus/fwupd/BUILD.gn
@@ -15,12 +15,15 @@ ] sources = [ + "dbus_constants.h", "fake_fwupd_client.cc", "fake_fwupd_client.h", "fwupd_client.cc", "fwupd_client.h", "fwupd_device.cc", "fwupd_device.h", + "fwupd_properties.cc", + "fwupd_properties.h", "fwupd_update.cc", "fwupd_update.h", ]
diff --git a/chromeos/dbus/fwupd/dbus_constants.h b/chromeos/dbus/fwupd/dbus_constants.h new file mode 100644 index 0000000..b6b47afe --- /dev/null +++ b/chromeos/dbus/fwupd/dbus_constants.h
@@ -0,0 +1,20 @@ +// 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_DBUS_FWUPD_DBUS_CONSTANTS_H_ +#define CHROMEOS_DBUS_FWUPD_DBUS_CONSTANTS_H_ + +namespace chromeos { + +const char kFwupdServiceName[] = "org.freedesktop.fwupd"; +const char kFwupdServicePath[] = "/"; +const char kFwupdServiceInterface[] = "org.freedesktop.fwupd"; +const char kFwupdDeviceAddedSignalName[] = "DeviceAdded"; +const char kFwupdGetUpgradesMethodName[] = "GetUpgrades"; +const char kFwupdGetDevicesMethodName[] = "GetDevices"; +const char kFwupdInstallMethodName[] = "Install"; + +} // namespace chromeos + +#endif // CHROMEOS_DBUS_FWUPD_DBUS_CONSTANTS_H_
diff --git a/chromeos/dbus/fwupd/fwupd_client.cc b/chromeos/dbus/fwupd/fwupd_client.cc index 4ef223d..da5ebfc 100644 --- a/chromeos/dbus/fwupd/fwupd_client.cc +++ b/chromeos/dbus/fwupd/fwupd_client.cc
@@ -5,10 +5,13 @@ #include "chromeos/dbus/fwupd/fwupd_client.h" #include <memory> +#include <utility> #include "ash/constants/ash_features.h" #include "base/bind.h" #include "base/values.h" +#include "chromeos/dbus/fwupd/dbus_constants.h" +#include "chromeos/dbus/fwupd/fwupd_properties.h" #include "dbus/bus.h" #include "dbus/message.h" #include "dbus/object_proxy.h" @@ -19,14 +22,6 @@ FwupdClient* g_instance = nullptr; -const char kFwupdServiceName[] = "org.freedesktop.fwupd"; -const char kFwupdServicePath[] = "/"; -const char kFwupdServiceInterface[] = "org.freedesktop.fwupd"; -const char kFwupdDeviceAddedSignalName[] = "DeviceAdded"; -const char kFwupdGetUpgradesMethodName[] = "GetUpgrades"; -const char kFwupdGetDevicesMethodName[] = "GetDevices"; -const char kFwupdInstallMethodName[] = "Install"; - } // namespace class FwupdClientImpl : public FwupdClient { @@ -49,6 +44,12 @@ weak_ptr_factory_.GetWeakPtr()), base::BindOnce(&FwupdClientImpl::OnSignalConnected, weak_ptr_factory_.GetWeakPtr())); + + properties_ = std::make_unique<FwupdProperties>( + proxy_, base::BindRepeating(&FwupdClientImpl::OnPropertyChanged, + weak_ptr_factory_.GetWeakPtr())); + properties_->ConnectSignals(); + properties_->GetAll(); } void RequestUpdates(const std::string& device_id) override { @@ -255,7 +256,6 @@ if (!is_connected) { LOG(ERROR) << "Failed to connect to signal " << signal_name; } - DCHECK_EQ(kFwupdServiceInterface, interface_name); } // TODO(swifton): This is a stub implementation. @@ -269,6 +269,14 @@ } } + void OnPropertyChanged(const std::string& name) { + if (!features::IsFirmwareUpdaterAppEnabled()) + return; + + for (auto& observer : observers_) + observer.OnPropertiesChangedResponse(properties_.get()); + } + dbus::ObjectProxy* proxy_ = nullptr; // Note: This should remain the last member so it'll be destroyed and
diff --git a/chromeos/dbus/fwupd/fwupd_client.h b/chromeos/dbus/fwupd/fwupd_client.h index 3e85642..c7f289a8 100644 --- a/chromeos/dbus/fwupd/fwupd_client.h +++ b/chromeos/dbus/fwupd/fwupd_client.h
@@ -14,6 +14,7 @@ #include "base/observer_list.h" #include "chromeos/dbus/dbus_client.h" #include "chromeos/dbus/fwupd/fwupd_device.h" +#include "chromeos/dbus/fwupd/fwupd_properties.h" #include "chromeos/dbus/fwupd/fwupd_update.h" namespace chromeos { @@ -29,6 +30,7 @@ virtual void OnUpdateListResponse(const std::string& device_id, FwupdUpdateList* updates) = 0; virtual void OnInstallResponse(bool success) = 0; + virtual void OnPropertiesChangedResponse(FwupdProperties* properties) = 0; }; void AddObserver(Observer* observer); @@ -67,6 +69,9 @@ bool client_is_in_testing_mode_ = false; int device_signal_call_count_for_testing_ = 0; + // Holds the Fwupd Dbus properties for percentage and status. + std::unique_ptr<FwupdProperties> properties_; + base::ObserverList<Observer> observers_; }; } // namespace chromeos
diff --git a/chromeos/dbus/fwupd/fwupd_client_unittest.cc b/chromeos/dbus/fwupd/fwupd_client_unittest.cc index a7159251..d5c47c2 100644 --- a/chromeos/dbus/fwupd/fwupd_client_unittest.cc +++ b/chromeos/dbus/fwupd/fwupd_client_unittest.cc
@@ -9,6 +9,7 @@ #include "base/memory/scoped_refptr.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" +#include "chromeos/dbus/fwupd/fwupd_properties.h" #include "dbus/message.h" #include "dbus/mock_bus.h" #include "dbus/mock_object_proxy.h" @@ -53,6 +54,10 @@ chromeos::FwupdUpdateList* updates), (override)); MOCK_METHOD(void, OnInstallResponse, (bool success), (override)); + MOCK_METHOD(void, + OnPropertiesChangedResponse, + (chromeos::FwupdProperties * properties), + (override)); }; } // namespace @@ -77,9 +82,13 @@ GetObjectProxy(kFwupdServiceName, fwupd_service_path)) .WillRepeatedly(testing::Return(proxy_.get())); - EXPECT_CALL(*proxy_, DoConnectToSignal(kFwupdServiceName, _, _, _)) + EXPECT_CALL(*proxy_, DoConnectToSignal(_, _, _, _)) .WillRepeatedly(Invoke(this, &FwupdClientTest::ConnectToSignal)); + expected_properties_ = std::make_unique<chromeos::FwupdProperties>( + bus_->GetObjectProxy(kFwupdServiceName, fwupd_service_path), + base::DoNothing()); + fwupd_client_ = FwupdClient::Create(); fwupd_client_->InitForTesting(bus_.get()); fwupd_client_->client_is_in_testing_mode_ = true; @@ -125,6 +134,18 @@ void SetInstallState(bool success) { install_success_ = success; } + void CheckPropertyChanged(FwupdProperties* properties) { + if (properties->percentage.is_valid()) { + CHECK_EQ(expected_properties_->percentage.value(), + properties->percentage.value()); + } + + if (properties->status.is_valid()) { + CHECK_EQ(expected_properties_->status.value(), + properties->status.value()); + } + } + void AddDbusMethodCallResultSimulation( std::unique_ptr<dbus::Response> response, std::unique_ptr<dbus::ErrorResponse> error_response) { @@ -132,6 +153,8 @@ std::move(error_response)); } + FwupdProperties* GetProperties() { return fwupd_client_->properties_.get(); } + protected: // Synchronously passes |signal| to |client_|'s handler, simulating the signal // being emitted by fwupd. @@ -145,6 +168,7 @@ scoped_refptr<dbus::MockObjectProxy> proxy_; std::unique_ptr<FwupdClient> fwupd_client_; + std::unique_ptr<chromeos::FwupdProperties> expected_properties_; private: // Handles calls to |proxy_|'s ConnectToSignal() method. @@ -153,7 +177,6 @@ const std::string& signal_name, dbus::ObjectProxy::SignalCallback signal_callback, dbus::ObjectProxy::OnConnectedCallback* on_connected_callback) { - CHECK_EQ(interface_name, kFwupdServiceName); signal_callbacks_[signal_name] = signal_callback; task_environment_.GetMainThreadTaskRunner()->PostTask( @@ -310,4 +333,21 @@ base::RunLoop().RunUntilIdle(); } +TEST_F(FwupdClientTest, PropertiesChanged) { + const uint32_t expected_percentage = 50u; + const uint32_t expected_status = 1u; + + expected_properties_->percentage.ReplaceValue(expected_percentage); + expected_properties_->status.ReplaceValue(expected_status); + + MockObserver observer; + EXPECT_CALL(observer, OnPropertiesChangedResponse(_)) + .Times(2) + .WillRepeatedly(Invoke(this, &FwupdClientTest::CheckPropertyChanged)); + fwupd_client_->AddObserver(&observer); + + GetProperties()->percentage.ReplaceValue(expected_percentage); + GetProperties()->status.ReplaceValue(expected_status); +} + } // namespace chromeos
diff --git a/chromeos/dbus/fwupd/fwupd_properties.cc b/chromeos/dbus/fwupd/fwupd_properties.cc new file mode 100644 index 0000000..f205096 --- /dev/null +++ b/chromeos/dbus/fwupd/fwupd_properties.cc
@@ -0,0 +1,22 @@ +// 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/dbus/fwupd/fwupd_properties.h" + +#include "chromeos/dbus/fwupd/dbus_constants.h" +#include "dbus/object_proxy.h" +#include "dbus/property.h" + +namespace chromeos { + +FwupdProperties::FwupdProperties(dbus::ObjectProxy* object_proxy, + const PropertyChangedCallback& callback) + : dbus::PropertySet(object_proxy, kFwupdServiceInterface, callback) { + RegisterProperty("Percentage", &percentage); + RegisterProperty("Status", &status); +} + +FwupdProperties::~FwupdProperties() = default; + +} // namespace chromeos
diff --git a/chromeos/dbus/fwupd/fwupd_properties.h b/chromeos/dbus/fwupd/fwupd_properties.h new file mode 100644 index 0000000..a5bf5ec --- /dev/null +++ b/chromeos/dbus/fwupd/fwupd_properties.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 CHROMEOS_DBUS_FWUPD_FWUPD_PROPERTIES_H_ +#define CHROMEOS_DBUS_FWUPD_FWUPD_PROPERTIES_H_ + +#include "base/component_export.h" +#include "dbus/object_proxy.h" +#include "dbus/property.h" + +// Wrapper class of dbus::PropertySet that holds Dbus property fields +// pertaining to an FWUPD Dbus object. Properties of this class gets updated +// whenever dbus::PropertiesChanged() is called for the Fwupd interface. +namespace chromeos { + +class COMPONENT_EXPORT(CHROMEOS_DBUS_FWUPD) FwupdProperties + : public dbus::PropertySet { + public: + FwupdProperties(dbus::ObjectProxy* object_proxy, + const PropertyChangedCallback& callback); + ~FwupdProperties() override; + + dbus::Property<uint32_t> percentage; + dbus::Property<uint32_t> status; +}; + +} // namespace chromeos + +#endif // CHROMEOS_DBUS_FWUPD_FWUPD_PROPERTIES_H_ \ No newline at end of file
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt index 84ec188..c45b98b 100644 --- a/chromeos/profiles/atom.afdo.newest.txt +++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-atom-98-4729.0-1638787322-benchmark-98.0.4751.0-r1-redacted.afdo.xz +chromeos-chrome-amd64-atom-98-4729.0-1638787322-benchmark-98.0.4754.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt index c72fb3ee0..399d3fa 100644 --- a/chromeos/profiles/bigcore.afdo.newest.txt +++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-bigcore-98-4729.0-1638791049-benchmark-98.0.4751.0-r1-redacted.afdo.xz +chromeos-chrome-amd64-bigcore-98-4729.0-1638791049-benchmark-98.0.4754.0-r1-redacted.afdo.xz
diff --git a/chromeos/services/cros_healthd/private/mojom/BUILD.gn b/chromeos/services/cros_healthd/private/mojom/BUILD.gn new file mode 100644 index 0000000..675fca46 --- /dev/null +++ b/chromeos/services/cros_healthd/private/mojom/BUILD.gn
@@ -0,0 +1,14 @@ +# 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. + +import("//mojo/public/tools/bindings/mojom.gni") + +mojom("mojom") { + sources = [ "cros_healthd_internal.mojom" ] + public_deps = [ + "//chromeos/services/cros_healthd/public/mojom", + "//chromeos/services/network_health/public/mojom", + "//mojo/public/mojom/base", + ] +}
diff --git a/chromeos/services/cros_healthd/private/mojom/OWNERS b/chromeos/services/cros_healthd/private/mojom/OWNERS new file mode 100644 index 0000000..82b6623 --- /dev/null +++ b/chromeos/services/cros_healthd/private/mojom/OWNERS
@@ -0,0 +1,5 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS +per-file *.mojom=file://chromeos/SECURITY_OWNERS +per-file *_mojom_traits*.*=set noparent +per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/chromeos/services/cros_healthd/private/mojom/cros_healthd_internal.mojom b/chromeos/services/cros_healthd/private/mojom/cros_healthd_internal.mojom new file mode 100644 index 0000000..4b828f77 --- /dev/null +++ b/chromeos/services/cros_healthd/private/mojom/cros_healthd_internal.mojom
@@ -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. + +// Internal API exposed to the cros_healthd daemon. This should only be used by +// cros_healthd to obtain the browser resources and bootstrap the connection +// between Chrome and cros_healthd. + +// NOTE: This mojom should be kept in sync with the copy in Chromium OS's repo +// in src/platform2/diagnostics/mojom/external/cros_healthd_internal.mojom. + +module chromeos.cros_healthd.internal.mojom; + +import "chromeos/services/cros_healthd/public/mojom/cros_healthd.mojom"; +import "chromeos/services/network_health/public/mojom/network_diagnostics.mojom"; +import "chromeos/services/network_health/public/mojom/network_health.mojom"; + +// Interface for Chrome to bootstrap the connection between cros_healthd and +// Chrome. Chrome uses this interface to obtain cros_healthd services and +// to provide Chrome services. +// +// NextMinVersion: 1, NextIndex: 2 +interface ServiceBootstrap { + // Pass a receiver of service factory to cros_healthd to bind the services. + GetCrosHealthdServiceFactory@0(pending_receiver< + chromeos.cros_healthd.mojom.CrosHealthdServiceFactory> receiver); + // Pass a remote of internal service factory to cros_healthd for it to + // obtain the services in Chrome. This should be the only interface which + // the connection is passed from the provider side. All the services in + // Chrome should use internal service factory interface to provide services + // to cros_healthd. + // Should be called only once per connection. + SetCrosHealthdInternalServiceFactory@1(pending_remote< + CrosHealthdInternalServiceFactory> remote); +}; + +// Factory interface which allows remote ends (cros_healthd) to request +// implementations of several services in Chrome. +// +// NextMinVersion: 1, NextIndex: 2 +interface CrosHealthdInternalServiceFactory { + // NetworkHealthService provides network health information from chrome + // network stack. + GetNetworkHealthService@0(pending_receiver< + chromeos.network_health.mojom.NetworkHealthService> receiver); + // NetworkDiagnosticsRoutines provides network diagnostics routines to test + // network. + GetNetworkDiagnosticsRoutines@1(pending_receiver< + chromeos.network_diagnostics.mojom.NetworkDiagnosticsRoutines> receiver); +};
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb index 7a75ca75..0f484946 100644 --- a/chromeos/strings/chromeos_strings_kk.xtb +++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -123,6 +123,7 @@ <translation id="2789486458103222910">Жарайды</translation> <translation id="2805756323405976993">Қолданбалар</translation> <translation id="28232023175184696">Интернетке қосыла алмай жатыр. Әрекетті қайталау үшін түртіңіз.</translation> +<translation id="2859243502336719778">Маңызды жаңарту</translation> <translation id="2860473693272905224">Сканерге басқа бет қойыңыз.</translation> <translation id="2872961005593481000">Өшіру</translation> <translation id="2878387241690264070">Заряд <ph name="NUM_SECONDS" /> секундта <ph name="RATE" /> азайды.</translation> @@ -157,6 +158,7 @@ <translation id="3456078764689556234"><ph name="PRINTED_PAGES" /> бет (жалпы саны: <ph name="TOTAL_PAGES" />) басып шығарылды.</translation> <translation id="345898999683440380"><ph name="PAGE_NUM" />-бет сканерленуде. <ph name="PERCENTAGE_VALUE" />% орындалды.</translation> <translation id="3459509316159669723">Басып шығару</translation> +<translation id="3462187165860821523"><ph name="DEVICE_NAME" /> жаңартылуда</translation> <translation id="3486220673238053218">анықтама</translation> <translation id="3488065109653206955">Ішінара белсендірілген</translation> <translation id="3527036260304016759">Сәтсіз: белгісіз қате шықты</translation> @@ -215,6 +217,7 @@ <translation id="4378373042927530923">Іске қосылмаған</translation> <translation id="4378551569595875038">Қосылуда…</translation> <translation id="4382484599443659549">PDF</translation> +<translation id="4418498623216225764">Перифериялық құрылғыларды жаңарту</translation> <translation id="4425149324548788773">Менің Drive дискім</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> өшірулі</translation> <translation id="4429881212383817840">Kerberos билетінің жарамдылық мерзімі жақында аяқталады</translation> @@ -270,6 +273,7 @@ <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> секундта <ph name="RATE" /> зарядталды.</translation> <translation id="4930320165497208503">Байланысты реттеу немесе жаңарту үшін <ph name="BEGIN_LINK" />Параметрлерге<ph name="END_LINK" /> өтіңіз.</translation> <translation id="4932733599132424254">Күні</translation> +<translation id="4950314376641394653"><ph name="DEVICE_NAME" /> микробағдарламасы <ph name="VERSION" /> нұсқасына жаңартылды.</translation> <translation id="498186245079027698">Сканерді тексеріп, әрекетті қайталаңыз. Сканерленген файлдарды сақтайтын орынның жеткілікті екенін тексеріңіз.</translation> <translation id="4985509611418653372">Іске қосу</translation> <translation id="4987769320337599931">Брандмауэр</translation> @@ -418,6 +422,7 @@ <translation id="7040230719604914234">Оператор</translation> <translation id="7058278511608979688">Аяқтау және сақтау</translation> <translation id="7059230779847288458">Зарядталуда, толғанға дейінгі уақыт: <ph name="TIME_VALUE" /></translation> +<translation id="7068619307603204412">Құрылғыңызды дайындаңыз</translation> <translation id="708426984172631313">ТОҚТАТЫЛДЫ</translation> <translation id="7086440545492620869"><ph name="VALUE" /> <ph name="DISPLAY_NAME" /></translation> <translation id="710028965487274708">Орындалмады – авторизация жасалмады</translation> @@ -431,6 +436,7 @@ <translation id="7177485034254901881"><ph name="DEVICE_TYPE" /> құрылғысын <ph name="MANAGER" /> басқарады. Әкімшілер құрылғыны қашықтан конфигурациялай алады.</translation> <translation id="7180611975245234373">Жаңарту</translation> <translation id="7216409898977639127">Ұялы байланыс провайдері</translation> +<translation id="7240035910874241640">Барлық перифериялық құрылғы жаңартылған.</translation> <translation id="7271040990581020067">Сканер пайдаланылуда. Кейінірек қайталап көріңіз.</translation> <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation> <translation id="7287310195820267359">Тұсқағаз жинақтары</translation> @@ -471,6 +477,7 @@ <translation id="7763470514545477072">Домен суффиксі сәйкестігі</translation> <translation id="7769672763586021400">Үлгі идентификаторы</translation> <translation id="7784116172884276937">DNS серверлері реттелмеген.</translation> +<translation id="7786540085520432425">Жаңарту кезінде терезені кішірейте аласыз, бірақ құрылғыны ажыратпаңыз. Процесс бірнеше минутқа созылып, ол кезде құрылғы жұмыс істемей қалуы мүмкін.</translation> <translation id="780301667611848630">Жоқ, рақмет</translation> <translation id="7805768142964895445">Күйі</translation> <translation id="7819857487979277519">PSK (WPA немесе RSN)</translation> @@ -530,6 +537,7 @@ <translation id="8498220429738806196">Трафик есептегіштері</translation> <translation id="8503813439785031346">Пайдаланушы аты</translation> <translation id="8503836310948963452">Бірнеше минут қана…</translation> +<translation id="8520963233738002436"><ph name="DEVICE_NAME" /> құрылғысы жаңартылған.</translation> <translation id="8521021929829989041">Жеке құрылғы ретінде пайдалану</translation> <translation id="8528615187455571738">Crosvm</translation> <translation id="8575298406870537639">Желіге қосылу үшін оператор осы опцияны талап етуі мүмкін. Мәліметтер алу үшін операторыңызға хабарласыңыз.</translation> @@ -571,6 +579,7 @@ <translation id="8970109610781093811">Қайта тексеру</translation> <translation id="8983038754672563810">HSPA</translation> <translation id="8987565828374052507">{NUMBER_OF_PAGES,plural, =0{Сканерлеу}=1{{NUMBER_OF_PAGES} бетті сканерлеу}other{{NUMBER_OF_PAGES} бетті сканерлеу}}</translation> +<translation id="8994273342647807496">Орнатылуда – <ph name="PERCENTAGE_VALUE" />%</translation> <translation id="9003704114456258138">Жиілік</translation> <translation id="9039663905644212491">PEAP</translation> <translation id="9062831201344759865">DNS ажыратымдылығының кідірісі жоғары.</translation>
diff --git a/components/content_creation/reactions/core/reaction_list_factory.cc b/components/content_creation/reactions/core/reaction_list_factory.cc index 91883fd8..8ade3aca 100644 --- a/components/content_creation/reactions/core/reaction_list_factory.cc +++ b/components/content_creation/reactions/core/reaction_list_factory.cc
@@ -32,35 +32,39 @@ std::vector<ReactionMetadata> BuildReactionMetadata() { return { ReactionMetadata( - ReactionType::CLAP, - l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_CLAPPING), - MakeThumbnailUrl("clap"), MakeReactionUrl("clap"), 24), + ReactionType::HEART, + l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_HEART), + MakeThumbnailUrl("heart"), MakeReactionUrl("heart"), 48), + ReactionMetadata( + ReactionType::EMOTIONAL, + l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_LOUDLY_CRYING), + MakeThumbnailUrl("emotional"), MakeReactionUrl("emotional"), 48), ReactionMetadata( ReactionType::GRIN, l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_GRINNING), MakeThumbnailUrl("grin"), MakeReactionUrl("grin"), 48), + ReactionMetadata( + ReactionType::THANKS, + l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_FOLDED_HANDS), + MakeThumbnailUrl("thanks"), MakeReactionUrl("thanks"), 24), + ReactionMetadata( + ReactionType::SURPRISE, + l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_FLUSHED), + MakeThumbnailUrl("surprise"), MakeReactionUrl("surprise"), 48), + ReactionMetadata( + ReactionType::CLAP, + l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_CLAPPING), + MakeThumbnailUrl("clap"), MakeReactionUrl("clap"), 24), + ReactionMetadata( + ReactionType::UNSURE, + l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_THINKING), + MakeThumbnailUrl("unsure"), MakeReactionUrl("unsure"), 48), ReactionMetadata(ReactionType::FIRE, l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_FIRE), MakeThumbnailUrl("fire"), MakeReactionUrl("fire"), 48), ReactionMetadata(ReactionType::EYES, l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_EYES), MakeThumbnailUrl("eyes"), MakeReactionUrl("eyes"), 48), - ReactionMetadata( - ReactionType::EMOTIONAL, - l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_LOUDLY_CRYING), - MakeThumbnailUrl("emotional"), MakeReactionUrl("emotional"), 48), - ReactionMetadata( - ReactionType::SURPRISE, - l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_FLUSHED), - MakeThumbnailUrl("surprise"), MakeReactionUrl("surprise"), 48), - ReactionMetadata( - ReactionType::THANKS, - l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_FOLDED_HANDS), - MakeThumbnailUrl("thanks"), MakeReactionUrl("thanks"), 24), - ReactionMetadata( - ReactionType::UNSURE, - l10n_util::GetStringUTF8(IDS_LIGHTWEIGHT_REACTIONS_THINKING), - MakeThumbnailUrl("unsure"), MakeReactionUrl("unsure"), 48), }; }
diff --git a/components/content_creation/reactions/core/reaction_types.h b/components/content_creation/reactions/core/reaction_types.h index 89c309d..e06f7bb 100644 --- a/components/content_creation/reactions/core/reaction_types.h +++ b/components/content_creation/reactions/core/reaction_types.h
@@ -20,8 +20,9 @@ SURPRISE = 5, THANKS = 6, UNSURE = 7, + HEART = 8, - MAX_VALUE = UNSURE + MAX_VALUE = HEART }; } // namespace content_creation
diff --git a/components/content_creation_strings.grdp b/components/content_creation_strings.grdp index cace242..d01cad0 100644 --- a/components/content_creation_strings.grdp +++ b/components/content_creation_strings.grdp
@@ -35,6 +35,10 @@ </message> <!-- Lightweight Reactions names, currently only used on Android. --> + <message name="IDS_LIGHTWEIGHT_REACTIONS_HEART" is_accessibility_with_no_ui="true" desc="The accessibility text to read when the heart reaction is selected."> + Heart + </message> + <message name="IDS_LIGHTWEIGHT_REACTIONS_CLAPPING" is_accessibility_with_no_ui="true" desc="The accessibility text to read when the clapping reaction is selected."> Clapping </message>
diff --git a/components/custom_handlers/BUILD.gn b/components/custom_handlers/BUILD.gn new file mode 100644 index 0000000..c0def34 --- /dev/null +++ b/components/custom_handlers/BUILD.gn
@@ -0,0 +1,21 @@ +# 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. + +static_library("custom_handlers") { + sources = [ + "pref_names.cc", + "pref_names.h", + "protocol_handler_registry.cc", + "protocol_handler_registry.h", + ] + deps = [ + "//build:chromeos_buildflags", + "//components/keyed_service/core", + "//components/pref_registry", + "//components/prefs", + "//components/user_prefs", + "//content/public/browser", + "//content/public/common", + ] +}
diff --git a/components/custom_handlers/DEPS b/components/custom_handlers/DEPS new file mode 100644 index 0000000..abbffeb --- /dev/null +++ b/components/custom_handlers/DEPS
@@ -0,0 +1,8 @@ +include_rules = [ + "+components/keyed_service", + "+components/pref_registry", + "+components/prefs", + "+components/user_prefs", + "+content/public/common", + "+content/public/browser", +]
diff --git a/components/custom_handlers/pref_names.cc b/components/custom_handlers/pref_names.cc new file mode 100644 index 0000000..fe67909 --- /dev/null +++ b/components/custom_handlers/pref_names.cc
@@ -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. + +#include "components/custom_handlers/pref_names.h" + +namespace custom_handlers { +namespace prefs { + +// List of protocol handlers. +const char kRegisteredProtocolHandlers[] = + "custom_handlers.registered_protocol_handlers"; + +// List of protocol handlers the user has requested not to be asked about again. +const char kIgnoredProtocolHandlers[] = + "custom_handlers.ignored_protocol_handlers"; + +// List of protocol handlers registered by policy. +const char kPolicyRegisteredProtocolHandlers[] = + "custom_handlers.policy.registered_protocol_handlers"; + +// List of protocol handlers the policy has requested to be ignored. +const char kPolicyIgnoredProtocolHandlers[] = + "custom_handlers.policy.ignored_protocol_handlers"; + +// Whether user-specified handlers for protocols and content types can be +// specified. +const char kCustomHandlersEnabled[] = "custom_handlers.enabled"; + +} // namespace prefs +} // namespace custom_handlers
diff --git a/components/custom_handlers/pref_names.h b/components/custom_handlers/pref_names.h new file mode 100644 index 0000000..fc76c4d --- /dev/null +++ b/components/custom_handlers/pref_names.h
@@ -0,0 +1,20 @@ +// 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 COMPONENTS_CUSTOM_HANDLERS_PREF_NAMES_H_ +#define COMPONENTS_CUSTOM_HANDLERS_PREF_NAMES_H_ + +namespace custom_handlers { +namespace prefs { + +extern const char kRegisteredProtocolHandlers[]; +extern const char kIgnoredProtocolHandlers[]; +extern const char kPolicyRegisteredProtocolHandlers[]; +extern const char kPolicyIgnoredProtocolHandlers[]; +extern const char kCustomHandlersEnabled[]; + +} // namespace prefs +} // namespace custom_handlers + +#endif // COMPONENTS_CUSTOM_HANDLERS_PREF_NAMES_H_
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry.cc b/components/custom_handlers/protocol_handler_registry.cc similarity index 95% rename from chrome/browser/custom_handlers/protocol_handler_registry.cc rename to components/custom_handlers/protocol_handler_registry.cc index 2af1824..81d7111 100644 --- a/chrome/browser/custom_handlers/protocol_handler_registry.cc +++ b/components/custom_handlers/protocol_handler_registry.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/custom_handlers/protocol_handler_registry.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include <stddef.h> @@ -16,8 +16,7 @@ #include "base/notreached.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" -#include "chrome/browser/profiles/profile_io_data.h" -#include "chrome/common/pref_names.h" +#include "components/custom_handlers/pref_names.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" #include "components/user_prefs/user_prefs.h" @@ -27,6 +26,9 @@ using content::BrowserThread; using content::ChildProcessSecurityPolicy; +using content::ProtocolHandler; + +namespace custom_handlers { namespace { @@ -150,8 +152,7 @@ NotifyChanged(); } -bool ProtocolHandlerRegistry::IsDefault( - const ProtocolHandler& handler) const { +bool ProtocolHandlerRegistry::IsDefault(const ProtocolHandler& handler) const { DCHECK_CURRENTLY_ON(BrowserThread::UI); return GetHandlerFor(handler.protocol()) == handler; } @@ -159,14 +160,11 @@ void ProtocolHandlerRegistry::InstallDefaultsForChromeOS() { #if BUILDFLAG(IS_CHROMEOS_ASH) // Only chromeos has default protocol handlers at this point. - AddPredefinedHandler( - ProtocolHandler::CreateProtocolHandler( - "mailto", - GURL("https://mail.google.com/mail/?extsrc=mailto&url=%s"))); - AddPredefinedHandler( - ProtocolHandler::CreateProtocolHandler( - "webcal", - GURL("https://www.google.com/calendar/render?cid=%s"))); + AddPredefinedHandler(ProtocolHandler::CreateProtocolHandler( + "mailto", + GURL("https://mail.google.com/mail/?extsrc=mailto&url=%s"))); + AddPredefinedHandler(ProtocolHandler::CreateProtocolHandler( + "webcal", GURL("https://www.google.com/calendar/render?cid=%s"))); #else NOTREACHED(); // this method should only ever be called in chromeos. #endif @@ -227,8 +225,7 @@ } ProtocolHandlerRegistry::ProtocolHandlerList -ProtocolHandlerRegistry::GetHandlersFor( - const std::string& scheme) const { +ProtocolHandlerRegistry::GetHandlersFor(const std::string& scheme) const { DCHECK_CURRENTLY_ON(BrowserThread::UI); auto p = protocol_handlers_.find(scheme); if (p == protocol_handlers_.end()) { @@ -514,16 +511,13 @@ EncodeIgnoredHandlers()); PrefService* prefs = user_prefs::UserPrefs::Get(context_); - prefs->Set(prefs::kRegisteredProtocolHandlers, - *registered_protocol_handlers); - prefs->Set(prefs::kIgnoredProtocolHandlers, - *ignored_protocol_handlers); + prefs->Set(prefs::kRegisteredProtocolHandlers, *registered_protocol_handlers); + prefs->Set(prefs::kIgnoredProtocolHandlers, *ignored_protocol_handlers); prefs->SetBoolean(prefs::kCustomHandlersEnabled, enabled_); } const ProtocolHandlerRegistry::ProtocolHandlerList* -ProtocolHandlerRegistry::GetHandlerList( - const std::string& scheme) const { +ProtocolHandlerRegistry::GetHandlerList(const std::string& scheme) const { DCHECK_CURRENTLY_ON(BrowserThread::UI); auto p = protocol_handlers_.find(scheme); if (p == protocol_handlers_.end()) { @@ -649,8 +643,7 @@ GetHandlersFromPref(pref_name); for (std::vector<const base::DictionaryValue*>::const_iterator p = registered_handlers.begin(); - p != registered_handlers.end(); - ++p) { + p != registered_handlers.end(); ++p) { ProtocolHandler handler = ProtocolHandler::CreateProtocolHandler(*p); if (!RegisterProtocolHandler(handler, source)) continue; @@ -681,8 +674,7 @@ GetHandlersFromPref(pref_name); for (std::vector<const base::DictionaryValue*>::const_iterator p = ignored_handlers.begin(); - p != ignored_handlers.end(); - ++p) { + p != ignored_handlers.end(); ++p) { IgnoreProtocolHandler(ProtocolHandler::CreateProtocolHandler(*p), source); } } @@ -715,6 +707,10 @@ ClearDefault(protocol); } +void ProtocolHandlerRegistry::SetIsLoading(bool is_loading) { + is_loading_ = is_loading; +} + void ProtocolHandlerRegistry::AddPredefinedHandler( const ProtocolHandler& handler) { DCHECK(!is_loaded_); // Must be called prior InitProtocolSettings. @@ -729,3 +725,5 @@ &ProtocolHandlerRegistry::OnSetAsDefaultProtocolClientFinished, weak_ptr_factory_.GetWeakPtr(), protocol); } + +} // namespace custom_handlers
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry.h b/components/custom_handlers/protocol_handler_registry.h similarity index 94% rename from chrome/browser/custom_handlers/protocol_handler_registry.h rename to components/custom_handlers/protocol_handler_registry.h index c51e957..7d5c77d 100644 --- a/chrome/browser/custom_handlers/protocol_handler_registry.h +++ b/components/custom_handlers/protocol_handler_registry.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_CUSTOM_HANDLERS_PROTOCOL_HANDLER_REGISTRY_H_ -#define CHROME_BROWSER_CUSTOM_HANDLERS_PROTOCOL_HANDLER_REGISTRY_H_ +#ifndef COMPONENTS_CUSTOM_HANDLERS_PROTOCOL_HANDLER_REGISTRY_H_ +#define COMPONENTS_CUSTOM_HANDLERS_PROTOCOL_HANDLER_REGISTRY_H_ #include <map> #include <memory> @@ -24,9 +24,15 @@ class PrefRegistrySyncable; } +namespace { +class ProtocolHandlerRegistryTest; +} // namespace + using content::ProtocolHandler; using DefaultClientCallback = base::OnceCallback<void(bool)>; +namespace custom_handlers { + // This is where handlers for protocols registered with // navigator.registerProtocolHandler() are registered. Each Profile owns an // instance of this class, which is initialized on browser start through @@ -204,16 +210,24 @@ // load command was issued, otherwise the command will be ignored. void AddPredefinedHandler(const ProtocolHandler& handler); + // Install default protocol handlers for chromeos which must be done + // prior to calling InitProtocolSettings. + // TODO(jfernandez): This method is declared as public because it's invoked by + // the ProtocolHandlerRegistryFactory. Instead declaring it private and make + // the factory a friend class, we could add a Create() method on + // ProtocolHandlerRegistry that constructs the object, calls the necessary + // methods on it, then returns it as a unique_ptr (this is the usual way to + // have these Init() type methods called correctly). + void InstallDefaultsForChromeOS(); + + void SetIsLoading(bool is_loading); + private: friend class base::DeleteHelper<ProtocolHandlerRegistry>; friend struct content::BrowserThread::DeleteOnThread< content::BrowserThread::IO>; - // for access to InstallDefaultsForChromeOS - friend class ProtocolHandlerRegistryFactory; - - friend class ProtocolHandlerRegistryTest; - friend class RegisterProtocolHandlerBrowserTest; + friend class ::ProtocolHandlerRegistryTest; // Puts the given handler at the top of the list of handlers for its // protocol. @@ -226,10 +240,6 @@ // or NULL if there are none. const ProtocolHandlerList* GetHandlerList(const std::string& scheme) const; - // Install default protocol handlers for chromeos which must be done - // prior to calling InitProtocolSettings. - void InstallDefaultsForChromeOS(); - // Makes this ProtocolHandler the default handler for its protocol. void SetDefault(const ProtocolHandler& handler); @@ -352,4 +362,7 @@ // DefaultProtocolClientWorker. base::WeakPtrFactory<ProtocolHandlerRegistry> weak_ptr_factory_{this}; }; -#endif // CHROME_BROWSER_CUSTOM_HANDLERS_PROTOCOL_HANDLER_REGISTRY_H_ + +} // namespace custom_handlers + +#endif // COMPONENTS_CUSTOM_HANDLERS_PROTOCOL_HANDLER_REGISTRY_H_
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc index d370c6e..5f97d15 100644 --- a/components/exo/wayland/server.cc +++ b/components/exo/wayland/server.cc
@@ -196,6 +196,12 @@ LOG(ERROR) << "Unable to create runtime directory under " << parent_path; return false; } + if (!base::SetPosixFilePermissions(out_temp_dir.GetPath(), 0755)) { + LOG(ERROR) << "Could not set permissions for directory " + << out_temp_dir.GetPath() + << ", deleted=" << out_temp_dir.Delete(); + return false; + } return true; }
diff --git a/components/heap_profiling/in_process/heap_profiler_controller_unittest.cc b/components/heap_profiling/in_process/heap_profiler_controller_unittest.cc index b2ddc04..c10eba27 100644 --- a/components/heap_profiling/in_process/heap_profiler_controller_unittest.cc +++ b/components/heap_profiling/in_process/heap_profiler_controller_unittest.cc
@@ -140,7 +140,15 @@ // Sampling profiler is not capable of unwinding stack on Android under tests. #if !defined(OS_ANDROID) -TEST_F(HeapProfilerControllerTest, ProfileCollectionsScheduler) { + +// See crbug.com/1276033 +#if defined(OS_APPLE) +#define MAYBE_ProfileCollectionsScheduler DISABLED_ProfileCollectionsScheduler +#else +#define MAYBE_ProfileCollectionsScheduler ProfileCollectionsScheduler +#endif + +TEST_F(HeapProfilerControllerTest, MAYBE_ProfileCollectionsScheduler) { constexpr int kSnapshotsToCollect = 3; std::atomic<int> profile_count{0};
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc index f99ebda6..697351d 100644 --- a/components/history/core/browser/history_backend.cc +++ b/components/history/core/browser/history_backend.cc
@@ -161,6 +161,30 @@ // avoid other potential issues. constexpr int kDSTRoundingOffsetHours = 4; +// Merges `update` into `existing` by overwriting fields in `existing` that are +// not the default value in `update`. +void MergeUpdateIntoExistingModelAnnotations( + const VisitContentModelAnnotations& update, + VisitContentModelAnnotations& existing) { + if (update.visibility_score != + VisitContentModelAnnotations::kDefaultVisibilityScore) { + existing.visibility_score = update.visibility_score; + } + + if (!update.categories.empty()) { + existing.categories = update.categories; + } + + if (update.page_topics_model_version != + VisitContentModelAnnotations::kDefaultPageTopicsModelVersion) { + existing.page_topics_model_version = update.page_topics_model_version; + } + + if (!update.entities.empty()) { + existing.entities = update.entities; + } +} + } // namespace std::u16string FormatUrlForRedirectComparison(const GURL& url) { @@ -491,7 +515,8 @@ if (db_->GetRowForVisit(visit_id, &visit_row)) { VisitContentAnnotations annotations; if (db_->GetContentAnnotationsForVisit(visit_id, &annotations)) { - annotations.model_annotations = model_annotations; + MergeUpdateIntoExistingModelAnnotations(model_annotations, + annotations.model_annotations); db_->UpdateContentAnnotationsForVisit(visit_id, annotations); } else { annotations.model_annotations = model_annotations;
diff --git a/components/history/core/browser/history_backend_unittest.cc b/components/history/core/browser/history_backend_unittest.cc index af57fb4b..f3097778 100644 --- a/components/history/core/browser/history_backend_unittest.cc +++ b/components/history/core/browser/history_backend_unittest.cc
@@ -1742,17 +1742,23 @@ ASSERT_EQ(1U, visits.size()); VisitID visit_id = visits[0].visit_id; - VisitContentModelAnnotations model_annotations = { - 0.5f, - {{/*id=*/"1", /*weight=*/1}, {/*id=*/"2", /*weight=*/1}}, - 123, + VisitContentModelAnnotations model_annotations_without_entities = { + 0.5f, {{/*id=*/"1", /*weight=*/1}, {/*id=*/"2", /*weight=*/1}}, 123, {}}; + backend_->AddContentModelAnnotationsForVisit( + visit_id, model_annotations_without_entities); + VisitContentModelAnnotations model_annotations_only_entities = { + -1.0f, + {}, + -1, {{/*id=*/"entity1", /*weight=*/1}, {/*id=*/"entity2", /*weight=*/1}}}; - backend_->AddContentModelAnnotationsForVisit(visit_id, model_annotations); + backend_->AddContentModelAnnotationsForVisit(visit_id, + model_annotations_only_entities); VisitContentAnnotations got_content_annotations; ASSERT_TRUE(backend_->db()->GetContentAnnotationsForVisit( visit_id, &got_content_annotations)); + // Model annotations should be merged from both calls. EXPECT_EQ(VisitContentAnnotationFlag::kNone, got_content_annotations.annotation_flags); EXPECT_EQ(0.5f, got_content_annotations.model_annotations.visibility_score);
diff --git a/components/history/core/browser/url_row.h b/components/history/core/browser/url_row.h index c2bcedd..2b4ad90 100644 --- a/components/history/core/browser/url_row.h +++ b/components/history/core/browser/url_row.h
@@ -175,6 +175,9 @@ // for a visit. Be cautious when changing the default values as they may already // have been written to the storage. struct VisitContentModelAnnotations { + static constexpr float kDefaultVisibilityScore = -1; + static constexpr int kDefaultPageTopicsModelVersion = -1; + struct Category { Category(); Category(const std::string& id, int weight); @@ -200,17 +203,20 @@ // A value from 0 to 1 that represents how prominent, or visible, the page // might be considered on UI surfaces. - float visibility_score = -1.0; + float visibility_score = kDefaultVisibilityScore; // A vector that contains category IDs and their weights. It is guaranteed // that there will not be duplicates in the category IDs contained in this // field. std::vector<Category> categories; // The version of the page topics model that was used to annotate content. - int64_t page_topics_model_version = -1; + int64_t page_topics_model_version = kDefaultPageTopicsModelVersion; // A vector that contains entity IDs and their weights. It is guaranteed // that there will not be duplicates in the category IDs contained in this // field. std::vector<Category> entities; + + // Any field added here must also update the + // `MergeUpdateIntoExistingModelAnnotations` function in history_backend.cc. }; // A structure containing the annotations made to page content for a visit.
diff --git a/components/history_clusters/core/features.cc b/components/history_clusters/core/features.cc index 1d706b8..a3eb07b 100644 --- a/components/history_clusters/core/features.cc +++ b/components/history_clusters/core/features.cc
@@ -26,7 +26,7 @@ } // namespace bool IsJourneysEnabled(const std::string& locale) { - if (!base::FeatureList::IsEnabled(kJourneys)) + if (!base::FeatureList::IsEnabled(internal::kJourneys)) return false; // Allow comma and colon as delimiters to the language list. @@ -43,35 +43,40 @@ base::Contains(allowlist, l10n_util::GetLanguage(locale)); } +// Default to "", because defaulting it to a specific locale makes it hard to +// allow all locales, since the FeatureParam code interprets an empty string as +// undefined, and instead returns the default value. const base::FeatureParam<std::string> kLocaleOrLanguageAllowlist{ - &kJourneys, "JourneysLocaleOrLanguageAllowlist", ""}; + &internal::kJourneys, "JourneysLocaleOrLanguageAllowlist", ""}; const base::FeatureParam<int> kMaxVisitsToCluster{ - &kJourneys, "JourneysMaxVisitsToCluster", 1000}; + &internal::kJourneys, "JourneysMaxVisitsToCluster", 1000}; -const base::FeatureParam<int> kMaxDaysToCluster{&kJourneys, +const base::FeatureParam<int> kMaxDaysToCluster{&internal::kJourneys, "JourneysMaxDaysToCluster", 9}; // 20k should be more than enough for most cases and should avoid consuming // large amounts of memory in extreme cases. const base::FeatureParam<int> kMaxKeywordPhrases{ - &kJourneys, "JourneysMaxKeywordPhrases", 20000}; + &internal::kJourneys, "JourneysMaxKeywordPhrases", 20000}; const base::FeatureParam<bool> kPersistClustersInHistoryDb{ - &kJourneys, "JourneysPersistClustersInHistoryDb", false}; + &internal::kJourneys, "JourneysPersistClustersInHistoryDb", false}; const base::FeatureParam<double> kMinScoreToAlwaysShowAboveTheFold{ - &kJourneys, "JourneysMinScoreToAlwaysShowAboveTheFold", 0.5}; + &internal::kJourneys, "JourneysMinScoreToAlwaysShowAboveTheFold", 0.5}; const base::FeatureParam<int> kNumVisitsToAlwaysShowAboveTheFold{ - &kJourneys, "JourneysNumVisitsToAlwaysShowAboveTheFold", 3}; + &internal::kJourneys, "JourneysNumVisitsToAlwaysShowAboveTheFold", 3}; // Default to true, as this new alternate action text was recommended by our UX // writers. const base::FeatureParam<bool> kAlternateOmniboxActionText{ &kOmniboxAction, "JourneysAlternateOmniboxActionText", true}; +namespace internal { const base::Feature kJourneys{"Journeys", base::FEATURE_DISABLED_BY_DEFAULT}; +} // namespace internal const base::Feature kOmniboxAction{"JourneysOmniboxAction", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/history_clusters/core/features.h b/components/history_clusters/core/features.h index b133290..c1e31ce 100644 --- a/components/history_clusters/core/features.h +++ b/components/history_clusters/core/features.h
@@ -14,6 +14,10 @@ // Params & helpers functions // Returns true if Journeys in the Chrome History WebUI is enabled. +// Callers with access to `HistoryClustersService` should use +// `HistoryClustersService::IsJourneysEnabled` which has precomputed this value +// with the g_browser_process locale. Renderer process callers will have to +// use this function directly. bool IsJourneysEnabled(const std::string& application_locale); // A comma (or colon) separated list of allowed locales and languages for which @@ -65,9 +69,11 @@ // Features +namespace internal { // Enables Journeys in the Chrome History WebUI. This flag shouldn't be checked // directly. Instead use `IsJourneysEnabled()` for the system language filter. extern const base::Feature kJourneys; +} // namespace internal // Enables the Journeys Omnibox Action chip. `kJourneys` must also be enabled // for this to take effect.
diff --git a/components/history_clusters/core/features_unittest.cc b/components/history_clusters/core/features_unittest.cc index 054807a..663e69aa 100644 --- a/components/history_clusters/core/features_unittest.cc +++ b/components/history_clusters/core/features_unittest.cc
@@ -17,7 +17,7 @@ EXPECT_FALSE(IsJourneysEnabled(" random junk ")); base::test::ScopedFeatureList features; - features.InitWithFeatures({kJourneys, kOmniboxAction}, {}); + features.InitWithFeatures({internal::kJourneys, kOmniboxAction}, {}); EXPECT_TRUE(IsJourneysEnabled("")); EXPECT_TRUE(IsJourneysEnabled("en")); @@ -30,7 +30,7 @@ base::test::ScopedFeatureList features; features.InitWithFeaturesAndParameters( {{ - kJourneys, + internal::kJourneys, // Test that we're tolerant of spaces, colons, whole locales, as well // as primary language subcodes. {{"JourneysLocaleOrLanguageAllowlist", "en, fr:de:zh-TW"}},
diff --git a/components/history_clusters/core/history_clusters_service.cc b/components/history_clusters/core/history_clusters_service.cc index e17c3b77..3b85fe9 100644 --- a/components/history_clusters/core/history_clusters_service.cc +++ b/components/history_clusters/core/history_clusters_service.cc
@@ -40,7 +40,6 @@ #include "components/site_engagement/core/site_engagement_score_provider.h" #include "components/url_formatter/url_formatter.h" #include "third_party/abseil-cpp/absl/types/optional.h" -#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/time_format.h" #if BUILDFLAG(BUILD_WITH_ON_DEVICE_CLUSTERING_BACKEND) @@ -289,7 +288,8 @@ optimization_guide::EntityMetadataProvider* entity_metadata_provider, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, site_engagement::SiteEngagementScoreProvider* engagement_score_provider) - : application_locale_language_(l10n_util::GetLanguage(application_locale)), + : is_journeys_enabled_( + ::history_clusters::IsJourneysEnabled(application_locale)), history_service_(history_service), visit_deletion_observer_(this), post_processing_task_runner_(base::ThreadPool::CreateSequencedTaskRunner( @@ -354,9 +354,9 @@ visit_context_annotations.status.navigation_end_signals && (visit_context_annotations.status.ukm_page_end_signals || !visit_context_annotations.status.expect_ukm_page_end_signals)) { - // If the main kMemories feature is enabled, we want to persist visits. + // If the main Journeys feature is enabled, we want to persist visits. // And if the persist-only switch is enabled, we also want to persist them. - if (base::FeatureList::IsEnabled(kJourneys) || + if (IsJourneysEnabled() || base::FeatureList::IsEnabled(kPersistContextAnnotationsInHistoryDb)) { history_service_->AddContextAnnotationsForVisit( visit_context_annotations.visit_row.visit_id, @@ -426,7 +426,7 @@ bool HistoryClustersService::DoesQueryMatchAnyCluster( const std::string& query) { - if (!base::FeatureList::IsEnabled(kJourneys)) + if (!IsJourneysEnabled()) return false; // We don't want any omnibox jank for low-end devices.
diff --git a/components/history_clusters/core/history_clusters_service.h b/components/history_clusters/core/history_clusters_service.h index 34a234a..ad6ea6d 100644 --- a/components/history_clusters/core/history_clusters_service.h +++ b/components/history_clusters/core/history_clusters_service.h
@@ -97,6 +97,11 @@ // KeyedService: void Shutdown() override; + // Returns true if the Journeys feature is enabled for the current application + // locale. This is a cached wrapper of `IsJourneysEnabled()` within features.h + // that's already evaluated against the g_browser_process application locale. + bool IsJourneysEnabled() const { return is_journeys_enabled_; } + // Used to add and remove observers. void AddObserver(Observer* obs); void RemoveObserver(Observer* obs); @@ -200,8 +205,8 @@ QueryClustersCallback callback, QueryClustersResult result) const; - // The language of the application locale the service was initialized with. - const std::string application_locale_language_; + // True if the Journeys feature is enabled for the application locale. + const bool is_journeys_enabled_; // Non-owning pointer, but never nullptr. history::HistoryService* const history_service_;
diff --git a/components/history_clusters/core/history_clusters_service_test_api.h b/components/history_clusters/core/history_clusters_service_test_api.h index a9907089..4209c68 100644 --- a/components/history_clusters/core/history_clusters_service_test_api.h +++ b/components/history_clusters/core/history_clusters_service_test_api.h
@@ -65,10 +65,6 @@ loop.Run(); } - const std::string& GetServiceApplicationLocaleLanguage() const { - return history_clusters_service_->application_locale_language_; - } - HistoryClustersService* const history_clusters_service_; history::HistoryService* const history_service_; };
diff --git a/components/history_clusters/core/history_clusters_service_unittest.cc b/components/history_clusters/core/history_clusters_service_unittest.cc index 33e1fd0..4934826 100644 --- a/components/history_clusters/core/history_clusters_service_unittest.cc +++ b/components/history_clusters/core/history_clusters_service_unittest.cc
@@ -243,16 +243,10 @@ class HistoryClustersServiceTest : public HistoryClustersServiceTestBase { public: HistoryClustersServiceTest() { - scoped_feature_list_.InitAndEnableFeature(kJourneys); + scoped_feature_list_.InitAndEnableFeature(internal::kJourneys); } }; -TEST_F(HistoryClustersServiceTest, ApplicationLocaleLanguage) { - EXPECT_EQ( - history_clusters_service_test_api_->GetServiceApplicationLocaleLanguage(), - "en"); -} - TEST_F(HistoryClustersServiceTest, ClusterAndVisitSorting) { base::HistogramTester histogram_tester; AddHardcodedTestDataToHistoryService(); @@ -421,7 +415,7 @@ TEST_F(HistoryClustersServiceTest, HardCapOnVisitsFetchedFromHistory) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeatureWithParameters( - kJourneys, {{"JourneysMaxVisitsToCluster", "20"}}); + internal::kJourneys, {{"JourneysMaxVisitsToCluster", "20"}}); history::ContextID context_id = reinterpret_cast<history::ContextID>(1); auto visit = GetHardcodedTestVisits()[0]; @@ -751,7 +745,7 @@ scoped_feature_list_.InitWithFeatures( /*enabled_features=*/{}, /*disabled_features=*/{ - kJourneys, + internal::kJourneys, kPersistContextAnnotationsInHistoryDb, }); } @@ -919,9 +913,9 @@ HistoryClustersServiceMaxKeywordsTest() { // Set the max keyword phrases to 5. scoped_feature_list_.InitAndEnableFeatureWithParameters( - kJourneys, { - {kMaxKeywordPhrases.name, "5"}, - }); + internal::kJourneys, { + {kMaxKeywordPhrases.name, "5"}, + }); } }; TEST_F(HistoryClustersServiceMaxKeywordsTest,
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeController.java b/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeController.java index ce24451..eb7b011 100644 --- a/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeController.java +++ b/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeController.java
@@ -4,6 +4,8 @@ package org.chromium.components.messages; +import android.view.View; + import androidx.annotation.Nullable; import org.chromium.base.ActivityState; @@ -12,8 +14,10 @@ import org.chromium.content_public.browser.NavigationController; import org.chromium.content_public.browser.NavigationEntry; import org.chromium.content_public.browser.Visibility; +import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContentsObserver; import org.chromium.ui.base.PageTransition; +import org.chromium.ui.base.ViewAndroidDelegate; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid.ActivityStateObserver; @@ -79,21 +83,30 @@ super(scopeKey.webContents); mDelegate = delegate; mScopeKey = scopeKey; - mDelegate.onScopeChange(new MessageScopeChange(mScopeKey.scopeType, scopeKey, - scopeKey.webContents.getVisibility() == Visibility.VISIBLE - ? ChangeType.ACTIVE - : ChangeType.INACTIVE)); + int changeType = ChangeType.INACTIVE; + WebContents webContents = scopeKey.webContents; + if (webContents != null && webContents.getVisibility() == Visibility.VISIBLE) { + ViewAndroidDelegate viewAndroidDelegate = webContents.getViewAndroidDelegate(); + if (viewAndroidDelegate != null && viewAndroidDelegate.getContainerView() != null + && viewAndroidDelegate.getContainerView().getVisibility() != View.VISIBLE) { + changeType = ChangeType.INACTIVE; + } else { + changeType = ChangeType.ACTIVE; + } + } + mDelegate.onScopeChange( + new MessageScopeChange(mScopeKey.scopeType, scopeKey, changeType)); } @Override - public void wasShown() { + public void onWebContentsFocused() { super.wasShown(); mDelegate.onScopeChange( new MessageScopeChange(mScopeKey.scopeType, mScopeKey, ChangeType.ACTIVE)); } @Override - public void wasHidden() { + public void onWebContentsLostFocus() { super.wasHidden(); mDelegate.onScopeChange( new MessageScopeChange(mScopeKey.scopeType, mScopeKey, ChangeType.INACTIVE));
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeControllerTest.java b/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeControllerTest.java index f6fd252..e2c054b8 100644 --- a/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeControllerTest.java +++ b/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeControllerTest.java
@@ -70,8 +70,9 @@ Assert.assertEquals("Scope type should be inactive when page is hidden", ChangeType.INACTIVE, captor.getValue().changeType); - observer.wasShown(); + observer.onWebContentsFocused(); expectedOnScopeChangeCalls++; + verify(delegate, times(expectedOnScopeChangeCalls) .description("Delegate should be called when page is shown")) @@ -79,7 +80,7 @@ Assert.assertEquals("Scope type should be active when page is shown", ChangeType.ACTIVE, captor.getValue().changeType); - observer.wasHidden(); + observer.onWebContentsLostFocus(); expectedOnScopeChangeCalls++; verify(delegate, times(expectedOnScopeChangeCalls)
diff --git a/components/metrics/stability_metrics_helper.cc b/components/metrics/stability_metrics_helper.cc index 620ce56c..29c56a54 100644 --- a/components/metrics/stability_metrics_helper.cc +++ b/components/metrics/stability_metrics_helper.cc
@@ -309,6 +309,11 @@ : prefs::kStabilityRendererFailedLaunchCount; RecordStabilityEvent(metric); IncrementPrefValue(pref); + // TODO(crbug/1278145): Remove the scheduled write if it doesn't help resolve + // the discrepancy. + // Schedule a Local State write to help diagnose a discrepancy with + // Stability.Counts. + local_state_->CommitPendingWrite(); } void StabilityMetricsHelper::IncrementPrefValue(const char* path) {
diff --git a/components/nacl/browser/nacl_host_message_filter.cc b/components/nacl/browser/nacl_host_message_filter.cc index 177b5fc..3014cd9 100644 --- a/components/nacl/browser/nacl_host_message_filter.cc +++ b/components/nacl/browser/nacl_host_message_filter.cc
@@ -142,9 +142,6 @@ IPC::Message* reply_msg) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - // TODO(crbug.com/1273132): Remove. - bool nonsfi_mode_allowed = false; - auto map_url_callback = nacl::NaClBrowser::GetDelegate()->GetMapUrlToLocalFilePathCallback( profile_directory_); @@ -156,17 +153,15 @@ uint32_t perms = launch_params.permission_bits & ppapi::PERMISSION_DEV; LaunchNaClContinuationOnUIThread( launch_params, reply_msg, std::vector<NaClResourcePrefetchResult>(), - ppapi::PpapiPermissions(perms), nonsfi_mode_allowed, map_url_callback); + ppapi::PpapiPermissions(perms), map_url_callback); return; } - LaunchNaClContinuation(launch_params, reply_msg, nonsfi_mode_allowed, - map_url_callback); + LaunchNaClContinuation(launch_params, reply_msg, map_url_callback); } void NaClHostMessageFilter::LaunchNaClContinuation( const nacl::NaClLaunchParams& launch_params, IPC::Message* reply_msg, - bool nonsfi_mode_allowed, NaClBrowserDelegate::MapUrlToLocalFilePathCallback map_url_callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -210,14 +205,13 @@ base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, base::BindOnce(&NaClHostMessageFilter::BatchOpenResourceFiles, this, safe_launch_params, reply_msg, permissions, - nonsfi_mode_allowed, map_url_callback)); + map_url_callback)); } void NaClHostMessageFilter::BatchOpenResourceFiles( const nacl::NaClLaunchParams& launch_params, IPC::Message* reply_msg, ppapi::PpapiPermissions permissions, - bool nonsfi_mode_allowed, NaClBrowserDelegate::MapUrlToLocalFilePathCallback map_url_callback) { std::vector<NaClResourcePrefetchResult> prefetched_resource_files; const std::vector<NaClResourcePrefetchRequest>& request_list = @@ -247,7 +241,7 @@ FROM_HERE, base::BindOnce(&NaClHostMessageFilter::LaunchNaClContinuationOnUIThread, this, launch_params, reply_msg, prefetched_resource_files, - permissions, nonsfi_mode_allowed, map_url_callback)); + permissions, map_url_callback)); } void NaClHostMessageFilter::LaunchNaClContinuationOnUIThread( @@ -255,7 +249,6 @@ IPC::Message* reply_msg, const std::vector<NaClResourcePrefetchResult>& prefetched_resource_files, ppapi::PpapiPermissions permissions, - bool nonsfi_mode_allowed, NaClBrowserDelegate::MapUrlToLocalFilePathCallback map_url_callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -267,11 +260,12 @@ base::PlatformFile nexe_file = IPC::PlatformFileForTransitToPlatformFile(launch_params.nexe_file); + // TODO(b/200965779): Remove nonsfi_mode parameters from NaClProcessHost. NaClProcessHost* host = new NaClProcessHost( GURL(launch_params.manifest_url), base::File(nexe_file), nexe_token, prefetched_resource_files, permissions, launch_params.permission_bits, - launch_params.uses_nonsfi_mode, nonsfi_mode_allowed, off_the_record_, - launch_params.process_type, profile_directory_); + launch_params.uses_nonsfi_mode, /*nonsfi_mode_allowed=*/false, + off_the_record_, launch_params.process_type, profile_directory_); GURL manifest_url(launch_params.manifest_url); base::FilePath manifest_path; // We're calling MapUrlToLocalFilePath with the non-blocking API
diff --git a/components/nacl/browser/nacl_host_message_filter.h b/components/nacl/browser/nacl_host_message_filter.h index 1752c1f..0d9cd83a 100644 --- a/components/nacl/browser/nacl_host_message_filter.h +++ b/components/nacl/browser/nacl_host_message_filter.h
@@ -57,19 +57,16 @@ const nacl::NaClLaunchParams& launch_params, IPC::Message* reply_msg, ppapi::PpapiPermissions permissions, - bool nonsfi_mode_allowed, NaClBrowserDelegate::MapUrlToLocalFilePathCallback map_url_callback); void LaunchNaClContinuation( const nacl::NaClLaunchParams& launch_params, IPC::Message* reply_msg, - bool nonsfi_mode_allowed, NaClBrowserDelegate::MapUrlToLocalFilePathCallback map_url_callback); void LaunchNaClContinuationOnUIThread( const nacl::NaClLaunchParams& launch_params, IPC::Message* reply_msg, const std::vector<NaClResourcePrefetchResult>& prefetched_resource_files, ppapi::PpapiPermissions permissions, - bool nonsfi_mode_allowed, NaClBrowserDelegate::MapUrlToLocalFilePathCallback map_url_callback); void OnGetReadonlyPnaclFd(const std::string& filename, bool is_executable,
diff --git a/components/omnibox/browser/actions/history_clusters_action.cc b/components/omnibox/browser/actions/history_clusters_action.cc index 6adfb257..6eb4779 100644 --- a/components/omnibox/browser/actions/history_clusters_action.cc +++ b/components/omnibox/browser/actions/history_clusters_action.cc
@@ -75,7 +75,7 @@ return; // Both features must be enabled to ever attach the action chip. - if (!base::FeatureList::IsEnabled(history_clusters::kJourneys) || + if (!service->IsJourneysEnabled() || !base::FeatureList::IsEnabled(history_clusters::kOmniboxAction)) { return; }
diff --git a/components/omnibox/browser/autocomplete_result.cc b/components/omnibox/browser/autocomplete_result.cc index c9db9037..fb50ad994 100644 --- a/components/omnibox/browser/autocomplete_result.cc +++ b/components/omnibox/browser/autocomplete_result.cc
@@ -112,11 +112,17 @@ // static size_t AutocompleteResult::GetDynamicMaxMatches() { +#if defined(OS_ANDROID) + constexpr const int kDynamicMaxMatchesLimit = 15; +#else // !defined(OS_ANDROID) + constexpr const int kDynamicMaxMatchesLimit = 10; +#endif if (!base::FeatureList::IsEnabled(omnibox::kDynamicMaxAutocomplete)) return AutocompleteResult::GetMaxMatches(); return base::GetFieldTrialParamByFeatureAsInt( omnibox::kDynamicMaxAutocomplete, - OmniboxFieldTrial::kDynamicMaxAutocompleteIncreasedLimitParam, 10); + OmniboxFieldTrial::kDynamicMaxAutocompleteIncreasedLimitParam, + kDynamicMaxMatchesLimit); } AutocompleteResult::AutocompleteResult() {
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc index b576c40..feb25b8 100644 --- a/components/omnibox/common/omnibox_features.cc +++ b/components/omnibox/common/omnibox_features.cc
@@ -100,7 +100,7 @@ // would be shown. E.g., show up to 10 suggestions if doing so would display no // URLs; else show up to 8 suggestions if doing so would include 1 or more URLs. const base::Feature kDynamicMaxAutocomplete{"OmniboxDynamicMaxAutocomplete", - enabled_by_default_desktop_only}; + enabled_by_default_desktop_android}; // If enabled, when the user clears the whole omnibox text (i.e. via Backspace), // Chrome will request remote ZeroSuggest suggestions for the OTHER page @@ -149,7 +149,7 @@ base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kOnFocusSuggestionsContextualWebAllowSRP{ "OmniboxOnFocusSuggestionsContextualWebAllowSRP", - base::FEATURE_DISABLED_BY_DEFAULT}; + enabled_by_default_android_only}; const base::Feature kOnFocusSuggestionsContextualWebOnContent{ "OmniboxOnFocusSuggestionsContextualWebOnContent", enabled_by_default_android_only};
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index bef95d28..3d88fc3 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -13022,7 +13022,7 @@ 'type': 'string', }, }, - 'future_on': ['chrome_os'], + 'supported_on': ['chrome_os:98-'], 'features': { 'dynamic_refresh': True, 'per_profile': False,
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index fa35840..52f815e 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -211,6 +211,7 @@ Si no estableces la política o el valor que genera la sustitución no es un nombre de host válido, no se configurará ningún nombre de host en la solicitud de DHCP.</translation> <translation id="1257550411839719984">Establecer el directorio de descarga predeterminado</translation> <translation id="1265053460044691532">Permite limitar el tiempo durante el cual un usuario autenticado mediante SAML puede acceder sin conexión.</translation> +<translation id="1268548671627260798">Lista de URLs que están exentas de la notificación sobre la pantalla completa</translation> <translation id="127264587838521316">Habilita las solicitudes de instalación de extensiones de <ph name="PRODUCT_NAME" /></translation> <translation id="1272798957154751008">Habilitar la migración de los dispositivos Chromad a la administración de la nube</translation> <translation id="1274997165432133392">Cookies y otros datos de sitios</translation> @@ -382,6 +383,18 @@ Nota: Esta política también se aplica en las extensiones de componentes, como la extensión de Servicios de Hangout.</translation> <translation id="148194404518916594">Permite que los usuarios utilicen Tocar para buscar</translation> +<translation id="1485570394283692769">Controla si los sitios web pueden enviar solicitudes a extremos de red más privados de una forma no segura. + + Esta política está relacionada con la especificación Acceso a redes privadas. Para obtener más información, consulta https://wicg.github.io/private-network-access/. + + Un extremo de red es más privado que otro en los siguientes casos: + 1) Si su dirección IP es localhost y la otra no lo es. + 2) Si su dirección IP es privada y la otra es pública. + En el futuro, en función de la evolución de las especificaciones, es posible que se aplique esta política a todas las solicitudes de origen cruzado dirigidas a IP privadas o localhost. + + Si se establece esta política como falsa o no se establece, el comportamiento predeterminado para las solicitudes a extremos de red más privados dependerá de la configuración personal del usuario con respecto a las marcas de función <ph name="BLOCK_INSECURE_PRIVATE_NETWORK_REQUESTS_FEATURE_NAME" />, <ph name="PRIVATE_NETWORK_ACCESS_SEND_PREFLIGHTS_FEATURE_NAME" /> y <ph name="PRIVATE_NETWORK_ACCESS_RESPECT_PREFLIGHT_RESULTS_FEATURE_NAME" />, las cuales se pueden establecer en una prueba de campo o en la línea de comandos. + + Si estableces esta política como verdadera, los sitios web podrán enviar solicitudes a cualquier extremo de red, sujeto a otras verificaciones de origen cruzado.</translation> <translation id="1486021504508098388">Enviar información sobre la luz de fondo</translation> <translation id="1487916040416013623">Si estableces la política, se especificarán los servidores que deben habilitarse para la autenticación integrada, la cual solo está activa cuando <ph name="PRODUCT_NAME" /> recibe un desafío de autenticación de un proxy o de un servidor que se encuentra en la lista autorizada. @@ -2738,6 +2751,11 @@ Si inhabilitas la política o no la estableces, los usuarios podrán transferir archivos a Drive por conexión móvil.</translation> <translation id="4248277954659222481">Permite la reproducción automática de contenido multimedia en una lista de patrones de URL permitidos</translation> <translation id="4250680216510889253">No</translation> +<translation id="4257545866869267519">Configura una lista de direcciones URL que estén exentas de la notificación sobre la pantalla completa. La notificación se muestra cuando el dispositivo sale del modo de suspensión, aumenta el brillo o se desbloquea la pantalla y una ventana está en modo de pantalla completa. De esta forma, los usuarios sabrán que están en modo de pantalla completa, lo que reduce el riesgo de una suplantación de identidad. + + Esta política permite desactivar la notificación para direcciones URL específicas que se consideran fuentes confiables. Se establece al especificar una lista de patrones de URL que cumplen con el siguiente formato ( https://www.chromium.org/administrators/url-blocklist-filter-format ). P. ej., es posible inhabilitar las notificaciones por completo al especificar el carácter comodín <ph name="WILDCARD_VALUE" /> que coincida con todas las URLs. + + Si estableces esta política como una lista vacía o no la estableces, ninguna URL queda exenta de la notificación sobre la pantalla completa.</translation> <translation id="4260027436474745627">Si estableces la política, cada uno de los orígenes designados en una lista de elementos separados por comas se ejecutará en un proceso dedicado. El proceso de cada origen designado solo podrá incluir documentos de ese origen y sus subdominios. Por ejemplo, si especificas https://a1.example.com/, se permitirá https://a2.a1.example.com/ en el mismo proceso, pero no así https://example.com o https://b.example.com. A partir de <ph name="PRODUCT_NAME" /> 77, también puedes especificar un rango de orígenes para aislarlos mediante un comodín. Por ejemplo, si especificas https://[*.]corp.example.com, se otorgará su propio proceso dedicado a cada origen dentro de https://corp.example.com, incluidos https://corp.example.com, https://a1.corp.example.com y https://a2.a1.corp.example.com. @@ -2923,6 +2941,7 @@ <translation id="449784980858429908">Otorgar permiso automáticamente a los sitios para conectarse a puertos en serie</translation> <translation id="450080746522343150">Bloquear todas las descargas</translation> <translation id="4510923771103268849">El usuario tiene acceso con permisos de administrador a los contenedores de Crostini</translation> +<translation id="4512407512989846472">No permitir la copia al portapapeles en URLs específicas</translation> <translation id="4513691822411041977">No forzar el uso de SafeSearch en la Búsqueda de Google ni en el modo restringido de YouTube</translation> <translation id="4515404363392014383">Habilita la Navegación segura para las fuentes de confianza</translation> <translation id="4518251772179446575">Preguntar siempre si un sitio quiere rastrear la ubicación física de los usuarios.</translation> @@ -4258,6 +4277,7 @@ De lo contrario, se ocultarán las direcciones IP locales con nombres de host de mDNS. Ten en cuenta que esta política afecta la protección de las IP locales, si los administradores la habilitan.</translation> <translation id="614662973812186053">Esta política también controla la recopilación de datos de diagnóstico y uso de Android.</translation> +<translation id="614665605501218241">Permitir a los sitios de la lista enviar solicitudes a extremos de red más privados de una forma no segura.</translation> <translation id="6154509171634387825">Advertencia: 3DES se quitará por completo en la versión 95 de <ph name="PRODUCT_NAME" /> (alrededor de octubre de 2021) y esta política dejará de funcionar. Si estableces la política como verdadera, se habilitarán los conjuntos de algoritmos de cifrado 3DES en TLS. Si la estableces como falsa, se inhabilitarán los conjuntos. Si no la estableces, los conjuntos de algoritmos de cifrado 3DES estarán inhabilitados de forma predeterminada. Esta política podrá usarse para asegurar la compatibilidad de forma temporal con un servidor desactualizado. Esta es una medida provisoria; deberás volver a configurar el servidor. @@ -4272,6 +4292,13 @@ Si no la estableces, los usuarios podrán activar o desactivar esta función.</translation> <translation id="6174065452773547810">Si habilitas la política o no la estableces, los dispositivos tendrán controles de informes detallados. Si inhabilitas la política, los dispositivos inscritos no tendrán controles de informes detallados.</translation> +<translation id="6174187836314350835">Lista de patrones de URL. Las solicitudes iniciadas en sitios web entregados por orígenes coincidentes no están sujetas a verificaciones del Acceso de red privada. + + Si no estableces esta política, se comportará como si se hubiera establecido con una lista vacía. + + En el caso de orígenes no contemplados en los patrones especificados en la política, se utilizará el valor predeterminado global ya sea de la política <ph name="INSECURE_PRIVATE_NETWORK_REQUESTS_ALLOWED_POLICY_NAME" /> (si se establece) o de la configuración personal del usuario. + + Para obtener información detallada sobre los patrones de URL válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="6178075938488052838">Esta política controla quién puede iniciar una sesión en <ph name="PRODUCT_OS_NAME" />, pero no impide que los usuarios accedan a otras cuentas de Google en Android. Si quieres impedirlo, configura la política <ph name="ACCOUNT_TYPES_WITH_MANAGEMENT_DISABLED_CLOUDDPC_POLICY_NAME" /> específica de Android como parte de la política <ph name="ARC_POLICY_POLICY_NAME" />.</translation> <translation id="6181304954168534748">Hash SHA-256 de la plantilla de escritorio.</translation> <translation id="6181618732396778048">No permite que ningún sitio solicite acceso de escritura a archivos ni directorios</translation> @@ -4733,6 +4760,7 @@ Nota: Aunque la política acepte varios elementos en <ph name="ENTRIES_FIELD_NAME" />, ignorará todos menos el primero. Advertencia: Si estableces esta política, es posible que se retrase la aplicación de las actualizaciones de software.</translation> <translation id="6698632841807204978">Habilitar la impresión monocromática</translation> +<translation id="6699740789657890714">Especificar si se permite que los sitios web envíen solicitudes a extremos de red más privados de una forma no segura</translation> <translation id="6699880231565102694">Habilitar autenticación de dos factores para los hosts de acceso remoto.</translation> <translation id="6703251016607733593">Si estableces la política, se inhabilitará la aplicación de los requisitos de divulgación del Certificado de transparencia para una lista de hash de <ph name="SUBJECT_PUBLIC_KEY_INFO" />. Los hosts empresariales podrán seguir usando los certificados que no sean de confianza (porque no se divulgaron públicamente de forma correcta). Para inhabilitar la aplicación, el hash debe complir con una de las siguientes condiciones: @@ -5879,6 +5907,14 @@ <translation id="8028814157747157754">Habilitar el proveedor de búsqueda predeterminado y permitir que los usuarios modifiquen la lista de proveedores de búsqueda</translation> <translation id="8029201909194194377">Duración máxima de la sesión que se permite para las conexiones de acceso remoto</translation> <translation id="8029607810986641704">Bloquear el dispositivo cuando está inactivo o suspendido</translation> +<translation id="8032201191311129122">Esta política bloquea la copia de datos al portapapeles en URLs específicas. + + Las listas de URLs <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> y <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> controlan los sitios que pueden escribir en el portapapeles. Si la URL coincide con un patrón del campo "enable" y no coincide con ningún patrón del campo "disable", se bloqueará una escritura en el portapapeles. Si la URL no coincide con ningún patrón, no se bloqueará la copia. + + Los patrones de coincidencia de orígenes usan un formato similar a los de la política "<ph name="URL_BLOCKLIST_POLICY_NAME" />", que se documentan en http://www.chromium.org/administrators/url-blocklist-filter-format. + + El valor <ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE" /> indica la cantidad mínima de datos (expresada en bytes) que activa la revisión de patrones. Esto significa que se permitiría una escritura en el portapapeles de parte de una URL bloqueada si el tamaño de los datos copiados es menor al valor especificado en este campo. Si no estableces el campo, el valor predeterminado es 100 bytes. + </translation> <translation id="8044493735196713914">Modo de notificación de inicio de dispositivo</translation> <translation id="80453040817068401">Hacer que el navegador <ph name="LACROS_NAME" /> esté disponible</translation> <translation id="804619600634661088">Permitir el uso de la depuración remota</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 82473b0..0f82abd 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -211,6 +211,7 @@ Als je het beleid niet instelt of als de waarde na vervanging geen geldige hostnaam is, wordt er geen hostnaam ingesteld in het DHCP-verzoek.</translation> <translation id="1257550411839719984">Standaardmap voor downloads instellen</translation> <translation id="1265053460044691532">De offline inlogtijd beperken voor een gebruiker die is geverifieerd via SAML</translation> +<translation id="1268548671627260798">Lijst met URL's die zijn vrijgesteld van de melding over volledig scherm</translation> <translation id="127264587838521316">Hiermee worden installatieverzoeken voor <ph name="PRODUCT_NAME" />-extensies aangezet</translation> <translation id="1272798957154751008">De migratie van Chromad-apparatten naar cloudbeheer aanzetten</translation> <translation id="1274997165432133392">Cookies en andere sitegegevens</translation> @@ -382,6 +383,18 @@ Opmerking: Dit beleid is ook van toepassing op componentextensies, zoals de Hangout Services-extensie.</translation> <translation id="148194404518916594">Toestaan dat gebruikers 'Tikken om te zoeken' gebruiken</translation> +<translation id="1485570394283692769">Hiermee bepaal je of websites op een onbeveiligde manier verzoeken mogen sturen naar netwerkeindpunten die meer privé zijn. + + Dit beleid heeft betrekking op de specificatie voor toegang tot privénetwerken. Zie https://wicg.github.io/private-network-access/ voor meer informatie. + + Een netwerkeindpunt is meer privé dan een ander eindpunt als: +1) het IP-adres van het netwerkeindpunt localhost is en het andere niet, + 2) het IP-adres van het netwerkeindpunt privé is en het andere openbaar. + Afhankelijk van hoe de specificatie zich ontwikkelt, kan dit beleid in de toekomt van toepassing zijn op alle cross-origin-verzoeken naar privé-IP-adressen of localhost. + + Als je dit beleid niet instelt of instelt op False, hangt het standaardgedrag voor verzoeken naar netwerkeindpunten die meer privé zijn af van de persoonlijke instellingen van de gebruiker voor de functievlaggen <ph name="BLOCK_INSECURE_PRIVATE_NETWORK_REQUESTS_FEATURE_NAME" />, <ph name="PRIVATE_NETWORK_ACCESS_SEND_PREFLIGHTS_FEATURE_NAME" /> en <ph name="PRIVATE_NETWORK_ACCESS_RESPECT_PREFLIGHT_RESULTS_FEATURE_NAME" />, die kunnen worden ingesteld via praktijktests of via de opdrachtregel. + + Als je dit beleid instelt op True, mogen websites verzoeken sturen naar elk willekeurig netwerkeindpunt (hiervoor worden andere cross-origin-checks uitgevoerd).</translation> <translation id="1486021504508098388">Informatie over schermverlichting melden</translation> <translation id="1487916040416013623">Als je het beleid instelt, geef je aan welke servers op de toelatingslijst voor geïntegreerde verificatie moeten worden gezet. Geïntegreerde verificatie is alleen aangezet als <ph name="PRODUCT_NAME" /> een verificatie-uitdaging ontvangt van een proxy of een server die op deze toelatingslijst staat. @@ -2718,6 +2731,11 @@ Als je het beleid niet toepast of niet instelt, kunnen gebruikers bestanden overzetten naar Drive via een mobiele verbinding.</translation> <translation id="4248277954659222481">Automatisch afspelen van media toestaan op een toelatingslijst met URL-patronen</translation> <translation id="4250680216510889253">Nee</translation> +<translation id="4257545866869267519">Hiermee kun je een lijst met URL's instellen die zijn vrijgesteld van de melding over volledig scherm. De melding wordt getoond als het apparaat uit de slaapstand wordt gehaald, de helderheid wordt verhoogd of het vergrendelscherm wordt ontgrendeld en het apparaat een venster in de modus voor volledig scherm heeft. De bedoeling is om gebruikers ervan bewust te maken dat de modus voor volledig scherm aanstaat. Dit verkleint het risico op phishingaanvallen. + + Met dit beleid kun je de melding uitzetten voor specifieke URL's die als vertrouwde bronnen worden beschouwd. Het beleid wordt ingesteld door een lijst met URL-patronen op te geven die zijn ingedeeld volgens https://www.chromium.org/administrators/url-blocklist-filter-format. Het is bijvoorbeeld mogelijk om de meldingen helemaal uit te zetten door het jokerteken <ph name="WILDCARD_VALUE" /> op te geven dat overeenkomt met alle URL's. + +Als je dit beleid instelt voor een lege lijst of niet instelt, zijn er geen URL's vrijgesteld van de melding over volledig scherm.</translation> <translation id="4260027436474745627">Als je dit beleid toepast, wordt elk van de benoemde herkomsten in een door komma's gescheiden lijst uitgevoerd in een eigen proces. Elk proces van een benoemde herkomst mag alleen documenten bevatten van de betreffende herkomst en de subdomeinen daarvan. Als je bijvoorbeeld https://a1.example.com/ opgeeft, valt https://a2.a1.example.com/ onder hetzelfde proces, maar https://example.com of https://b.example.com niet. Sinds <ph name="PRODUCT_NAME" /> 77 kun je met een jokerteken een herkomstbereik opgeven om te isoleren. Als je bijvoorbeeld https://[*.]corp.example.com opgeeft, wordt elke herkomst onder https://corp.example.com uitgevoerd in een eigen proces, waaronder https://corp.example.com zelf, https://a1.corp.example.com en https://a2.a1.corp.example.com. @@ -4244,6 +4262,7 @@ Anders worden lokale IP-adressen verborgen met mDNS-hostnamen. Houd er rekening mee dat dit beleid de beveiliging van lokale IP's verzwakt als beheerders dit nodig hebben.</translation> <translation id="614662973812186053">Met dit beleid wordt ook het gebruik van Android en het verzamelen van diagnostische gegevens bepaald.</translation> +<translation id="614665605501218241">Hiermee sta je de vermelde sites toe om op een onbeveiligde manier verzoeken te sturen naar netwerkeindpunten die meer privé zijn.</translation> <translation id="6154509171634387825">Waarschuwing: 3DES wordt volledig verwijderd uit <ph name="PRODUCT_NAME" /> vanaf versie 95 (rond oktober 2021). Dit beleid werkt dan niet meer. Als je het beleid instelt op True, worden 3DES cipher suites in TLS aangezet. Als je het beleid instelt op False, worden ze uitgezet. Als je het beleid niet instelt, staan 3DES cipher suites standaard uit. Je kunt dit beleid gebruiken om de compatibiliteit met een verouderde server tijdelijk te behouden. Dit is slechts een noodoplossing. De server moet opnieuw worden ingesteld. @@ -4258,6 +4277,13 @@ Als je het beleid niet instelt, kunnen gebruikers zelf bepalen of ze deze functie willen aan- of uitzetten.</translation> <translation id="6174065452773547810">Als je dit beleid toepast of niet instelt, kan het apparaat opties voor gedetailleerde rapportage krijgen. Als je het beleid niet toepast, kunnen ingeschreven apparaten geen opties voor gedetailleerde rapportage krijgen.</translation> +<translation id="6174187836314350835">Lijst met URL-patronen. Verzoeken die worden gestart vanaf websites die worden geleverd via overeenkomende oorsprongen, worden niet onderworpen aan checks voor toegang tot privénetwerken. + + Als je dit beleid niet instelt, gedraagt het zich alsof het is ingesteld op de lege lijst. + + Voor oorsprongen die niet overeenkomen met de hier genoemde patronen, wordt de algemene standaardwaarde gebruikt op basis van het beleid <ph name="INSECURE_PRIVATE_NETWORK_REQUESTS_ALLOWED_POLICY_NAME" /> (als dit is ingesteld) of anders op basis van de persoonlijke instellingen van de gebruiker. + + Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige URL-patronen.</translation> <translation id="6178075938488052838">Met dit beleid wordt bepaald wie een <ph name="PRODUCT_OS_NAME" />-sessie mag starten. Hiermee wordt niet voorkomen dat gebruikers binnen Android inloggen op extra Google-accounts. Als je dit wilt voorkomen, kun je het Android-specifieke beleid <ph name="ACCOUNT_TYPES_WITH_MANAGEMENT_DISABLED_CLOUDDPC_POLICY_NAME" /> configureren als onderdeel van <ph name="ARC_POLICY_POLICY_NAME" />.</translation> <translation id="6181304954168534748">De SHA-256-hash van de bureautemplate.</translation> <translation id="6181618732396778048">Geen sites toestemming geven om schrijftoegang tot bestanden en directory's te vragen</translation> @@ -4693,6 +4719,7 @@ Opmerking: Hoewel er met het beleid meerdere items kunnen worden geaccepteerd in <ph name="ENTRIES_FIELD_NAME" />, wordt alleen het eerste item gebruikt. De andere items worden genegeerd. Waarschuwing: Als je dit beleid instelt, kan de toepassing van software-updates worden vertraagd.</translation> <translation id="6698632841807204978">Monochroom afdrukken aanzetten</translation> +<translation id="6699740789657890714">Hiermee kun je aangeven of websites op een onbeveiligde manier verzoeken mogen sturen naar netwerkeindpunten die meer privé zijn.</translation> <translation id="6699880231565102694">Verificatie in 2 stappen aanzetten voor hosts voor externe toegang</translation> <translation id="6703251016607733593">Als je dit beleid instelt, wordt de handhaving van vereisten voor openbaarmaking via Certificaattransparantie uitgezet voor een lijst van <ph name="SUBJECT_PUBLIC_KEY_INFO" />-hashes. Enterprise-hosts kunnen certificaten blijven gebruiken die anders niet zouden worden vertrouwd (omdat deze niet op de juiste manier openbaar zijn gemaakt). Als je de handhaving wilt uitzetten, moet de hash aan een van de volgende voorwaarden voldoen:
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index babead37..6555a26 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -2865,6 +2865,23 @@ Se esta política for definida como falsa, o navegador não mostrará novamente a página de recepção na primeira execução após um upgrade do SO.</translation> <translation id="441686537793821907">Bloquear a instalação de extensões externas</translation> +<translation id="4420613474328461583">Lista de configurações dos serviços do Chrome Enterprise Connectors que serão aplicadas ao conector <ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" />, que é acionado quando o download de um arquivo é feito no Chrome. + + Os campos <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> são usados para determinar se o conector envia um arquivo para análise quando o download é feito em uma página específica e quais tags são incluídas na solicitação de análise desse arquivo. Uma tag correspondente ao padrão "ativar" é incluída na solicitação de análise se o URL da página corresponder a um padrão associado a essa tag. Isso acontecerá apenas se nenhum padrão "desativar" com a mesma tag corresponder ao URL da página. A análise é feita se pelo menos uma tag estiver incluída na solicitação. + + O campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica o provedor de serviços de análise correspondente às configurações. + + Se o campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> for definido como 1, o Chrome espera uma resposta do serviço de análise antes de dar ao usuário acesso ao arquivo. Qualquer outro valor inteiro dá acesso imediato ao arquivo para o usuário. + + O campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> controla se o Chrome bloqueia ou permite arquivos protegidos por senha. + + O campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> controla se o Chrome bloqueia ou permite arquivos grandes demais para serem analisados. + + O campo <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> é usado a fim de determinar para quais tags o conector precisa exigir uma justificativa do usuário para ignorar uma verificação que resulta em um aviso que pode ser ignorado. Se o campo não for definido, presume-se que uma justificativa não é necessária. + + Os campos <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> são usados para configurar uma mensagem que informa o usuário quando um aviso é exibido após uma verificação identificar um arquivo que viola a política. O campo "message" contém o texto que é exibido ao usuário e pode ter no máximo 200 caracteres. O campo "learn_more_url" contém um URL fornecido pelo administrador em que o usuário pode clicar para receber mais informações fornecidas pelo cliente sobre o motivo da ação ter sido bloqueada. O campo "language" é opcional e contém o idioma da mensagem. Deixar esse campo vazio ou com um valor "default" (padrão) indica uma mensagem que é usada quando o idioma do usuário não contiver uma. O campo "tag" especifica para quais tipos de verificação a mensagem é exibida. A lista "custom_messages" pode ter zero ou mais entradas. Cada entrada precisa ter campos "message" e "tag" não vazios. + + Esta política só pode ser definida pelo <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="4423597592074154136">Especificar manualmente as configurações de proxy</translation> <translation id="4424004842303301809">Desativar relatórios de eventos para prevenção de vazamento de dados</translation> <translation id="4427173305799125784">O visualizador de PDF não pode fazer anotações em PDFs</translation> @@ -2986,6 +3003,7 @@ Para ver a explicação detalhada, acesse https://www.chromestatus.com/feature/5675755719622656. Se esta política estiver ativada, os sites terão permissão para navegar e abrir novas janelas/guias simultaneamente. Se esta política estiver desativada ou for deixada sem definição, os sites não terão permissão para navegar e abrir uma nova janela/guia simultaneamente.</translation> +<translation id="457430673056611745">Política de configuração para o OnPrint do <ph name="PRODUCT_NAME" /> Enterprise Connector</translation> <translation id="4578265298946081589">Não é reinicializado quando o usuário sai.</translation> <translation id="4581507927311097234">O tempo, em milissegundos, sem entrada do usuário até que a tela seja desligada.</translation> <translation id="4582338216073557489">Definir a política como "Nenhuma" faz com que o <ph name="PRODUCT_NAME" /> use o tamanho de cache padrão para o armazenamento de arquivos em cache no disco. Os usuários não podem fazer mudanças. @@ -5994,6 +6012,23 @@ Se a política for definida como "Desativada" ou não for definida, nenhum pacote será enviado.</translation> <translation id="816783746144552109">Configurar a versão mínima permitida do Chrome OS para o dispositivo.</translation> +<translation id="8169492352330154095">Lista de configurações dos serviços do Chrome Enterprise Connectors que serão aplicadas ao conector <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" />, que é acionado quando um arquivo é anexado ao Chrome. + + Os campos <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> são usados para determinar se o conector envia um arquivo para análise quando for anexado a uma página específica e quais tags são incluídas na solicitação de análise desse arquivo. Uma tag correspondente ao padrão "ativar" é incluída na solicitação de análise se o URL da página corresponder a um padrão associado a essa tag. Isso acontece apenas se nenhum padrão "desativar" com a mesma tag corresponder ao URL da página. A análise é feita se pelo menos uma tag for incluída na solicitação. + + O campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica o provedor de serviços de análise correspondente às configurações. + + Se o campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> for definido como 1, o Chrome espera uma resposta do serviço de análise antes de dar à página acesso ao arquivo. Qualquer outro valor inteiro dá à página acesso imediato ao arquivo. + + O campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> controla se o Chrome bloqueia ou permite arquivos protegidos por senha. + + O campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> controla se o Chrome bloqueia ou permite arquivos grandes demais para serem analisados. + + O campo <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> é usado a fim de determinar para quais tags o conector precisa de uma justificativa do usuário para ignorar uma verificação que resulta em um aviso que pode ser ignorado. Se o campo não for definido, presume-se que uma justificativa não é necessária. + + Os campos <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> são usados para configurar uma mensagem que informa o usuário quando um aviso é exibido após uma verificação apresenta um veredito não limpo. O campo "message" contém o texto que é exibido ao usuário e pode ter no máximo 200 caracteres. O campo "learn_more_url" contém um URL fornecido pelo administrador em que o usuário pode clicar para receber mais informações fornecidas pelo cliente sobre o motivo da ação ter sido bloqueada. O campo "language" é opcional e contém o idioma da mensagem. Deixar esse campo vazio ou com um valor "default" (padrão) indica uma mensagem que é usada quando o idioma do usuário não contiver uma. O campo "tag" especifica para quais tipos de verificação a mensagem é exibida. A lista "custom_messages" pode ter zero ou mais entradas. Cada entrada precisa ter campos "message" e "tag" não vazios. + + Esta política só pode ser definida pelo <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="8171924760436219650">Usar o botão direito do mouse como o principal na tela de login</translation> <translation id="8173864651667424191">Usar "Imprimir como imagem" como padrão na visualização da impressão de documentos PDF quando a opção estiver disponível</translation> <translation id="8176035528522326671">Permitir que o usuário corporativo seja o usuário principal de diversos perfis (comportamento padrão para usuários gerenciados por empresa)</translation> @@ -6247,6 +6282,11 @@ Se essa política não for definida, o valor padrão 3 será usado. Se a política for definida, snapshots antigos serão excluídos conforme necessário para respeitar o limite. Se a política for definida como 0, nenhum snapshot será criado.</translation> +<translation id="8447347049334673364">Se definida, a política controlará as configurações de gerenciamento de extensões do <ph name="PRODUCT_NAME" />, inclusive aquelas controladas pelas políticas existentes relacionadas a extensões. A política substitui todas as políticas legadas que possam estar definidas. + + Esta política mapeia um ID de extensão ou um URL de atualização apenas para a própria configuração específica. Uma configuração padrão pode ser definida para o ID especial <ph name="DEFAULT_SCOPE" />, que será aplicada a todas as extensões que não tiverem uma configuração personalizada definida nesta política. Com um URL de atualização, a configuração será aplicada a todas as extensões com o URL de atualização exato indicado no manifesto da extensão (http://support.google.com/chrome/a?p=Configure_ExtensionSettings_policy). Se a sinalização "override_update_url" for definida como verdadeira, a extensão será instalada e atualizada usando o URL de atualização especificado na política <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> ou no campo "update_url" desta política. A sinalização "override_update_url" será ignorada se o campo "update_url" for um URL da Chrome Web Store. + + Observação: a instalação forçada é limitada a apps e extensões listados na Chrome Web Store para instâncias do <ph name="MS_WIN_NAME" /> que não estão associadas a um domínio do <ph name="MS_AD_NAME" /> e instâncias do <ph name="MAC_OS_NAME" /> não gerenciadas por MDM ou associadas a um domínio via MCX.</translation> <translation id="8451988835943702790">Usar a página "Nova guia" como página inicial</translation> <translation id="8455529558077979314">Configurações da tela de privacidade</translation> <translation id="8455551509936646199">Dia da semana em que a reinicialização acontecerá, interpretado no fuso horário local do dispositivo. Usado apenas quando "frequency" for definido como "WEEKLY".</translation> @@ -6462,6 +6502,21 @@ Para ver informações detalhadas sobre padrões de <ph name="URL_LABEL" /> válidos, consulte https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> não é um valor aceitável para esta política.</translation> <translation id="8703488928438047864">Informa o status da placa</translation> <translation id="8704831857353097849">Lista de plug-ins desativados</translation> +<translation id="8704915028294851978">Lista de configurações para os serviços do <ph name="PRODUCT_NAME" /> Enterprise Connectors que serão aplicados ao conector <ph name="ON_PRINT_ENTERPRISE_CONNECTOR" />, que é acionado quando uma página ou arquivo é impresso usando o <ph name="PRODUCT_NAME" />. + + Os campos <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> são usados para determinar se o conector envia dados para análise quando a impressão é acionada em uma página específica e quais tags são incluídas na solicitação de análise. A análise é feita se pelo menos uma tag for incluída na solicitação. + + O campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica o provedor de serviços de análise correspondente às configurações. + + Se o campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> for definido como 1, o <ph name="PRODUCT_NAME" /> aguarda uma resposta do serviço de análise antes de exibir a caixa de diálogo da prévia de impressão da página. Qualquer outro valor inteiro significa que o <ph name="PRODUCT_NAME" /> exibe a caixa de diálogo da prévia de impressão imediatamente. + + O campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> controla se o <ph name="PRODUCT_NAME" /> bloqueia ou permite que arquivos/páginas grandes demais sejam analisados. + + O campo <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> é usado a fim de determinar para quais tags o conector precisa de uma justificativa do usuário para ignorar uma verificação com um aviso que pode ser ignorado. Se o campo não for definido, presume-se que uma justificativa não é necessária. + + Os campos <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> são usados para configurar uma mensagem que informa o usuário quando um aviso é exibido após uma verificação ter um veredito não limpo. O administrador pode configurar mensagens de até 200 caracteres. + + Esta política só pode ser definida pelo <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="8705895771006864851">Se esta política for definida como verdadeira, funcionalidades de tradução serão fornecidas quando for adequado para os usuários, mostrando uma barra de ferramentas de tradução integrada no <ph name="PRODUCT_NAME" /> e uma opção de tradução no menu de contexto que aparece ao clicar com o botão direito do mouse. Se esta política for definida como falsa, todos os recursos de tradução integrados serão desativados. Se você definir a política, os usuários não poderão mudar essa função. Se ela não for definida, os usuários poderão mudar a configuração.</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 494eddf0..9b05bf3 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -2845,6 +2845,23 @@ หากตั้งค่านโยบายนี้เป็น "เท็จ" เบราว์เซอร์จะไม่แสดงหน้ายินดีต้อนรับอีกครั้งเมื่อเรียกใช้เบราว์เซอร์ครั้งแรกหลังการอัปเกรดระบบปฏิบัติการ</translation> <translation id="441686537793821907">บล็อกการติดตั้งส่วนขยายจากภายนอก</translation> +<translation id="4420613474328461583">รายการของการตั้งค่าบริการเครื่องมือเชื่อมต่อ Chrome Enterprise ที่จะใช้กับเครื่องมือเชื่อมต่อ <ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" /> Enterprise ซึ่งจะเรียกใช้งานเมื่อมีการดาวน์โหลดไฟล์ใน Chrome + + ช่อง <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> และ <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> ใช้เพื่อกำหนดว่าเครื่องมือเชื่อมต่อควรส่งไฟล์สำหรับการวิเคราะห์หรือไม่เมื่อมีการดาวน์โหลดไฟล์จากหน้าหนึ่งๆ และแท็กใดที่จะรวมอยู่ในคำขอการวิเคราะห์สำหรับไฟล์นั้น แท็กที่สอดคล้องกับรูปแบบ "เปิดใช้" จะรวมอยู่ในคำขอการวิเคราะห์หาก URL ของหน้าตรงกับรูปแบบที่เกี่ยวข้องกับแท็กดังกล่าวตราบใดที่ไม่มีรูปแบบ "ปิดใช้" ที่มีแท็กเดียวกันนั้นตรงกับ URL ของหน้า การวิเคราะห์จะเกิดขึ้นหากมีอย่างน้อย 1 แท็กในคำขอ + + ช่อง <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> จะระบุว่าผู้ให้บริการการวิเคราะห์ใดที่สอดคล้องกับการตั้งค่า + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> ที่ตั้งไว้เป็น 1 หมายความว่า Chrome จะรอให้มีการตอบสนองจากบริการการวิเคราะห์ก่อนให้สิทธิ์ผู้ใช้เข้าถึงไฟล์ที่ดาวน์โหลด ค่าที่เป็นจำนวนเต็มอื่นๆ หมายความว่า Chrome จะให้สิทธิ์ผู้ใช้เข้าถึงไฟล์นั้นทันที + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> จะควบคุมให้ Chrome บล็อกหรืออนุญาตไฟล์ที่มีการป้องกันด้วยรหัสผ่าน + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> จะควบคุมให้ Chrome บล็อกหรืออนุญาตให้วิเคราะห์ไฟล์ที่มีขนาดใหญ่เกินไป + + ช่อง <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> ใช้เพื่อกำหนดว่าเครื่องมือเชื่อมต่อต้องกำหนดให้ผู้ใช้ป้อนเหตุผลสำหรับแท็กใดเพื่อข้ามการสแกนที่ทำให้เกิดคำเตือนแบบข้ามได้ หากไม่ได้ตั้งค่าช่องนี้ ระบบจะถือว่าไม่จำเป็นต้องป้อนเหตุผล + + ช่อง <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> และ <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> ใช้เพื่อกำหนดค่าข้อความที่จะแสดงแก่ผู้ใช้เมื่อมีคำเตือนปรากฏขึ้นหลังจากที่การสแกนตรวจพบการละเมิด ช่องข้อความมีข้อความที่จะแสดงต่อผู้ใช้และต้องมีความยาวไม่เกิน 200 อักขระ ช่อง learn_more_url มี URL จากผู้ดูแลระบบ ซึ่งผู้ใช้สามารถคลิกเพื่อดูข้อมูลเพิ่มเติมจากลูกค้าเกี่ยวกับเหตุผลที่การดำเนินการถูกบล็อก ช่องภาษาจะมีหรือไม่มีก็ได้และจะมีภาษาของข้อความ ช่องภาษาที่เว้นว่างไว้หรือมีค่าเป็น "ค่าเริ่มต้น" จะระบุข้อความที่จะใช้เมื่อภาษาของผู้ใช้ไม่มีข้อความ ช่องแท็กจะระบุประเภทการสแกนที่จะมีการแสดงข้อความ รายการ custom_messages อาจไม่มีรายการย่อยเลยหรือมีรายการย่อยเพิ่มเติม โดยที่รายการย่อยแต่ละรายการจำเป็นต้องมีช่องข้อความและช่องแท็กที่ไม่เว้นว่างไว้ + + นโยบายนี้ตั้งค่าได้จาก<ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> เท่านั้น</translation> <translation id="4423597592074154136">ระบุการตั้งค่าพร็อกซีด้วยตนเอง</translation> <translation id="4424004842303301809">ปิดใช้การรายงานเหตุการณ์การป้องกันข้อมูลรั่วไหล</translation> <translation id="4427173305799125784">โปรแกรมอ่าน PDF ใส่คำอธิบายประกอบใน PDF ไม่ได้</translation> @@ -2966,6 +2983,7 @@ ดูคำอธิบายฉบับเต็มได้ที่ https://www.chromestatus.com/feature/5675755719622656 หากเปิดใช้นโยบายนี้ เว็บไซต์จะมีสิทธิ์นำทางและเปิดหน้าต่างหรือแท็บใหม่ไปพร้อมกันได้ หากปิดใช้หรือไม่ได้ตั้งค่านโยบายนี้ เว็บไซต์จะไม่มีสิทธิ์นำทางและเปิดหน้าต่างหรือแท็บใหม่ไปพร้อมกัน</translation> +<translation id="457430673056611745">นโยบายการกำหนดค่าสำหรับเครื่องมือเชื่อมต่อ <ph name="PRODUCT_NAME" /> Enterprise OnPrint</translation> <translation id="4578265298946081589">ไม่ต้องรีบูตเมื่อผู้ใช้ออกจากระบบ</translation> <translation id="4581507927311097234">ระยะเวลาเป็นมิลลิวินาทีก่อนปิดหน้าจอหลังจากไม่มีการป้อนข้อมูลจากผู้ใช้</translation> <translation id="4582338216073557489">การตั้งค่านโยบายนี้เป็น "ไม่มี" ทำให้ <ph name="PRODUCT_NAME" /> ใช้ขนาดแคชเริ่มต้นในการจัดเก็บไฟล์ที่แคชไว้ในดิสก์ โดยที่ผู้ใช้จะเปลี่ยนแปลงไม่ได้ @@ -5946,6 +5964,23 @@ การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าจะไม่ส่งแพ็กเก็ต</translation> <translation id="816783746144552109">กำหนดค่าเวอร์ชัน Chrome OS ขั้นต่ำที่อุปกรณ์จะใช้ได้</translation> +<translation id="8169492352330154095">รายการของการตั้งค่าบริการเครื่องมือเชื่อมต่อ Chrome Enterprise ที่จะใช้กับเครื่องมือเชื่อมต่อ <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" /> Enterprise ซึ่งจะเรียกใช้งานเมื่อมีไฟล์แนบไปกับ Chrome + + ช่อง <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> และ <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> ใช้เพื่อกำหนดว่าเครื่องมือเชื่อมต่อควรส่งไฟล์สำหรับการวิเคราะห์หรือไม่เมื่อมีการแนบไฟล์มากับหน้าหนึ่งๆ และแท็กใดที่จะรวมอยู่ในคำขอการวิเคราะห์สำหรับไฟล์นั้น แท็กที่สอดคล้องกับรูปแบบ "เปิดใช้" จะรวมอยู่ในคำขอการวิเคราะห์หาก URL ของหน้าตรงกับรูปแบบที่เกี่ยวข้องกับแท็กดังกล่าวตราบใดที่ไม่มีรูปแบบ "ปิดใช้" ที่มีแท็กเดียวกันนั้นตรงกับ URL ของหน้า การวิเคราะห์จะเกิดขึ้นหากมีอย่างน้อย 1 แท็กในคำขอ + + ช่อง <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> จะระบุว่าผู้ให้บริการการวิเคราะห์ใดที่สอดคล้องกับการตั้งค่า + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> ที่ตั้งไว้เป็น 1 หมายความว่า Chrome จะรอให้มีการตอบสนองจากบริการการวิเคราะห์ก่อนให้สิทธิ์หน้าในการเข้าถึงไฟล์ ค่าที่เป็นจำนวนเต็มอื่นๆ หมายความว่า Chrome จะให้สิทธิ์เข้าถึงหน้าแก่ไฟล์โดยทันที + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> จะควบคุมให้ Chrome บล็อกหรืออนุญาตไฟล์ที่มีการป้องกันด้วยรหัสผ่าน + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> จะควบคุมให้ Chrome บล็อกหรืออนุญาตให้วิเคราะห์ไฟล์ที่มีขนาดใหญ่เกินไป + + ช่อง <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> ใช้เพื่อกำหนดว่าเครื่องมือเชื่อมต่อต้องกำหนดให้ผู้ใช้ป้อนเหตุผลสำหรับแท็กใดเพื่อข้ามการสแกนที่ทำให้เกิดคำเตือนแบบข้ามได้ หากไม่ได้ตั้งค่าช่องนี้ ระบบจะถือว่าไม่จำเป็นต้องป้อนเหตุผล + + ช่อง <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> และ <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> ใช้เพื่อกำหนดค่าข้อความที่จะแสดงแก่ผู้ใช้เมื่อมีคำเตือนปรากฏขึ้นหลังจากที่การสแกนตรวจพบการละเมิด ช่องข้อความมีข้อความที่จะแสดงต่อผู้ใช้และต้องมีความยาวไม่เกิน 200 อักขระ ช่อง learn_more_url มี URL จากผู้ดูแลระบบ ซึ่งผู้ใช้สามารถคลิกเพื่อดูข้อมูลเพิ่มเติมจากลูกค้าเกี่ยวกับเหตุผลที่การดำเนินการถูกบล็อก ช่องภาษาจะมีหรือไม่มีก็ได้และจะมีภาษาของข้อความ ช่องภาษาที่เว้นว่างไว้หรือมีค่าเป็น "ค่าเริ่มต้น" จะระบุข้อความที่จะใช้เมื่อภาษาของผู้ใช้ไม่มีข้อความ ช่องแท็กจะระบุประเภทการสแกนที่จะมีการแสดงข้อความ รายการ custom_messages อาจไม่มีรายการย่อยเลยหรือมีรายการย่อยเพิ่มเติม โดยที่รายการย่อยแต่ละรายการจำเป็นต้องมีช่องข้อความและช่องแท็กที่ไม่เว้นว่างไว้ + + นโยบายนี้ตั้งค่าได้จาก<ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> เท่านั้น</translation> <translation id="8171924760436219650">สลับปุ่มหลักของเมาส์ไปเป็นปุ่มด้านขวาในหน้าจอการเข้าสู่ระบบ</translation> <translation id="8173864651667424191">ตัวเลือกการพิมพ์เป็นรูปภาพจะมีค่าเริ่มต้นเป็นตั้งค่าสำหรับตัวอย่างก่อนพิมพ์เอกสาร PDF เมื่อพร้อมใช้งาน</translation> <translation id="8176035528522326671">อนุญาตให้ผู้ใช้ขององค์กรเป็นผู้ใช้หลักแบบหลายโปรไฟล์เท่านั้น (ค่าเริ่มต้นสำหรับผู้ใช้ที่มีองค์กรเป็นผู้จัดการ)</translation> @@ -6194,6 +6229,11 @@ หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะใช้ค่าเริ่มต้นที่ 3 หากตั้งค่านโยบายนี้ ระบบจะลบสแนปชอตเก่าตามที่จำเป็นเพื่อให้จำนวนอยู่ในขีดจำกัดที่กำหนด หากตั้งค่านโยบายนี้เป็น 0 จะไม่มีการสร้างสแนปชอต</translation> +<translation id="8447347049334673364">การตั้งค่านโยบายนี้จะควบคุมการตั้งค่าการจัดการส่วนขยายสำหรับ <ph name="PRODUCT_NAME" /> ซึ่งรวมถึงการตั้งค่าที่ควบคุมโดยนโยบายเกี่ยวกับส่วนขยายที่มีอยู่ นโยบายนี้มีผลแทนนโยบายเดิมที่อาจตั้งค่าไว้ + + นโยบายนี้จะจับคู่รหัสส่วนขยายหรือ URL อัปเดตกับการตั้งค่าที่เฉพาะเจาะจงของรายการนั้นๆ เท่านั้น คุณกำหนดค่าเริ่มต้นสำหรับรหัสพิเศษ <ph name="DEFAULT_SCOPE" /> ได้ ซึ่งระบบจะใช้กับส่วนขยายทั้งหมดที่ไม่มีการกำหนดค่าเองในนโยบายนี้ เมื่อใช้ URL อัปเดต ระบบจะใช้การกำหนดค่ากับส่วนขยายที่มี URL อัปเดตตรงกับที่ระบุไว้ในไฟล์ Manifest ของส่วนขยาย ( http://support.google.com/chrome/a?p=Configure_ExtensionSettings_policy ) หากตั้งค่าธงสถานะ "override_update_url" เป็น "จริง" ระบบจะติดตั้งและอัปเดตส่วนขยายโดยใช้ URL "อัปเดต" ที่ระบุในนโยบาย <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> หรือในช่อง "update_url" ในนโยบายนี้ ระบบจะไม่สนใจธงสถานะ "override_update_url" หาก "update_url" คือ URL Chrome เว็บสโตร์ + + หมายเหตุ: สำหรับอินสแตนซ์ <ph name="MS_WIN_NAME" /> ที่ไม่ได้เข้าร่วมโดเมน <ph name="MS_AD_NAME" /> และอินสแตนซ์ <ph name="MAC_OS_NAME" /> ที่ไม่ได้จัดการผ่าน MDM หรือไม่ได้เข้าร่วมโดเมนผ่าน MCX การติดตั้งที่บังคับจะจำกัดอยู่ที่แอปและส่วนขยายที่แสดงอยู่ใน Chrome เว็บสโตร์เท่านั้น</translation> <translation id="8451988835943702790">ใช้หน้าแท็บใหม่เป็นหน้าแรก</translation> <translation id="8455529558077979314">การตั้งค่าหน้าจอส่วนตัว</translation> <translation id="8455551509936646199">วันในสัปดาห์ที่ควรมีการรีบูต โดยตีความในเขตเวลาท้องถิ่นของอุปกรณ์ ใช้เมื่อ "frequency" เท่ากับ "WEEKLY" เท่านั้น</translation> @@ -6409,6 +6449,21 @@ ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns <ph name="WILDCARD_VALUE" /> ไม่ใช่ค่าที่ยอมรับสำหรับนโยบายนี้</translation> <translation id="8703488928438047864">รายงานสถานะของบอร์ด</translation> <translation id="8704831857353097849">รายการปลั๊กอินที่ปิดใช้งาน</translation> +<translation id="8704915028294851978">รายการของการตั้งค่าบริการเครื่องมือเชื่อมต่อ <ph name="PRODUCT_NAME" /> Enterprise ที่จะใช้กับเครื่องมือเชื่อมต่อ Enterprise <ph name="ON_PRINT_ENTERPRISE_CONNECTOR" /> ซึ่งจะเรียกใช้งานเมื่อพิมพ์หน้าหรือไฟล์จาก <ph name="PRODUCT_NAME" /> + + ช่อง <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> และ <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> ใช้เพื่อกำหนดว่าเครื่องมือเชื่อมต่อควรส่งข้อมูลสำหรับการวิเคราะห์หรือไม่เมื่อมีการเรียกใช้งานการพิมพ์จากหน้าหนึ่งๆ และแท็กใดที่จะรวมอยู่ในคำขอการวิเคราะห์ การวิเคราะห์จะเกิดขึ้นหากมีอย่างน้อย 1 แท็กในคำขอ + + ช่อง <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> จะระบุว่าผู้ให้บริการการวิเคราะห์ใดที่สอดคล้องกับการตั้งค่า + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> ที่ตั้งไว้เป็น 1 หมายความว่า <ph name="PRODUCT_NAME" /> จะรอให้มีการตอบสนองจากบริการการวิเคราะห์ก่อนอนุญาตให้แสดงกล่องโต้ตอบการแสดงตัวอย่างการพิมพ์สำหรับหน้าที่พิมพ์ ค่าที่เป็นจำนวนเต็มอื่นๆ หมายความว่า <ph name="PRODUCT_NAME" /> จะแสดงกล่องโต้ตอบการแสดงตัวอย่างการพิมพ์ทันที + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> จะควบคุมให้ <ph name="PRODUCT_NAME" /> บล็อกหรืออนุญาตให้วิเคราะห์ไฟล์/หน้าที่มีขนาดใหญ่เกินไป + + ช่อง <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> ใช้เพื่อกำหนดว่าเครื่องมือเชื่อมต่อต้องกำหนดให้ผู้ใช้ป้อนเหตุผลสำหรับแท็กใดเพื่อข้ามการสแกนที่ทำให้เกิดคำเตือนแบบข้ามได้ หากไม่ได้ตั้งค่าช่องนี้ ระบบจะถือว่าไม่จำเป็นต้องป้อนเหตุผล + + ช่อง <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> และ <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> ใช้เพื่อกำหนดค่าข้อความที่จะแสดงแก่ผู้ใช้เมื่อมีคำเตือนปรากฏขึ้นหลังจากที่การสแกนตรวจพบการละเมิด ผู้ดูแลระบบกำหนดค่าข้อความได้สูงสุด 200 อักขระ + + นโยบายนี้ตั้งค่าได้จาก<ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> เท่านั้น</translation> <translation id="8705895771006864851">การตั้งค่านโยบายเป็น "จริง" จะเสนอฟังก์ชันแปลภาษาแก่ผู้ใช้ตามความเหมาะสมด้วยการแสดงแถบเครื่องมือแปลภาษาที่ผสานรวมอยู่ใน <ph name="PRODUCT_NAME" /> และตัวเลือกการแปลเมื่อคลิกขวาที่เมนูตามบริบท การตั้งค่านโยบายเป็น "เท็จ" จะปิดฟีเจอร์แปลภาษาในตัวทั้งหมด หากคุณตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนฟังก์ชันนี้ไม่ได้ การไม่ตั้งค่าจะให้ผู้ใช้เปลี่ยนการตั้งค่าได้</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index fa6d4c4..0bd6596 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -2839,6 +2839,23 @@ 如果將這項政策設為 False,當裝置升級 OS 後,瀏覽器不會在首次啟動時重新顯示歡迎頁面。</translation> <translation id="441686537793821907">禁止安裝外部擴充功能</translation> +<translation id="4420613474328461583">指定要套用至 <ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" /> Enterprise 連接器的 Chrome Enterprise 連接器服務設定清單,這份清單會在透過 Chrome 下載檔案時觸發。 + + 從特定網頁下載檔案時,系統會使用 <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> 欄位來判斷連接器是否要傳送檔案進行分析,以及要在該檔案的分析要求中加入哪些標記。系統會比對標記對應的模式,如果頁面網址符合與該標記相關聯的模式,且不符合該標記的「disable」模式,系統就會在分析要求中加入與「enable」模式對應的標記。如果要求中加入至少 1 個標記,系統就會進行分析。 + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 欄位可用來指定與設定對應的分析服務供應商。 + + 如果將 <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> 欄位設為 1,Chrome 會先等候分析服務的回應,再授予使用者存取下載檔案的權限。如果設為其他整數值,Chrome 會立即授予使用者存取檔案的權限。 + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> 欄位可控制 Chrome 要封鎖還是允許受到密碼保護的檔案。 + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> 欄位可控制 Chrome 要封鎖還是允許超過大小上限而無法分析的檔案。 + + 當掃描結果顯示可略過的警告時,系統會使用 <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> 欄位來判斷連接器該在哪些標記中要求使用者輸入略過掃描的原因。如果不設定這個欄位,系統會認定不需要輸入原因。 + + 當掃描結果判定檔案有問題時,系統會根據 <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> 和 <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> 欄位設定要向使用者顯示的訊息。「message」欄位包含要向使用者顯示的文字,長度上限為 200 個半形字元。「learn_more_url」欄位包含由管理員提供的網址,使用者點選後可取得更多由客戶提供的資訊,瞭解動作遭到封鎖的原因。「language」欄位為選填,包含訊息所用語言。如果將「language」欄位留空或設為「default」值,表示在找不到使用者語言的訊息時,系統會使用預設訊息。「tag」欄位可用來指定要顯示訊息的掃描類型。「custom_messages」清單可以有零或多個項目,每個項目都必須包括非空白的「message」和「tag」欄位。 + + 這項政策只能透過 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />進行設定。</translation> <translation id="4423597592074154136">手動指定 Proxy 設定</translation> <translation id="4424004842303301809">停用資料外洩防護事件的回報功能</translation> <translation id="4427173305799125784">PDF 檢視器無法為 PDF 加註</translation> @@ -2959,6 +2976,7 @@ 如需完整說明,請前往 https://www.chromestatus.com/feature/5675755719622656。 如果啟用這項政策,即可同時在多個網站中進行瀏覽及開啟新視窗/分頁。 如果停用這項政策或不予設定,則無法同時在多個網站中進行瀏覽及開啟新視窗/分頁。</translation> +<translation id="457430673056611745">OnPrint <ph name="PRODUCT_NAME" /> Enterprise 連接器的設定政策</translation> <translation id="4578265298946081589">不要在使用者登出時重新啟動。</translation> <translation id="4581507927311097234">關閉螢幕前的閒置時間長度 (以毫秒為單位)。如果使用者在這段時間內沒有任何動作,系統就會關閉螢幕</translation> <translation id="4582338216073557489">將這項政策設為 None 時,<ph name="PRODUCT_NAME" /> 會使用預設的快取大小將快取檔案儲存在磁碟上,使用者無法變更這項設定。 @@ -5922,6 +5940,23 @@ 如果將這項政策設為停用或不設定,系統不會傳送任何封包。</translation> <translation id="816783746144552109">設定裝置的 Chrome 作業系統最低版本限制。</translation> +<translation id="8169492352330154095">指定要套用至 <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" /> Enterprise 連接器的 Chrome Enterprise 連接器服務設定清單,這份清單會在檔案附加至 Chrome 時觸發。 + + 將檔案附加至特定網頁時,系統會使用 <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> 和 <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> 欄位來判斷連接器是否要傳送檔案進行分析,以及要在該檔案的分析要求中加入哪些標記。系統會比對標記對應的模式,如果頁面網址符合與該標記相關聯的模式,且不符合該標記的「disable」模式,系統就會在分析要求中加入與「enable」模式對應的標記。如果要求中加入至少 1 個標記,系統就會進行分析。 + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 欄位可用來指定與設定對應的分析服務供應商。 + + 如果將 <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> 欄位設為 1,Chrome 會先等候分析服務的回應,再授予頁面存取檔案的權限。如果設為其他整數值,Chrome 會立即授予頁面存取檔案的權限。 + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> 欄位可控制 Chrome 要封鎖還是允許受到密碼保護的檔案。 + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> 欄位可控制 Chrome 要封鎖還是允許超過大小上限而無法分析的檔案。 + + 當掃描結果顯示可略過的警告時,系統會使用 <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> 欄位來判斷連接器該在哪些標記中要求使用者輸入略過掃描的原因。如果不設定這個欄位,系統會認定不需要輸入原因。 + + 當掃描結果判定檔案有問題時,系統會根據 <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> 和 <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> 欄位設定要向使用者顯示的訊息。「message」欄位包含要向使用者顯示的文字,長度上限為 200 個半形字元。「learn_more_url」欄位包含由管理員提供的網址,使用者點選後可取得更多由客戶提供的資訊,瞭解動作遭到封鎖的原因。「language」欄位為選填,包含訊息所用語言。如果將「language」欄位留空或設為「default」值,表示在找不到使用者語言的訊息時,系統會使用預設訊息。「tag」欄位可用來指定要顯示訊息的掃描類型。「custom_messages」清單可以有零或多個項目,每個項目都必須包括非空白的「message」和「tag」欄位。 + + 這項政策只能透過 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />進行設定。</translation> <translation id="8171924760436219650">在登入畫面上將滑鼠的主要按鈕切換為右鍵</translation> <translation id="8173864651667424191">在 PDF 文件的列印預覽畫面中,「以圖片形式列印」是預設選項 (如果有)。</translation> <translation id="8176035528522326671">僅允許企業使用者成為多重設定檔的主要使用者 (受企業管理的使用者的預設行為)</translation> @@ -6171,6 +6206,11 @@ 如果不設定這項政策,系統會使用預設值 3 如果設定這項政策,系統會視需要刪除較舊的快照,以避免超出限制。如果這項政策設為 0,則系統不會建立任何快照</translation> +<translation id="8447347049334673364">你可以透過這項政策控管 <ph name="PRODUCT_NAME" /> 的擴充功能管理設定,包括由現有擴充功能相關政策所控管的任何設定。這項政策會取代任何可能已設定的舊版政策。 + + 這項政策只會將擴充功能 ID 或更新網址對應到其特定的設定。你可以指定特殊 ID <ph name="DEFAULT_SCOPE" /> 的預設設定,所有未透過這項政策自訂設定的擴充功能一律會套用這項預設設定。如果指定了更新網址,系統會根據擴充功能資訊清單中載明的確切更新網址,將設定套用至擴充功能 (http://support.google.com/chrome/a?p=Configure_ExtensionSettings_policy)。如果「override_update_url」標記的設定為 True,系統會根據 <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> 政策或這項政策在「update_url」欄位中指定的「更新」網址,安裝及更新擴充功能。如果「update_url」是 Chrome 線上應用程式商店網址,則系統會忽略「override_update_url」標記。 + + 注意:如果是尚未加入 <ph name="MS_AD_NAME" /> 網域的 <ph name="MS_WIN_NAME" /> 執行個體,以及尚未透過行動裝置管理 (MDM) 軟體進行管理或透過 MCX 加入網域的 <ph name="MAC_OS_NAME" /> 執行個體,系統只會針對 Chrome 線上應用程式商店中的應用程式和擴充功能執行強制安裝作業。</translation> <translation id="8451988835943702790">將新分頁設為首頁</translation> <translation id="8455529558077979314">隱私保護畫面設定</translation> <translation id="8455551509936646199">應該在星期幾重新啟動 (根據裝置當地時區),僅適用於「frequency」設為「WEEKLY」的情況。</translation> @@ -6377,6 +6417,21 @@ 想進一步瞭解有效的<ph name="URL_LABEL" />模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。<ph name="WILDCARD_VALUE" /> 不是這項政策許可的值。</translation> <translation id="8703488928438047864">回報主機板狀態</translation> <translation id="8704831857353097849">停用的外掛程式清單</translation> +<translation id="8704915028294851978">指定要套用至 <ph name="ON_PRINT_ENTERPRISE_CONNECTOR" /> Enterprise 連接器的 <ph name="PRODUCT_NAME" /> Enterprise 連接器服務設定清單,這份清單會在透過 <ph name="PRODUCT_NAME" /> 列印網頁或檔案時觸發。 + + 在特定網頁中觸發列印功能時,系統會使用 <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> 欄位來判斷連接器是否要傳送資料進行分析,以及要在分析要求中加入哪些標記。如果要求中加入至少 1 個標記,系統就會進行分析。 + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 欄位可用來指定與設定對應的分析服務供應商。 + + 如果將 <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> 欄位設為 1,<ph name="PRODUCT_NAME" /> 會先等候分析服務的回應,再允許系統為列印頁面顯示列印預覽對話方塊。如果設為其他整數值,<ph name="PRODUCT_NAME" /> 會立即顯示列印預覽對話方塊。 + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> 欄位可控制 <ph name="PRODUCT_NAME" /> 要封鎖還是允許超過大小上限而無法分析的檔案/網頁。 + + 當掃描結果顯示可略過的警告時,系統會使用 <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> 欄位來判斷連接器該在哪些標記中要求使用者輸入略過掃描的原因。如果不設定這個欄位,系統會認定不需要輸入原因。 + + 當掃描結果判定檔案有問題時,系統會根據 <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> 和 <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> 欄位設定要向使用者顯示的訊息。系統管理員可以自訂訊息,長度上限為 200 個半形字元。 + + 這項政策只能透過 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />進行設定。</translation> <translation id="8705895771006864851">如果將這項政策設為 True,系統會適時在 <ph name="PRODUCT_NAME" /> 中顯示整合式翻譯工具列,為使用者提供翻譯功能。使用者也可以按一下滑鼠右鍵開啟內容選單,選擇其中的翻譯選項。如果將這項政策設為 False,系統會關閉所有內建的翻譯功能。 如果設定這項政策,使用者將無法變更此功能。如果不設定,使用者將可變更這項設定。</translation>
diff --git a/components/reporting/proto/synced/metric_data.proto b/components/reporting/proto/synced/metric_data.proto index 64b9c98..8daf7124 100644 --- a/components/reporting/proto/synced/metric_data.proto +++ b/components/reporting/proto/synced/metric_data.proto
@@ -128,6 +128,46 @@ optional ThunderboltInfo thunderbolt_info = 1; } +enum MemoryEncryptionState { + UNSPECIFIED_MEMORY_ENCRYPTION_STATE = 0; + // The memory encryption state is unknown. + MEMORY_ENCRYPTION_STATE_UNKNOWN = 1; + // Memory encrpytion on the device is disabled. + MEMORY_ENCRYPTION_STATE_DISABLED = 2; + // Memory encryption on the device uses total memory encryption. + MEMORY_ENCRYPTION_STATE_TME = 3; + // Memory encryption on the device uses multi-key total memory encryption. + MEMORY_ENCRYPTION_STATE_MKTME = 4; +} + +enum MemoryEncryptionAlgorithm { + UNSPECIFIED_MEMORY_ENCRYPTION_ALGORITHM = 0; + // The memory encryption algorithm being used is unknown. + MEMORY_ENCRYPTION_ALGORITHM_UNKNOWN = 1; + // The memory encryption algorithm is using the AES_XTS encryption algorithm + // with a 128 bit block cypher. + MEMORY_ENCRYPTION_ALGORITHM_AES_XTS_128 = 2; + // The memory encryption algorithm is using the AES_XTS encryption algorithm + // with a 256 bit block cypher. + MEMORY_ENCRYPTION_ALGORITHM_AES_XTS_256 = 3; +} + +message TotalMemoryEncryptionInfo { + // The state of memory encryption on the device. + optional MemoryEncryptionState encryption_state = 1; + // The maximum number of keys that can be used for encryption. + optional uint32 max_keys = 2; + // The length of the encryption keys. + optional uint32 key_length = 3; + // The encryption algorithm being used on the device. + optional MemoryEncryptionAlgorithm encryption_algorithm = 4; +} + +message MemoryInfo { + // TME info for the device. + optional TotalMemoryEncryptionInfo tme_info = 1; +} + // Information about keylocker. This is supported on Intel CPUs. message KeylockerInfo { // If keylocker is supported on the devices CPUs. @@ -148,6 +188,8 @@ optional CpuInfo cpu_info = 1; // Bus Device info for the device. optional BusDeviceInfo bus_device_info = 2; + // Memory info for the device. + optional MemoryInfo memory_info = 3; } // Audio telemetry data recorded intermittently
diff --git a/components/safe_browsing/core/browser/safe_browsing_metrics_collector_unittest.cc b/components/safe_browsing/core/browser/safe_browsing_metrics_collector_unittest.cc index 0206446..a79fd99 100644 --- a/components/safe_browsing/core/browser/safe_browsing_metrics_collector_unittest.cc +++ b/components/safe_browsing/core/browser/safe_browsing_metrics_collector_unittest.cc
@@ -88,6 +88,8 @@ prefs::kSafeBrowsingScoutReportingEnabled, false); pref_service_.registry()->RegisterDictionaryPref( prefs::kSafeBrowsingEventTimestamps); + pref_service_.registry()->RegisterBooleanPref( + prefs::kEnhancedProtectionEnabledViaTailoredSecurity, false); } };
diff --git a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.cc b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.cc index a5e0903..9c485dcf 100644 --- a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.cc +++ b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.cc
@@ -51,8 +51,8 @@ // Returns a primary Google account that can be used for getting a token. CoreAccountId GetAccountForRequest( const signin::IdentityManager* identity_manager) { - CoreAccountInfo result; - identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin); + CoreAccountInfo result = + identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin); return result.IsEmpty() ? CoreAccountId() : result.account_id; } @@ -231,15 +231,13 @@ signin::IdentityManager* identity_manager, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) : identity_manager_(identity_manager), - url_loader_factory_(std::move(url_loader_factory)) { - // Register a repeating timer to get the tailored security bit every 5 - // minutes. - timer_.Start(FROM_HERE, - base::Minutes(kRepeatingCheckTailoredSecurityBitDelayInMinutes), - this, &TailoredSecurityService::QueryTailoredSecurityBit); -} + url_loader_factory_(std::move(url_loader_factory)) {} -TailoredSecurityService::~TailoredSecurityService() = default; +TailoredSecurityService::~TailoredSecurityService() { + for (auto& observer : observer_list_) { + observer.OnTailoredSecurityServiceDestroyed(); + } +} void TailoredSecurityService::AddObserver( TailoredSecurityServiceObserver* observer) { @@ -266,6 +264,29 @@ return pending_tailored_security_requests_.size(); } +void TailoredSecurityService::AddQueryRequest() { + DCHECK(!is_shut_down_); + active_query_request_++; + if (active_query_request_ == 1) { + // Query now and register a repeating timer to get the tailored security bit + // every `kRepeatingCheckTailoredSecurityBitDelayInMinutes` minutes. + QueryTailoredSecurityBit(); + timer_.Start( + FROM_HERE, + base::Minutes(kRepeatingCheckTailoredSecurityBitDelayInMinutes), this, + &TailoredSecurityService::QueryTailoredSecurityBit); + } +} + +void TailoredSecurityService::RemoveQueryRequest() { + DCHECK(!is_shut_down_); + DCHECK(active_query_request_ >= 0); + active_query_request_--; + if (active_query_request_ == 0) { + timer_.Stop(); + } +} + void TailoredSecurityService::QueryTailoredSecurityBit() { static constexpr net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("tailored_security_service", @@ -320,9 +341,15 @@ } } -void TailoredSecurityService::OnTailoredSecurityBitRetrieved(bool is_enabled) { - for (auto& observer : observer_list_) { - observer.OnTailoredSecurityBitChanged(is_enabled); +void TailoredSecurityService::OnTailoredSecurityBitRetrieved( + bool is_enabled, + base::Time previous_update) { + if (is_tailored_security_enabled_ != is_enabled) { + is_tailored_security_enabled_ = is_enabled; + last_updated_ = base::Time::Now(); + for (auto& observer : observer_list_) { + observer.OnTailoredSecurityBitChanged(is_enabled, previous_update); + } } } @@ -336,17 +363,17 @@ std::move(pending_tailored_security_requests_[request]); pending_tailored_security_requests_.erase(request); - base::Value response_value; - bool tailored_security_service_enabled = false; + bool is_enabled = is_tailored_security_enabled_; + base::Time previous_update = last_updated_; if (success) { - response_value = ReadResponse(request); - tailored_security_service_enabled = - response_value.is_none() - ? false - : response_value.FindBoolKey("history_recording_enabled") - .value_or(false); + base::Value response_value = ReadResponse(request); + is_enabled = response_value.is_none() + ? false + : response_value.FindBoolKey("history_recording_enabled") + .value_or(false); } - std::move(callback).Run(tailored_security_service_enabled); + + std::move(callback).Run(is_enabled, previous_update); } void TailoredSecurityService::SetTailoredSecurityBitForTesting(
diff --git a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h index 332a0261..9b0cbb41 100644 --- a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h +++ b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h
@@ -75,7 +75,7 @@ }; using QueryTailoredSecurityBitCallback = - base::OnceCallback<void(bool is_enabled)>; + base::OnceCallback<void(bool is_enabled, base::Time previous_update)>; using CompletionCallback = base::OnceCallback<void(Request*, bool success)>; @@ -87,6 +87,13 @@ void AddObserver(TailoredSecurityServiceObserver* observer); void RemoveObserver(TailoredSecurityServiceObserver* observer); + // Called to increment/decrement |active_query_request_|. When + // |active_query_request_| goes from zero to nonzero, we begin querying the + // tailored security setting. When it goes from nonzero to zero, we stop + // querying the tailored security setting. Virtual for tests. + virtual void AddQueryRequest(); + virtual void RemoveQueryRequest(); + // Queries whether TailoredSecurity is enabled on the server. void QueryTailoredSecurityBit(); @@ -124,7 +131,12 @@ QueryTailoredSecurityBitCallback callback, Request* request, bool success); - void OnTailoredSecurityBitRetrieved(bool is_enabled); + + // Called with whether the tailored security setting `is_enabled` and the + // timestamp of the most recent update (excluding the current update in + // progress). + void OnTailoredSecurityBitRetrieved(bool is_enabled, + base::Time previous_update); private: // Stores pointer to IdentityManager instance. It must outlive the @@ -143,9 +155,16 @@ base::ObserverList<TailoredSecurityServiceObserver, true>::Unchecked observer_list_; + // The number of active query requests. When this goes from non-zero to zero, + // we stop `timer_`. When it goes from zero to non-zero, we start it. + size_t active_query_request_ = 0; + // Timer to periodically check tailored security bit. base::RepeatingTimer timer_; + bool is_tailored_security_enabled_ = false; + base::Time last_updated_; + bool is_shut_down_ = false; base::WeakPtrFactory<TailoredSecurityService> weak_ptr_factory_{this};
diff --git a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_observer.h b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_observer.h index 000dfe7b..97e6340 100644 --- a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_observer.h +++ b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_observer.h
@@ -5,13 +5,20 @@ #ifndef COMPONENTS_SAFE_BROWSING_CORE_BROWSER_TAILORED_SECURITY_SERVICE_TAILORED_SECURITY_SERVICE_OBSERVER_H_ #define COMPONENTS_SAFE_BROWSING_CORE_BROWSER_TAILORED_SECURITY_SERVICE_TAILORED_SECURITY_SERVICE_OBSERVER_H_ +#include "base/time/time.h" + namespace safe_browsing { // Observes TailoredSecurityService bit. class TailoredSecurityServiceObserver { public: - // Called when the Tailored Security bit changed. - virtual void OnTailoredSecurityBitChanged(bool enabled) = 0; + // Called when the Tailored Security bit changed to |enabled|, and provides + // the last time it was changed (not including the current update). + virtual void OnTailoredSecurityBitChanged(bool enabled, + base::Time previous_update) {} + + // Called when the service is being destroyed. + virtual void OnTailoredSecurityServiceDestroyed() {} protected: virtual ~TailoredSecurityServiceObserver() = default;
diff --git a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_unittest.cc b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_unittest.cc index 25df96c..c74f460 100644 --- a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_unittest.cc +++ b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_unittest.cc
@@ -58,11 +58,13 @@ std::string GetExpectedTailoredSecurityServiceValue(); - void SetTailoredSecurityServiceCallback(bool is_enabled); + void SetTailoredSecurityServiceCallback(bool is_enabled, + base::Time previous_update); - void GetTailoredSecurityServiceCallback(bool is_enabled); + void GetTailoredSecurityServiceCallback(bool is_enabled, + base::Time previous_update); - void MultipleRequestsCallback(bool is_enabled); + void MultipleRequestsCallback(bool is_enabled, base::Time previous_update); void SetExpectedURL(const GURL& expected_url) { expected_url_ = expected_url; @@ -174,16 +176,20 @@ } void TestingTailoredSecurityService::SetTailoredSecurityServiceCallback( - bool is_enabled) { + bool is_enabled, + base::Time previous_update) { EXPECT_EQ(expected_tailored_security_service_value_, is_enabled); } void TestingTailoredSecurityService::GetTailoredSecurityServiceCallback( - bool is_enabled) { + bool is_enabled, + base::Time previous_update) { EXPECT_EQ(expected_tailored_security_service_value_, is_enabled); } -void TestingTailoredSecurityService::MultipleRequestsCallback(bool is_enabled) { +void TestingTailoredSecurityService::MultipleRequestsCallback( + bool is_enabled, + base::Time previous_update) { EXPECT_EQ(expected_tailored_security_service_value_, is_enabled); }
diff --git a/components/safe_browsing/core/common/safe_browsing_prefs.cc b/components/safe_browsing/core/common/safe_browsing_prefs.cc index 2a53125..f560f0b4 100644 --- a/components/safe_browsing/core/common/safe_browsing_prefs.cc +++ b/components/safe_browsing/core/common/safe_browsing_prefs.cc
@@ -107,6 +107,8 @@ const char kSafeBrowsingEventTimestamps[] = "safebrowsing.event_timestamps"; const char kAccountTailoredSecurityUpdateTimestamp[] = "safebrowsing.aesb_update_time_windows_epoch_micros"; +const char kEnhancedProtectionEnabledViaTailoredSecurity[] = + "safebrowsing.esb_enabled_via_tailored_security"; } // namespace prefs @@ -122,10 +124,14 @@ } } -void SetSafeBrowsingState(PrefService* prefs, SafeBrowsingState state) { +void SetSafeBrowsingState(PrefService* prefs, + SafeBrowsingState state, + bool is_esb_enabled_in_sync) { if (state == SafeBrowsingState::ENHANCED_PROTECTION) { SetEnhancedProtectionPref(prefs, true); SetStandardProtectionPref(prefs, true); + prefs->SetBoolean(prefs::kEnhancedProtectionEnabledViaTailoredSecurity, + is_esb_enabled_in_sync); } else if (state == SafeBrowsingState::STANDARD_PROTECTION) { SetEnhancedProtectionPref(prefs, false); SetStandardProtectionPref(prefs, true); @@ -217,6 +223,8 @@ registry->RegisterDictionaryPref(prefs::kSafeBrowsingEventTimestamps); registry->RegisterTimePref(prefs::kAccountTailoredSecurityUpdateTimestamp, base::Time()); + registry->RegisterBooleanPref( + prefs::kEnhancedProtectionEnabledViaTailoredSecurity, false); } void RegisterLocalStatePrefs(PrefRegistrySimple* registry) {
diff --git a/components/safe_browsing/core/common/safe_browsing_prefs.h b/components/safe_browsing/core/common/safe_browsing_prefs.h index 71027f14..c4b2d877 100644 --- a/components/safe_browsing/core/common/safe_browsing_prefs.h +++ b/components/safe_browsing/core/common/safe_browsing_prefs.h
@@ -115,6 +115,10 @@ // was updated. extern const char kAccountTailoredSecurityUpdateTimestamp[]; +// A boolean indicating if Enhanced Protection was enabled in sync with +// account tailored security. +extern const char kEnhancedProtectionEnabledViaTailoredSecurity[]; + } // namespace prefs namespace safe_browsing { @@ -184,7 +188,11 @@ SafeBrowsingState GetSafeBrowsingState(const PrefService& prefs); -void SetSafeBrowsingState(PrefService* prefs, SafeBrowsingState state); +// Set the SafeBrowsing prefs. Also records if ESB was enabled in sync with +// Account-ESB via Tailored Security. +void SetSafeBrowsingState(PrefService* prefs, + SafeBrowsingState state, + bool is_esb_enabled_in_sync = false); // Returns whether Safe Browsing is enabled for the user. bool IsSafeBrowsingEnabled(const PrefService& prefs);
diff --git a/components/services/app_service/public/cpp/app_types.cc b/components/services/app_service/public/cpp/app_types.cc index 4a6d3ed..2989ef9 100644 --- a/components/services/app_service/public/cpp/app_types.cc +++ b/components/services/app_service/public/cpp/app_types.cc
@@ -56,8 +56,6 @@ return AppType::kSystemWeb; case apps::mojom::AppType::kStandaloneBrowserChromeApp: return AppType::kStandaloneBrowserChromeApp; - case apps::mojom::AppType::kExtension: - return AppType::kExtension; } }
diff --git a/components/services/app_service/public/cpp/app_types.h b/components/services/app_service/public/cpp/app_types.h index d22de50..ab4c47f 100644 --- a/components/services/app_service/public/cpp/app_types.h +++ b/components/services/app_service/public/cpp/app_types.h
@@ -28,7 +28,6 @@ kBorealis = 10, // Borealis app, see go/borealis-app. kSystemWeb = 11, // System web app. kStandaloneBrowserChromeApp = 12, // Chrome app hosted in Lacros. - kExtension = 13, // Browser extension. }; // Whether an app is ready to launch, i.e. installed.
diff --git a/components/services/app_service/public/cpp/types_util.cc b/components/services/app_service/public/cpp/types_util.cc index 12a2a3f..91c9acc 100644 --- a/components/services/app_service/public/cpp/types_util.cc +++ b/components/services/app_service/public/cpp/types_util.cc
@@ -83,7 +83,6 @@ case apps::mojom::AppType::kWeb: case apps::mojom::AppType::kSystemWeb: case apps::mojom::AppType::kChromeApp: - case apps::mojom::AppType::kExtension: return true; case apps::mojom::AppType::kUnknown: case apps::mojom::AppType::kArc:
diff --git a/components/services/app_service/public/mojom/types.mojom b/components/services/app_service/public/mojom/types.mojom index b419afc..baa0296f 100644 --- a/components/services/app_service/public/mojom/types.mojom +++ b/components/services/app_service/public/mojom/types.mojom
@@ -129,7 +129,6 @@ kBorealis, // Borealis app, see go/borealis-app. kSystemWeb, // System web app. kStandaloneBrowserChromeApp, // Chrome app hosted in Lacros. - kExtension, // Browser extension. }; // Whether an app is ready to launch, i.e. installed.
diff --git a/components/sessions/content/content_serialized_navigation_builder_unittest.cc b/components/sessions/content/content_serialized_navigation_builder_unittest.cc index 177b9c2..38b26fdb 100644 --- a/components/sessions/content/content_serialized_navigation_builder_unittest.cc +++ b/components/sessions/content/content_serialized_navigation_builder_unittest.cc
@@ -282,7 +282,7 @@ content::BrowserTaskEnvironment test_environment; content::TestBrowserContext browser_context; - // Make a NavigationEntries, serialize it twice into a vector. + // Make a NavigationEntry and serialize it twice into a vector. const std::unique_ptr<content::NavigationEntry> entry( MakeNavigationEntryForTest()); std::vector<SerializedNavigationEntry> navigations; @@ -300,17 +300,76 @@ ASSERT_EQ(entry->GetURL(), restored_entries[1]->GetURL()); // Because the state of the two SerializedNavigationEntries was identical - // (specifcally, their item sequence numbers), the root FrameNavigationEntries - // for the two restored entries should be de-duplicated and shared. The url - // is stored on the root FrameNavigationEntry, so because they are shared, - // calling SetURL() on one of the restored entries should update the url on - // both. + // (specifically, their item sequence numbers), the root + // FrameNavigationEntries for the two restored entries should be de-duplicated + // and shared. The url is stored on the root FrameNavigationEntry, so because + // they are shared, calling SetURL() on one of the restored entries should + // update the url on both. GURL new_url("http://www.url.com#ToNavigationEntries"); restored_entries[0]->SetURL(new_url); EXPECT_EQ(new_url, restored_entries[0]->GetURL()); EXPECT_EQ(new_url, restored_entries[1]->GetURL()); } +// Test that we can restore FrameNavigationEntries with matching item sequence +// numbers and unique names but different URLs, as these may be found in +// serialized sessions from builds prior to r894383. +// See https://crbug.com/1275257. +TEST_F(ContentSerializedNavigationBuilderTest, DeduplicateEntriesByURL) { + content::BrowserTaskEnvironment test_environment; + content::TestBrowserContext browser_context; + + // Make a NavigationEntry and serialize it several times into a vector. + // Change the URL but not item sequence number for the last two entries, to + // simulate a replaceState that was serialized from a build prior to r894383. + const std::unique_ptr<content::NavigationEntry> entry( + MakeNavigationEntryForTest()); + GURL url1("http://www.url.com/page1"); + entry->SetURL(url1); + std::vector<SerializedNavigationEntry> navigations; + navigations.push_back( + ContentSerializedNavigationBuilder::FromNavigationEntry(0, entry.get())); + navigations.push_back( + ContentSerializedNavigationBuilder::FromNavigationEntry(1, entry.get())); + GURL url2("http://www.url.com/page2"); + entry->SetURL(url2); + navigations.push_back( + ContentSerializedNavigationBuilder::FromNavigationEntry(2, entry.get())); + navigations.push_back( + ContentSerializedNavigationBuilder::FromNavigationEntry(3, entry.get())); + + // Deserialize them via ToNavigationEntries(). + std::vector<std::unique_ptr<content::NavigationEntry>> restored_entries = + ContentSerializedNavigationBuilder::ToNavigationEntries(navigations, + &browser_context); + ASSERT_EQ(restored_entries.size(), 4ul); + ASSERT_EQ(url1, restored_entries[0]->GetURL()); + ASSERT_EQ(url1, restored_entries[1]->GetURL()); + ASSERT_EQ(url2, restored_entries[2]->GetURL()); + ASSERT_EQ(url2, restored_entries[3]->GetURL()); + + // The root FrameNavigationEntries for the first two restored entries should + // have been de-duplicated and shared, so changing the URL of one of them + // should change the other, but not the third and fourth entries (which had a + // different URL and thus aren't shared). + GURL url3("http://www.url.com/page3"); + restored_entries[0]->SetURL(url3); + EXPECT_EQ(url3, restored_entries[0]->GetURL()); + EXPECT_EQ(url3, restored_entries[1]->GetURL()); + EXPECT_EQ(url2, restored_entries[2]->GetURL()); + EXPECT_EQ(url2, restored_entries[3]->GetURL()); + + // The third and fourth entries should have a shared FrameNavigationEntry as + // well, such that updating one affects the other but not the first and second + // entries. + GURL url4("http://www.url.com/page4"); + restored_entries[3]->SetURL(url4); + EXPECT_EQ(url3, restored_entries[0]->GetURL()); + EXPECT_EQ(url3, restored_entries[1]->GetURL()); + EXPECT_EQ(url4, restored_entries[2]->GetURL()); + EXPECT_EQ(url4, restored_entries[3]->GetURL()); +} + TEST_F(ContentSerializedNavigationBuilderTest, SetPasswordState) { std::unique_ptr<content::NavigationEntry> entry( content::NavigationEntry::Create());
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 0936b8b..3b78f152 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -685,6 +685,7 @@ <translation id="3215092763954878852">No se pudo usar WebAuthn</translation> <translation id="3218181027817787318">Relativo</translation> <translation id="3223287115535306850">Ícono de carga para el inicio de la app</translation> +<translation id="3225347164936328585">Aplausos</translation> <translation id="3225919329040284222">El servidor mostró un certificado que no coincide con lo esperado. Estas expectativas se incluyen en determinados sitios web con un alto nivel de seguridad para garantizar tu protección.</translation> <translation id="3226128629678568754">Presiona el botón para volver a cargar y, de ese modo, enviar nuevamente los datos necesarios para cargar la página.</translation> <translation id="3226387218769101247">Miniaturas</translation> @@ -721,6 +722,7 @@ <translation id="3333762389743153920">No admite una tarjeta virtual</translation> <translation id="3338095232262050444">Seguro</translation> <translation id="3339446062576134663">Nube (Ash)</translation> +<translation id="3345782426586609320">Ojos</translation> <translation id="3355823806454867987">Cambiar la configuración del proxy...</translation> <translation id="3360103848165129075">Hoja del controlador de pagos</translation> <translation id="3361596688432910856">Chrome <ph name="BEGIN_EMPHASIS" />no guardará<ph name="END_EMPHASIS" /> la siguiente información: @@ -1075,6 +1077,7 @@ <translation id="4390472908992056574">Borde</translation> <translation id="4406883609789734330">Subtitulado instantáneo</translation> <translation id="4406896451731180161">resultados de búsqueda</translation> +<translation id="4407755609041463909">Fuego</translation> <translation id="4408413947728134509">Cookies <ph name="NUM_COOKIES" /></translation> <translation id="4414515549596849729">datos de sitios y cookies</translation> <translation id="4415426530740016218">Dirección de retiro</translation> @@ -1383,6 +1386,7 @@ <translation id="5344579389779391559">Es posible que esta página intente cobrarte dinero</translation> <translation id="5347645913823149105">Botón Personalizar fuentes en Chrome, presiona Intro para personalizar el tamaño de las fuentes y los tipos de letra en Chrome</translation> <translation id="5355557959165512791">No puedes visitar <ph name="SITE" /> ahora porque este certificado se revocó. Los ataques y errores de red suelen ser temporales, por lo que es posible que esta página funcione más tarde.</translation> +<translation id="5356837363448394805">Sonrojo</translation> <translation id="536296301121032821">Error al almacenar la configuración de la política</translation> <translation id="5363309033720083897">Puerto en serie que permite tu administrador</translation> <translation id="5371425731340848620">Actualizar tarjeta</translation> @@ -1615,6 +1619,7 @@ <translation id="622039917539443112">Plegado en paralelo</translation> <translation id="6221345481584921695">La Navegación segura de Google <ph name="BEGIN_LINK" />detectó software malicioso<ph name="END_LINK" /> en <ph name="SITE" /> recientemente. A veces, los sitios web que suelen ser seguros contienen software malicioso. El contenido malicioso proviene de <ph name="SUBRESOURCE_HOST" />, un conocido distribuidor de software malicioso.</translation> <translation id="6226163402662242066"><ph name="MANAGE_CHROME_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, presiona Tab y, luego, Intro para personalizar tus herramientas de accesibilidad en la configuración de Chrome</translation> +<translation id="6233160458685643793">Sonrisa burlona</translation> <translation id="6234122620015464377">Cortar después de cada documento</translation> <translation id="6240447795304464094">Logotipo de Google Pay</translation> <translation id="6241121617266208201">Ocultar sugerencias</translation> @@ -1667,6 +1672,7 @@ <translation id="6390662030813198813">Engineering-E</translation> <translation id="6391700400718590966">Se cerró la hoja inferior que indicaba que las credenciales de pago seguro no coinciden</translation> <translation id="6393956493820063117">Una política del administrador no permite pegar contenido de <ph name="ORIGIN_NAME" /> en esta ubicación</translation> +<translation id="6398277657359595425">Llanto desconsolado</translation> <translation id="6398765197997659313">Salir de pantalla completa</translation> <translation id="6401136357288658127">Esta política es obsoleta. En su lugar, debes usar la política <ph name="NEW_POLICY" />.</translation> <translation id="6404511346730675251">Editar marcador</translation> @@ -1741,6 +1747,7 @@ <translation id="6660413144148052430">ubicación</translation> <translation id="6662457027866368246">Primer rollo</translation> <translation id="666259744093848177">(x86_64 translated)</translation> +<translation id="6663846344464066639">Manos juntas</translation> <translation id="6665553082534466207">Perforación triple a la derecha</translation> <translation id="6671697161687535275">¿Confirmas que quieres quitar la sugerencia de formulario de Chromium?</translation> <translation id="6685834062052613830">Salir y completar la configuración</translation> @@ -1809,6 +1816,7 @@ <translation id="6934672428414710184">Este nombre es de tu Cuenta de Google</translation> <translation id="6944692733090228304">Ingresaste tu contraseña en un sitio que no está administrado por <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Para proteger tu cuenta, no vuelvas a usar la contraseña en otras apps y sitios.</translation> <translation id="6945221475159498467">Seleccionar</translation> +<translation id="6946722113367118030">Pensando</translation> <translation id="6948051842255602737">Terminó el juego, tu puntuación es <ph name="SCORE" />.</translation> <translation id="6948701128805548767">Para ver los requisitos y métodos de retiro, selecciona una dirección</translation> <translation id="6949872517221025916">Restablecer contraseña</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index efc4b29..9322c7a 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -1099,6 +1099,7 @@ <translation id="4450893287417543264">Қайта көрсетілмесін</translation> <translation id="4451135742916150903">HID құрылғыларына қосылуға рұқсат сұрайды</translation> <translation id="4452328064229197696">Сіз жаңа ғана қолданған құпия сөз деректердің қолды болуы салдарынан жария етілді. Аккаунттарыңызды қорғау үшін Google Құпия сөздер реттегіші сақталған құпия сөздеріңізді тексеруді ұсынады.</translation> +<translation id="4455222631300069614">Құпия сөзіңізді дереу өзгертіңіз</translation> <translation id="4460315069258617173">Осы сайтқа қатысты қойындыларды жапқанға дейін, рұқсат берілген.</translation> <translation id="4464826014807964867">Ұйымыңыздан алынған ақпарат қамтылған веб-сайттар</translation> <translation id="447665707681730621"><ph name="BUBBLE_MESSAGE" />. <ph name="LEARN_MORE_TEXT" /></translation> @@ -1337,6 +1338,7 @@ <translation id="51918995459521422"><ph name="ORIGIN" /> бірнеше файл жүктеп алғысы келеді</translation> <translation id="519422657042045905">Аннотация жоқ</translation> <translation id="5201306358585911203">Бұл веббетке ендірілген беттегі сұрау</translation> +<translation id="5204468114771111727">Chrome деректер қолды болған кезде пайдаланылған құпия сөзді тапты. Google Assistant құпия сөзіңізді автоматты түрде өзгерте алады.</translation> <translation id="5205222826937269299">Аты қажет</translation> <translation id="5209518306177824490">SHA-1 саусақ ізі</translation> <translation id="5209670883520018268">20-науа</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 3ff1c74..f7c5517 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -688,6 +688,7 @@ <translation id="3215092763954878852">Kunne ikke bruke WebAuthn</translation> <translation id="3218181027817787318">Relativ</translation> <translation id="3223287115535306850">Throbber for appstart</translation> +<translation id="3225347164936328585">Klappende</translation> <translation id="3225919329040284222">Tjeneren oppga et sertifikat som ikke samsvarte med innebygde forventninger. Disse forventningene benyttes for visse nettsteder med høy sikkerhet, og brukes for å beskytte deg.</translation> <translation id="3226128629678568754">Trykk på knappen for å laste inn på nytt, for å sende inn dataene som trengs for å laste inn siden på nytt.</translation> <translation id="3226387218769101247">Miniatyrbilder</translation> @@ -724,6 +725,7 @@ <translation id="3333762389743153920">Ikke kvalifisert for virtuelt kort</translation> <translation id="3338095232262050444">Sikker</translation> <translation id="3339446062576134663">Nettsky (Ash)</translation> +<translation id="3345782426586609320">Øyne</translation> <translation id="3355823806454867987">Endre innstillinger for proxy-tjener</translation> <translation id="3360103848165129075">Ark for betalingsbehandling</translation> <translation id="3361596688432910856">Chrome <ph name="BEGIN_EMPHASIS" />lagrer ikke<ph name="END_EMPHASIS" /> @@ -1083,6 +1085,7 @@ <translation id="4390472908992056574">Rand</translation> <translation id="4406883609789734330">Direkteteksting</translation> <translation id="4406896451731180161">søkeresultater</translation> +<translation id="4407755609041463909">Ild</translation> <translation id="4408413947728134509">Informasjonskapsler <ph name="NUM_COOKIES" /></translation> <translation id="4414515549596849729">informasjonskapsler og nettstedsdata</translation> <translation id="4415426530740016218">Henteadresse</translation> @@ -1391,6 +1394,7 @@ <translation id="5344579389779391559">Denne siden kan prøve å belaste deg for penger</translation> <translation id="5347645913823149105">«Tilpass skrifttyper i Chrome»-knappen – trykk på Enter for å tilpasse skriftstørrelser og -typer i Chrome</translation> <translation id="5355557959165512791">Du kan ikke gå til <ph name="SITE" /> akkurat nå, siden sertifikatet for nettstedet er trukket tilbake. Nettverksfeil- og angrep er vanligvis midlertidige, så denne siden fungerer sannsynligvis senere.</translation> +<translation id="5356837363448394805">Rødmende</translation> <translation id="536296301121032821">Kunne ikke lagre angivelsen for enhetsinnstillinger</translation> <translation id="5363309033720083897">Den serielle porten tillates av administratoren din</translation> <translation id="5371425731340848620">Oppdater kortet</translation> @@ -1623,6 +1627,7 @@ <translation id="622039917539443112">Parallellfals</translation> <translation id="6221345481584921695">Google Safe Browsing oppdaget nylig <ph name="BEGIN_LINK" />skadelig programvare<ph name="END_LINK" /> på <ph name="SITE" />. Nettsteder som vanligvis er trygge, kan noen ganger være infisert med skadelig programvare. Det skadelige innholdet kommer fra <ph name="SUBRESOURCE_HOST" />, som er en kjent distributør av skadelig programvare.</translation> <translation id="6226163402662242066"><ph name="MANAGE_CHROME_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" /> – trykk på Tab og deretter på Enter for å gi tilgjengelighetsverktøyene dine personlig preg i Chrome-innstillingene</translation> +<translation id="6233160458685643793">Flirende</translation> <translation id="6234122620015464377">Beskjær etter hvert dokument</translation> <translation id="6240447795304464094">Google Pay-logo</translation> <translation id="6241121617266208201">Skjul forslag</translation> @@ -1675,6 +1680,7 @@ <translation id="6390662030813198813">Engineering-E</translation> <translation id="6391700400718590966">Ark for sikker betalingslegitimasjon uten samsvarende legitimasjon er lukket</translation> <translation id="6393956493820063117">Innliming fra <ph name="ORIGIN_NAME" /> på denne plasseringen er blokkert av en administratorregel</translation> +<translation id="6398277657359595425">Strigråtende</translation> <translation id="6398765197997659313">Avslutt fullskjerm</translation> <translation id="6401136357288658127">Denne regelen er avviklet. Du bør bruke den nye regelen <ph name="NEW_POLICY" /> i stedet.</translation> <translation id="6404511346730675251">Rediger bokmerket</translation> @@ -1749,6 +1755,7 @@ <translation id="6660413144148052430">posisjon</translation> <translation id="6662457027866368246">Første rull</translation> <translation id="666259744093848177">(x86_64 oversatt)</translation> +<translation id="6663846344464066639">Foldede hender</translation> <translation id="6665553082534466207">Tre hull høyre</translation> <translation id="6671697161687535275">Vil du fjerne forslaget fra Chromium?</translation> <translation id="6685834062052613830">Logg av og fullfør konfigurasjonen</translation> @@ -1817,6 +1824,7 @@ <translation id="6934672428414710184">Dette navnet er fra Google-kontoen din</translation> <translation id="6944692733090228304">Du har skrevet inn passordet ditt på et nettsted som ikke administreres av <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. For å beskytte kontoen din må du ikke bruke det samme passordet i andre apper eller på andre nettsteder.</translation> <translation id="6945221475159498467">Velg</translation> +<translation id="6946722113367118030">Tenkende</translation> <translation id="6948051842255602737">Spillet er over. Poengsummen din er <ph name="SCORE" />.</translation> <translation id="6948701128805548767">For å se hentemetoder og -krav, velg en adresse</translation> <translation id="6949872517221025916">Tilbakestill passordet</translation>
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index 5b849f96..5f227388 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -166,26 +166,6 @@ } }; -class DumpAccessibilityTreeWithLayoutNGBlockFragmentationTest - : public DumpAccessibilityTreeTest { - public: - void SetUpCommandLine(base::CommandLine* command_line) override { - DumpAccessibilityTreeTest::SetUpCommandLine(command_line); - command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures, - "LayoutNGBlockFragmentation"); - } -}; - -class DumpAccessibilityTreeWithoutLayoutNGBlockFragmentationTest - : public DumpAccessibilityTreeTest { - public: - void SetUpCommandLine(base::CommandLine* command_line) override { - DumpAccessibilityTreeTest::SetUpCommandLine(command_line); - command_line->AppendSwitchASCII(switches::kDisableBlinkFeatures, - "LayoutNGBlockFragmentation"); - } -}; - // Parameterize the tests so that each test-pass is run independently. struct DumpAccessibilityTreeTestPassToString { std::string operator()( @@ -212,18 +192,6 @@ ::testing::ValuesIn(DumpAccessibilityTestHelper::TreeTestPasses()), DumpAccessibilityTreeTestPassToString()); -INSTANTIATE_TEST_SUITE_P( - All, - DumpAccessibilityTreeWithLayoutNGBlockFragmentationTest, - ::testing::ValuesIn(DumpAccessibilityTestHelper::TreeTestPasses()), - DumpAccessibilityTreeTestPassToString()); - -INSTANTIATE_TEST_SUITE_P( - All, - DumpAccessibilityTreeWithoutLayoutNGBlockFragmentationTest, - ::testing::ValuesIn(DumpAccessibilityTestHelper::TreeTestPasses()), - DumpAccessibilityTreeTestPassToString()); - IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityCSSAltText) { RunCSSTest(FILE_PATH_LITERAL("alt-text.html")); } @@ -323,18 +291,10 @@ RunCSSTest(FILE_PATH_LITERAL("marker-hyphens.html")); } -IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeWithLayoutNGBlockFragmentationTest, - AccessibilityCSSMarkerCrash) { +IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityCSSMarkerCrash) { RunCSSTest(FILE_PATH_LITERAL("marker-crash.html")); } -IN_PROC_BROWSER_TEST_P( - DumpAccessibilityTreeWithoutLayoutNGBlockFragmentationTest, - AccessibilityCSSMarkerCrash) { - RunCSSTest( - FILE_PATH_LITERAL("marker-crash-without-layout-ng-block-frag.html")); -} - IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityCSSTextOverflowEllipsis) { RunCSSTest(FILE_PATH_LITERAL("text-overflow-ellipsis.html"));
diff --git a/content/browser/attribution_reporting/attribution_host_unittest.cc b/content/browser/attribution_reporting/attribution_host_unittest.cc index a9bb620..9cb9afd 100644 --- a/content/browser/attribution_reporting/attribution_host_unittest.cc +++ b/content/browser/attribution_reporting/attribution_host_unittest.cc
@@ -55,13 +55,14 @@ using testing::_; using testing::AllOf; -using testing::ElementsAre; -using testing::IsEmpty; +using testing::InSequence; using testing::IsNull; +using testing::Mock; using testing::Pointee; using testing::Property; using testing::Return; -using testing::SizeIs; + +using Checkpoint = ::testing::MockFunction<void(int step)>; const char kConversionUrl[] = "https://b.com"; const char kConversionUrlWithFragment[] = "https://b.com/#fragment"; @@ -84,7 +85,7 @@ RenderViewHostTestHarness::SetUp(); conversion_host_ = AttributionHostTestPeer::CreateAttributionHost( - web_contents(), std::make_unique<TestManagerProvider>(&test_manager_)); + web_contents(), std::make_unique<TestManagerProvider>(&mock_manager_)); AttributionHost::SetReceiverImplForTesting(conversion_host_.get()); contents()->GetMainFrame()->InitializeRenderFrameIfNeeded(); @@ -111,11 +112,16 @@ } protected: - TestAttributionManager test_manager_; + MockAttributionManager mock_manager_; std::unique_ptr<AttributionHost> conversion_host_; }; TEST_F(AttributionHostTest, ValidConversionInSubframe_NoBadMessage) { + EXPECT_CALL(mock_manager_, + HandleTrigger(Property( + &StorableTrigger::conversion_destination, + net::SchemefulSite(GURL("https://www.example.com"))))); + contents()->NavigateAndCommit(GURL("https://www.example.com")); // Create a subframe and use it as a target for the conversion registration @@ -138,15 +144,15 @@ // triggered. base::RunLoop().RunUntilIdle(); EXPECT_FALSE(bad_message_observer.got_bad_message()); - - EXPECT_THAT(test_manager_.handled_triggers(), - ElementsAre(Property( - &StorableTrigger::conversion_destination, - net::SchemefulSite(GURL("https://www.example.com"))))); } TEST_F(AttributionHostTest, ConversionInSubframe_ConversionDestinationMatchesMainFrame) { + EXPECT_CALL(mock_manager_, + HandleTrigger(Property( + &StorableTrigger::conversion_destination, + net::SchemefulSite(GURL("https://www.example.com"))))); + contents()->NavigateAndCommit(GURL("https://www.example.com")); // Create a subframe and use it as a target for the conversion registration @@ -171,14 +177,11 @@ // triggered. base::RunLoop().RunUntilIdle(); EXPECT_FALSE(bad_message_observer.got_bad_message()); - - EXPECT_THAT(test_manager_.handled_triggers(), - ElementsAre(Property( - &StorableTrigger::conversion_destination, - net::SchemefulSite(GURL("https://www.example.com"))))); } TEST_F(AttributionHostTest, ConversionInSubframeOnInsecurePage_BadMessage) { + EXPECT_CALL(mock_manager_, HandleTrigger).Times(0); + contents()->NavigateAndCommit(GURL("http://www.example.com")); // Create a subframe and use it as a target for the conversion registration @@ -202,7 +205,6 @@ "blink.mojom.ConversionHost can only be used in secure contexts with a " "secure conversion registration origin.", bad_message_observer.WaitForBadMessage()); - EXPECT_THAT(test_manager_.handled_triggers(), IsEmpty()); } TEST_F(AttributionHostTest, ConversionInSubframe_ChecksCorrectOrigins) { @@ -221,6 +223,8 @@ ScopedContentBrowserClientSetting setting(&browser_client); for (bool conversion_allowed : {false, true}) { + EXPECT_CALL(mock_manager_, HandleTrigger).Times(conversion_allowed); + contents()->NavigateAndCommit(GURL("https://www.example.com")); // Create a subframe and use it as a target for the conversion registration @@ -237,13 +241,13 @@ url::Origin::Create(GURL("https://report.example")); conversion_host_mojom()->RegisterConversion(std::move(conversion)); - EXPECT_THAT(test_manager_.handled_triggers(), SizeIs(conversion_allowed)); - - test_manager_.Reset(); + Mock::VerifyAndClear(&mock_manager_); } } TEST_F(AttributionHostTest, ConversionOnInsecurePage_BadMessage) { + EXPECT_CALL(mock_manager_, HandleTrigger).Times(0); + // Create a page with an insecure origin. contents()->NavigateAndCommit(GURL("http://www.example.com")); SetCurrentTargetFrameForTesting(main_rfh()); @@ -260,10 +264,11 @@ "blink.mojom.ConversionHost can only be used in secure contexts with a " "secure conversion registration origin.", bad_message_observer.WaitForBadMessage()); - EXPECT_THAT(test_manager_.handled_triggers(), IsEmpty()); } TEST_F(AttributionHostTest, ConversionWithInsecureReportingOrigin_BadMessage) { + EXPECT_CALL(mock_manager_, HandleTrigger).Times(0); + contents()->NavigateAndCommit(GURL("https://www.example.com")); SetCurrentTargetFrameForTesting(main_rfh()); @@ -279,10 +284,11 @@ "blink.mojom.ConversionHost can only be used in secure contexts with a " "secure conversion registration origin.", bad_message_observer.WaitForBadMessage()); - EXPECT_THAT(test_manager_.handled_triggers(), IsEmpty()); } TEST_F(AttributionHostTest, ValidConversion_NoBadMessage) { + EXPECT_CALL(mock_manager_, HandleTrigger); + // Create a page with a secure origin. contents()->NavigateAndCommit(GURL("https://www.example.com")); SetCurrentTargetFrameForTesting(main_rfh()); @@ -300,10 +306,11 @@ // triggered. base::RunLoop().RunUntilIdle(); EXPECT_FALSE(bad_message_observer.got_bad_message()); - EXPECT_THAT(test_manager_.handled_triggers(), SizeIs(1)); } TEST_F(AttributionHostTest, ValidConversionWithEmbedderDisable_NoConversion) { + EXPECT_CALL(mock_manager_, HandleTrigger).Times(0); + MockAttributionReportingContentBrowserClient browser_client; EXPECT_CALL( browser_client, @@ -322,11 +329,11 @@ conversion->reporting_origin = url::Origin::Create(GURL("https://secure.com")); conversion_host_mojom()->RegisterConversion(std::move(conversion)); - - EXPECT_THAT(test_manager_.handled_triggers(), IsEmpty()); } TEST_F(AttributionHostTest, ValidImpressionWithEmbedderDisable_NoImpression) { + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + MockAttributionReportingContentBrowserClient browser_client; // This is called twice because the real AttributionHost is still active for // the test. @@ -346,11 +353,16 @@ navigation->SetInitiatorFrame(main_rfh()); navigation->set_impression(CreateValidImpression()); navigation->Commit(); - - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); } TEST_F(AttributionHostTest, Conversion_AssociatedWithConversionSite) { + // Verify that we use the domain of the page where the conversion occurred + // instead of the origin. + EXPECT_CALL(mock_manager_, + HandleTrigger(Property( + &StorableTrigger::conversion_destination, + net::SchemefulSite(GURL("https://conversion.com"))))); + // Create a page with a secure origin. contents()->NavigateAndCommit(GURL("https://sub.conversion.com")); SetCurrentTargetFrameForTesting(main_rfh()); @@ -359,13 +371,6 @@ conversion->reporting_origin = url::Origin::Create(GURL("https://secure.com")); conversion_host_mojom()->RegisterConversion(std::move(conversion)); - - // Verify that we use the domain of the page where the conversion occurred - // instead of the origin. - EXPECT_THAT(test_manager_.handled_triggers(), - ElementsAre(Property( - &StorableTrigger::conversion_destination, - net::SchemefulSite(GURL("https://conversion.com"))))); } TEST_F(AttributionHostTest, PerPageConversionMetrics) { @@ -384,16 +389,16 @@ url::Origin::Create(GURL("https://secure.com")); for (size_t i = 0u; i < 8u; i++) { + EXPECT_CALL(mock_manager_, HandleTrigger); conversion_host_mojom()->RegisterConversion(conversion->Clone()); - EXPECT_THAT(test_manager_.handled_triggers(), SizeIs(1)); - test_manager_.Reset(); + Mock::VerifyAndClear(&mock_manager_); } + EXPECT_CALL(mock_manager_, HandleTrigger); conversion->reporting_origin = url::Origin::Create(GURL("https://anothersecure.com")); conversion_host_mojom()->RegisterConversion(conversion->Clone()); - EXPECT_THAT(test_manager_.handled_triggers(), SizeIs(1)); - test_manager_.Reset(); + Mock::VerifyAndClear(&mock_manager_); // Same document navs should not reset the counter. contents()->NavigateAndCommit(GURL("https://www.example.com#hash")); @@ -453,23 +458,23 @@ blink::Impression impression = CreateValidImpression(); for (size_t i = 0u; i < 8u; i++) { + EXPECT_CALL(mock_manager_, HandleSource); conversion_host_mojom()->RegisterImpression(impression); // Run loop to allow the bad message code to run if a bad message was // triggered. base::RunLoop().RunUntilIdle(); - EXPECT_THAT(test_manager_.handled_sources(), SizeIs(1)); - test_manager_.Reset(); + Mock::VerifyAndClear(&mock_manager_); } + EXPECT_CALL(mock_manager_, HandleSource); impression.reporting_origin = url::Origin::Create(GURL("https://anothersecure.com")); conversion_host_mojom()->RegisterImpression(impression); // Run loop to allow the bad message code to run if a bad message was // triggered. base::RunLoop().RunUntilIdle(); - EXPECT_THAT(test_manager_.handled_sources(), SizeIs(1)); - test_manager_.Reset(); + Mock::VerifyAndClear(&mock_manager_); // Same document navs should not reset the counter. contents()->NavigateAndCommit(GURL("https://www.example.com#hash")); @@ -529,22 +534,22 @@ } TEST_F(AttributionHostTest, NavigationWithNoImpression_Ignored) { + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + contents()->NavigateAndCommit(GURL("https://secure_impression.com")); NavigationSimulatorImpl::NavigateAndCommitFromDocument(GURL(kConversionUrl), main_rfh()); - - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); } TEST_F(AttributionHostTest, ValidImpression_ForwardedToManager) { + EXPECT_CALL(mock_manager_, HandleSource); + contents()->NavigateAndCommit(GURL("https://secure_impression.com")); auto navigation = NavigationSimulatorImpl::CreateRendererInitiated( GURL(kConversionUrl), main_rfh()); navigation->SetInitiatorFrame(main_rfh()); navigation->set_impression(CreateValidImpression()); navigation->Commit(); - - EXPECT_THAT(test_manager_.handled_sources(), SizeIs(1)); } TEST_F(AttributionHostTest, ImpressionWithNoManagerAvilable_NoCrash) { @@ -562,6 +567,8 @@ } TEST_F(AttributionHostTest, ImpressionInSubframe_Ignored) { + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + contents()->NavigateAndCommit(GURL("https://secure_impression.com")); // Create a subframe and use it as a target for the conversion registration @@ -575,13 +582,13 @@ navigation->SetInitiatorFrame(main_rfh()); navigation->set_impression(CreateValidImpression()); navigation->Commit(); - - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); } // Test that if we cannot access the initiator frame of the navigation, we // ignore the associated impression. TEST_F(AttributionHostTest, ImpressionNavigationWithDeadInitiator_Ignored) { + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + base::HistogramTester histograms; contents()->NavigateAndCommit(GURL("https://secure_impression.com")); @@ -593,13 +600,13 @@ navigation->set_impression(CreateValidImpression()); navigation->Commit(); - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); - histograms.ExpectUniqueSample( "Conversions.ImpressionNavigationHasDeadInitiator", true, 2); } TEST_F(AttributionHostTest, ImpressionNavigationCommitsToErrorPage_Ignored) { + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + contents()->NavigateAndCommit(GURL("https://secure_impression.com")); auto navigation = NavigationSimulatorImpl::CreateRendererInitiated( @@ -608,11 +615,11 @@ navigation->set_impression(CreateValidImpression()); navigation->Fail(net::ERR_FAILED); navigation->CommitErrorPage(); - - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); } TEST_F(AttributionHostTest, ImpressionNavigationAborts_Ignored) { + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + contents()->NavigateAndCommit(GURL("https://secure_impression.com")); auto navigation = NavigationSimulatorImpl::CreateRendererInitiated( @@ -620,12 +627,12 @@ navigation->SetInitiatorFrame(main_rfh()); navigation->set_impression(CreateValidImpression()); navigation->AbortCommit(); - - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); } TEST_F(AttributionHostTest, CommittedOriginDiffersFromConversionDesintation_Ignored) { + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + contents()->NavigateAndCommit(GURL("https://secure_impression.com")); auto navigation = NavigationSimulatorImpl::CreateRendererInitiated( @@ -633,8 +640,6 @@ navigation->SetInitiatorFrame(main_rfh()); navigation->set_impression(CreateValidImpression()); navigation->Commit(); - - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); } TEST_F(AttributionHostTest, @@ -674,6 +679,9 @@ }; for (const auto& test_case : kTestCases) { + EXPECT_CALL(mock_manager_, HandleSource) + .Times(test_case.impression_expected); + contents()->NavigateAndCommit(GURL(test_case.impression_origin)); auto navigation = NavigationSimulatorImpl::CreateRendererInitiated( GURL(test_case.conversion_origin), main_rfh()); @@ -687,16 +695,17 @@ navigation->SetInitiatorFrame(main_rfh()); navigation->Commit(); - EXPECT_THAT(test_manager_.handled_sources(), - SizeIs(test_case.impression_expected)) - << "For test case: " << test_case.impression_origin << " | " - << test_case.conversion_origin << " | " << test_case.reporting_origin; - test_manager_.Reset(); + Mock::VerifyAndClear(&mock_manager_); } } TEST_F(AttributionHostTest, ImpressionInSubframe_ImpressionOriginMatchesTopPageOrigin) { + EXPECT_CALL(mock_manager_, + HandleSource(Property( + &StorableSource::impression_origin, + url::Origin::Create(GURL("https://www.example.com"))))); + contents()->NavigateAndCommit(GURL("https://www.example.com")); // Create a subframe and use it as a target for the impression registration @@ -719,14 +728,14 @@ // triggered. base::RunLoop().RunUntilIdle(); EXPECT_FALSE(bad_message_observer.got_bad_message()); - - EXPECT_THAT(test_manager_.handled_sources(), - ElementsAre(Property( - &StorableSource::impression_origin, - url::Origin::Create(GURL("https://www.example.com"))))); } TEST_F(AttributionHostTest, ValidImpression_NoBadMessage) { + EXPECT_CALL(mock_manager_, + HandleSource(AllOf(Property(&StorableSource::source_type, + StorableSource::SourceType::kEvent), + Property(&StorableSource::priority, 10)))); + // Create a page with a secure origin. contents()->NavigateAndCommit(GURL("https://www.example.com")); SetCurrentTargetFrameForTesting(main_rfh()); @@ -742,10 +751,6 @@ // triggered. base::RunLoop().RunUntilIdle(); EXPECT_FALSE(bad_message_observer.got_bad_message()); - EXPECT_THAT(test_manager_.handled_sources(), - ElementsAre(AllOf(Property(&StorableSource::source_type, - StorableSource::SourceType::kEvent), - Property(&StorableSource::priority, 10)))); } TEST_F(AttributionHostTest, RegisterImpression_RecordsAllowedMetric) { @@ -813,6 +818,17 @@ // navigation begins but before it's committed. Currently only used on Android // but should work cross-platform. TEST_F(AttributionHostTest, AndroidConversion_DuringNavigation) { + Checkpoint checkpoint; + { + InSequence seq; + + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + EXPECT_CALL(checkpoint, Call(1)); + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + EXPECT_CALL(checkpoint, Call(2)); + EXPECT_CALL(mock_manager_, HandleSource); + } + std::string origin( #if defined(OS_ANDROID) "android-app:com.any.app"); @@ -826,22 +842,31 @@ GURL(kConversionUrl), contents()); navigation->Start(); - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); + checkpoint.Call(1); conversion_host()->ReportAttributionForCurrentNavigation( url::Origin::Create(GURL(origin)), CreateValidImpression()); - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); + checkpoint.Call(2); navigation->Commit(); - - EXPECT_THAT(test_manager_.handled_sources(), SizeIs(1)); } // In pre-loaded CCT navigations, the attribution can arrive after the // navigation completes. Currently only used on Android but should work // cross-platform. TEST_F(AttributionHostTest, AndroidConversion_AfterNavigation) { + Checkpoint checkpoint; + { + InSequence seq; + + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + EXPECT_CALL(checkpoint, Call(1)); + EXPECT_CALL(mock_manager_, HandleSource); + EXPECT_CALL(checkpoint, Call(2)); + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + } + std::string origin( #if defined(OS_ANDROID) "android-app:com.any.app"); @@ -855,21 +880,21 @@ GURL(kConversionUrl), contents()); navigation->Commit(); - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); + checkpoint.Call(1); conversion_host()->ReportAttributionForCurrentNavigation( url::Origin::Create(GURL(origin)), CreateValidImpression()); - EXPECT_THAT(test_manager_.handled_sources(), SizeIs(1)); + checkpoint.Call(2); // Make sure we don't allow repeated attributions for the same navigation. conversion_host()->ReportAttributionForCurrentNavigation( url::Origin::Create(GURL(origin)), CreateValidImpression()); - - EXPECT_THAT(test_manager_.handled_sources(), SizeIs(1)); } TEST_F(AttributionHostTest, AndroidConversion_AfterNavigation_SubDomain) { + EXPECT_CALL(mock_manager_, HandleSource); + std::string origin( #if defined(OS_ANDROID) "android-app:com.any.app"); @@ -885,14 +910,14 @@ conversion_host()->ReportAttributionForCurrentNavigation( url::Origin::Create(GURL(origin)), CreateValidImpression()); - - EXPECT_THAT(test_manager_.handled_sources(), SizeIs(1)); } // In pre-loaded CCT navigations, the attribution can arrive after the // navigation completes, but the destination must match the attribution. TEST_F(AttributionHostTest, AndroidConversion_AfterNavigation_WrongDestination) { + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + std::string origin( #if defined(OS_ANDROID) "android-app:com.any.app"); @@ -909,20 +934,18 @@ conversion_host()->ReportAttributionForCurrentNavigation( url::Origin::Create(GURL(origin)), CreateValidImpression()); - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); - // Navigating to the correct URL after navigation to the wrong one still // shouldn't allow the attribution. auto good_navigation = NavigationSimulatorImpl::CreateBrowserInitiated( GURL(kConversionUrl), contents()); good_navigation->Commit(); - - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); } // Ensure we don't re-use pending Impressions after an aborted commit. Currently // only used on Android but should work cross-platform. TEST_F(AttributionHostTest, AndroidConversion_NavigationAborted) { + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + std::string origin( #if defined(OS_ANDROID) "android-app:com.any.app"); @@ -941,19 +964,17 @@ navigation_abort->AbortCommit(); - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); - auto navigation_commit = NavigationSimulatorImpl::CreateBrowserInitiated( GURL(kConversionUrl), contents()); navigation_commit->Commit(); - - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); } // Ensure we don't re-use pending Impressions after an Error page commit. // Currently only used on Android but should work cross-platform. TEST_F(AttributionHostTest, AndroidConversion_NavigationError) { + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + std::string origin( #if defined(OS_ANDROID) "android-app:com.any.app"); @@ -973,19 +994,17 @@ navigation_error->Fail(net::ERR_UNEXPECTED); navigation_error->CommitErrorPage(); - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); - auto navigation_commit = NavigationSimulatorImpl::CreateBrowserInitiated( GURL(kConversionUrl), contents()); navigation_commit->Commit(); - - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); } // We don't allow attributions before a navigation begins. Currently only used // on Android but should work cross-platform. TEST_F(AttributionHostTest, AndroidConversion_BeforeNavigation) { + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + std::string origin( #if defined(OS_ANDROID) "android-app:com.any.app"); @@ -1002,12 +1021,12 @@ url::Origin::Create(GURL(origin)), CreateValidImpression()); navigation->Commit(); - - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); } // We ignore same-document navigations. TEST_F(AttributionHostTest, AndroidConversion_SameDocument) { + EXPECT_CALL(mock_manager_, HandleSource); + std::string origin( #if defined(OS_ANDROID) "android-app:com.any.app"); @@ -1025,12 +1044,12 @@ conversion_host()->ReportAttributionForCurrentNavigation( url::Origin::Create(GURL(origin)), CreateValidImpression()); - - EXPECT_THAT(test_manager_.handled_sources(), SizeIs(1)); } #if defined(OS_ANDROID) TEST_F(AttributionHostTest, AndroidConversion) { + EXPECT_CALL(mock_manager_, HandleSource); + url::ScopedSchemeRegistryForTests scoped_registry; url::AddStandardScheme(kAndroidAppScheme, url::SCHEME_WITH_HOST); auto navigation = NavigationSimulatorImpl::CreateBrowserInitiated( @@ -1039,19 +1058,17 @@ url::Origin::Create(GURL("android-app:com.any.app"))); navigation->set_impression(CreateValidImpression()); navigation->Commit(); - - EXPECT_THAT(test_manager_.handled_sources(), SizeIs(1)); } TEST_F(AttributionHostTest, AndroidConversion_BadScheme) { + EXPECT_CALL(mock_manager_, HandleSource).Times(0); + auto navigation = NavigationSimulatorImpl::CreateBrowserInitiated( GURL(kConversionUrl), contents()); navigation->set_initiator_origin( url::Origin::Create(GURL("https://com.any.app"))); navigation->set_impression(CreateValidImpression()); navigation->Commit(); - - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); } #endif
diff --git a/content/browser/attribution_reporting/attribution_internals_browsertest.cc b/content/browser/attribution_reporting/attribution_internals_browsertest.cc index 414eed2..af916f8 100644 --- a/content/browser/attribution_reporting/attribution_internals_browsertest.cc +++ b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
@@ -4,6 +4,13 @@ #include "content/browser/attribution_reporting/attribution_internals_ui.h" +#include <stdint.h> + +#include <limits> +#include <utility> +#include <vector> + +#include "base/callback.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "content/browser/attribution_reporting/attribution_manager.h" @@ -43,11 +50,24 @@ const std::u16string kMaxInt64String = u"9223372036854775807"; const std::u16string kMaxUint64String = u"18446744073709551615"; +template <typename T> +auto InvokeCallback(T value) { + return [value = std::move(value)](base::OnceCallback<void(T)> callback) { + std::move(callback).Run(std::move(value)); + }; +} + } // namespace class AttributionInternalsWebUiBrowserTest : public ContentBrowserTest { public: - AttributionInternalsWebUiBrowserTest() = default; + AttributionInternalsWebUiBrowserTest() { + ON_CALL(manager_, GetActiveSourcesForWebUI) + .WillByDefault(InvokeCallback<std::vector<StorableSource>>({})); + + ON_CALL(manager_, GetPendingReportsForWebUI) + .WillByDefault(InvokeCallback<std::vector<AttributionReport>>({})); + } void ClickRefreshButton() { EXPECT_TRUE(ExecJsInWebUI("document.getElementById('refresh').click();")); @@ -93,7 +113,7 @@ // The manager must outlive the `AttributionInternalsHandler` so that the // latter can remove itself as an observer of the former on the latter's // destruction. - TestAttributionManager manager_; + MockAttributionManager manager_; }; IN_PROC_BROWSER_TEST_F(AttributionInternalsWebUiBrowserTest, @@ -115,7 +135,7 @@ OverrideWebUIAttributionManager(); // Create a mutation observer to wait for the content to render to the dom. - // Waiting on calls to TestAttributionManager is not sufficient because the + // Waiting on calls to `MockAttributionManager` is not sufficient because the // results are returned in promises. static constexpr char wait_script[] = R"( let status = document.getElementById("feature-status-content"); @@ -147,7 +167,7 @@ OverrideWebUIAttributionManager(); // Create a mutation observer to wait for the content to render to the dom. - // Waiting on calls to TestAttributionManager is not sufficient because the + // Waiting on calls to `MockAttributionManager` is not sufficient because the // results are returned in promises. static constexpr char wait_script[] = R"( let status = document.getElementById("feature-status-content"); @@ -200,16 +220,17 @@ // are properly handled as `bigint` values in JS and don't run into issues // with `Number.MAX_SAFE_INTEGER`. - manager_.SetActiveSourcesForWebUI( - {SourceBuilder(now) - .SetSourceEventId(std::numeric_limits<uint64_t>::max()) - .SetAttributionLogic(StorableSource::AttributionLogic::kNever) - .Build(), - SourceBuilder(now + base::Hours(1)) - .SetSourceType(StorableSource::SourceType::kEvent) - .SetPriority(std::numeric_limits<int64_t>::max()) - .SetDedupKeys({13, 17}) - .Build()}); + ON_CALL(manager_, GetActiveSourcesForWebUI) + .WillByDefault(InvokeCallback<std::vector<StorableSource>>( + {SourceBuilder(now) + .SetSourceEventId(std::numeric_limits<uint64_t>::max()) + .SetAttributionLogic(StorableSource::AttributionLogic::kNever) + .Build(), + SourceBuilder(now + base::Hours(1)) + .SetSourceType(StorableSource::SourceType::kEvent) + .SetPriority(std::numeric_limits<int64_t>::max()) + .SetDedupKeys({13, 17}) + .Build()})); manager_.NotifySourceDeactivated( DeactivatedSource(SourceBuilder(now + base::Hours(2)).Build(), @@ -264,7 +285,7 @@ OverrideWebUIAttributionManager(); // Create a mutation observer to wait for the content to render to the dom. - // Waiting on calls to TestAttributionManager is not sufficient because the + // Waiting on calls to `MockAttributionManager` is not sufficient because the // results are returned in promises. static constexpr char wait_script[] = R"( let status = document.getElementById("debug-mode-content"); @@ -291,7 +312,7 @@ OverrideWebUIAttributionManager(); // Create a mutation observer to wait for the content to render to the dom. - // Waiting on calls to TestAttributionManager is not sufficient because the + // Waiting on calls to `MockAttributionManager` is not sufficient because the // results are returned in promises. static constexpr char wait_script[] = R"( let status = document.getElementById("debug-mode-content"); @@ -333,15 +354,16 @@ .Build(), SentReport::Status::kFailure, /*http_response_code=*/0)); - manager_.SetReportsForWebUI( - {ReportBuilder( - SourceBuilder(now) - .SetSourceType(StorableSource::SourceType::kEvent) - .SetAttributionLogic(StorableSource::AttributionLogic::kFalsely) - .Build()) - .SetReportTime(now) - .SetPriority(13) - .Build()}); + ON_CALL(manager_, GetPendingReportsForWebUI) + .WillByDefault(InvokeCallback<std::vector<AttributionReport>>( + {ReportBuilder(SourceBuilder(now) + .SetSourceType(StorableSource::SourceType::kEvent) + .SetAttributionLogic( + StorableSource::AttributionLogic::kFalsely) + .Build()) + .SetReportTime(now) + .SetPriority(13) + .Build()})); manager_.NotifyReportDropped(AttributionStorage::CreateReportResult( CreateReportStatus::kPriorityTooLow, ReportBuilder(SourceBuilder(now).Build()) @@ -466,11 +488,18 @@ .SetReportTime(now) .SetPriority(7) .Build(); - manager_.SetReportsForWebUI({report}); + EXPECT_CALL(manager_, GetPendingReportsForWebUI) + .WillOnce(InvokeCallback<std::vector<AttributionReport>>({report})); + report.report_time += base::Hours(1); manager_.NotifyReportSent(SentReport(report, SentReport::Status::kSent, /*http_response_code=*/200)); + EXPECT_CALL(manager_, ClearData) + .WillOnce([](base::Time delete_begin, base::Time delete_end, + base::RepeatingCallback<bool(const url::Origin&)> filter, + base::OnceClosure done) { std::move(done).Run(); }); + // Verify both rows get rendered. static constexpr char wait_script[] = R"( let table = document.querySelector("#report-table-wrapper tbody"); @@ -499,17 +528,20 @@ EXPECT_EQ(kDeleteTitle, delete_title_watcher.WaitAndGetTitle()); } -// TODO(johnidel): Use a real AttributionManager here and verify that the -// reports are actually sent. IN_PROC_BROWSER_TEST_F(AttributionInternalsWebUiBrowserTest, WebUISendReports_ReportsRemoved) { EXPECT_TRUE(NavigateToURL(shell(), GURL(kAttributionInternalsUrl))); - AttributionReport report = - ReportBuilder(SourceBuilder(base::Time::Now()).Build()) - .SetPriority(7) - .Build(); - manager_.SetReportsForWebUI({report}); + EXPECT_CALL(manager_, GetPendingReportsForWebUI) + .WillOnce(InvokeCallback<std::vector<AttributionReport>>( + {ReportBuilder(SourceBuilder(base::Time::Now()).Build()) + .SetPriority(7) + .Build()})) + .WillOnce(InvokeCallback<std::vector<AttributionReport>>({})); + + EXPECT_CALL(manager_, SendReportsForWebUI) + .WillOnce([](base::OnceClosure done) { std::move(done).Run(); }); + OverrideWebUIAttributionManager(); static constexpr char wait_script[] = R"(
diff --git a/content/browser/attribution_reporting/attribution_reporter_android_unittest.cc b/content/browser/attribution_reporting/attribution_reporter_android_unittest.cc index a5c3e637..d376ece 100644 --- a/content/browser/attribution_reporting/attribution_reporter_android_unittest.cc +++ b/content/browser/attribution_reporting/attribution_reporter_android_unittest.cc
@@ -23,8 +23,6 @@ using testing::_; using testing::AllOf; -using testing::ElementsAre; -using testing::IsEmpty; using testing::IsNull; using testing::Pointee; using testing::Property; @@ -45,7 +43,7 @@ } protected: - TestAttributionManager test_manager_; + MockAttributionManager mock_manager_; private: url::ScopedSchemeRegistryForTests scoped_registry_; @@ -53,30 +51,31 @@ TEST_F(AttributionReporterTest, ValidImpression_Allowed) { base::Time time = base::Time::Now() - base::Hours(1); - attribution_reporter_android::ReportAppImpression( - test_manager_, nullptr, kPackageName, kEventId, kConversionUrl, - kReportToUrl, 56789, time); - EXPECT_THAT( - test_manager_.handled_sources(), - ElementsAre(AllOf(Property(&StorableSource::impression_origin, - OriginFromAndroidPackageName(kPackageName)), - Property(&StorableSource::source_type, - StorableSource::SourceType::kEvent), - Property(&StorableSource::impression_time, time)))); + EXPECT_CALL( + mock_manager_, + HandleSource(AllOf(Property(&StorableSource::impression_origin, + OriginFromAndroidPackageName(kPackageName)), + Property(&StorableSource::source_type, + StorableSource::SourceType::kEvent), + Property(&StorableSource::impression_time, time)))); + + attribution_reporter_android::ReportAppImpression( + mock_manager_, nullptr, kPackageName, kEventId, kConversionUrl, + kReportToUrl, 56789, time); } TEST_F(AttributionReporterTest, ValidImpression_Allowed_NoOptionals) { - attribution_reporter_android::ReportAppImpression( - test_manager_, nullptr, kPackageName, kEventId, kConversionUrl, "", 0, - base::Time::Now()); + EXPECT_CALL( + mock_manager_, + HandleSource(AllOf(Property(&StorableSource::impression_origin, + OriginFromAndroidPackageName(kPackageName)), + Property(&StorableSource::source_type, + StorableSource::SourceType::kEvent)))); - EXPECT_THAT( - test_manager_.handled_sources(), - ElementsAre(AllOf(Property(&StorableSource::impression_origin, - OriginFromAndroidPackageName(kPackageName)), - Property(&StorableSource::source_type, - StorableSource::SourceType::kEvent)))); + attribution_reporter_android::ReportAppImpression( + mock_manager_, nullptr, kPackageName, kEventId, kConversionUrl, "", 0, + base::Time::Now()); } TEST_F(AttributionReporterTest, ValidImpression_Disallowed) { @@ -89,19 +88,19 @@ .WillOnce(Return(false)); ScopedContentBrowserClientSetting setting(&browser_client); - attribution_reporter_android::ReportAppImpression( - test_manager_, nullptr, kPackageName, kEventId, kConversionUrl, - kReportToUrl, 56789, base::Time::Now()); + EXPECT_CALL(mock_manager_, HandleSource).Times(0); - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); + attribution_reporter_android::ReportAppImpression( + mock_manager_, nullptr, kPackageName, kEventId, kConversionUrl, + kReportToUrl, 56789, base::Time::Now()); } TEST_F(AttributionReporterTest, InvalidImpression) { - attribution_reporter_android::ReportAppImpression( - test_manager_, nullptr, kPackageName, kEventId, kInvalidUrl, kReportToUrl, - 56789, base::Time::Now()); + EXPECT_CALL(mock_manager_, HandleSource).Times(0); - EXPECT_THAT(test_manager_.handled_sources(), IsEmpty()); + attribution_reporter_android::ReportAppImpression( + mock_manager_, nullptr, kPackageName, kEventId, kInvalidUrl, kReportToUrl, + 56789, base::Time::Now()); } } // namespace
diff --git a/content/browser/attribution_reporting/attribution_test_utils.cc b/content/browser/attribution_reporting/attribution_test_utils.cc index 4d72709..3fa1769 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.cc +++ b/content/browser/attribution_reporting/attribution_test_utils.cc
@@ -113,97 +113,49 @@ return manager_; } -TestAttributionManager::TestAttributionManager() = default; +MockAttributionManager::MockAttributionManager() = default; -TestAttributionManager::~TestAttributionManager() = default; +MockAttributionManager::~MockAttributionManager() = default; -void TestAttributionManager::AddObserver(Observer* observer) { +void MockAttributionManager::AddObserver(Observer* observer) { observers_.AddObserver(observer); } -void TestAttributionManager::RemoveObserver(Observer* observer) { +void MockAttributionManager::RemoveObserver(Observer* observer) { observers_.RemoveObserver(observer); } -void TestAttributionManager::HandleSource(StorableSource source) { - handled_sources_.push_back(std::move(source)); -} - -void TestAttributionManager::HandleTrigger(StorableTrigger trigger) { - handled_triggers_.push_back(std::move(trigger)); -} - -void TestAttributionManager::GetActiveSourcesForWebUI( - base::OnceCallback<void(std::vector<StorableSource>)> callback) { - std::move(callback).Run(sources_); -} - -void TestAttributionManager::GetPendingReportsForWebUI( - base::OnceCallback<void(std::vector<AttributionReport>)> callback) { - std::move(callback).Run(reports_); -} - -void TestAttributionManager::SendReportsForWebUI(base::OnceClosure done) { - reports_.clear(); - std::move(done).Run(); -} - -const AttributionPolicy& TestAttributionManager::GetAttributionPolicy() const { +const AttributionPolicy& MockAttributionManager::GetAttributionPolicy() const { return policy_; } -void TestAttributionManager::ClearData( - base::Time delete_begin, - base::Time delete_end, - base::RepeatingCallback<bool(const url::Origin&)> filter, - base::OnceClosure done) { - sources_.clear(); - reports_.clear(); - std::move(done).Run(); -} - -void TestAttributionManager::SetActiveSourcesForWebUI( - std::vector<StorableSource> sources) { - sources_ = std::move(sources); -} - -void TestAttributionManager::SetReportsForWebUI( - std::vector<AttributionReport> reports) { - reports_ = std::move(reports); -} - -void TestAttributionManager::NotifySourcesChanged() { +void MockAttributionManager::NotifySourcesChanged() { for (Observer& observer : observers_) observer.OnSourcesChanged(); } -void TestAttributionManager::NotifyReportsChanged() { +void MockAttributionManager::NotifyReportsChanged() { for (Observer& observer : observers_) observer.OnReportsChanged(); } -void TestAttributionManager::NotifySourceDeactivated( +void MockAttributionManager::NotifySourceDeactivated( const DeactivatedSource& source) { for (Observer& observer : observers_) observer.OnSourceDeactivated(source); } -void TestAttributionManager::NotifyReportSent(const SentReport& info) { +void MockAttributionManager::NotifyReportSent(const SentReport& info) { for (Observer& observer : observers_) observer.OnReportSent(info); } -void TestAttributionManager::NotifyReportDropped( +void MockAttributionManager::NotifyReportDropped( const AttributionStorage::CreateReportResult& result) { for (Observer& observer : observers_) observer.OnReportDropped(result); } -void TestAttributionManager::Reset() { - handled_sources_.clear(); - handled_triggers_.clear(); -} - // Builds an impression with default values. This is done as a builder because // all values needed to be provided at construction time. SourceBuilder::SourceBuilder(base::Time time)
diff --git a/content/browser/attribution_reporting/attribution_test_utils.h b/content/browser/attribution_reporting/attribution_test_utils.h index 644e4a4..c5bc8b59 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.h +++ b/content/browser/attribution_reporting/attribution_test_utils.h
@@ -157,32 +157,40 @@ raw_ptr<AttributionManager> manager_ = nullptr; }; -// Test AttributionManager which can be injected into tests to monitor calls to -// a AttributionManager instance. -class TestAttributionManager : public AttributionManager { +class MockAttributionManager : public AttributionManager { public: - TestAttributionManager(); - ~TestAttributionManager() override; + MockAttributionManager(); + ~MockAttributionManager() override; // AttributionManager: + MOCK_METHOD(void, HandleSource, (StorableSource source), (override)); + + MOCK_METHOD(void, HandleTrigger, (StorableTrigger trigger), (override)); + + MOCK_METHOD(void, + GetActiveSourcesForWebUI, + (base::OnceCallback<void(std::vector<StorableSource>)> callback), + (override)); + + MOCK_METHOD( + void, + GetPendingReportsForWebUI, + (base::OnceCallback<void(std::vector<AttributionReport>)> callback), + (override)); + + MOCK_METHOD(void, SendReportsForWebUI, (base::OnceClosure done), (override)); + + MOCK_METHOD(void, + ClearData, + (base::Time delete_begin, + base::Time delete_end, + base::RepeatingCallback<bool(const url::Origin&)> filter, + base::OnceClosure done), + (override)); + void AddObserver(Observer* observer) override; void RemoveObserver(Observer* observer) override; - void HandleSource(StorableSource source) override; - void HandleTrigger(StorableTrigger trigger) override; - void GetActiveSourcesForWebUI( - base::OnceCallback<void(std::vector<StorableSource>)> callback) override; - void GetPendingReportsForWebUI( - base::OnceCallback<void(std::vector<AttributionReport>)> callback) - override; - void SendReportsForWebUI(base::OnceClosure done) override; const AttributionPolicy& GetAttributionPolicy() const override; - void ClearData(base::Time delete_begin, - base::Time delete_end, - base::RepeatingCallback<bool(const url::Origin&)> filter, - base::OnceClosure done) override; - - void SetActiveSourcesForWebUI(std::vector<StorableSource> sources); - void SetReportsForWebUI(std::vector<AttributionReport> reports); void NotifySourcesChanged(); void NotifyReportsChanged(); @@ -192,28 +200,8 @@ void NotifyReportDropped( const AttributionStorage::CreateReportResult& result); - // Resets all counters on this. - void Reset(); - - const std::vector<StorableSource>& handled_sources() const - WARN_UNUSED_RESULT { - return handled_sources_; - } - - const std::vector<StorableTrigger>& handled_triggers() const - WARN_UNUSED_RESULT { - return handled_triggers_; - } - private: AttributionPolicy policy_; - - std::vector<StorableSource> handled_sources_; - std::vector<StorableTrigger> handled_triggers_; - - std::vector<StorableSource> sources_; - std::vector<AttributionReport> reports_; - base::ObserverList<Observer, /*check_empty=*/true> observers_; };
diff --git a/content/browser/back_forward_cache_features_browsertest.cc b/content/browser/back_forward_cache_features_browsertest.cc index ddfa991..db6c779 100644 --- a/content/browser/back_forward_cache_features_browsertest.cc +++ b/content/browser/back_forward_cache_features_browsertest.cc
@@ -310,9 +310,8 @@ // Tests the case when the page starts fetching in a dedicated worker, goes to // BFcache, and then a redirection happens. The cached page should evicted in // this case. -// TODO(crbug.com/1275477): Test is flaky. IN_PROC_BROWSER_TEST_F(BackForwardCacheWithDedicatedWorkerBrowserTest, - DISABLED_FetchRedirectedWhileStoring) { + FetchRedirectedWhileStoring) { CreateHttpsServer(); net::test_server::ControllableHttpResponse fetch1_response(https_server(), @@ -345,7 +344,10 @@ fetch1_response.WaitForRequest(); // Navigate to B. + PageLifecycleStateManagerTestDelegate delegate( + rfh_a->render_view_host()->GetPageLifecycleStateManager()); EXPECT_TRUE(NavigateToURL(shell(), url_b)); + delegate.WaitForInBackForwardCacheAck(); // Page A is initially stored in the back-forward cache. EXPECT_TRUE(rfh_a->IsInBackForwardCache()); @@ -378,9 +380,8 @@ // Tests the case when the page starts fetching in a nested dedicated worker, // goes to BFcache, and then a redirection happens. The cached page should // evicted in this case. -// TODO(crbug.com/1275477): Test is flaky. IN_PROC_BROWSER_TEST_F(BackForwardCacheWithDedicatedWorkerBrowserTest, - DISABLED_FetchRedirectedWhileStoring_Nested) { + FetchRedirectedWhileStoring_Nested) { CreateHttpsServer(); net::test_server::ControllableHttpResponse fetch1_response(https_server(), @@ -421,7 +422,10 @@ fetch1_response.WaitForRequest(); // Navigate to B. + PageLifecycleStateManagerTestDelegate delegate( + rfh_a->render_view_host()->GetPageLifecycleStateManager()); EXPECT_TRUE(NavigateToURL(shell(), url_b)); + delegate.WaitForInBackForwardCacheAck(); // Page A is initially stored in the back-forward cache. EXPECT_TRUE(rfh_a->IsInBackForwardCache()); @@ -687,6 +691,129 @@ {}, {}, {}, {}, FROM_HERE); } +// Tests the case when fetch started in a dedicated worker, but the response +// never ends after the page is frozen. This should result in an eviction due to +// timeout. +IN_PROC_BROWSER_TEST_F(BackForwardCacheWithDedicatedWorkerBrowserTest, + ImageStillLoading_ResponseStartedWhileFrozen_Timeout) { + CreateHttpsServer(); + + net::test_server::ControllableHttpResponse image_response(https_server(), + "/image.png"); + ASSERT_TRUE(https_server()->Start()); + + GURL url_a(https_server()->GetURL("a.test", "/title1.html")); + GURL url_b(https_server()->GetURL("b.test", "/title1.html")); + + // Navigate to A. + EXPECT_TRUE(NavigateToURL(shell(), url_a)); + RenderFrameHostImplWrapper rfh_a(current_frame_host()); + + // Call fetch in a dedicated worker before navigating away. + std::string worker_script = + JsReplace(R"( + fetch($1); + )", + https_server()->GetURL("a.test", "/image.png")); + EXPECT_TRUE(ExecJs(rfh_a.get(), JsReplace(R"( + const blob = new Blob([$1]); + const blobURL = URL.createObjectURL(blob); + const worker = new Worker(blobURL); + )", + worker_script))); + + // Wait for the image request, but don't send anything yet. + image_response.WaitForRequest(); + + // Navigate away. + PageLifecycleStateManagerTestDelegate delegate( + rfh_a->render_view_host()->GetPageLifecycleStateManager()); + EXPECT_TRUE(NavigateToURL(shell(), url_b)); + delegate.WaitForInBackForwardCacheAck(); + // The page was still loading when we navigated away, but it's still eligible + // for back-forward cache. + EXPECT_TRUE(rfh_a->IsInBackForwardCache()); + + RenderFrameDeletedObserver delete_observer(rfh_a.get()); + // Start sending the image response while in the back-forward cache, but never + // finish the request. Eventually the page will get deleted due to network + // request timeout. + image_response.Send(net::HTTP_OK, "image/png"); + delete_observer.WaitUntilDeleted(); + + // 3) Go back to the first page. We should not restore the page from the + // back-forward cache. + ASSERT_TRUE(HistoryGoBack(web_contents())); + ExpectNotRestored( + {BackForwardCacheMetrics::NotRestoredReason::kNetworkRequestTimeout}, {}, + {}, {}, {}, FROM_HERE); +} + +// Tests the case when fetch started in a nested dedicated worker, but the +// response never ends after the page is frozen. This should result in an +// eviction due to timeout. +IN_PROC_BROWSER_TEST_F( + BackForwardCacheWithDedicatedWorkerBrowserTest, + ImageStillLoading_ResponseStartedWhileFrozen_Timeout_Nested) { + CreateHttpsServer(); + + net::test_server::ControllableHttpResponse image_response(https_server(), + "/image.png"); + ASSERT_TRUE(https_server()->Start()); + + GURL url_a(https_server()->GetURL("a.test", "/title1.html")); + GURL url_b(https_server()->GetURL("b.test", "/title1.html")); + + // Navigate to A. + EXPECT_TRUE(NavigateToURL(shell(), url_a)); + RenderFrameHostImplWrapper rfh_a(current_frame_host()); + + // Call fetch in a dedicated worker before navigating away. + std::string child_worker_script = + JsReplace(R"( + fetch($1); + )", + https_server()->GetURL("a.test", "/image.png")); + std::string parent_worker_script = JsReplace(R"( + const blob = new Blob([$1]); + const blobURL = URL.createObjectURL(blob); + const worker = new Worker(blobURL); + )", + child_worker_script); + EXPECT_TRUE(ExecJs(rfh_a.get(), JsReplace(R"( + const blob = new Blob([$1]); + const blobURL = URL.createObjectURL(blob); + const worker = new Worker(blobURL); + )", + parent_worker_script))); + + // Wait for the image request, but don't send anything yet. + image_response.WaitForRequest(); + + // Navigate away. + PageLifecycleStateManagerTestDelegate delegate( + rfh_a->render_view_host()->GetPageLifecycleStateManager()); + EXPECT_TRUE(NavigateToURL(shell(), url_b)); + delegate.WaitForInBackForwardCacheAck(); + // The page was still loading when we navigated away, but it's still eligible + // for back-forward cache. + EXPECT_TRUE(rfh_a->IsInBackForwardCache()); + + RenderFrameDeletedObserver delete_observer(rfh_a.get()); + // Start sending the image response while in the back-forward cache, but never + // finish the request. Eventually the page will get deleted due to network + // request timeout. + image_response.Send(net::HTTP_OK, "image/png"); + delete_observer.WaitUntilDeleted(); + + // 3) Go back to the first page. We should not restore the page from the + // back-forward cache. + ASSERT_TRUE(HistoryGoBack(web_contents())); + ExpectNotRestored( + {BackForwardCacheMetrics::NotRestoredReason::kNetworkRequestTimeout}, {}, + {}, {}, {}, FROM_HERE); +} + // TODO(https://crbug.com/154571): Shared workers are not available on Android. #if defined(OS_ANDROID) #define MAYBE_PageWithSharedWorkerNotCached \
diff --git a/content/browser/back_forward_cache_network_request_browsertest.cc b/content/browser/back_forward_cache_network_request_browsertest.cc index a43e949..8f56d445 100644 --- a/content/browser/back_forward_cache_network_request_browsertest.cc +++ b/content/browser/back_forward_cache_network_request_browsertest.cc
@@ -739,7 +739,6 @@ // finish the request. Eventually the page will get deleted due to network // request timeout. image_response.Send(net::HTTP_OK, "image/png"); - std::string body(kMaxBufferedBytesPerRequest + 1, '*'); delete_observer.WaitUntilDeleted(); // 3) Go back to the first page. We should not restore the page from the
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc index 7b6564df..f3d4227 100644 --- a/content/browser/browser_interface_binders.cc +++ b/content/browser/browser_interface_binders.cc
@@ -171,7 +171,8 @@ #include "content/browser/net/reporting_service_proxy.h" #endif -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && \ + (BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)) #include "content/public/browser/service_process_host.h" #else #include "content/browser/gpu/gpu_process_host.h" @@ -196,7 +197,8 @@ mojo::Remote<shape_detection::mojom::ShapeDetectionService>> remote; if (!*remote) { -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && \ + (BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)) ServiceProcessHost::Launch<shape_detection::mojom::ShapeDetectionService>( remote->BindNewPipeAndPassReceiver(), ServiceProcessHost::Options()
diff --git a/content/browser/cache_storage/OWNERS b/content/browser/cache_storage/OWNERS index 056bbaf..8025c05 100644 --- a/content/browser/cache_storage/OWNERS +++ b/content/browser/cache_storage/OWNERS
@@ -2,6 +2,7 @@ wanderview@chromium.org # Secondary +ayui@chromium.org jkarlin@chromium.org jsbell@chromium.org mek@chromium.org
diff --git a/content/browser/cross_origin_opener_policy_browsertest.cc b/content/browser/cross_origin_opener_policy_browsertest.cc index f9c2c4e..d9e73ca5 100644 --- a/content/browser/cross_origin_opener_policy_browsertest.cc +++ b/content/browser/cross_origin_opener_policy_browsertest.cc
@@ -63,6 +63,16 @@ return coop; } +// This is the value of COOP when navigating to a page without COOP set: +// - value is kUnsafeNone +// - soap_by_default_value is kSameOriginPlusCoep +network::CrossOriginOpenerPolicy CoopUnsafeNoneWithSoapByDefault() { + network::CrossOriginOpenerPolicy coop; + coop.soap_by_default_value = + network::mojom::CrossOriginOpenerPolicyValue::kSameOriginAllowPopups; + return coop; +} + network::CrossOriginOpenerPolicy CoopUnsafeNone() { network::CrossOriginOpenerPolicy coop; // Using the default value. @@ -224,14 +234,14 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, NewPopupCOOP_InheritsSameOrigin) { GURL starting_page(https_server()->GetURL( - "a.com", "/set-header?cross-origin-opener-policy: same-origin")); + "a.test", "/set-header?cross-origin-opener-policy: same-origin")); EXPECT_TRUE(NavigateToURL(shell(), starting_page)); RenderFrameHostImpl* main_rfh = current_frame_host(); // Create same origin child frame. ASSERT_TRUE(ExecJs(main_rfh, R"( - let frame = document.createElement('iframe'); + const frame = document.createElement('iframe'); frame.src = '/empty.html'; document.body.appendChild(frame); )")); @@ -243,9 +253,7 @@ RenderFrameHostImpl* popup_rfh = static_cast<WebContentsImpl*>(shell_observer.GetShell()->web_contents()) - ->GetPrimaryFrameTree() - .root() - ->current_frame_host(); + ->GetMainFrame(); EXPECT_EQ(main_rfh->cross_origin_opener_policy(), CoopSameOrigin()); EXPECT_EQ(popup_rfh->cross_origin_opener_policy(), CoopSameOrigin()); @@ -254,7 +262,7 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, NewPopupCOOP_InheritsSameOriginAllowPopups) { GURL starting_page(https_server()->GetURL( - "a.com", + "a.test", "/set-header?cross-origin-opener-policy: same-origin-allow-popups")); EXPECT_TRUE(NavigateToURL(shell(), starting_page)); @@ -262,7 +270,7 @@ // Create same origin child frame. ASSERT_TRUE(ExecJs(current_frame_host(), R"( - let frame = document.createElement('iframe'); + const frame = document.createElement('iframe'); frame.src = '/empty.html'; document.body.appendChild(frame); )")); @@ -274,9 +282,7 @@ RenderFrameHostImpl* popup_rfh = static_cast<WebContentsImpl*>(shell_observer.GetShell()->web_contents()) - ->GetPrimaryFrameTree() - .root() - ->current_frame_host(); + ->GetMainFrame(); EXPECT_EQ(main_rfh->cross_origin_opener_policy(), CoopSameOriginAllowPopups()); @@ -287,8 +293,8 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, NewPopupCOOP_CrossOriginDoesNotInherit) { GURL starting_page(https_server()->GetURL( - "a.com", "/set-header?cross-origin-opener-policy: same-origin")); - GURL url_b(https_server()->GetURL("b.com", "/empty.html")); + "a.test", "/set-header?cross-origin-opener-policy: same-origin")); + GURL url_b(https_server()->GetURL("b.test", "/empty.html")); EXPECT_TRUE(NavigateToURL(shell(), starting_page)); @@ -296,7 +302,7 @@ // Create cross origin child frame. ASSERT_TRUE(ExecJs(main_rfh, JsReplace(R"( - let frame = document.createElement('iframe'); + const frame = document.createElement('iframe'); frame.src = $1; document.body.appendChild(frame); )", @@ -309,9 +315,7 @@ RenderFrameHostImpl* popup_rfh = static_cast<WebContentsImpl*>(shell_observer.GetShell()->web_contents()) - ->GetPrimaryFrameTree() - .root() - ->current_frame_host(); + ->GetMainFrame(); EXPECT_EQ(main_rfh->cross_origin_opener_policy(), CoopSameOrigin()); EXPECT_EQ(popup_rfh->cross_origin_opener_policy(), CoopUnsafeNone()); @@ -325,8 +329,8 @@ "cross-origin-opener-policy: same-origin&cross-origin-embedder-policy: " "require-corp"}) { GURL starting_page( - https_server()->GetURL("a.com", std::string("/set-header?") + header)); - GURL url_b(https_server()->GetURL("b.com", "/empty.html")); + https_server()->GetURL("a.test", std::string("/set-header?") + header)); + GURL url_b(https_server()->GetURL("b.test", "/empty.html")); EXPECT_TRUE(NavigateToURL(shell(), starting_page)); @@ -334,7 +338,7 @@ // Create cross origin child frame. ASSERT_TRUE(ExecJs(main_rfh, JsReplace(R"( - let frame = document.createElement('iframe'); + const frame = document.createElement('iframe'); frame.src = $1; document.body.appendChild(frame); )", @@ -349,9 +353,7 @@ Shell* new_shell = new_shell_observer.GetShell(); RenderFrameHostImpl* popup_rfh = static_cast<WebContentsImpl*>(new_shell->web_contents()) - ->GetPrimaryFrameTree() - .root() - ->current_frame_host(); + ->GetMainFrame(); scoped_refptr<SiteInstance> main_rfh_site_instance( main_rfh->GetSiteInstance()); @@ -375,11 +377,195 @@ } IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, + BlobInheritsCreatorSameOrigin) { + GURL starting_page(https_server()->GetURL( + "a.test", "/set-header?cross-origin-opener-policy: same-origin")); + EXPECT_TRUE(NavigateToURL(shell(), starting_page)); + + // Create and open blob. + ShellAddedObserver shell_observer; + ASSERT_TRUE(ExecJs(current_frame_host(), R"( + const blob = new Blob(['foo'], {type : 'text/html'}); + const url = URL.createObjectURL(blob); + window.open(url); + )")); + EXPECT_TRUE(WaitForLoadStop(shell_observer.GetShell()->web_contents())); + RenderFrameHostImpl* popup_rfh = + static_cast<WebContentsImpl*>(shell_observer.GetShell()->web_contents()) + ->GetMainFrame(); + + // COOP and COEP inherited from Blob creator + // TODO(https://crbug.com/1059300) COOP should be inherited from creator and + // be same-origin. + EXPECT_EQ(popup_rfh->cross_origin_opener_policy(), + CoopUnsafeNoneWithSoapByDefault()); + EXPECT_EQ(popup_rfh->cross_origin_embedder_policy().value, + network::mojom::CrossOriginEmbedderPolicyValue::kNone); +} + +IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, + BlobInheritsInitiatorSameOriginPlusCoep) { + GURL starting_page( + https_server()->GetURL("a.test", + "/set-header" + "?cross-origin-opener-policy: same-origin" + "&cross-origin-embedder-policy: require-corp")); + EXPECT_TRUE(NavigateToURL(shell(), starting_page)); + + // Create and open blob. + ShellAddedObserver shell_observer; + ASSERT_TRUE(ExecJs(current_frame_host(), R"( + const blob = new Blob(['foo'], {type : 'text/html'}); + const url = URL.createObjectURL(blob); + window.open(url); + )")); + EXPECT_TRUE(WaitForLoadStop(shell_observer.GetShell()->web_contents())); + RenderFrameHostImpl* popup_rfh = + static_cast<WebContentsImpl*>(shell_observer.GetShell()->web_contents()) + ->GetMainFrame(); + + // COOP and COEP inherited from Blob creator + // TODO(https://crbug.com/1059300) COOP should be inherited from creator and + // be same-origin-plus-coep. + EXPECT_EQ(popup_rfh->cross_origin_opener_policy(), + CoopUnsafeNoneWithSoapByDefault()); + + // TODO(https://crbug.com/1151223) COEP should be inherited from creator and + // be require-corp + EXPECT_EQ(popup_rfh->cross_origin_embedder_policy().value, + network::mojom::CrossOriginEmbedderPolicyValue::kNone); +} + +IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, + BlobInheritsCreatorSameOriginAllowPopups) { + GURL starting_page(https_server()->GetURL( + "a.test", + "/set-header" + "?cross-origin-opener-policy: same-origin-allow-popups" + "&cross-origin-embedder-policy: require-corp")); + EXPECT_TRUE(NavigateToURL(shell(), starting_page)); + + // Create and open blob. + ShellAddedObserver shell_observer; + ASSERT_TRUE(ExecJs(current_frame_host(), R"( + const blob = new Blob(['foo'], {type : 'text/html'}); + const url = URL.createObjectURL(blob); + window.open(url); + )")); + EXPECT_TRUE(WaitForLoadStop(shell_observer.GetShell()->web_contents())); + RenderFrameHostImpl* popup_rfh = + static_cast<WebContentsImpl*>(shell_observer.GetShell()->web_contents()) + ->GetMainFrame(); + + // COOP and COEP inherited from Blob creator + // TODO(https://crbug.com/1059300) COOP should be inherited from creator and + // be same-origin-allow-popups. + EXPECT_EQ(popup_rfh->cross_origin_opener_policy(), + CoopUnsafeNoneWithSoapByDefault()); + + // TODO(https://crbug.com/1151223) COEP should be inherited from creator and + // be require-corp + EXPECT_EQ(popup_rfh->cross_origin_embedder_policy().value, + network::mojom::CrossOriginEmbedderPolicyValue::kNone); +} + +IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, + BlobInheritsCreatorTopFrameSameOriginCreatorIframeCOEP) { + GURL starting_page(https_server()->GetURL( + "a.test", "/set-header?cross-origin-opener-policy: same-origin")); + GURL iframe_with_coep_url(https_server()->GetURL( + "a.test", "/set-header?cross-origin-embedder-policy: require-corp")); + + EXPECT_TRUE(NavigateToURL(shell(), starting_page)); + + // Create same origin child frame with COEP + ASSERT_TRUE(ExecJs(current_frame_host(), JsReplace(R"( + const frame = document.createElement('iframe'); + frame.src = $1; + document.body.appendChild(frame); + )", + iframe_with_coep_url))); + EXPECT_TRUE(WaitForLoadStop(web_contents())); + + RenderFrameHostImpl* child_rfh = + current_frame_host()->child_at(0)->current_frame_host(); + + // Create and open blob from iframe. + ShellAddedObserver shell_observer; + ASSERT_TRUE(ExecJs(child_rfh, R"( + const blob = new Blob(['foo'], {type : 'text/html'}); + const url = URL.createObjectURL(blob); + window.open(url); + )")); + EXPECT_TRUE(WaitForLoadStop(shell_observer.GetShell()->web_contents())); + RenderFrameHostImpl* popup_rfh = + static_cast<WebContentsImpl*>(shell_observer.GetShell()->web_contents()) + ->GetMainFrame(); + + // COOP is inherited from creator's top level document, COEP is inherited from + // creator. + // TODO(https://crbug.com/1059300) COOP should be inherited from creator and + // be same-origin. + EXPECT_EQ(popup_rfh->cross_origin_opener_policy(), + CoopUnsafeNoneWithSoapByDefault()); + + // TODO(https://crbug.com/1151223) COEP should be inherited from creator and + // be require-corp + EXPECT_EQ(popup_rfh->cross_origin_embedder_policy().value, + network::mojom::CrossOriginEmbedderPolicyValue::kNone); +} + +IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, + BlobInheritsCreatorNotInitiator) { + GURL starting_page(https_server()->GetURL( + "a.test", + "/set-header" + "?cross-origin-opener-policy: same-origin-allow-popups")); + EXPECT_TRUE(NavigateToURL(shell(), starting_page)); + + // Create blob url in main page, which will be used later. + // Then open a popup on a document that is same-origin without COOP. + ShellAddedObserver first_shell_observer; + ASSERT_TRUE(ExecJs(current_frame_host(), R"( + const blob = new Blob(['foo'], {type : 'text/html'}); + window.url = URL.createObjectURL(blob); + window.open("/empty.html"); + )")); + EXPECT_TRUE(WaitForLoadStop(first_shell_observer.GetShell()->web_contents())); + RenderFrameHostImpl* first_popup_rfh = + static_cast<WebContentsImpl*>( + first_shell_observer.GetShell()->web_contents()) + ->GetMainFrame(); + + // Open blob url created in opener. + ShellAddedObserver second_shell_observer; + ASSERT_TRUE(ExecJs(first_popup_rfh, R"( + window.open(opener.url); + )")); + EXPECT_TRUE( + WaitForLoadStop(second_shell_observer.GetShell()->web_contents())); + RenderFrameHostImpl* second_popup_rfh = + static_cast<WebContentsImpl*>( + second_shell_observer.GetShell()->web_contents()) + ->GetMainFrame(); + + // COOP and COEP inherited from Blob creator (initial window) and not the + // initiator (first popup) + // TODO(https://crbug.com/1059300) COOP should be inherited from creator and + // be same-origin-allow-popups. + EXPECT_EQ(second_popup_rfh->cross_origin_opener_policy(), + CoopUnsafeNoneWithSoapByDefault()); + + EXPECT_EQ(second_popup_rfh->cross_origin_embedder_policy().value, + network::mojom::CrossOriginEmbedderPolicyValue::kNone); +} + +IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, NetworkErrorOnSandboxedPopups) { GURL starting_page(https_server()->GetURL( - "a.com", "/cross-origin-opener-policy_sandbox_popup.html")); + "a.test", "/cross-origin-opener-policy_sandbox_popup.html")); GURL openee_url = https_server()->GetURL( - "a.com", "/set-header?Cross-Origin-Opener-Policy: same-origin"); + "a.test", "/set-header?Cross-Origin-Opener-Policy: same-origin"); EXPECT_TRUE(NavigateToURL(shell(), starting_page)); ShellAddedObserver shell_observer; @@ -400,14 +586,14 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, NoNetworkErrorOnSandboxedDocuments) { GURL starting_page(https_server()->GetURL( - "a.com", "/set-header?Content-Security-Policy: sandbox allow-scripts")); + "a.test", "/set-header?Content-Security-Policy: sandbox allow-scripts")); EXPECT_TRUE(NavigateToURL(shell(), starting_page)); EXPECT_NE(current_frame_host()->active_sandbox_flags(), network::mojom::WebSandboxFlags::kNone) << "Document should be sandboxed."; GURL next_page = https_server()->GetURL( - "a.com", "/set-header?Cross-Origin-Opener-Policy: same-origin"); + "a.test", "/set-header?Cross-Origin-Opener-Policy: same-origin"); EXPECT_TRUE(NavigateToURL(shell(), next_page)); EXPECT_EQ( @@ -457,9 +643,9 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, RedirectsParseCoopAndCoepHeaders) { GURL redirect_initial_page(https_server()->GetURL( - "a.com", "/cross-origin-opener-policy_redirect_initial.html")); + "a.test", "/cross-origin-opener-policy_redirect_initial.html")); GURL redirect_final_page(https_server()->GetURL( - "a.com", "/cross-origin-opener-policy_redirect_final.html")); + "a.test", "/cross-origin-opener-policy_redirect_final.html")); CrossOriginPolicyHeadersObserver obs( web_contents(), @@ -475,9 +661,9 @@ WebContentsConsoleObserver console_observer(shell()->web_contents()); console_observer.SetPattern("*Cross-Origin-Opener-Policy * ignored*"); - GURL non_coop_page(embedded_test_server()->GetURL("a.com", "/title1.html")); + GURL non_coop_page(embedded_test_server()->GetURL("a.test", "/title1.html")); GURL coop_page = embedded_test_server()->GetURL( - "a.com", "/set-header?Cross-Origin-Opener-Policy: same-origin"); + "a.test", "/set-header?Cross-Origin-Opener-Policy: same-origin"); EXPECT_TRUE(NavigateToURL(shell(), non_coop_page)); scoped_refptr<SiteInstance> initial_site_instance( @@ -535,7 +721,7 @@ // Create same origin child frame. ASSERT_TRUE(ExecJs(current_frame_host(), R"( - let frame = document.createElement('iframe'); + const frame = document.createElement('iframe'); frame.src = '/empty.html'; document.body.appendChild(frame); )")); @@ -602,12 +788,12 @@ CoopCrossOriginIframeInheritance) { GURL coop_url(embedded_test_server()->GetURL( "/set-header?cross-origin-opener-policy: same-origin-allow-popups")); - GURL url_b(embedded_test_server()->GetURL("b.com", "/empty.html")); + GURL url_b(embedded_test_server()->GetURL("b.test", "/empty.html")); ASSERT_TRUE(NavigateToURL(shell(), coop_url)); // Create child frame. ASSERT_TRUE(ExecJs(current_frame_host(), JsReplace(R"( - let frame = document.createElement('iframe'); + const frame = document.createElement('iframe'); frame.src = $1; document.body.appendChild(frame); )", @@ -673,9 +859,9 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, NonCoopPageCrashIntoCoop) { IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess()); - GURL non_coop_page(https_server()->GetURL("a.com", "/title1.html")); + GURL non_coop_page(https_server()->GetURL("a.test", "/title1.html")); GURL coop_page = https_server()->GetURL( - "a.com", "/set-header?Cross-Origin-Opener-Policy: same-origin"); + "a.test", "/set-header?Cross-Origin-Opener-Policy: same-origin"); // Test a crash before the navigation. { @@ -686,7 +872,7 @@ // Ensure it has a RenderFrameProxyHost for another cross-site page. GURL non_coop_cross_site_page( - https_server()->GetURL("b.com", "/title1.html")); + https_server()->GetURL("b.test", "/title1.html")); OpenPopup(current_frame_host(), non_coop_cross_site_page, ""); EXPECT_EQ(web_contents() ->GetPrimaryFrameTree() @@ -728,7 +914,7 @@ scoped_refptr<SiteInstance> initial_site_instance( current_frame_host()->GetSiteInstance()); GURL non_coop_cross_site_page( - https_server()->GetURL("b.com", "/title1.html")); + https_server()->GetURL("b.test", "/title1.html")); // Ensure it has a RenderFrameProxyHost for another cross-site page. OpenPopup(current_frame_host(), non_coop_cross_site_page, ""); @@ -776,12 +962,12 @@ CoopPageCrashIntoNonCoop) { IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess()); GURL coop_allow_popups_page(https_server()->GetURL( - "a.com", + "a.test", "/set-header?Cross-Origin-Opener-Policy: same-origin-allow-popups")); GURL non_coop_page(https_server()->GetURL( - "a.com", "/set-header?Cross-Origin-Opener-Policy: unsafe-none")); + "a.test", "/set-header?Cross-Origin-Opener-Policy: unsafe-none")); GURL cross_origin_non_coop_page( - https_server()->GetURL("b.com", "/title1.html")); + https_server()->GetURL("b.test", "/title1.html")); // Test a crash before the navigation. { // Navigate to a COOP page. @@ -877,10 +1063,10 @@ CoopPageCrashIntoCoop) { IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess()); GURL coop_allow_popups_page(https_server()->GetURL( - "a.com", + "a.test", "/set-header?Cross-Origin-Opener-Policy: same-origin-allow-popups")); GURL cross_origin_non_coop_page( - https_server()->GetURL("b.com", "/title1.html")); + https_server()->GetURL("b.test", "/title1.html")); // Test a crash before the navigation. { @@ -980,11 +1166,11 @@ BackNavigationCoiToNonCoiAfterCrash) { IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess()); GURL isolated_page( - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); - GURL non_isolated_page(https_server()->GetURL("a.com", "/title1.html")); + GURL non_isolated_page(https_server()->GetURL("a.test", "/title1.html")); // Put a non isolated page in history. EXPECT_TRUE(NavigateToURL(shell(), non_isolated_page)); @@ -1020,9 +1206,9 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, ProxiesAreRemovedWhenCrossingCoopBoundary) { - GURL non_coop_page(https_server()->GetURL("a.com", "/title1.html")); + GURL non_coop_page(https_server()->GetURL("a.test", "/title1.html")); GURL coop_page = https_server()->GetURL( - "a.com", "/set-header?Cross-Origin-Opener-Policy: same-origin"); + "a.test", "/set-header?Cross-Origin-Opener-Policy: same-origin"); RenderFrameHostManager* main_window_rfhm = web_contents()->GetPrimaryFrameTree().root()->render_manager(); @@ -1055,7 +1241,7 @@ ProxiesAreKeptWhenNavigatingFromCoopToCoop) { IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess()); GURL coop_page = https_server()->GetURL( - "a.com", "/set-header?Cross-Origin-Opener-Policy: same-origin"); + "a.test", "/set-header?Cross-Origin-Opener-Policy: same-origin"); // Navigate to a COOP page. EXPECT_TRUE(NavigateToURL(shell(), coop_page)); @@ -1064,14 +1250,15 @@ // Ensure it has a RenderFrameProxyHost for another cross-site page. Shell* popup_shell = OpenPopup(current_frame_host(), coop_page, ""); - GURL cross_site_iframe(https_server()->GetURL("b.com", "/title1.html")); + GURL cross_site_iframe(https_server()->GetURL("b.test", "/title1.html")); TestNavigationManager iframe_navigation(popup_shell->web_contents(), cross_site_iframe); - EXPECT_TRUE(ExecJs(popup_shell->web_contents(), - JsReplace("var iframe = document.createElement('iframe');" - "iframe.src = $1;" - "document.body.appendChild(iframe);", - cross_site_iframe))); + EXPECT_TRUE( + ExecJs(popup_shell->web_contents(), + JsReplace("const iframe = document.createElement('iframe');" + "iframe.src = $1;" + "document.body.appendChild(iframe);", + cross_site_iframe))); iframe_navigation.WaitForNavigationFinished(); EXPECT_EQ(web_contents() ->GetPrimaryFrameTree() @@ -1098,13 +1285,13 @@ RenderProcessHostImpl::SetMaxRendererProcessCount(1); // Navigate to a starting page. - GURL starting_page(https_server()->GetURL("a.com", "/title1.html")); + GURL starting_page(https_server()->GetURL("a.test", "/title1.html")); EXPECT_TRUE(NavigateToURL(shell(), starting_page)); // Open a popup with CrossOriginOpenerPolicy and CrossOriginEmbedderPolicy // set. GURL url_openee = - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"); @@ -1130,7 +1317,7 @@ // Navigate to a starting page with CrossOriginOpenerPolicy and // CrossOriginEmbedderPolicy set. GURL starting_page = - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"); @@ -1152,7 +1339,7 @@ // Navigate to a new page without COOP and COEP. Because of process reuse, it // is placed in the popup process. - GURL final_page(https_server()->GetURL("a.com", "/title1.html")); + GURL final_page(https_server()->GetURL("a.test", "/title1.html")); EXPECT_TRUE(NavigateToURL(shell(), final_page)); EXPECT_EQ(current_frame_host()->GetProcess(), popup_webcontents->GetMainFrame()->GetProcess()); @@ -1160,9 +1347,9 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, SpeculativeRfhsAndCoop) { - GURL non_coop_page(https_server()->GetURL("a.com", "/title1.html")); + GURL non_coop_page(https_server()->GetURL("a.test", "/title1.html")); GURL coop_page = - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"); @@ -1400,12 +1587,12 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, CrossOriginIsolatedWithOpeneeCspSandbox) { GURL opener_url = - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"); GURL openee_url = - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp&" @@ -1423,10 +1610,7 @@ WaitForLoadStop(popup); RenderFrameHostImpl* openee_current_main_document = - static_cast<WebContentsImpl*>(popup) - ->GetPrimaryFrameTree() - .root() - ->current_frame_host(); + static_cast<WebContentsImpl*>(popup)->GetMainFrame(); // Those documents aren't error pages. EXPECT_EQ(opener_current_main_document->GetLastCommittedURL(), opener_url); @@ -1455,7 +1639,7 @@ CrossOriginIsolatedOpeneeOpenerSandbox) { // The URL used by both the openee and the opener. GURL url = https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp&" @@ -1472,10 +1656,7 @@ WaitForLoadStop(popup); RenderFrameHostImpl* openee_current_main_document = - static_cast<WebContentsImpl*>(popup) - ->GetPrimaryFrameTree() - .root() - ->current_frame_host(); + static_cast<WebContentsImpl*>(popup)->GetMainFrame(); // Popups with a sandboxing flag, inherited from their opener, are not // allowed to navigate to a document with a Cross-Origin-Opener-Policy that @@ -1511,28 +1692,28 @@ // non-coop <-> non-coop { // same-origin => keep. - https_server()->GetURL("a.com", "/title1.html"), - https_server()->GetURL("a.com", "/title2.html"), + https_server()->GetURL("a.test", "/title1.html"), + https_server()->GetURL("a.test", "/title2.html"), false, }, { // different-origin => keep. - https_server()->GetURL("a.a.com", "/title1.html"), - https_server()->GetURL("b.a.com", "/title2.html"), + https_server()->GetURL("a.a.test", "/title1.html"), + https_server()->GetURL("b.a.test", "/title2.html"), false, }, { // different-site => keep. - https_server()->GetURL("a.com", "/title1.html"), - https_server()->GetURL("b.com", "/title2.html"), + https_server()->GetURL("a.test", "/title1.html"), + https_server()->GetURL("b.test", "/title2.html"), false, }, // non-coop <-> coop. { // same-origin => change. - https_server()->GetURL("a.com", "/title1.html"), - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/title1.html"), + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1540,8 +1721,8 @@ }, { // different-origin => change. - https_server()->GetURL("a.a.com", "/title1.html"), - https_server()->GetURL("b.a.com", + https_server()->GetURL("a.a.test", "/title1.html"), + https_server()->GetURL("b.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1549,8 +1730,8 @@ }, { // different-site => change. - https_server()->GetURL("a.com", "/title1.html"), - https_server()->GetURL("b.com", + https_server()->GetURL("a.test", "/title1.html"), + https_server()->GetURL("b.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1560,11 +1741,11 @@ // coop <-> coop. { // same-origin => keep. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1572,11 +1753,11 @@ }, { // different-origin => change. - https_server()->GetURL("a.a.com", + https_server()->GetURL("a.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("b.a.com", + https_server()->GetURL("b.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1584,11 +1765,11 @@ }, { // different-site => keep. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("b.com", + https_server()->GetURL("b.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1598,9 +1779,9 @@ // non-coop <-> coop-ro. { // same-origin => change. - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1608,9 +1789,9 @@ }, { // different-origin => change. - https_server()->GetURL("a.a.com", "/title1.html"), + https_server()->GetURL("a.a.test", "/title1.html"), https_server()->GetURL( - "b.a.com", + "b.a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1618,9 +1799,9 @@ }, { // different-site => change. - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), https_server()->GetURL( - "b.com", + "b.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1631,12 +1812,12 @@ { // same-origin => keep. https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1645,12 +1826,12 @@ { // different-origin => change. https_server()->GetURL( - "a.a.com", + "a.a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), https_server()->GetURL( - "b.a.com", + "b.a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1659,12 +1840,12 @@ { // different-site => keep. https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), https_server()->GetURL( - "b.com", + "b.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1674,12 +1855,12 @@ // coop <-> coop-ro. { // same-origin => change. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1687,12 +1868,12 @@ }, { // different-origin => change. - https_server()->GetURL("a.a.com", + https_server()->GetURL("a.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), https_server()->GetURL( - "b.a.com", + "b.a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1700,12 +1881,12 @@ }, { // different-site => change - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), https_server()->GetURL( - "b.com", + "b.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1753,14 +1934,14 @@ // Open with no URL => Always keep. { // From non-coop. - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), GURL(), false, }, { // From coop-ro. https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1769,7 +1950,7 @@ }, { // From coop. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1788,16 +1969,16 @@ // non-coop opens non-coop. { - https_server()->GetURL("a.com", "/title1.html"), - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), false, }, // non-coop opens coop-ro. { - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1806,8 +1987,8 @@ // non-coop opens coop. { - https_server()->GetURL("a.com", "/title1.html"), - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/title1.html"), + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1816,23 +1997,23 @@ // coop opens non-coop. { - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), true, }, // coop-ro opens coop-ro (same-origin). { https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1842,12 +2023,12 @@ // coop-ro opens coop-ro (different-origin). { https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), https_server()->GetURL( - "b.com", + "b.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1947,9 +2128,9 @@ const VirtualBcgAllowPopupTestCase kTestCases[] = { { // same-origin. - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1959,9 +2140,9 @@ }, { // cross-origin. - https_server()->GetURL("a.a.com", "/title1.html"), + https_server()->GetURL("a.a.test", "/title1.html"), https_server()->GetURL( - "b.a.com", + "b.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1971,9 +2152,9 @@ }, { // cross-site. - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), https_server()->GetURL( - "b.com", + "b.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -1993,11 +2174,11 @@ { // same-origin. https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), false, true, VirtualBrowsingContextGroup, @@ -2005,11 +2186,11 @@ { // cross-origin. https_server()->GetURL( - "b.a.com", + "b.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("a.a.com", "/title1.html"), + https_server()->GetURL("a.a.test", "/title1.html"), false, true, VirtualBrowsingContextGroup, @@ -2017,11 +2198,11 @@ { // cross-site. https_server()->GetURL( - "b.com", + "b.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), false, true, VirtualBrowsingContextGroup, @@ -2037,36 +2218,36 @@ const VirtualBcgAllowPopupTestCase kTestCases[] = { { // same-origin. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: " "same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), false, true, VirtualBrowsingContextGroup, }, { // cross-origin. - https_server()->GetURL("b.a.com", + https_server()->GetURL("b.a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: " "same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("a.a.com", "/title1.html"), + https_server()->GetURL("a.a.test", "/title1.html"), false, true, VirtualBrowsingContextGroup, }, { // cross-site. - https_server()->GetURL("b.com", + https_server()->GetURL("b.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: " "same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), false, true, VirtualBrowsingContextGroup, @@ -2083,12 +2264,12 @@ { // same-origin. https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -2099,12 +2280,12 @@ { // cross-origin. https_server()->GetURL( - "a.a.com", + "a.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), https_server()->GetURL( - "b.a.com", + "b.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -2115,12 +2296,12 @@ { // cross-site. https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), https_server()->GetURL( - "b.com", + "b.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -2140,12 +2321,12 @@ const VirtualBcgAllowPopupTestCase kTestCases[] = { { // same-origin. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: " "same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: " "same-origin-allow-popups&" @@ -2156,12 +2337,12 @@ }, { // cross-origin. - https_server()->GetURL("a.a.com", + https_server()->GetURL("a.a.test", "/set-header?" "Cross-Origin-Opener-Policy: " "same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("b.a.com", + https_server()->GetURL("b.a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: " "same-origin-allow-popups&" @@ -2172,12 +2353,12 @@ }, { // cross-site. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: " "same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("b.com", + https_server()->GetURL("b.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: " "same-origin-allow-popups&" @@ -2197,12 +2378,12 @@ const VirtualBcgAllowPopupTestCase kTestCases[] = { { // same-origin. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: " "same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: " "same-origin-allow-popups&" @@ -2213,13 +2394,13 @@ }, { // cross-origin. - https_server()->GetURL("a.a.com", + https_server()->GetURL("a.a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: " "same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), https_server()->GetURL( - "b.a.com", + "b.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -2230,12 +2411,12 @@ { // cross-site. https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), https_server()->GetURL( - "b.com", + "b.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Embedder-Policy: require-corp"), @@ -2257,12 +2438,12 @@ { // same-origin. https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), true, true, VirtualBrowsingContextGroup, @@ -2270,12 +2451,12 @@ { // cross-origin. https_server()->GetURL( - "a.a.com", + "a.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("b.a.com", "/title1.html"), + https_server()->GetURL("b.a.test", "/title1.html"), true, true, VirtualBrowsingContextGroup, @@ -2283,12 +2464,12 @@ { // cross-site. https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups&" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"), - https_server()->GetURL("b.com", "/title1.html"), + https_server()->GetURL("b.test", "/title1.html"), true, true, VirtualBrowsingContextGroup, @@ -2306,12 +2487,12 @@ // https://crbug.com/1109648. IN_PROC_BROWSER_TEST_P(VirtualBrowsingContextGroupTest, HistoryNavigation) { GURL url_a = https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"); GURL url_b = https_server()->GetURL( - "b.com", + "b.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"); @@ -2359,10 +2540,10 @@ // A1 and B4 must not be in the same browsing context group. IN_PROC_BROWSER_TEST_P(VirtualBrowsingContextGroupTest, HistoryNavigationWithPopup) { - GURL url_a = https_server()->GetURL("a.com", "/title1.html"); - GURL url_b = https_server()->GetURL("b.com", "/title1.html"); + GURL url_a = https_server()->GetURL("a.test", "/title1.html"); + GURL url_b = https_server()->GetURL("b.test", "/title1.html"); GURL url_c = https_server()->GetURL( - "c.com", + "c.test", "/set-header?" "Cross-Origin-Opener-Policy-Report-Only: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"); @@ -2400,7 +2581,7 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, CoopCoepNotOriginKeyed) { GURL isolated_page( - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); @@ -2426,16 +2607,16 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, MAYBE_CrossOriginIsolatedSiteInstance_MainFrame) { GURL isolated_page( - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); GURL isolated_page_b( - https_server()->GetURL("cdn.a.com", + https_server()->GetURL("cdn.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); - GURL non_isolated_page(https_server()->GetURL("a.com", "/title1.html")); + GURL non_isolated_page(https_server()->GetURL("a.test", "/title1.html")); // Navigation from/to cross-origin isolated pages. @@ -2518,16 +2699,16 @@ CrossOriginOpenerPolicyBrowserTest, CrossOriginIsolatedSiteInstance_MainFrameRendererInitiated) { GURL isolated_page( - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); GURL isolated_page_b( - https_server()->GetURL("cdn.a.com", + https_server()->GetURL("cdn.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); - GURL non_isolated_page(https_server()->GetURL("a.com", "/title1.html")); + GURL non_isolated_page(https_server()->GetURL("a.test", "/title1.html")); // Navigation from/to cross-origin isolated pages. @@ -2587,12 +2768,12 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, CrossOriginIsolatedSiteInstance_IFrame) { GURL isolated_page( - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); GURL isolated_page_b( - https_server()->GetURL("cdn.a.com", + https_server()->GetURL("cdn.a.test", "/set-header?" "Cross-Origin-Embedder-Policy: require-corp&" "Cross-Origin-Resource-Policy: cross-origin")); @@ -2609,7 +2790,7 @@ EXPECT_TRUE( ExecJs(web_contents(), - JsReplace("var iframe = document.createElement('iframe'); " + JsReplace("const iframe = document.createElement('iframe'); " "iframe.src = $1; " "document.body.appendChild(iframe);", isolated_page))); @@ -2629,7 +2810,7 @@ EXPECT_TRUE( ExecJs(web_contents(), - JsReplace("var iframe = document.createElement('iframe'); " + JsReplace("const iframe = document.createElement('iframe'); " "iframe.src = $1; " "document.body.appendChild(iframe);", isolated_page_b))); @@ -2648,17 +2829,17 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, CrossOriginIsolatedSiteInstance_Popup) { GURL isolated_page( - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); GURL isolated_page_b( - https_server()->GetURL("cdn.a.com", + https_server()->GetURL("cdn.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); GURL non_isolated_page( - embedded_test_server()->GetURL("a.com", "/title1.html")); + embedded_test_server()->GetURL("a.test", "/title1.html")); // Initial cross-origin isolated page. EXPECT_TRUE(NavigateToURL(shell(), isolated_page)); @@ -2671,9 +2852,7 @@ static_cast<WebContentsImpl*>( OpenPopup(current_frame_host(), non_isolated_page, "") ->web_contents()) - ->GetPrimaryFrameTree() - .root() - ->current_frame_host(); + ->GetMainFrame(); EXPECT_FALSE(popup_rfh->GetSiteInstance()->IsCrossOriginIsolated()); EXPECT_FALSE(popup_rfh->GetSiteInstance()->IsRelatedSiteInstance( @@ -2686,9 +2865,7 @@ RenderFrameHostImpl* popup_rfh = static_cast<WebContentsImpl*>( OpenPopup(current_frame_host(), isolated_page, "")->web_contents()) - ->GetPrimaryFrameTree() - .root() - ->current_frame_host(); + ->GetMainFrame(); EXPECT_TRUE(popup_rfh->GetSiteInstance()->IsCrossOriginIsolated()); EXPECT_EQ(popup_rfh->GetSiteInstance(), @@ -2701,9 +2878,7 @@ static_cast<WebContentsImpl*>( OpenPopup(current_frame_host(), isolated_page_b, "") ->web_contents()) - ->GetPrimaryFrameTree() - .root() - ->current_frame_host(); + ->GetMainFrame(); EXPECT_TRUE(popup_rfh->GetSiteInstance()->IsCrossOriginIsolated()); EXPECT_FALSE(popup_rfh->GetSiteInstance()->IsRelatedSiteInstance( @@ -2717,18 +2892,18 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, CrossOriginIsolatedSiteInstance_ErrorPage) { GURL isolated_page( - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); - GURL non_coep_page(https_server()->GetURL("b.com", + GURL non_coep_page(https_server()->GetURL("b.test", "/set-header?" "Access-Control-Allow-Origin: *")); GURL invalid_url( - https_server()->GetURL("a.com", "/this_page_does_not_exist.html")); + https_server()->GetURL("a.test", "/this_page_does_not_exist.html")); - GURL error_url(https_server()->GetURL("a.com", "/page404.html")); + GURL error_url(https_server()->GetURL("a.test", "/page404.html")); // Initial cross-origin isolated page. EXPECT_TRUE(NavigateToURL(shell(), isolated_page)); @@ -2741,7 +2916,7 @@ EXPECT_TRUE( ExecJs(web_contents(), - JsReplace("var iframe = document.createElement('iframe'); " + JsReplace("const iframe = document.createElement('iframe'); " "iframe.src = $1; " "document.body.appendChild(iframe);", invalid_url))); @@ -2765,7 +2940,7 @@ EXPECT_TRUE( ExecJs(web_contents(), - JsReplace("var iframe = document.createElement('iframe'); " + JsReplace("const iframe = document.createElement('iframe'); " "iframe.src = $1; " "document.body.appendChild(iframe);", error_url))); @@ -2790,7 +2965,7 @@ EXPECT_TRUE( ExecJs(web_contents(), - JsReplace("var iframe = document.createElement('iframe'); " + JsReplace("const iframe = document.createElement('iframe'); " "iframe.src = $1; " "document.body.appendChild(iframe);", non_coep_page))); @@ -2820,7 +2995,7 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, NavigatePopupToErrorAndCrash) { GURL isolated_page( - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); @@ -2884,7 +3059,7 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, ReloadCrossOriginIsolatedPageWhileOffline) { GURL isolated_page( - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); @@ -2913,7 +3088,7 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, ReloadCoopPageWhileOffline) { GURL isolated_page( - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin")); @@ -2941,13 +3116,13 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, BackNavigationToCrossOriginIsolatedPageWhileOffline) { GURL isolated_page( - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); GURL same_origin_isolated_page( - https_server()->GetURL("a.com", "/cross-origin-isolated.html")); + https_server()->GetURL("a.test", "/cross-origin-isolated.html")); // Put the initial isolated page in history. EXPECT_TRUE(NavigateToURL(shell(), isolated_page)); @@ -2984,16 +3159,16 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, CrossOriginRedirectHasProperCrossOriginIsolatedState) { GURL non_isolated_page( - embedded_test_server()->GetURL("a.com", "/title1.html")); + embedded_test_server()->GetURL("a.test", "/title1.html")); GURL isolated_page( - https_server()->GetURL("c.com", + https_server()->GetURL("c.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); GURL redirect_isolated_page(https_server()->GetURL( - "b.com", "/redirect-with-coop-coep-headers?" + isolated_page.spec())); + "b.test", "/redirect-with-coop-coep-headers?" + isolated_page.spec())); EXPECT_TRUE(NavigateToURL(shell(), non_isolated_page)); SiteInstanceImpl* current_si = current_frame_host()->GetSiteInstance(); @@ -3011,12 +3186,12 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, MainFrameA_IframeB_Opens_WindowA) { GURL isolated_page( - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp")); GURL isolated_page_b( - https_server()->GetURL("cdn.a.com", + https_server()->GetURL("cdn.a.test", "/set-header?" "Cross-Origin-Embedder-Policy: require-corp&" "Cross-Origin-Resource-Policy: cross-origin")); @@ -3029,11 +3204,12 @@ TestNavigationManager cross_origin_iframe_navigation(web_contents(), isolated_page_b); - EXPECT_TRUE(ExecJs(web_contents(), - JsReplace("var iframe = document.createElement('iframe'); " - "iframe.src = $1; " - "document.body.appendChild(iframe);", - isolated_page_b))); + EXPECT_TRUE( + ExecJs(web_contents(), + JsReplace("const iframe = document.createElement('iframe'); " + "iframe.src = $1; " + "document.body.appendChild(iframe);", + isolated_page_b))); cross_origin_iframe_navigation.WaitForNavigationFinished(); EXPECT_TRUE(cross_origin_iframe_navigation.was_successful()); @@ -3049,9 +3225,7 @@ RenderFrameHostImpl* popup_rfh = static_cast<WebContentsImpl*>( OpenPopup(iframe_rfh, isolated_page, "", "", false)->web_contents()) - ->GetPrimaryFrameTree() - .root() - ->current_frame_host(); + ->GetMainFrame(); EXPECT_TRUE(popup_rfh->GetSiteInstance()->IsCrossOriginIsolated()); EXPECT_FALSE(popup_rfh->GetSiteInstance()->IsRelatedSiteInstance( @@ -3070,12 +3244,12 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, GrandChildAccessCrash1183571) { GURL a_url_coop(https_server()->GetURL( - "a.com", + "a.test", "/set-header?Cross-Origin-Opener-Policy-Report-Only: same-origin")); - GURL b_url(https_server()->GetURL("b.com", "/empty.html")); - GURL c_url(https_server()->GetURL("c.com", "/empty.html")); + GURL b_url(https_server()->GetURL("b.test", "/empty.html")); + GURL c_url(https_server()->GetURL("c.test", "/empty.html")); - // 1. Start from COOP-Report-Only:same-origin. (a.com COOP-RO) + // 1. Start from COOP-Report-Only:same-origin. (a.test COOP-RO) EXPECT_TRUE(NavigateToURL(shell(), a_url_coop)); RenderFrameHostImpl* opener_rfh = current_frame_host(); @@ -3093,7 +3267,7 @@ WaitForLoadStop(shell_observer.GetShell()->web_contents()); } - // 3. Insert a cross-origin iframe. (b.com) + // 3. Insert a cross-origin iframe. (b.test) EXPECT_TRUE(ExecJs(opener_rfh, JsReplace(R"( const iframe = document.createElement("iframe"); iframe.src = $1; @@ -3104,7 +3278,7 @@ RenderFrameHostImpl* opener_child_rfh = opener_rfh->child_at(0)->current_frame_host(); - // 4. Insert a grand-child iframe (b.com). + // 4. Insert a grand-child iframe (b.test). EXPECT_TRUE(ExecJs(opener_child_rfh, JsReplace(R"( const iframe = document.createElement("iframe"); iframe.src = $1; @@ -3146,7 +3320,7 @@ kTestParams); IN_PROC_BROWSER_TEST_P(NoSharedArrayBufferByDefault, BaseCase) { - GURL url = https_server()->GetURL("a.com", "/empty.html"); + GURL url = https_server()->GetURL("a.test", "/empty.html"); EXPECT_TRUE(NavigateToURL(shell(), url)); EXPECT_EQ(false, EvalJs(current_frame_host(), "self.crossOriginIsolated")); EXPECT_EQ(false, @@ -3155,7 +3329,7 @@ IN_PROC_BROWSER_TEST_P(NoSharedArrayBufferByDefault, CoopCoepIsolated) { GURL url = - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"); @@ -3169,7 +3343,7 @@ CoopCoepTransferSharedArrayBufferToIframe) { CHECK(!base::FeatureList::IsEnabled(features::kSharedArrayBuffer)); GURL url = - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"); @@ -3195,7 +3369,7 @@ EXECUTE_SCRIPT_NO_RESOLVE_PROMISES)); EXPECT_TRUE(ExecJs(main_document, R"( - let sab = new SharedArrayBuffer(1234); + const sab = new SharedArrayBuffer(1234); g_iframe.contentWindow.postMessage(sab, "*"); )")); @@ -3210,12 +3384,12 @@ CoopCoepTransferSharedArrayBufferToNoCrossOriginIsolatedIframe) { CHECK(!base::FeatureList::IsEnabled(features::kSharedArrayBuffer)); GURL main_url = - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"); GURL iframe_url = - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Embedder-Policy: require-corp&" "Cross-Origin-Resource-Policy: cross-origin&" @@ -3236,7 +3410,7 @@ EXPECT_EQ(false, EvalJs(sub_document, "self.crossOriginIsolated")); auto postSharedArrayBuffer = EvalJs(main_document, R"( - let sab = new SharedArrayBuffer(1234); + const sab = new SharedArrayBuffer(1234); g_iframe.contentWindow.postMessage(sab,"*"); )"); @@ -3254,12 +3428,12 @@ CoopCoepTransferSharedArrayBufferFromNoCrossOriginIsolatedIframe) { CHECK(!base::FeatureList::IsEnabled(features::kSharedArrayBuffer)); GURL main_url = - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: require-corp"); GURL iframe_url = - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Embedder-Policy: require-corp&" "Cross-Origin-Resource-Policy: cross-origin&" @@ -3292,7 +3466,7 @@ // a document with self.crossOriginIsolated == false sounds wrong. EXPECT_TRUE(ExecJs(sub_document, R"( // Create a WebAssembly Memory to bypass the SAB constructor restriction. - let sab = new (new WebAssembly.Memory( + const sab = new (new WebAssembly.Memory( { shared:true, initial:1, maximum:1 }).buffer.constructor)(1234); parent.postMessage(sab, "*"); )")); @@ -3512,7 +3686,7 @@ EXECUTE_SCRIPT_NO_RESOLVE_PROMISES)); EXPECT_TRUE(ExecJs(main_document, R"( - let sab = new SharedArrayBuffer(1234); + const sab = new SharedArrayBuffer(1234); g_iframe.contentWindow.postMessage(sab, "*"); )")); @@ -3573,7 +3747,7 @@ EXECUTE_SCRIPT_NO_RESOLVE_PROMISES)); EXPECT_TRUE(ExecJs(main_document, R"( - let wasm_shared_memory = new WebAssembly.Memory({ + const wasm_shared_memory = new WebAssembly.Memory({ shared:true, initial:0, maximum:0 }); g_iframe.contentWindow.postMessage(wasm_shared_memory.buffer, "*"); )")); @@ -3608,7 +3782,7 @@ IN_PROC_BROWSER_TEST_P(SharedArrayBufferOnDesktopBrowserTest, DesktopHasSharedArrayBuffer) { CHECK(!base::FeatureList::IsEnabled(features::kSharedArrayBuffer)); - GURL url = https_server()->GetURL("a.com", "/empty.html"); + GURL url = https_server()->GetURL("a.test", "/empty.html"); EXPECT_TRUE(NavigateToURL(shell(), url)); EXPECT_EQ(false, EvalJs(current_frame_host(), "self.crossOriginIsolated")); #if !defined(OS_ANDROID) @@ -3623,8 +3797,8 @@ IN_PROC_BROWSER_TEST_P(SharedArrayBufferOnDesktopBrowserTest, DesktopTransferSharedArrayBuffer) { CHECK(!base::FeatureList::IsEnabled(features::kSharedArrayBuffer)); - GURL main_url = https_server()->GetURL("a.com", "/empty.html"); - GURL iframe_url = https_server()->GetURL("a.com", "/empty.html"); + GURL main_url = https_server()->GetURL("a.test", "/empty.html"); + GURL iframe_url = https_server()->GetURL("a.test", "/empty.html"); EXPECT_TRUE(NavigateToURL(shell(), main_url)); EXPECT_TRUE(ExecJs(current_frame_host(), JsReplace("g_iframe = document.createElement('iframe');" @@ -3649,14 +3823,14 @@ #if !defined(OS_ANDROID) EXPECT_TRUE(ExecJs(sub_document, R"( - let sab = new SharedArrayBuffer(1234); + const sab = new SharedArrayBuffer(1234); parent.postMessage(sab, "*"); )")); EXPECT_EQ(1234, EvalJs(main_document, "g_sab_size")); #else // defined(OS_ANDROID) EXPECT_FALSE(ExecJs(sub_document, R"( - let sab = new SharedArrayBuffer(1234); + const sab = new SharedArrayBuffer(1234); parent.postMessage(sab, "*"); )")); #endif // defined(OS_ANDROID) @@ -3669,7 +3843,7 @@ IN_PROC_BROWSER_TEST_P(NoCoepCredentialless, Regression1238282) { EXPECT_TRUE(NavigateToURL( shell(), - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin&" "Cross-Origin-Embedder-Policy: credentialless"))); @@ -3684,24 +3858,24 @@ const VirtualBcgAllowPopupTestCase kTestCases[] = { { // same-origin. - https_server()->GetURL("a.com", "/title1.html"), - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), false, false, SoapByDefaultVirtualBrowsingContextGroup, }, { // cross-origin. - https_server()->GetURL("a.a.com", "/title1.html"), - https_server()->GetURL("b.a.com", "/title1.html"), + https_server()->GetURL("a.a.test", "/title1.html"), + https_server()->GetURL("b.a.test", "/title1.html"), true, true, SoapByDefaultVirtualBrowsingContextGroup, }, { // cross-site. - https_server()->GetURL("a.com", "/title1.html"), - https_server()->GetURL("b.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), + https_server()->GetURL("b.test", "/title1.html"), true, true, SoapByDefaultVirtualBrowsingContextGroup, @@ -3716,8 +3890,8 @@ const VirtualBcgAllowPopupTestCase kTestCases[] = { { // same-origin. - https_server()->GetURL("a.com", "/title1.html"), - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/title1.html"), + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: unsafe-none"), false, @@ -3726,8 +3900,8 @@ }, { // cross-origin. - https_server()->GetURL("a.a.com", "/title1.html"), - https_server()->GetURL("b.a.com", + https_server()->GetURL("a.a.test", "/title1.html"), + https_server()->GetURL("b.a.test", "/set-header?" "Cross-Origin-Opener-Policy: unsafe-none"), false, @@ -3736,8 +3910,8 @@ }, { // cross-site. - https_server()->GetURL("a.com", "/title1.html"), - https_server()->GetURL("b.com", + https_server()->GetURL("a.test", "/title1.html"), + https_server()->GetURL("b.test", "/set-header?" "Cross-Origin-Opener-Policy: unsafe-none"), false, @@ -3754,30 +3928,30 @@ const VirtualBcgAllowPopupTestCase kTestCases[] = { { // same-origin. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: unsafe-none"), - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), true, true, SoapByDefaultVirtualBrowsingContextGroup, }, { // cross-origin. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: unsafe-none"), - https_server()->GetURL("b.a.com", "/title1.html"), + https_server()->GetURL("b.a.test", "/title1.html"), true, true, SoapByDefaultVirtualBrowsingContextGroup, }, { // cross-site. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: unsafe-none"), - https_server()->GetURL("b.com", "/title1.html"), + https_server()->GetURL("b.test", "/title1.html"), true, true, SoapByDefaultVirtualBrowsingContextGroup, @@ -3792,9 +3966,9 @@ const VirtualBcgAllowPopupTestCase kTestCases[] = { { // same-origin. - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups"), false, @@ -3803,9 +3977,9 @@ }, { // cross-origin. - https_server()->GetURL("a.a.com", "/title1.html"), + https_server()->GetURL("a.a.test", "/title1.html"), https_server()->GetURL( - "b.a.com", + "b.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups"), true, @@ -3814,9 +3988,9 @@ }, { // cross-site. - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), https_server()->GetURL( - "b.com", + "b.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups"), true, @@ -3834,10 +4008,10 @@ { // same-origin. https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups"), - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), false, false, SoapByDefaultVirtualBrowsingContextGroup, @@ -3845,10 +4019,10 @@ { // cross-origin. https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups"), - https_server()->GetURL("b.a.com", "/title1.html"), + https_server()->GetURL("b.a.test", "/title1.html"), true, true, SoapByDefaultVirtualBrowsingContextGroup, @@ -3856,10 +4030,10 @@ { // cross-site. https_server()->GetURL( - "a.com", + "a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin-allow-popups"), - https_server()->GetURL("b.com", "/title1.html"), + https_server()->GetURL("b.test", "/title1.html"), true, true, SoapByDefaultVirtualBrowsingContextGroup, @@ -3874,8 +4048,8 @@ const VirtualBcgAllowPopupTestCase kTestCases[] = { { // same-origin. - https_server()->GetURL("a.com", "/title1.html"), - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/title1.html"), + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin"), true, @@ -3884,8 +4058,8 @@ }, { // cross-origin. - https_server()->GetURL("a.a.com", "/title1.html"), - https_server()->GetURL("b.a.com", + https_server()->GetURL("a.a.test", "/title1.html"), + https_server()->GetURL("b.a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin"), true, @@ -3894,8 +4068,8 @@ }, { // cross-site. - https_server()->GetURL("a.com", "/title1.html"), - https_server()->GetURL("b.com", + https_server()->GetURL("a.test", "/title1.html"), + https_server()->GetURL("b.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin"), true, @@ -3912,30 +4086,30 @@ const VirtualBcgAllowPopupTestCase kTestCases[] = { { // same-origin. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin"), - https_server()->GetURL("a.com", "/title1.html"), + https_server()->GetURL("a.test", "/title1.html"), true, true, SoapByDefaultVirtualBrowsingContextGroup, }, { // cross-origin. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin"), - https_server()->GetURL("b.a.com", "/title1.html"), + https_server()->GetURL("b.a.test", "/title1.html"), true, true, SoapByDefaultVirtualBrowsingContextGroup, }, { // cross-site. - https_server()->GetURL("a.com", + https_server()->GetURL("a.test", "/set-header?" "Cross-Origin-Opener-Policy: same-origin"), - https_server()->GetURL("b.com", "/title1.html"), + https_server()->GetURL("b.test", "/title1.html"), true, true, SoapByDefaultVirtualBrowsingContextGroup, @@ -3952,8 +4126,8 @@ // https://crbug.com/1109648. IN_PROC_BROWSER_TEST_P(SoapByDefaultVirtualBrowsingContextGroupTest, HistoryNavigation) { - GURL url_a = https_server()->GetURL("a.com", "/title1.html"); - GURL url_b = https_server()->GetURL("b.com", "/title1.html"); + GURL url_a = https_server()->GetURL("a.test", "/title1.html"); + GURL url_b = https_server()->GetURL("b.test", "/title1.html"); EXPECT_TRUE(NavigateToURL(shell(), url_a)); int group_1 = SoapByDefaultVirtualBrowsingContextGroup(web_contents()); @@ -3998,8 +4172,8 @@ // A1 and A4 must not be in the same browsing context group. IN_PROC_BROWSER_TEST_P(SoapByDefaultVirtualBrowsingContextGroupTest, HistoryNavigationWithPopup) { - GURL url_a = https_server()->GetURL("a.com", "/title1.html"); - GURL url_b = https_server()->GetURL("b.com", "/title1.html"); + GURL url_a = https_server()->GetURL("a.test", "/title1.html"); + GURL url_b = https_server()->GetURL("b.test", "/title1.html"); // Navigate to A1. EXPECT_TRUE(NavigateToURL(shell(), url_a));
diff --git a/content/browser/indexed_db/OWNERS b/content/browser/indexed_db/OWNERS index c7030c7..3bee009b 100644 --- a/content/browser/indexed_db/OWNERS +++ b/content/browser/indexed_db/OWNERS
@@ -3,6 +3,7 @@ # Secondary arichiv@chromium.org +ayui@chromium.org cmp@chromium.org dmurph@chromium.org jsbell@chromium.org
diff --git a/content/browser/launch_as_mojo_client_browsertest.cc b/content/browser/launch_as_mojo_client_browsertest.cc index 071bc3f..d085371 100644 --- a/content/browser/launch_as_mojo_client_browsertest.cc +++ b/content/browser/launch_as_mojo_client_browsertest.cc
@@ -155,21 +155,14 @@ shell_controller->ShutDown(); } -// Running a Content embedder with a dynamically loaded Mojo Core library is -// currently only supported on Linux and Chrome OS. -// -// TODO(crbug.com/1096899): Re-enable on MSan if possible. MSan complains about -// spurious uninitialized memory reads inside base::PlatformThread due to what -// appears to be poor interaction among MSan, PlatformThread's thread_local -// storage, and Mojo's use of dlopen(). #if defined(OS_LINUX) || defined(OS_CHROMEOS) -#if defined(MEMORY_SANITIZER) || BUILDFLAG(CFI_ICALL_CHECK) -#define MAYBE_WithMojoCoreLibrary DISABLED_WithMojoCoreLibrary -#else -#define MAYBE_WithMojoCoreLibrary WithMojoCoreLibrary -#endif +// TODO(crbug.com/1259557): This test implementation fundamentally conflicts +// with a fix for the linked bug because it causes a browser process to behave +// partially as a broker and partially as a non-broker. This can be re-enabled +// when we migrate away from the current Mojo implementation. It's OK to disable +// for now because no production code relies on this feature. IN_PROC_BROWSER_TEST_F(LaunchAsMojoClientBrowserTest, - MAYBE_WithMojoCoreLibrary) { + DISABLED_WithMojoCoreLibrary) { // Instructs a newly launched Content Shell browser to initialize Mojo Core // dynamically from a shared library, rather than using the version linked // into the Content Shell binary.
diff --git a/content/browser/presentation/presentation_service_impl.cc b/content/browser/presentation/presentation_service_impl.cc index 9890dd6c..a830337a6 100644 --- a/content/browser/presentation/presentation_service_impl.cc +++ b/content/browser/presentation/presentation_service_impl.cc
@@ -142,6 +142,10 @@ void PresentationServiceImpl::SetReceiver( mojo::PendingRemote<blink::mojom::PresentationReceiver> presentation_receiver_remote) { + // Mojo interfaces for Presentation API are disabled during pre-rendering. + DCHECK_NE(render_frame_host_->GetLifecycleState(), + content::RenderFrameHost::LifecycleState::kPrerendering); + // Presentation receiver virtual web tests (which have the flag set) has no // ReceiverPresentationServiceDelegate implementation. // TODO(imcheng): Refactor content_browser_client to return a no-op
diff --git a/content/browser/renderer_host/navigation_entry_impl.cc b/content/browser/renderer_host/navigation_entry_impl.cc index 7f7a610..9d4a234 100644 --- a/content/browser/renderer_host/navigation_entry_impl.cc +++ b/content/browser/renderer_host/navigation_entry_impl.cc
@@ -77,10 +77,9 @@ DCHECK(!data.empty()) << "Shouldn't generate an empty PageState."; GURL state_url(state.url_string.value_or(std::u16string())); - scoped_refptr<FrameNavigationEntry> entry = - context->GetFrameNavigationEntryForItemSequenceNumber( - state.item_sequence_number, - state.target ? base::UTF16ToUTF8(*state.target) : "", state_url); + scoped_refptr<FrameNavigationEntry> entry = context->GetFrameNavigationEntry( + state.item_sequence_number, + state.target ? base::UTF16ToUTF8(*state.target) : "", state_url); DCHECK(!entry || entry->initiator_origin() == state.initiator_origin); if (!entry) { entry = base::MakeRefCounted<FrameNavigationEntry>( @@ -272,9 +271,9 @@ } else { if (restore_context) { // If |restore_context| is given and already has a FrameNavigationEntry - // for the given item sequence number, share that FrameNavigationEntry - // rather than creating a duplicate. - new_entry = restore_context->GetFrameNavigationEntryForItemSequenceNumber( + // for the given item sequence number and URL, share that + // FrameNavigationEntry rather than creating a duplicate. + new_entry = restore_context->GetFrameNavigationEntry( frame_entry->item_sequence_number(), frame_entry->frame_unique_name(), frame_entry->url()); }
diff --git a/content/browser/renderer_host/navigation_entry_restore_context_impl.cc b/content/browser/renderer_host/navigation_entry_restore_context_impl.cc index 4967ef8..5bb2d2a 100644 --- a/content/browser/renderer_host/navigation_entry_restore_context_impl.cc +++ b/content/browser/renderer_host/navigation_entry_restore_context_impl.cc
@@ -5,7 +5,6 @@ #include "content/browser/renderer_host/navigation_entry_restore_context_impl.h" #include "content/browser/renderer_host/frame_navigation_entry.h" -#include "url/gurl.h" namespace content { @@ -26,22 +25,28 @@ // value can be used for any arbitrary document. if (entry->item_sequence_number() == 0) return; - Key key(entry->item_sequence_number(), entry->frame_unique_name()); + Key key(entry->item_sequence_number(), entry->frame_unique_name(), + entry->url()); + // The checks here should be consistent with GetFrameNavigationEntry and this + // is only expected to be called after that function fails to find an entry, + // so we don't expect there to be an entry for this key already. DCHECK(entries_.find(key) == entries_.end()); entries_.emplace(key, entry); } FrameNavigationEntry* -NavigationEntryRestoreContextImpl::GetFrameNavigationEntryForItemSequenceNumber( +NavigationEntryRestoreContextImpl::GetFrameNavigationEntry( int64_t item_sequence_number, const std::string& unique_name, - const GURL& expected_url) { + const GURL& url) { + // Note: Ensure the checks here are consistent with AddFrameNavigationEntry, + // to satisfy the DCHECK there. See https://crbug.com/1275257. if (item_sequence_number == 0) return nullptr; - auto it = entries_.find(Key(item_sequence_number, unique_name)); + auto it = entries_.find(Key(item_sequence_number, unique_name, url)); if (it == entries_.end()) return nullptr; - return it->second->url() == expected_url ? it->second : nullptr; + return it->second; } } // namespace content
diff --git a/content/browser/renderer_host/navigation_entry_restore_context_impl.h b/content/browser/renderer_host/navigation_entry_restore_context_impl.h index 5925d9b..e832ba6 100644 --- a/content/browser/renderer_host/navigation_entry_restore_context_impl.h +++ b/content/browser/renderer_host/navigation_entry_restore_context_impl.h
@@ -10,8 +10,7 @@ #include "content/common/content_export.h" #include "content/public/browser/navigation_entry_restore_context.h" - -class GURL; +#include "url/gurl.h" namespace content { @@ -35,18 +34,20 @@ void AddFrameNavigationEntry(FrameNavigationEntry* entry); // If there is an existing FrameNavigationEntry with the given // |item_sequence_number| targeting |unique_name|, this returns it so that it - // can be shared. Entries with the same ISN should always have the same URL, - // so this returns null if the located FrameNavigationEntry differs from - // |expected_url| to avoid bugs. - FrameNavigationEntry* GetFrameNavigationEntryForItemSequenceNumber( - int64_t item_sequence_number, - const std::string& unique_name, - const GURL& expected_url); + // can be shared. Entries with the same ISN and unique name may differ by URL + // if they were persisted from an earlier version, so this indexes by URL as + // well. + FrameNavigationEntry* GetFrameNavigationEntry(int64_t item_sequence_number, + const std::string& unique_name, + const GURL& url); private: - // As an added precaution, we key based on both item sequence number and - // the unique name of the frame, just in case a sequence number somehow - // appears in multiple frames. + // RestoreContext entries are indexed by item sequence number, unique name of + // the frame, and URL. The unique name is a precaution in case the item + // sequence number somehow appears in multiple frames. The URL is needed to + // handle cases from older versions where a replaceState operation might have + // caused multiple FrameNavigationEntries with the same ISN and unique namm to + // have different URLs. // // We also ensure that entries with an item sequence number of 0 (the default // value) cannot be stored or retrieved, since they may not represent the same @@ -54,20 +55,23 @@ // and we can skip FrameNavigationEntry sharing for them because they are not // considered same-document anyway. struct Key { - Key(int64_t isn, const std::string& name) - : item_sequence_number(isn), unique_name(name) {} + Key(int64_t isn, const std::string& name, const GURL& entry_url) + : item_sequence_number(isn), unique_name(name), url(entry_url) {} bool operator==(const Key& other) const { return item_sequence_number == other.item_sequence_number && - unique_name == other.unique_name; + unique_name == other.unique_name && url == other.url; } const int64_t item_sequence_number; const std::string unique_name; + const GURL url; struct Compare { bool operator()(const Key& x, const Key& y) const { if (x.item_sequence_number != y.item_sequence_number) return x.item_sequence_number > y.item_sequence_number; - return x.unique_name > y.unique_name; + if (x.unique_name != y.unique_name) + return x.unique_name > y.unique_name; + return x.url > y.url; } }; };
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index ce259d7..e47ecf4 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -3169,7 +3169,16 @@ if (network::IsUrlPotentiallyTrustworthy(url)) { // https://mikewest.github.io/corpp/#process-navigation-response - if (auto* const parent = GetParentFrame()) { + auto* parent = GetParentFrame(); + // Fenced Frames should respect the outer frame's COEP. + // Note: we only check the outer document for fenced frames, because it's + // unclear if other embedded cases like Portals should inherit COEP from the + // embedder as well. + // TODO(https://crbug.com/1278207) add other embedded cases if needed. + if (GetNavigatingFrameType() == NavigatingFrameType::kFencedFrameRoot) { + parent = GetParentFrameOrOuterDocument(); + } + if (parent) { const auto& parent_coep = parent->cross_origin_embedder_policy(); CrossOriginEmbedderPolicyReporter* parent_coep_reporter = parent->coep_reporter();
diff --git a/content/browser/renderer_host/page_lifecycle_state_manager.cc b/content/browser/renderer_host/page_lifecycle_state_manager.cc index 0e6cfa6..2d39aed 100644 --- a/content/browser/renderer_host/page_lifecycle_state_manager.cc +++ b/content/browser/renderer_host/page_lifecycle_state_manager.cc
@@ -205,25 +205,6 @@ if (test_delegate_) test_delegate_->OnUpdateSentToRenderer(*last_state_sent_to_renderer_); - // TODO(https://crbug.com/1234634): Remove this. - // We record the time that we sent it so that we can measure how long the ack - // has been outstanding later. - if (new_state->should_dispatch_pageshow_for_debugging) { - // We could send a second one of these before before - // receiving the first ack. This would require something more complicated to - // handle perfectly but it should be rare or even impossible, so instead we - // just record that it happened and clear the timestamp without setting a - // new one - if (outstanding_ack_count_bug_1234634_ > 0) { - outstanding_ack_timestamp_bug_1234634_.reset(); - blink::RecordUMAEventPageShowPersisted( - blink::EventPageShowPersisted::kYesInBrowserPendingAck); - } else { - outstanding_ack_timestamp_bug_1234634_ = base::Time::Now(); - } - outstanding_ack_count_bug_1234634_++; - } - render_view_host_impl_->GetAssociatedPageBroadcast()->SetPageLifecycleState( std::move(state), std::move(page_restore_params), base::BindOnce(&PageLifecycleStateManager::OnPageLifecycleChangedAck, @@ -258,12 +239,9 @@ base::OnceClosure done_cb) { blink::mojom::PageLifecycleStatePtr old_state = std::move(last_acknowledged_state_); - // TODO(https://crbug.com/1234634): Remove this. if (acknowledged_state->should_dispatch_pageshow_for_debugging) { blink::RecordUMAEventPageShowPersisted( blink::EventPageShowPersisted::kYesInBrowserAck); - outstanding_ack_count_bug_1234634_--; - outstanding_ack_timestamp_bug_1234634_.reset(); } last_acknowledged_state_ = std::move(acknowledged_state);
diff --git a/content/browser/renderer_host/page_lifecycle_state_manager.h b/content/browser/renderer_host/page_lifecycle_state_manager.h index 1df284d..a0f26db8 100644 --- a/content/browser/renderer_host/page_lifecycle_state_manager.h +++ b/content/browser/renderer_host/page_lifecycle_state_manager.h
@@ -8,7 +8,6 @@ #include "base/callback_forward.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" -#include "base/time/time.h" #include "base/timer/timer.h" #include "content/common/content_export.h" #include "content/public/common/page_visibility_state.h" @@ -87,11 +86,6 @@ void SetDelegateForTesting(TestDelegate* test_delegate_); - // TODO(https://crbug.com/1234634): Remove this. - absl::optional<base::Time> outstanding_ack_timestamp_bug_1234634() { - return outstanding_ack_timestamp_bug_1234634_; - } - private: // Send mojo message to renderer if the effective (page) lifecycle state has // changed. @@ -141,15 +135,6 @@ base::OneShotTimer back_forward_cache_timeout_monitor_; raw_ptr<TestDelegate> test_delegate_{nullptr}; - - // TODO(https://crbug.com/1234634): Remove this. - // We set this when we send an updated state that should result in a pageshow - // with persisted=true and clear it when we receive an ack for that. - absl::optional<base::Time> outstanding_ack_timestamp_bug_1234634_; - // Incremented when we send an updated state that should result in a pageshow, - // decremented when we receive an ack for that. - int outstanding_ack_count_bug_1234634_; - // NOTE: This must be the last member. base::WeakPtrFactory<PageLifecycleStateManager> weak_ptr_factory_{this}; };
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 5583fe9..948c639 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -11118,11 +11118,11 @@ FROM_HERE, base::BindOnce( [](blink::mojom::LocalFrame::BeforeUnloadCallback callback, - base::TimeTicks start_time) { - std::move(callback).Run(/*proceed=*/true, start_time, - base::TimeTicks::Now()); + base::TimeTicks start_time, base::TimeTicks end_time) { + std::move(callback).Run(/*proceed=*/true, start_time, end_time); }, - std::move(before_unload_closure), send_before_unload_start_time_)); + std::move(before_unload_closure), send_before_unload_start_time_, + base::TimeTicks::Now())); return; } // Experiment to run beforeunload handlers at a higher priority in the
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 26e68b5c..2d918fcf 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -721,23 +721,6 @@ void RenderViewHostImpl::RenderProcessExited( RenderProcessHost* host, const ChildProcessTerminationInfo& info) { - // TODO(https://crbug.com/1234634): Remove this. - // If the renderer has exited while we were are still waiting for a ack, - // then log information about the exit. - if (page_lifecycle_state_manager_->outstanding_ack_timestamp_bug_1234634() - .has_value()) { - base::TimeDelta delta = - base::Time::Now() - - page_lifecycle_state_manager_->outstanding_ack_timestamp_bug_1234634() - .value(); - UMA_HISTOGRAM_MEDIUM_TIMES("Event.PageShow.Persisted.Unacked.Time", delta); - // We don't record this as an enum because the enum is platform dependent. - // Since this is temporary debugging, 20 seems a safe upper limit for the - // number of elements. - UMA_HISTOGRAM_EXACT_LINEAR("Event.PageShow.Persisted.Unacked.Status", - static_cast<int>(info.status), 20); - } - renderer_view_created_ = false; GetWidget()->RendererExited(); delegate_->RenderViewTerminated(this, info.status, info.exit_code);
diff --git a/content/browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc b/content/browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc index ec47185b..5a0d4982 100644 --- a/content/browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc +++ b/content/browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc
@@ -4,8 +4,11 @@ #include "content/browser/renderer_host/render_widget_host_view_child_frame.h" +#include <ostream> + #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/debug/stack_trace.h" #include "base/run_loop.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" @@ -15,6 +18,8 @@ #include "content/browser/portal/portal.h" #include "content/browser/renderer_host/frame_tree_node.h" #include "content/browser/renderer_host/render_process_host_impl.h" +#include "content/browser/renderer_host/render_widget_host_impl.h" +#include "content/browser/renderer_host/visible_time_request_trigger.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" @@ -32,7 +37,9 @@ #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "testing/gmock/include/gmock/gmock.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/features.h" +#include "third_party/blink/public/mojom/widget/record_content_to_visible_time_request.mojom.h" #include "ui/gfx/geometry/size.h" namespace content { @@ -378,17 +385,19 @@ } // Validate that OOPIFs receive presentation feedbacks. -// TODO(crbug.com/1270981): Flaky. -#if defined(OS_LINUX) || defined(OS_MAC) -#define MAYBE_PresentationFeedback DISABLED_PresentationFeedback -#else -#define MAYBE_PresentationFeedback PresentationFeedback -#endif +// TODO(crbug.com/1270981): Remove extra debug logs once the flake has been +// diagnosed. IN_PROC_BROWSER_TEST_F(RenderWidgetHostViewChildFrameBrowserTest, - MAYBE_PresentationFeedback) { + PresentationFeedback) { + using ::testing::IsEmpty; + using ::testing::SizeIs; + base::HistogramTester histogram_tester; GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); EXPECT_TRUE(NavigateToURL(shell(), main_url)); + EXPECT_THAT(histogram_tester.GetTotalCountsForPrefix( + "Browser.Tabs.TotalSwitchDuration"), + IsEmpty()); FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) ->GetPrimaryFrameTree() @@ -397,12 +406,33 @@ GURL cross_site_url( embedded_test_server()->GetURL("foo.com", "/title2.html")); EXPECT_TRUE(NavigateToURLFromRenderer(root->child_at(0), cross_site_url)); + EXPECT_THAT(histogram_tester.GetTotalCountsForPrefix( + "Browser.Tabs.TotalSwitchDuration"), + IsEmpty()); auto* child_rwh_impl = root->child_at(0)->current_frame_host()->GetRenderWidgetHost(); // Hide the frame and make it visible again, to force it to record the // tab-switch time, which is generated from presentation-feedback. child_rwh_impl->WasHidden(); + + shell()->web_contents()->ForEachRenderFrameHost( + base::BindRepeating([](RenderFrameHost* rfh) { + auto* rwh_impl = + static_cast<RenderWidgetHostImpl*>(rfh->GetRenderWidgetHost()); + VisibleTimeRequestTrigger* trigger = + rwh_impl->GetVisibleTimeRequestTrigger(); + if (!trigger) + return; + blink::mojom::RecordContentToVisibleTimeRequestPtr request = + trigger->TakeRequest(); + ASSERT_FALSE(request && request->show_reason_tab_switching) + << "A pre-existing tab switch request will interfere with the " + "test. Request was created at:" + << std::endl + << trigger->TakeLastUpdateRequestStackTrace().value(); + })); + child_rwh_impl->WasShown(blink::mojom::RecordContentToVisibleTimeRequest::New( base::TimeTicks::Now(), /* destination_is_loaded */ true, @@ -417,7 +447,13 @@ GiveItSomeTime(); } while (histogram_tester .GetTotalCountsForPrefix("Browser.Tabs.TotalSwitchDuration") - .size() != 1); + .size() < 1); + + // The test only creates a single ContentToVisibleTimeRequest, so only one + // Browser.Tabs.TotalSwitchDuration histogram should be logged. + EXPECT_THAT(histogram_tester.GetTotalCountsForPrefix( + "Browser.Tabs.TotalSwitchDuration"), + SizeIs(1)); } // Auto-resize is only implemented for Ash and GuestViews. So we need to inject
diff --git a/content/browser/renderer_host/visible_time_request_trigger.cc b/content/browser/renderer_host/visible_time_request_trigger.cc index 21e6f86..4a508933 100644 --- a/content/browser/renderer_host/visible_time_request_trigger.cc +++ b/content/browser/renderer_host/visible_time_request_trigger.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include <utility> +#include "base/debug/stack_trace.h" #include "base/feature_list.h" #include "base/time/time.h" #include "third_party/blink/public/common/features.h" @@ -56,6 +57,7 @@ bool show_reason_tab_switching, bool show_reason_unoccluded, bool show_reason_bfcache_restore) { + last_update_request_stack_trace_ = base::debug::StackTrace(); auto new_request = blink::mojom::RecordContentToVisibleTimeRequest::New( start_time, destination_is_loaded, show_reason_tab_switching, show_reason_unoccluded, show_reason_bfcache_restore);
diff --git a/content/browser/renderer_host/visible_time_request_trigger.h b/content/browser/renderer_host/visible_time_request_trigger.h index c6d776b..8a6529c 100644 --- a/content/browser/renderer_host/visible_time_request_trigger.h +++ b/content/browser/renderer_host/visible_time_request_trigger.h
@@ -5,7 +5,11 @@ #ifndef CONTENT_BROWSER_RENDERER_HOST_VISIBLE_TIME_REQUEST_TRIGGER_H_ #define CONTENT_BROWSER_RENDERER_HOST_VISIBLE_TIME_REQUEST_TRIGGER_H_ +#include <utility> + +#include "base/debug/stack_trace.h" #include "content/common/content_export.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/mojom/widget/record_content_to_visible_time_request.mojom.h" namespace base { @@ -79,11 +83,23 @@ return is_tab_switch_metrics2_feature_enabled_; } + // Returns the stack trace where UpdateRequest was last called, or nullopt if + // it was never called. + absl::optional<base::debug::StackTrace> TakeLastUpdateRequestStackTrace() { + return std::move(last_update_request_stack_trace_); + } + private: // The last visible event start request. This should only be set and // retrieved using UpdateRequest and TakeRequest. blink::mojom::RecordContentToVisibleTimeRequestPtr last_request_; + // Stack trace where `last_request_` was set. + // TODO(crbug.com/1270981): Remove this once the test flake in + // RenderWidgetHostViewChildFrameBrowserTest.PresentationFeedback is + // diagnosed. + absl::optional<base::debug::StackTrace> last_update_request_stack_trace_; + bool is_tab_switch_metrics2_feature_enabled_; };
diff --git a/content/browser/site_per_process_unload_browsertest.cc b/content/browser/site_per_process_unload_browsertest.cc index a758b6e..53ac3a6cd 100644 --- a/content/browser/site_per_process_unload_browsertest.cc +++ b/content/browser/site_per_process_unload_browsertest.cc
@@ -1339,10 +1339,17 @@ delete_B1.WaitUntilDeleted(); } +#if defined(OS_LINUX) && defined(THREAD_SANITIZER) +// See crbug.com/1275848. +#define MAYBE_NestedSubframeWithUnloadHandler \ + DISABLED_NestedSubframeWithUnloadHandler +#else +#define MAYBE_NestedSubframeWithUnloadHandler NestedSubframeWithUnloadHandler +#endif // After a same-origin iframe navigation, check that gradchild iframe are // properly deleted and their unload handler executed. IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, - NestedSubframeWithUnloadHandler) { + MAYBE_NestedSubframeWithUnloadHandler) { GURL main_url = embedded_test_server()->GetURL( "a.com", "/cross_site_iframe_factory.html?a(b(b,c))"); GURL iframe_new_url = embedded_test_server()->GetURL("b.com", "/title1.html");
diff --git a/content/browser/utility_process_sandbox_browsertest.cc b/content/browser/utility_process_sandbox_browsertest.cc index 1ac57ee..f1b00959 100644 --- a/content/browser/utility_process_sandbox_browsertest.cc +++ b/content/browser/utility_process_sandbox_browsertest.cc
@@ -122,6 +122,7 @@ case Sandbox::kAudio: #if BUILDFLAG(IS_CHROMEOS_ASH) + case Sandbox::kHardwareVideoDecoding: case Sandbox::kIme: case Sandbox::kTts: #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
diff --git a/content/browser/utility_sandbox_delegate.cc b/content/browser/utility_sandbox_delegate.cc index bacb631..87f200b 100644 --- a/content/browser/utility_sandbox_delegate.cc +++ b/content/browser/utility_sandbox_delegate.cc
@@ -65,6 +65,7 @@ sandbox_type_ == sandbox::mojom::Sandbox::kVideoCapture || #endif #if BUILDFLAG(IS_CHROMEOS_ASH) + sandbox_type_ == sandbox::mojom::Sandbox::kHardwareVideoDecoding || sandbox_type_ == sandbox::mojom::Sandbox::kIme || sandbox_type_ == sandbox::mojom::Sandbox::kTts || #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) @@ -102,6 +103,7 @@ // process upon startup. if (sandbox_type_ == sandbox::mojom::Sandbox::kNetwork || #if BUILDFLAG(IS_CHROMEOS_ASH) + sandbox_type_ == sandbox::mojom::Sandbox::kHardwareVideoDecoding || sandbox_type_ == sandbox::mojom::Sandbox::kIme || sandbox_type_ == sandbox::mojom::Sandbox::kTts || #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc index d3dc277..d0d8309 100644 --- a/content/browser/web_contents/web_contents_impl_browsertest.cc +++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -4699,21 +4699,19 @@ EXPECT_EQ( expected_rect.x(), EvalJs(web_contents, - "navigator.windowControlsOverlay.getBoundingClientRect().x")); + "navigator.windowControlsOverlay.getTitlebarAreaRect().x")); EXPECT_EQ( expected_rect.y(), EvalJs(web_contents, - "navigator.windowControlsOverlay.getBoundingClientRect().y")); + "navigator.windowControlsOverlay.getTitlebarAreaRect().y")); EXPECT_EQ( expected_rect.width(), - EvalJs( - web_contents, - "navigator.windowControlsOverlay.getBoundingClientRect().width")); + EvalJs(web_contents, + "navigator.windowControlsOverlay.getTitlebarAreaRect().width")); EXPECT_EQ( expected_rect.height(), - EvalJs( - web_contents, - "navigator.windowControlsOverlay.getBoundingClientRect().height")); + EvalJs(web_contents, + "navigator.windowControlsOverlay.getTitlebarAreaRect().height")); // When the overlay is not visible, the environment variables should be // undefined, and the the fallback value should be used.
diff --git a/content/browser/webid/idp_network_request_manager.cc b/content/browser/webid/idp_network_request_manager.cc index 4b0e11f5..c64726f0 100644 --- a/content/browser/webid/idp_network_request_manager.cc +++ b/content/browser/webid/idp_network_request_manager.cc
@@ -234,9 +234,11 @@ idp_well_known_callback_ = std::move(callback); - const url::Origin& idp_origin = url::Origin::Create(provider_); + // TODO(yigu): Using .well-known in sub-directory (non-root) is common for multi-tenancy. However, + // this may be an invalid use of .well-known and we should enforce it to be under root. + // https://crbug.com/1277712. GURL target_url = - idp_origin.GetURL().Resolve(IdpNetworkRequestManager::kWellKnownFilePath); + provider_.Resolve(IdpNetworkRequestManager::kWellKnownFilePath); url_loader_ = CreateUncredentialedUrlLoader(target_url);
diff --git a/content/test/data/accessibility/aria/aria-empty-string-expected-blink.txt b/content/test/data/accessibility/aria/aria-empty-string-expected-blink.txt index f5d6531..6028f03 100644 --- a/content/test/data/accessibility/aria/aria-empty-string-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-empty-string-expected-blink.txt
@@ -26,4 +26,3 @@ ++++++grid ++++++++columnHeader name='Sort undefined' ++++++group name='Hidden undefined, display block' -++++++genericContainer ignored invisible
diff --git a/content/test/data/accessibility/aria/aria-hidden-expected-blink.txt b/content/test/data/accessibility/aria/aria-hidden-expected-blink.txt index 03448c0a..eec655e 100644 --- a/content/test/data/accessibility/aria/aria-hidden-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-hidden-expected-blink.txt
@@ -5,18 +5,14 @@ ++++++++staticText name='blockDisplay' ++++++++++inlineTextBox name='blockDisplay' ++++++genericContainer ignored invisible -++++++++staticText ignored name='noneDisplay' ++++++genericContainer ignored invisible isLineBreakingObject=true ++++++++staticText ignored invisible name='blockDisplay Hiddentrue' ++++++genericContainer ignored invisible -++++++++staticText ignored invisible name='noneDisplay Hiddentrue' ++++++genericContainer isLineBreakingObject=true ++++++++staticText name='blockDisplay Hiddenfalse' ++++++++++inlineTextBox name='blockDisplay Hiddenfalse' ++++++genericContainer invisible -++++++++staticText ignored name='noneDisplay Hiddenfalse' ++++++genericContainer invisible name='blockDisplay Hiddentruefocusable' isLineBreakingObject=true ++++++++staticText ignored invisible name='blockDisplay Hiddentruefocusable' ++++++genericContainer ignored invisible ++++++++heading invisible name='noneDisplayParent Hiddenfalse' isLineBreakingObject=true -++++++++++staticText ignored name='noneDisplayParent Hiddenfalse'
diff --git a/content/test/data/accessibility/aria/aria-hidden-single-descendant-display-none-expected-blink.txt b/content/test/data/accessibility/aria/aria-hidden-single-descendant-display-none-expected-blink.txt index 7078e3a9..22a0c68 100644 --- a/content/test/data/accessibility/aria/aria-hidden-single-descendant-display-none-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-hidden-single-descendant-display-none-expected-blink.txt
@@ -1,11 +1,5 @@ rootWebArea ++genericContainer ignored ++++genericContainer ignored -++++++genericContainer ignored invisible -++++++++genericContainer ignored invisible -++++++++++button ignored invisible -++++++++++++staticText ignored invisible name='expect invisible subtree' -++++++++genericContainer invisible -++++++++++button ignored invisible -++++++++++++staticText ignored name='expect invisible subtree' +++++++genericContainer invisible ++++++group name='Done'
diff --git a/content/test/data/accessibility/aria/aria-hidden-single-descendant-visibility-hidden-expected-blink.txt b/content/test/data/accessibility/aria/aria-hidden-single-descendant-visibility-hidden-expected-blink.txt index 53661824..4acbc03 100644 --- a/content/test/data/accessibility/aria/aria-hidden-single-descendant-visibility-hidden-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-hidden-single-descendant-visibility-hidden-expected-blink.txt
@@ -6,8 +6,6 @@ ++++++++++button ignored invisible ++++++++++++staticText ignored invisible name='expect invisible subtree' ++++++++genericContainer invisible -++++++++++button ignored invisible -++++++++++++staticText ignored invisible name='expect invisible subtree' ++++++++genericContainer ignored invisible ++++++++++button invisible name='expect invisible subtree' ++++++++++++staticText ignored invisible name='expect invisible subtree'
diff --git a/content/test/data/accessibility/aria/aria-owns-crash-expected-blink.txt b/content/test/data/accessibility/aria/aria-owns-crash-expected-blink.txt index 4a8ba7c8..4ad6e7d 100644 --- a/content/test/data/accessibility/aria/aria-owns-crash-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-owns-crash-expected-blink.txt
@@ -4,11 +4,9 @@ ++++++genericContainer ignored invisible ++++++++genericContainer ignored invisible ++++++++++comboBoxGrouping ignored invisible -++++++++++++textField ignored invisible -++++++++++++++genericContainer ignored invisible +++++++++++++genericContainer ignored invisible ++++++++++++listBox ignored invisible ++++++++++++++none ignored invisible ++++++++++++++++none ignored invisible ++++++++++++++++++staticText ignored name='%E2%80%A2 ' -++++++++++++++++staticText ignored invisible name='Test' ++++++++genericContainer ignored invisible
diff --git a/content/test/data/accessibility/aria/aria-undefined-expected-blink.txt b/content/test/data/accessibility/aria/aria-undefined-expected-blink.txt index 868c386f..9e8e941 100644 --- a/content/test/data/accessibility/aria/aria-undefined-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-undefined-expected-blink.txt
@@ -26,4 +26,3 @@ ++++++grid ++++++++columnHeader name='Sort undefined' ++++++group name='Hidden undefined, display block' -++++++genericContainer ignored invisible
diff --git a/content/test/data/accessibility/aria/aria-undefined-literal-expected-blink.txt b/content/test/data/accessibility/aria/aria-undefined-literal-expected-blink.txt index 1cccaa1..f597f927 100644 --- a/content/test/data/accessibility/aria/aria-undefined-literal-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-undefined-literal-expected-blink.txt
@@ -26,4 +26,3 @@ ++++++grid ++++++++columnHeader name='Sort undefined' ++++++group name='Hidden undefined, display block' -++++++genericContainer ignored invisible
diff --git a/content/test/data/accessibility/aria/hidden-described-by-expected-blink.txt b/content/test/data/accessibility/aria/hidden-described-by-expected-blink.txt index 76a3b424..15814f6 100644 --- a/content/test/data/accessibility/aria/hidden-described-by-expected-blink.txt +++ b/content/test/data/accessibility/aria/hidden-described-by-expected-blink.txt
@@ -3,8 +3,7 @@ ++++genericContainer ignored ++++++genericContainer ignored ++++++++genericContainer ignored invisible +++++++++genericContainer description='span-A4' name='span-A3' descriptionFrom=relatedElement ++++++++++genericContainer ignored invisible -++++++++++genericContainer description='span-A4' name='span-A3' descriptionFrom=relatedElement -++++++++++++genericContainer ignored invisible ++++++++genericContainer description='span-A2' name='span-B' descriptionFrom=relatedElement ++++++++genericContainer name='span-C'
diff --git a/content/test/data/accessibility/aria/hidden-expected-blink.txt b/content/test/data/accessibility/aria/hidden-expected-blink.txt index fca90d2..66c13fbc 100644 --- a/content/test/data/accessibility/aria/hidden-expected-blink.txt +++ b/content/test/data/accessibility/aria/hidden-expected-blink.txt
@@ -2,7 +2,5 @@ ++genericContainer ignored ++++genericContainer ignored ++++++genericContainer ignored -++++++++genericContainer ignored invisible -++++++++++genericContainer ignored invisible ++++++++genericContainer description='b' ++++++++genericContainer description='c'
diff --git a/content/test/data/accessibility/aria/hidden-labelled-by-expected-blink.txt b/content/test/data/accessibility/aria/hidden-labelled-by-expected-blink.txt index 143e6971..a865ea0 100644 --- a/content/test/data/accessibility/aria/hidden-labelled-by-expected-blink.txt +++ b/content/test/data/accessibility/aria/hidden-labelled-by-expected-blink.txt
@@ -3,8 +3,7 @@ ++++genericContainer ignored ++++++genericContainer ignored ++++++++genericContainer ignored invisible +++++++++group name='span-A4' ++++++++++genericContainer ignored invisible -++++++++++group name='span-A4' -++++++++++++genericContainer ignored invisible ++++++++group name='span-A2' ++++++++genericContainer name='span-C'
diff --git a/content/test/data/accessibility/aria/table-column-hidden-expected-blink.txt b/content/test/data/accessibility/aria/table-column-hidden-expected-blink.txt index 04612b2a..93c34fd 100644 --- a/content/test/data/accessibility/aria/table-column-hidden-expected-blink.txt +++ b/content/test/data/accessibility/aria/table-column-hidden-expected-blink.txt
@@ -11,7 +11,6 @@ ++++++++++++++staticText name='Day' ++++++++++++++++inlineTextBox name='Day' ++++++++++++columnHeader ignored invisible -++++++++++++++staticText ignored name='Year' ++++++++++++columnHeader name='Weather' ariaCellColumnIndex=5 ariaCellRowIndex=2 ++++++++++++++staticText name='Weather' ++++++++++++++++inlineTextBox name='Weather' @@ -23,7 +22,6 @@ ++++++++++++++staticText name='01' ++++++++++++++++inlineTextBox name='01' ++++++++++++cell ignored invisible -++++++++++++++staticText ignored name='2017' ++++++++++++cell name='Sunny' ariaCellColumnIndex=5 ariaCellRowIndex=3 ++++++++++++++staticText name='Sunny' ++++++++++++++++inlineTextBox name='Sunny' @@ -35,7 +33,6 @@ ++++++++++++++staticText name='02' ++++++++++++++++inlineTextBox name='02' ++++++++++++cell ignored invisible -++++++++++++++staticText ignored name='2017' ++++++++++++cell name='Rainy' ariaCellColumnIndex=5 ariaCellRowIndex=4 ++++++++++++++staticText name='Rainy' ++++++++++++++++inlineTextBox name='Rainy'
diff --git a/content/test/data/accessibility/css/alt-text-expected-blink.txt b/content/test/data/accessibility/css/alt-text-expected-blink.txt index d7637699..d8b9c9e7 100644 --- a/content/test/data/accessibility/css/alt-text-expected-blink.txt +++ b/content/test/data/accessibility/css/alt-text-expected-blink.txt
@@ -58,7 +58,6 @@ ++++++++++staticText name='Some Text' ++++++++++++inlineTextBox name='Some Text' ++++++image name='alt' -++++++++staticText ignored name='Div text content' ++++++genericContainer ++++++++staticText name='DOM Text' ++++++++++inlineTextBox name='DOM Text'
diff --git a/content/test/data/accessibility/css/content-visibility-auto-aria-hidden-expected-blink.txt b/content/test/data/accessibility/css/content-visibility-auto-aria-hidden-expected-blink.txt index 5f95011..42459b5 100644 --- a/content/test/data/accessibility/css/content-visibility-auto-aria-hidden-expected-blink.txt +++ b/content/test/data/accessibility/css/content-visibility-auto-aria-hidden-expected-blink.txt
@@ -2,7 +2,5 @@ ++genericContainer ignored ++++genericContainer ignored ++++++genericContainer -++++++++genericContainer ignored invisible -++++++++++staticText ignored invisible name='aria-hidden' ++++++++genericContainer ++++++++++staticText name='Not hidden'
diff --git a/content/test/data/accessibility/css/content-visibility-hidden-check-failure-expected-blink.txt b/content/test/data/accessibility/css/content-visibility-hidden-check-failure-expected-blink.txt index 90377f5..b3d9221 100644 --- a/content/test/data/accessibility/css/content-visibility-hidden-check-failure-expected-blink.txt +++ b/content/test/data/accessibility/css/content-visibility-hidden-check-failure-expected-blink.txt
@@ -1,4 +1,2 @@ rootWebArea ++genericContainer ignored invisible -++++genericContainer ignored invisible -++++++staticText ignored invisible name='<newline>'
diff --git a/content/test/data/accessibility/css/content-visibility-to-hidden-expected-blink.txt b/content/test/data/accessibility/css/content-visibility-to-hidden-expected-blink.txt index c8bdd7a..39204e04 100644 --- a/content/test/data/accessibility/css/content-visibility-to-hidden-expected-blink.txt +++ b/content/test/data/accessibility/css/content-visibility-to-hidden-expected-blink.txt
@@ -3,10 +3,5 @@ ++++genericContainer ignored ++++++genericContainer ++++++++group className='hidden' name='Label' -++++++++++staticText ignored invisible name='<newline> target<newline> ' ++++++++++genericContainer ignored invisible -++++++++++++staticText ignored invisible name='<newline> child<newline> ' -++++++++++staticText ignored invisible name='<newline> ' ++++++++++genericContainer ignored invisible -++++++++++++staticText ignored invisible name='Label' -++++++++++staticText ignored invisible name='<newline> '
diff --git a/content/test/data/accessibility/css/display-none-expected-blink.txt b/content/test/data/accessibility/css/display-none-expected-blink.txt index 0e404a65..2306e8e 100644 --- a/content/test/data/accessibility/css/display-none-expected-blink.txt +++ b/content/test/data/accessibility/css/display-none-expected-blink.txt
@@ -2,7 +2,3 @@ ++genericContainer ignored ++++genericContainer ignored ++++++genericContainer ignored invisible -++++++++link ignored invisible -++++++++++staticText ignored name='One' -++++++++link ignored invisible -++++++++++staticText ignored name='Two'
diff --git a/content/test/data/accessibility/css/dom-element-css-alternative-text-expected-blink.txt b/content/test/data/accessibility/css/dom-element-css-alternative-text-expected-blink.txt index df9e939..c1e4fc7 100644 --- a/content/test/data/accessibility/css/dom-element-css-alternative-text-expected-blink.txt +++ b/content/test/data/accessibility/css/dom-element-css-alternative-text-expected-blink.txt
@@ -2,4 +2,3 @@ ++genericContainer ignored ++++genericContainer ++++++image name='alternative text' -++++++++staticText ignored name='DOM text'
diff --git a/content/test/data/accessibility/css/marker-crash-without-layout-ng-block-frag-expected-blink.txt b/content/test/data/accessibility/css/marker-crash-without-layout-ng-block-frag-expected-blink.txt deleted file mode 100644 index 5e555ab..0000000 --- a/content/test/data/accessibility/css/marker-crash-without-layout-ng-block-frag-expected-blink.txt +++ /dev/null
@@ -1,7 +0,0 @@ -rootWebArea -++genericContainer ignored -++++genericContainer ignored -++++++group -++++++++listMarker name='%E2%80%A2 ' -++++++genericContainer ignored -++++++++genericContainer ignored
diff --git a/content/test/data/accessibility/css/marker-crash-without-layout-ng-block-frag.html b/content/test/data/accessibility/css/marker-crash-without-layout-ng-block-frag.html deleted file mode 100644 index 259ccac..0000000 --- a/content/test/data/accessibility/css/marker-crash-without-layout-ng-block-frag.html +++ /dev/null
@@ -1,7 +0,0 @@ -<!-- Avoid a crash caused by adding pseudo element content in two places. - See AXNodeObject::CanAddLayoutChild(). https://crbug.com/1172038 --> -<style> -span:before { display: inherit; content: ""; -webkit-column-count: 1; } -</style> -<span role="group" style="display: list-item"></span> -<span class="empty"></span>
diff --git a/content/test/data/accessibility/css/visibility-expected-blink.txt b/content/test/data/accessibility/css/visibility-expected-blink.txt index 8fe462a2..55fa839 100644 --- a/content/test/data/accessibility/css/visibility-expected-blink.txt +++ b/content/test/data/accessibility/css/visibility-expected-blink.txt
@@ -2,10 +2,8 @@ ++genericContainer ignored ++++genericContainer ignored ++++++paragraph ignored invisible -++++++++staticText ignored invisible name='Hidden paragraph with ' ++++++++staticText name='visible link' ++++++++++inlineTextBox name='visible link' ++++++paragraph ignored invisible -++++++++staticText ignored invisible name='Collapsed paragraph with ' ++++++++staticText name='visible link' ++++++++++inlineTextBox name='visible link' \ No newline at end of file
diff --git a/content/test/data/accessibility/css/visibility-to-hidden-expected-blink.txt b/content/test/data/accessibility/css/visibility-to-hidden-expected-blink.txt index 5a76ffe..46cbb387 100644 --- a/content/test/data/accessibility/css/visibility-to-hidden-expected-blink.txt +++ b/content/test/data/accessibility/css/visibility-to-hidden-expected-blink.txt
@@ -5,7 +5,6 @@ ++++++++staticText name='Cats ' ++++++++++inlineTextBox name='Cats ' ++++++++genericContainer ignored invisible -++++++++++checkBox ignored invisible ++++++++genericContainer ++++++++++staticText name='done' ++++++++++++inlineTextBox name='done'
diff --git a/content/test/data/accessibility/display-locking/all-expected-blink.txt b/content/test/data/accessibility/display-locking/all-expected-blink.txt index 1598c7d..758d45a 100644 --- a/content/test/data/accessibility/display-locking/all-expected-blink.txt +++ b/content/test/data/accessibility/display-locking/all-expected-blink.txt
@@ -16,10 +16,8 @@ ++++++++staticText offscreen name='normal text 1' ++++++++++inlineTextBox offscreen name='normal text 1' ++++++++genericContainer offscreen -++++++++++staticText ignored invisible offscreen name='<newline> nested non-viewport-activatable locked element will not be in AX tree<newline> ' ++++++++staticText offscreen name='normal text 2' ++++++++++inlineTextBox offscreen name='normal text 2' ++++++++genericContainer offscreen -++++++++++staticText ignored invisible offscreen name='<newline> nested non-activatable locked element will not be in AX tree<newline> ' ++++++++staticText offscreen name='normal text 3' ++++++++++inlineTextBox offscreen name='normal text 3'
diff --git a/content/test/data/accessibility/display-locking/non-activatable-expected-blink.txt b/content/test/data/accessibility/display-locking/non-activatable-expected-blink.txt index 52c3e76..e7f6fda9 100644 --- a/content/test/data/accessibility/display-locking/non-activatable-expected-blink.txt +++ b/content/test/data/accessibility/display-locking/non-activatable-expected-blink.txt
@@ -3,13 +3,5 @@ ++++genericContainer ignored ++++++genericContainer ignored ++++++++genericContainer -++++++++++staticText ignored invisible name='<newline> ' ++++++++++genericContainer ignored invisible -++++++++++++staticText ignored invisible name='child' -++++++++++staticText ignored invisible name='<newline> ' ++++++++++genericContainer ignored invisible -++++++++++++staticText ignored invisible name='nested locked element!' -++++++++++staticText ignored invisible name='<newline> ' -++++++++++genericContainer ignored invisible -++++++++++++staticText ignored invisible name='activatable locked element' -++++++++++staticText ignored invisible name='<newline> '
diff --git a/content/test/data/accessibility/event/add-dialog-described-by-expected-uia-win.txt b/content/test/data/accessibility/event/add-dialog-described-by-expected-uia-win.txt index aabb8f5..01f26d4 100644 --- a/content/test/data/accessibility/event/add-dialog-described-by-expected-uia-win.txt +++ b/content/test/data/accessibility/event/add-dialog-described-by-expected-uia-win.txt
@@ -4,4 +4,5 @@ IsDataValidForForm changed on role=textbox Level changed on role=heading, name=Described by dialog title StructureChanged/ChildAdded on role=dialog -StructureChanged/ChildrenReordered on role=document +StructureChanged/ChildrenReordered on role=dialog +StructureChanged/ChildrenReordered on role=document \ No newline at end of file
diff --git a/content/test/data/accessibility/event/add-dialog-described-by-expected-uia-win7.txt b/content/test/data/accessibility/event/add-dialog-described-by-expected-uia-win7.txt index 1486541..e44a487 100644 --- a/content/test/data/accessibility/event/add-dialog-described-by-expected-uia-win7.txt +++ b/content/test/data/accessibility/event/add-dialog-described-by-expected-uia-win7.txt
@@ -3,4 +3,5 @@ AriaProperties changed on role=textbox IsDataValidForForm changed on role=textbox StructureChanged/ChildAdded on role=dialog -StructureChanged/ChildrenReordered on role=document +StructureChanged/ChildrenReordered on role=dialog +StructureChanged/ChildrenReordered on role=document \ No newline at end of file
diff --git a/content/test/data/accessibility/event/add-dialog-described-by-expected-win.txt b/content/test/data/accessibility/event/add-dialog-described-by-expected-win.txt index 8753b829..ae01d624 100644 --- a/content/test/data/accessibility/event/add-dialog-described-by-expected-win.txt +++ b/content/test/data/accessibility/event/add-dialog-described-by-expected-win.txt
@@ -1,3 +1,4 @@ EVENT_OBJECT_REORDER on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE +EVENT_OBJECT_REORDER on <div> role=ROLE_SYSTEM_GROUPING EVENT_OBJECT_SHOW on <div#described-by-dialog> role=ROLE_SYSTEM_DIALOG -IA2_EVENT_TEXT_INSERTED on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE new_text={'<obj>' start=0 end=1} +IA2_EVENT_TEXT_INSERTED on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE new_text={'<obj>' start=0 end=1} \ No newline at end of file
diff --git a/content/test/data/accessibility/event/add-dialog-expected-uia-win.txt b/content/test/data/accessibility/event/add-dialog-expected-uia-win.txt index b4cf0924..901b0769 100644 --- a/content/test/data/accessibility/event/add-dialog-expected-uia-win.txt +++ b/content/test/data/accessibility/event/add-dialog-expected-uia-win.txt
@@ -4,4 +4,5 @@ IsDataValidForForm changed on role=textbox Level changed on role=heading, name=Dialog title StructureChanged/ChildAdded on role=dialog, name=Dialog title -StructureChanged/ChildrenReordered on role=document +StructureChanged/ChildrenReordered on role=dialog, name=Dialog title +StructureChanged/ChildrenReordered on role=document \ No newline at end of file
diff --git a/content/test/data/accessibility/event/add-dialog-expected-uia-win7.txt b/content/test/data/accessibility/event/add-dialog-expected-uia-win7.txt index 7905d6a..fd68ac3 100644 --- a/content/test/data/accessibility/event/add-dialog-expected-uia-win7.txt +++ b/content/test/data/accessibility/event/add-dialog-expected-uia-win7.txt
@@ -3,4 +3,5 @@ AriaProperties changed on role=textbox IsDataValidForForm changed on role=textbox StructureChanged/ChildAdded on role=dialog, name=Dialog title -StructureChanged/ChildrenReordered on role=document +StructureChanged/ChildrenReordered on role=dialog, name=Dialog title +StructureChanged/ChildrenReordered on role=document \ No newline at end of file
diff --git a/content/test/data/accessibility/event/add-dialog-expected-win.txt b/content/test/data/accessibility/event/add-dialog-expected-win.txt index 0c5f22d4..f59bb0f 100644 --- a/content/test/data/accessibility/event/add-dialog-expected-win.txt +++ b/content/test/data/accessibility/event/add-dialog-expected-win.txt
@@ -1,3 +1,4 @@ EVENT_OBJECT_REORDER on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE +EVENT_OBJECT_REORDER on <div> role=ROLE_SYSTEM_GROUPING EVENT_OBJECT_SHOW on <div#dialog> role=ROLE_SYSTEM_DIALOG name="Dialog title" -IA2_EVENT_TEXT_INSERTED on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE new_text={'<obj>' start=0 end=1} +IA2_EVENT_TEXT_INSERTED on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE new_text={'<obj>' start=0 end=1} \ No newline at end of file
diff --git a/content/test/data/accessibility/event/add-dialog-no-info-expected-uia-win.txt b/content/test/data/accessibility/event/add-dialog-no-info-expected-uia-win.txt index 4457fa2..aa6af83 100644 --- a/content/test/data/accessibility/event/add-dialog-no-info-expected-uia-win.txt +++ b/content/test/data/accessibility/event/add-dialog-no-info-expected-uia-win.txt
@@ -4,4 +4,5 @@ IsDataValidForForm changed on role=textbox Level changed on role=heading, name=Dialog title StructureChanged/ChildAdded on role=dialog -StructureChanged/ChildrenReordered on role=document +StructureChanged/ChildrenReordered on role=dialog +StructureChanged/ChildrenReordered on role=document \ No newline at end of file
diff --git a/content/test/data/accessibility/event/add-dialog-no-info-expected-uia-win7.txt b/content/test/data/accessibility/event/add-dialog-no-info-expected-uia-win7.txt index 6145419..2994b4da 100644 --- a/content/test/data/accessibility/event/add-dialog-no-info-expected-uia-win7.txt +++ b/content/test/data/accessibility/event/add-dialog-no-info-expected-uia-win7.txt
@@ -3,4 +3,5 @@ AriaProperties changed on role=textbox IsDataValidForForm changed on role=textbox StructureChanged/ChildAdded on role=dialog -StructureChanged/ChildrenReordered on role=document +StructureChanged/ChildrenReordered on role=dialog +StructureChanged/ChildrenReordered on role=document \ No newline at end of file
diff --git a/content/test/data/accessibility/event/add-dialog-no-info-expected-win.txt b/content/test/data/accessibility/event/add-dialog-no-info-expected-win.txt index b2352f24..321fad7 100644 --- a/content/test/data/accessibility/event/add-dialog-no-info-expected-win.txt +++ b/content/test/data/accessibility/event/add-dialog-no-info-expected-win.txt
@@ -1,3 +1,4 @@ EVENT_OBJECT_REORDER on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE +EVENT_OBJECT_REORDER on <div> role=ROLE_SYSTEM_GROUPING EVENT_OBJECT_SHOW on <div#no-info-dialog> role=ROLE_SYSTEM_DIALOG -IA2_EVENT_TEXT_INSERTED on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE new_text={'<obj>' start=0 end=1} +IA2_EVENT_TEXT_INSERTED on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE new_text={'<obj>' start=0 end=1} \ No newline at end of file
diff --git a/content/test/data/accessibility/event/aria-hidden-single-descendant-visibility-hidden-expected-auralinux.txt b/content/test/data/accessibility/event/aria-hidden-single-descendant-visibility-hidden-expected-auralinux.txt index e422ec16..fd41b9f 100644 --- a/content/test/data/accessibility/event/aria-hidden-single-descendant-visibility-hidden-expected-auralinux.txt +++ b/content/test/data/accessibility/event/aria-hidden-single-descendant-visibility-hidden-expected-auralinux.txt
@@ -1,6 +1,8 @@ CHILDREN-CHANGED:REMOVE index:0 CHILD:(role=ROLE_SECTION) role=ROLE_DOCUMENT_WEB ENABLED,FOCUSABLE,FOCUSED,SENSITIVE,SHOWING,VISIBLE === Start Continuation === CHILDREN-CHANGED:ADD index:0 CHILD:(role=ROLE_SECTION) role=ROLE_DOCUMENT_WEB ENABLED,FOCUSABLE,FOCUSED,SENSITIVE,SHOWING,VISIBLE +STATE-CHANGE:DEFUNCT:TRUE role=ROLE_INVALID name='(null)' DEFUNCT +STATE-CHANGE:DEFUNCT:TRUE role=ROLE_INVALID name='(null)' DEFUNCT === Start Continuation === CHILDREN-CHANGED:REMOVE index:1 CHILD:(role=ROLE_SECTION) role=ROLE_DOCUMENT_WEB ENABLED,FOCUSABLE,FOCUSED,SENSITIVE,SHOWING,VISIBLE PARENT-CHANGED PARENT:(role=ROLE_DOCUMENT_WEB name='(null)') role=ROLE_PUSH_BUTTON name='expect invisible subtree' ENABLED,FOCUSABLE,SENSITIVE
diff --git a/content/test/data/accessibility/html/accordion-expected-blink.txt b/content/test/data/accessibility/html/accordion-expected-blink.txt index d7822fa..ef4bc51b 100644 --- a/content/test/data/accessibility/html/accordion-expected-blink.txt +++ b/content/test/data/accessibility/html/accordion-expected-blink.txt
@@ -16,16 +16,12 @@ ++++++++++++staticText name='Accordion Section #2' ++++++++++++++inlineTextBox name='Accordion Section #2' ++++++region ignored invisible -++++++++paragraph ignored invisible -++++++++++staticText ignored name='Content for second section of accordion element.' ++++++heading name='Accordion Section #3' ++++++++button collapsed name='Accordion Section #3' controlsIds= ++++++++++paragraph ++++++++++++staticText name='Accordion Section #3' ++++++++++++++inlineTextBox name='Accordion Section #3' ++++++region ignored invisible -++++++++paragraph ignored invisible -++++++++++staticText ignored name='Content for third section of accordion element.' ++++++heading name='Accordion Section #4' ++++++++button expanded name='Accordion Section #4' restriction=disabled ++++++++++paragraph
diff --git a/content/test/data/accessibility/html/custom-element-expected-blink.txt b/content/test/data/accessibility/html/custom-element-expected-blink.txt index e4ba329..9f07f97e 100644 --- a/content/test/data/accessibility/html/custom-element-expected-blink.txt +++ b/content/test/data/accessibility/html/custom-element-expected-blink.txt
@@ -5,16 +5,8 @@ ++++++genericContainer ++++++++staticText name='a' ++++++++++inlineTextBox name='a' -++++++++genericContainer ignored invisible -++++++++++staticText ignored name='b' -++++++++genericContainer ignored invisible -++++++++++staticText ignored invisible name='c' ++++++splitter horizontal name='Inside custom element' ++++++genericContainer ignored ++++++++genericContainer ignored ++++++++++staticText name='a' -++++++++++++inlineTextBox name='a' -++++++++++genericContainer ignored invisible -++++++++++++staticText ignored name='b' -++++++++++genericContainer ignored invisible -++++++++++++staticText ignored invisible name='c' +++++++++++++inlineTextBox name='a' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/custom-element-hidden-expected-blink.txt b/content/test/data/accessibility/html/custom-element-hidden-expected-blink.txt index 9db06e2..b39a6d3 100644 --- a/content/test/data/accessibility/html/custom-element-hidden-expected-blink.txt +++ b/content/test/data/accessibility/html/custom-element-hidden-expected-blink.txt
@@ -2,7 +2,6 @@ ++genericContainer ignored htmlTag='html' ++++genericContainer htmlTag='body' ++++++genericContainer ignored invisible htmlTag='template' -++++++genericContainer ignored invisible htmlTag='div' -++++++++genericContainer ignored invisible htmlTag='my-element' -++++++++++genericContainer ignored invisible htmlTag='div' +++++++genericContainer ignored invisible htmlTag='my-element' +++++++++genericContainer ignored invisible htmlTag='div' ++++++button htmlTag='button' name='Done'
diff --git a/content/test/data/accessibility/html/custom-element-with-aria-owns-inside-expected-blink.txt b/content/test/data/accessibility/html/custom-element-with-aria-owns-inside-expected-blink.txt index acc84e90..571e9dd2 100644 --- a/content/test/data/accessibility/html/custom-element-with-aria-owns-inside-expected-blink.txt +++ b/content/test/data/accessibility/html/custom-element-with-aria-owns-inside-expected-blink.txt
@@ -10,6 +10,4 @@ ++++++++++++staticText name='Endnote 2' ++++++++++++++inlineTextBox name='Endnote 2' ++++++++button ignored invisible -++++++++++staticText ignored name='1' -++++++++button ignored invisible -++++++++++staticText ignored name='2' +++++++++button ignored invisible \ No newline at end of file
diff --git a/content/test/data/accessibility/html/details-expected-blink.txt b/content/test/data/accessibility/html/details-expected-blink.txt index 30bb0ac..742e8504 100644 --- a/content/test/data/accessibility/html/details-expected-blink.txt +++ b/content/test/data/accessibility/html/details-expected-blink.txt
@@ -12,7 +12,6 @@ ++++++++++staticText ignored invisible name='<newline> ' ++++++++++staticText ignored invisible name='<newline> ' ++++++++++paragraph ignored invisible -++++++++++++staticText ignored invisible name='The details tag specifies additional details that the user can view or hide on demand.' ++++++++++staticText ignored invisible name='<newline> ' ++++++details ++++++++genericContainer ignored
diff --git a/content/test/data/accessibility/html/generated-content-after-hidden-input-expected-blink.txt b/content/test/data/accessibility/html/generated-content-after-hidden-input-expected-blink.txt index 4a5c3dd..b1bdc71 100644 --- a/content/test/data/accessibility/html/generated-content-after-hidden-input-expected-blink.txt +++ b/content/test/data/accessibility/html/generated-content-after-hidden-input-expected-blink.txt
@@ -2,8 +2,7 @@ ++genericContainer ignored ++++genericContainer ignored ++++++paragraph -++++++++textField ignored invisible -++++++++++genericContainer ignored invisible +++++++++genericContainer ignored invisible ++++++++genericContainer ignored ++++++++++staticText name='*' ++++++++++++inlineTextBox name='*'
diff --git a/content/test/data/accessibility/html/iframe-with-invalid-children-added-expected-blink.txt b/content/test/data/accessibility/html/iframe-with-invalid-children-added-expected-blink.txt index f15eb2f..b4ab399 100644 --- a/content/test/data/accessibility/html/iframe-with-invalid-children-added-expected-blink.txt +++ b/content/test/data/accessibility/html/iframe-with-invalid-children-added-expected-blink.txt
@@ -12,4 +12,3 @@ ++++++++labelText ignored ++++++++++staticText ignored name='label' ++++++++++textField ignored -++++++++++++genericContainer ignored
diff --git a/content/test/data/accessibility/html/input-list-expected-blink.txt b/content/test/data/accessibility/html/input-list-expected-blink.txt index 1af4800..199de31 100644 --- a/content/test/data/accessibility/html/input-list-expected-blink.txt +++ b/content/test/data/accessibility/html/input-list-expected-blink.txt
@@ -11,3 +11,4 @@ ++++++++++++listItem ignored invisible ++++++++++++++listMarker ignored invisible ++++++++++++++++staticText ignored invisible name='%E2%96%BE' +++++++genericContainer ignored invisible
diff --git a/content/test/data/accessibility/html/input-suggestions-source-element-expected-blink.txt b/content/test/data/accessibility/html/input-suggestions-source-element-expected-blink.txt index 21a8bf9..1a2d375c 100644 --- a/content/test/data/accessibility/html/input-suggestions-source-element-expected-blink.txt +++ b/content/test/data/accessibility/html/input-suggestions-source-element-expected-blink.txt
@@ -8,3 +8,4 @@ ++++++++++listItem ignored invisible ++++++++++++listMarker ignored invisible ++++++++++++++staticText ignored invisible name='%E2%96%BE' +++++++genericContainer ignored invisible
diff --git a/content/test/data/accessibility/html/landmark-expected-blink.txt b/content/test/data/accessibility/html/landmark-expected-blink.txt index 8ec3792..f87fadc2 100644 --- a/content/test/data/accessibility/html/landmark-expected-blink.txt +++ b/content/test/data/accessibility/html/landmark-expected-blink.txt
@@ -75,7 +75,6 @@ ++++++++++++++inlineTextBox name='Details' ++++++++genericContainer ignored ++++++++++headerAsNonLandmark ignored invisible -++++++++++++staticText ignored invisible name='This should NOT header role.' ++++++group ++++++++headerAsNonLandmark ++++++++++staticText name='This should NOT have banner role.' @@ -129,8 +128,6 @@ ++++++++++++++inlineTextBox name='Details' ++++++++genericContainer ignored ++++++++++genericContainer ignored invisible -++++++++++++headerAsNonLandmark ignored invisible -++++++++++++++staticText ignored invisible name='This should NOT header role.' ++++++group ++++++++genericContainer ignored ++++++++++headerAsNonLandmark @@ -183,7 +180,6 @@ ++++++++++++++inlineTextBox name='Details' ++++++++genericContainer ignored ++++++++++footerAsNonLandmark ignored invisible -++++++++++++staticText ignored invisible name='This should NOT footer role.' ++++++group ++++++++footerAsNonLandmark ++++++++++staticText name='This should NOT have footer role.' @@ -237,8 +233,6 @@ ++++++++++++++inlineTextBox name='Details' ++++++++genericContainer ignored ++++++++++genericContainer ignored invisible -++++++++++++footerAsNonLandmark ignored invisible -++++++++++++++staticText ignored invisible name='This should NOT footer role.' ++++++group ++++++++genericContainer ignored ++++++++++footerAsNonLandmark
diff --git a/content/test/data/accessibility/html/meter-expected-blink.txt b/content/test/data/accessibility/html/meter-expected-blink.txt index 3396f991..62121ec 100644 --- a/content/test/data/accessibility/html/meter-expected-blink.txt +++ b/content/test/data/accessibility/html/meter-expected-blink.txt
@@ -5,4 +5,3 @@ ++++++++genericContainer ++++++++++genericContainer ++++++++++++genericContainer ignored -++++++++genericContainer ignored invisible
diff --git a/content/test/data/accessibility/html/modal-dialog-closed-expected-blink.txt b/content/test/data/accessibility/html/modal-dialog-closed-expected-blink.txt index 8b65e57..167f94a 100644 --- a/content/test/data/accessibility/html/modal-dialog-closed-expected-blink.txt +++ b/content/test/data/accessibility/html/modal-dialog-closed-expected-blink.txt
@@ -4,8 +4,6 @@ ++++++staticText name='Test that elements respawn in the accessibility tree after a modal dialog closes.' ++++++++inlineTextBox name='Test that elements respawn in the accessibility tree after a modal dialog closes.' ++++++section -++++++++dialog ignored invisible -++++++++++staticText ignored name='This dialog is closed and should not be in the tree' ++++++++popUpButton collapsed value='This should be in the tree.' haspopup=menu ++++++++++menuListPopup invisible ++++++++++++menuListOption name='This should be in the tree.' selected=true
diff --git a/content/test/data/accessibility/html/modal-dialog-stack-expected-blink.txt b/content/test/data/accessibility/html/modal-dialog-stack-expected-blink.txt index c9779a5..e46b504b 100644 --- a/content/test/data/accessibility/html/modal-dialog-stack-expected-blink.txt +++ b/content/test/data/accessibility/html/modal-dialog-stack-expected-blink.txt
@@ -3,11 +3,9 @@ ++++genericContainer ignored invisible ++++++section ignored invisible ++++++++dialog ignored invisible -++++++++++staticText ignored name='<newline> This was the top dialog and should be marked ignored in the tree.<newline> ' ++++++++menuListPopup ignored invisible ++++++++++menuListOption ignored ++++++dialog ignored invisible -++++++++staticText ignored name='<newline> This was the middle dialog and should be marked ignored in the tree.<newline>' ++++++dialog ++++++++staticText name='This is the now active dialog. Of course it should be in the tree. ' ++++++++++inlineTextBox name='This is the now active dialog. Of course it should be in the tree. '
diff --git a/content/test/data/accessibility/html/modal-dialog-stack.html b/content/test/data/accessibility/html/modal-dialog-stack.html index d019dd7..0f35db3 100644 --- a/content/test/data/accessibility/html/modal-dialog-stack.html +++ b/content/test/data/accessibility/html/modal-dialog-stack.html
@@ -7,7 +7,7 @@ Test the accessibility tree after a pending modal dialog becomes active. <section> <dialog id="top-dialog"> - This was the top dialog and should be marked ignored in the tree. + This was the top dialog and should not be in the tree. </dialog> <select> <optgroup label="Group"> @@ -17,7 +17,7 @@ </section> <button>This button should not be in the tree.</button> <dialog id="middle-dialog"> - This was the middle dialog and should be marked ignored in the tree. + This was the middle dialog and should not be in the tree. </dialog> <dialog id="bottom-dialog"> This is the now active dialog. Of course it should be in the tree.
diff --git a/content/test/data/accessibility/html/open-modal-expected-blink.txt b/content/test/data/accessibility/html/open-modal-expected-blink.txt index 250ed9b4..f967d20 100644 --- a/content/test/data/accessibility/html/open-modal-expected-blink.txt +++ b/content/test/data/accessibility/html/open-modal-expected-blink.txt
@@ -4,9 +4,7 @@ ++++++staticText name='some text' ++++++++inlineTextBox name='some text' ++++++genericContainer ignored -++++++++dialog ignored invisible -++++++++++genericContainer ignored invisible -++++++++++++staticText ignored name='Some Text' +++++++++genericContainer ignored invisible === Start Continuation === rootWebArea ++genericContainer ignored invisible
diff --git a/content/test/data/accessibility/html/ruby-expected-blink.txt b/content/test/data/accessibility/html/ruby-expected-blink.txt index db916ca..485cf4c2 100644 --- a/content/test/data/accessibility/html/ruby-expected-blink.txt +++ b/content/test/data/accessibility/html/ruby-expected-blink.txt
@@ -4,11 +4,7 @@ ++++++ruby description='ruby text' descriptionFrom=rubyAnnotation ++++++++staticText name='ruby base' ++++++++++inlineTextBox name='ruby base' -++++++++rubyAnnotation ignored invisible -++++++++++staticText ignored name='(' ++++++++rubyAnnotation ignored -++++++++rubyAnnotation ignored invisible -++++++++++staticText ignored name=')' ++++++paragraph ++++++++ruby description='ruby text' descriptionFrom=rubyAnnotation ++++++++++staticText name='ruby base'
diff --git a/content/test/data/accessibility/html/select-in-canvas-expected-blink.txt b/content/test/data/accessibility/html/select-in-canvas-expected-blink.txt index e12576e..8c7eadfe 100644 --- a/content/test/data/accessibility/html/select-in-canvas-expected-blink.txt +++ b/content/test/data/accessibility/html/select-in-canvas-expected-blink.txt
@@ -9,8 +9,6 @@ ++++++canvas ++++++++staticText name='<newline> ' ++++++++popUpButton collapsed focusable value='1' -++++++++++genericContainer ignored invisible -++++++++++++staticText ignored invisible name='1' ++++++++++genericContainer ignored ++++++++++++menuListOption focusable name='1' ++++++++++++menuListOption focusable name='2'
diff --git a/content/test/data/accessibility/html/summary-expected-blink.txt b/content/test/data/accessibility/html/summary-expected-blink.txt index 2292e78..46c9434 100644 --- a/content/test/data/accessibility/html/summary-expected-blink.txt +++ b/content/test/data/accessibility/html/summary-expected-blink.txt
@@ -12,7 +12,6 @@ ++++++++++staticText ignored invisible name='<newline> ' ++++++++++staticText ignored invisible name='<newline> ' ++++++++++paragraph ignored invisible htmlTag='p' -++++++++++++staticText ignored invisible name='The details tag specifies additional details that the user can view or hide on demand.' ++++++++++staticText ignored invisible name='<newline> ' ++++++details htmlTag='details' ++++++++genericContainer ignored htmlTag='slot' @@ -25,5 +24,4 @@ ++++++++++staticText ignored invisible name='<newline> ' ++++++++++staticText ignored invisible name='<newline> ' ++++++++++paragraph ignored invisible htmlTag='p' -++++++++++++staticText ignored invisible name='Paragraph#2' ++++++++++staticText ignored invisible name='<newline> '
diff --git a/content/test/data/accessibility/html/svg-desc-in-group-expected-blink.txt b/content/test/data/accessibility/html/svg-desc-in-group-expected-blink.txt index ca2ad99..eec0e2b 100644 --- a/content/test/data/accessibility/html/svg-desc-in-group-expected-blink.txt +++ b/content/test/data/accessibility/html/svg-desc-in-group-expected-blink.txt
@@ -3,8 +3,6 @@ ++++genericContainer htmlTag='body' ++++++svgRoot htmlTag='svg' ++++++++group description='Group with circle and text' htmlTag='g' descriptionFrom=svgDescElement -++++++++++genericContainer ignored invisible htmlTag='desc' -++++++++++++staticText ignored name='Group with circle and text' ++++++++++genericContainer htmlTag='text' ++++++++++++staticText name='hello world' ++++++++++++++inlineTextBox name='hello world'
diff --git a/content/test/data/accessibility/html/svg-elements-not-mapped-expected-blink-cros.txt b/content/test/data/accessibility/html/svg-elements-not-mapped-expected-blink-cros.txt index d9a049a7..088bd91 100644 --- a/content/test/data/accessibility/html/svg-elements-not-mapped-expected-blink-cros.txt +++ b/content/test/data/accessibility/html/svg-elements-not-mapped-expected-blink-cros.txt
@@ -2,65 +2,31 @@ ++genericContainer ignored htmlTag='html' ++++genericContainer htmlTag='body' ++++++image htmlTag='svg' name='animate should not be exposed' -++++++++genericContainer ignored invisible htmlTag='animate' ++++++image htmlTag='svg' name='animateMotion should not be exposed' -++++++++genericContainer ignored invisible htmlTag='animatemotion' -++++++++++genericContainer ignored invisible htmlTag='mpath' ++++++image htmlTag='svg' name='animateTransform should not be exposed' -++++++++genericContainer ignored invisible htmlTag='animatetransform' ++++++image htmlTag='svg' name='clipPath should not be exposed' ++++++image htmlTag='svg' name='cursor should not be exposed' -++++++++genericContainer ignored invisible htmlTag='cursor' ++++++image htmlTag='svg' name='defs should not be exposed' ++++++++genericContainer ignored invisible htmlTag='solidcolor' ++++++image htmlTag='svg' name='discard should not be exposed' -++++++++genericContainer ignored invisible htmlTag='animatetransform' -++++++++genericContainer ignored invisible htmlTag='discard' ++++++svgRoot htmlTag='svg' name='filter and filter effect elements should not be exposed' -++++++++genericContainer ignored invisible htmlTag='fepointlight' -++++++++genericContainer ignored invisible htmlTag='femergenode' -++++++++genericContainer ignored invisible htmlTag='femergenode' ++++++++group htmlTag='g' ++++++++++group htmlTag='g' ++++++image htmlTag='svg' name='hatch should not be exposed' -++++++++genericContainer ignored invisible htmlTag='hatch' -++++++++++genericContainer ignored invisible htmlTag='hatchpath' ++++++image htmlTag='svg' name='hatchpath should not be exposed' -++++++++genericContainer ignored invisible htmlTag='hatch' -++++++++++genericContainer ignored invisible htmlTag='hatchpath' ++++++image htmlTag='svg' name='image which lacks criteria for inclusion should not be exposed' ++++++image htmlTag='svg' name='linearGradient should not be exposed' -++++++++genericContainer ignored htmlTag='stop' -++++++++genericContainer ignored htmlTag='stop' ++++++image htmlTag='svg' name='marker should not be exposed' ++++++image htmlTag='svg' name='mask should not be exposed' -++++++++genericContainer ignored htmlTag='stop' -++++++++genericContainer ignored htmlTag='stop' ++++++image htmlTag='svg' name='metadata should not be exposed' -++++++++genericContainer ignored invisible htmlTag='metadata' -++++++++++genericContainer ignored invisible htmlTag='rdf:rdf' -++++++++++++genericContainer ignored invisible htmlTag='rdf:description' ++++++image htmlTag='svg' name='mpath should not be exposed' -++++++++genericContainer ignored invisible htmlTag='animatemotion' -++++++++++genericContainer ignored invisible htmlTag='mpath' ++++++image htmlTag='svg' name='pattern should not be exposed' ++++++image htmlTag='svg' name='radialGradient should not be exposed' -++++++++genericContainer ignored htmlTag='stop' -++++++++genericContainer ignored htmlTag='stop' -++++++++genericContainer ignored htmlTag='stop' ++++++image htmlTag='svg' name='solidColor should not be exposed' -++++++++genericContainer ignored invisible htmlTag='solidcolor' ++++++image htmlTag='svg' name='stop should not be exposed' -++++++++genericContainer ignored htmlTag='stop' -++++++++genericContainer ignored htmlTag='stop' ++++++svgRoot htmlTag='svg' name='style and set should not be exposed' ++++++++graphicsSymbol htmlTag='rect' -++++++++++genericContainer ignored invisible htmlTag='set' ++++++svgRoot htmlTag='svg' name='switch should not be exposed' -++++++++genericContainer ignored invisible htmlTag='text' -++++++++++staticText ignored name='Ciao!' -++++++++genericContainer ignored invisible htmlTag='text' -++++++++++staticText ignored name='Hola!' ++++++++genericContainer htmlTag='text' ++++++++++staticText name='Hey!' ++++++++++++inlineTextBox name='Hey!' @@ -68,11 +34,7 @@ ++++++++genericContainer ignored invisible htmlTag='view' ++++++++genericContainer ignored invisible htmlTag='view' ++++++image description='abc' htmlTag='svg' name='desc should not be exposed as accessible object' descriptionFrom=svgDescElement -++++++++genericContainer ignored invisible htmlTag='desc' -++++++++++staticText ignored name='abc' ++++++image description='abc' htmlTag='svg' name='title should not be exposed as accessible object' descriptionFrom=title -++++++++genericContainer ignored invisible htmlTag='title' -++++++++++staticText ignored name='abc' ++++++image htmlTag='svg' name='circle which lacks criteria for inclusion should not be exposed' ++++++image htmlTag='svg' name='ellipse which lacks criteria for inclusion should not be exposed' ++++++svgRoot htmlTag='svg' name='foreignObject which lacks criteria for inclusion should not be exposed' @@ -106,4 +68,4 @@ ++++++++++staticText name='world' ++++++++++++inlineTextBox name='world' ++++++++++staticText name='!' -++++++++++++inlineTextBox name='!' +++++++++++++inlineTextBox name='!' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/svg-elements-not-mapped-expected-blink.txt b/content/test/data/accessibility/html/svg-elements-not-mapped-expected-blink.txt index e8cb0ba..89be9b0 100644 --- a/content/test/data/accessibility/html/svg-elements-not-mapped-expected-blink.txt +++ b/content/test/data/accessibility/html/svg-elements-not-mapped-expected-blink.txt
@@ -2,65 +2,31 @@ ++genericContainer ignored htmlTag='html' ++++genericContainer htmlTag='body' ++++++image htmlTag='svg' name='animate should not be exposed' -++++++++genericContainer ignored invisible htmlTag='animate' ++++++image htmlTag='svg' name='animateMotion should not be exposed' -++++++++genericContainer ignored invisible htmlTag='animatemotion' -++++++++++genericContainer ignored invisible htmlTag='mpath' ++++++image htmlTag='svg' name='animateTransform should not be exposed' -++++++++genericContainer ignored invisible htmlTag='animatetransform' ++++++image htmlTag='svg' name='clipPath should not be exposed' ++++++image htmlTag='svg' name='cursor should not be exposed' -++++++++genericContainer ignored invisible htmlTag='cursor' ++++++image htmlTag='svg' name='defs should not be exposed' ++++++++genericContainer ignored invisible htmlTag='solidcolor' ++++++image htmlTag='svg' name='discard should not be exposed' -++++++++genericContainer ignored invisible htmlTag='animatetransform' -++++++++genericContainer ignored invisible htmlTag='discard' ++++++image htmlTag='svg' name='filter and filter effect elements should not be exposed' -++++++++genericContainer ignored invisible htmlTag='fepointlight' -++++++++genericContainer ignored invisible htmlTag='femergenode' -++++++++genericContainer ignored invisible htmlTag='femergenode' ++++++++group ignored htmlTag='g' ++++++++++group ignored htmlTag='g' ++++++image htmlTag='svg' name='hatch should not be exposed' -++++++++genericContainer ignored invisible htmlTag='hatch' -++++++++++genericContainer ignored invisible htmlTag='hatchpath' ++++++image htmlTag='svg' name='hatchpath should not be exposed' -++++++++genericContainer ignored invisible htmlTag='hatch' -++++++++++genericContainer ignored invisible htmlTag='hatchpath' ++++++image htmlTag='svg' name='image which lacks criteria for inclusion should not be exposed' ++++++image htmlTag='svg' name='linearGradient should not be exposed' -++++++++genericContainer ignored htmlTag='stop' -++++++++genericContainer ignored htmlTag='stop' ++++++image htmlTag='svg' name='marker should not be exposed' ++++++image htmlTag='svg' name='mask should not be exposed' -++++++++genericContainer ignored htmlTag='stop' -++++++++genericContainer ignored htmlTag='stop' ++++++image htmlTag='svg' name='metadata should not be exposed' -++++++++genericContainer ignored invisible htmlTag='metadata' -++++++++++genericContainer ignored invisible htmlTag='rdf:rdf' -++++++++++++genericContainer ignored invisible htmlTag='rdf:description' ++++++image htmlTag='svg' name='mpath should not be exposed' -++++++++genericContainer ignored invisible htmlTag='animatemotion' -++++++++++genericContainer ignored invisible htmlTag='mpath' ++++++image htmlTag='svg' name='pattern should not be exposed' ++++++image htmlTag='svg' name='radialGradient should not be exposed' -++++++++genericContainer ignored htmlTag='stop' -++++++++genericContainer ignored htmlTag='stop' -++++++++genericContainer ignored htmlTag='stop' ++++++image htmlTag='svg' name='solidColor should not be exposed' -++++++++genericContainer ignored invisible htmlTag='solidcolor' ++++++image htmlTag='svg' name='stop should not be exposed' -++++++++genericContainer ignored htmlTag='stop' -++++++++genericContainer ignored htmlTag='stop' ++++++svgRoot htmlTag='svg' name='style and set should not be exposed' ++++++++graphicsSymbol htmlTag='rect' -++++++++++genericContainer ignored invisible htmlTag='set' ++++++svgRoot htmlTag='svg' name='switch should not be exposed' -++++++++genericContainer ignored invisible htmlTag='text' -++++++++++staticText ignored name='Ciao!' -++++++++genericContainer ignored invisible htmlTag='text' -++++++++++staticText ignored name='Hola!' ++++++++genericContainer htmlTag='text' ++++++++++staticText name='Hey!' ++++++++++++inlineTextBox name='Hey!' @@ -68,11 +34,7 @@ ++++++++genericContainer ignored invisible htmlTag='view' ++++++++genericContainer ignored invisible htmlTag='view' ++++++image description='abc' htmlTag='svg' name='desc should not be exposed as accessible object' descriptionFrom=svgDescElement -++++++++genericContainer ignored invisible htmlTag='desc' -++++++++++staticText ignored name='abc' ++++++image description='abc' htmlTag='svg' name='title should not be exposed as accessible object' descriptionFrom=title -++++++++genericContainer ignored invisible htmlTag='title' -++++++++++staticText ignored name='abc' ++++++image htmlTag='svg' name='circle which lacks criteria for inclusion should not be exposed' ++++++image htmlTag='svg' name='ellipse which lacks criteria for inclusion should not be exposed' ++++++svgRoot htmlTag='svg' name='foreignObject which lacks criteria for inclusion should not be exposed'
diff --git a/content/test/data/accessibility/html/svg-expected-blink.txt b/content/test/data/accessibility/html/svg-expected-blink.txt index 2974682..02dad28c 100644 --- a/content/test/data/accessibility/html/svg-expected-blink.txt +++ b/content/test/data/accessibility/html/svg-expected-blink.txt
@@ -2,8 +2,6 @@ ++genericContainer ignored ++++genericContainer ++++++svgRoot description='SVG Title Tag' name='svg' tooltip='SVG Title Tag' descriptionFrom=title -++++++++genericContainer ignored invisible -++++++++++staticText ignored name='SVG Title Tag' ++++++++genericContainer ++++++++++staticText name='Test' ++++++++++++inlineTextBox name='Test'
diff --git a/content/test/data/accessibility/html/svg-symbol-with-role-expected-blink.txt b/content/test/data/accessibility/html/svg-symbol-with-role-expected-blink.txt index 5c25d1a7..f852bf9 100644 --- a/content/test/data/accessibility/html/svg-symbol-with-role-expected-blink.txt +++ b/content/test/data/accessibility/html/svg-symbol-with-role-expected-blink.txt
@@ -2,11 +2,5 @@ ++genericContainer ignored htmlTag='html' ++++genericContainer htmlTag='body' ++++++svgRoot className='Symbol with role' htmlTag='svg' -++++++++genericContainer ignored invisible htmlTag='title' -++++++++++staticText ignored name='Click me!' ++++++++button htmlTag='svg' name='Click me!' roleDescription='fancy button' -++++++++++genericContainer ignored invisible htmlTag='title' -++++++++++++staticText ignored name='Click me!' ++++++++button htmlTag='svg' name='Click me!' roleDescription='fancy button' -++++++++++genericContainer ignored invisible htmlTag='title' -++++++++++++staticText ignored name='Click me!'
diff --git a/content/test/data/accessibility/html/svg-text-alternative-computation-expected-blink.txt b/content/test/data/accessibility/html/svg-text-alternative-computation-expected-blink.txt index 6e43a89..b71a0ed 100644 --- a/content/test/data/accessibility/html/svg-text-alternative-computation-expected-blink.txt +++ b/content/test/data/accessibility/html/svg-text-alternative-computation-expected-blink.txt
@@ -2,21 +2,13 @@ ++genericContainer ignored htmlTag='html' ++++genericContainer htmlTag='body' ++++++genericContainer ignored invisible htmlTag='div' -++++++++staticText ignored name='Link (from aria-labelledby)' ++++++genericContainer ignored invisible htmlTag='div' -++++++++staticText ignored name='Circle (from aria-labelledby)' ++++++svgRoot className='name-aria-labelledby' htmlTag='svg' ++++++++link description='Link (from title)' htmlTag='a' name='Link (from aria-labelledby)' descriptionFrom=title -++++++++++genericContainer ignored invisible htmlTag='title' -++++++++++++staticText ignored name='Link (from title)' ++++++svgRoot className='name-aria-label' htmlTag='svg' ++++++++link description='Link (from title)' htmlTag='a' name='Link (from aria-label)' descriptionFrom=title -++++++++++genericContainer ignored invisible htmlTag='title' -++++++++++++staticText ignored name='Link (from title)' ++++++svgRoot className='name-title' htmlTag='svg' ++++++++link description='Link (from xlink:title)' htmlTag='a' name='Link (from title)' descriptionFrom=title -++++++++++genericContainer ignored invisible htmlTag='title' -++++++++++++staticText ignored name='Link (from title)' ++++++svgRoot className='name-xlink-title' htmlTag='svg' ++++++++link htmlTag='a' name='Link (from xlink:title)' ++++++svgRoot className='name-aria-labelledby' htmlTag='svg' @@ -25,50 +17,25 @@ ++++++++graphicsSymbol htmlTag='circle' name='Circle (from aria-label)' ++++++svgRoot className='name-title' htmlTag='svg' ++++++++graphicsSymbol htmlTag='circle' name='Circle (from title)' -++++++++++genericContainer ignored invisible htmlTag='title' -++++++++++++staticText ignored name='Circle (from title)' ++++++svgRoot className='name-use-title' htmlTag='svg' ++++++++graphicsObject htmlTag='use' name='Circle (From first use element's title)' ++++++++++group ignored htmlTag='svg' ++++++++graphicsObject htmlTag='use' name='Circle (From second use element's title)' ++++++++++group ignored htmlTag='svg' ++++++svgRoot className='name-symbol-title' htmlTag='svg' -++++++++genericContainer ignored invisible htmlTag='title' -++++++++++staticText ignored name='Rectangle Symbol (From symbol's title)' ++++++++group htmlTag='svg' name='Rectangle Symbol (From symbol's title)' -++++++++++genericContainer ignored invisible htmlTag='title' -++++++++++++staticText ignored name='Rectangle Symbol (From symbol's title)' ++++++++group htmlTag='svg' name='Rectangle Symbol (From symbol's title)' -++++++++++genericContainer ignored invisible htmlTag='title' -++++++++++++staticText ignored name='Rectangle Symbol (From symbol's title)' ++++++genericContainer ignored invisible htmlTag='div' -++++++++staticText ignored name='Link (from aria-describedby)' ++++++svgRoot className='description-aria-describedby' htmlTag='svg' ++++++++link description='Link (from aria-describedby)' htmlTag='a' name='Link (from title)' descriptionFrom=relatedElement -++++++++++genericContainer ignored invisible htmlTag='title' -++++++++++++staticText ignored name='Link (from title)' -++++++++++genericContainer ignored invisible htmlTag='desc' -++++++++++++staticText ignored name='Link (from desc)' ++++++svgRoot className='description-aria-description' htmlTag='svg' ++++++++link description='Link (from aria-description)' htmlTag='a' name='Link (from title)' descriptionFrom=ariaDescription -++++++++++genericContainer ignored invisible htmlTag='title' -++++++++++++staticText ignored name='Link (from title)' -++++++++++genericContainer ignored invisible htmlTag='desc' -++++++++++++staticText ignored name='Link (from desc)' ++++++svgRoot className='description-desc' htmlTag='svg' ++++++++link description='Link (from desc)' htmlTag='a' name='Link (from title)' descriptionFrom=svgDescElement -++++++++++genericContainer ignored invisible htmlTag='title' -++++++++++++staticText ignored name='Link (from title)' -++++++++++genericContainer ignored invisible htmlTag='desc' -++++++++++++staticText ignored name='Link (from desc)' ++++++svgRoot className='description-title' htmlTag='svg' ++++++++link description='Link (from title)' htmlTag='a' name='Link (from aria-label)' descriptionFrom=title -++++++++++genericContainer ignored invisible htmlTag='title' -++++++++++++staticText ignored name='Link (from title)' ++++++svgRoot className='description-xlink-title' htmlTag='svg' ++++++++link description='Link (from xlink:title)' htmlTag='a' name='Link (from title)' descriptionFrom=title -++++++++++genericContainer ignored invisible htmlTag='title' -++++++++++++staticText ignored name='Link (from title)' ++++++svgRoot className='description-use-desc' htmlTag='svg' ++++++++graphicsObject description='Circle (From first use element's desc)' htmlTag='use' descriptionFrom=svgDescElement ++++++++++group ignored htmlTag='svg' @@ -80,11 +47,5 @@ ++++++++graphicsObject description='Circle (From second use element's title)' htmlTag='use' name='Circle 2' descriptionFrom=title ++++++++++group ignored htmlTag='svg' ++++++svgRoot className='desc-symbol-desc' htmlTag='svg' -++++++++genericContainer ignored invisible htmlTag='desc' -++++++++++staticText ignored name='Rectangle Symbol (From symbol's desc)' ++++++++group description='Rectangle Symbol (From symbol's desc)' htmlTag='svg' descriptionFrom=svgDescElement -++++++++++genericContainer ignored invisible htmlTag='desc' -++++++++++++staticText ignored name='Rectangle Symbol (From symbol's desc)' ++++++++group description='Rectangle Symbol (From symbol's desc)' htmlTag='svg' descriptionFrom=svgDescElement -++++++++++genericContainer ignored invisible htmlTag='desc' -++++++++++++staticText ignored name='Rectangle Symbol (From symbol's desc)'
diff --git a/content/test/data/accessibility/html/svg-title-in-group-expected-blink.txt b/content/test/data/accessibility/html/svg-title-in-group-expected-blink.txt index acc277d9..1ba0276 100644 --- a/content/test/data/accessibility/html/svg-title-in-group-expected-blink.txt +++ b/content/test/data/accessibility/html/svg-title-in-group-expected-blink.txt
@@ -4,7 +4,6 @@ ++++++svgRoot ++++++++image name='abcde' tooltip='abcde' nameFrom=relatedElement ++++++++++genericContainer ignored invisible -++++++++++++staticText ignored name='abcde' nameFrom=contents ++++++++++genericContainer ++++++++++++staticText name='NL' nameFrom=contents ++++++++++++++inlineTextBox name='NL' nameFrom=contents
diff --git a/content/test/data/accessibility/html/svg-with-clickable-rect-expected-blink.txt b/content/test/data/accessibility/html/svg-with-clickable-rect-expected-blink.txt index 108d7c72..d3a058b 100644 --- a/content/test/data/accessibility/html/svg-with-clickable-rect-expected-blink.txt +++ b/content/test/data/accessibility/html/svg-with-clickable-rect-expected-blink.txt
@@ -3,4 +3,3 @@ ++++genericContainer htmlTag='body' ++++++svgRoot htmlTag='svg' ++++++++graphicsSymbol htmlTag='rect' -++++++++++genericContainer ignored invisible htmlTag='set'
diff --git a/content/test/data/accessibility/html/table-column-remove-expected-blink.txt b/content/test/data/accessibility/html/table-column-remove-expected-blink.txt index 2c8090f8..1f13dee 100644 --- a/content/test/data/accessibility/html/table-column-remove-expected-blink.txt +++ b/content/test/data/accessibility/html/table-column-remove-expected-blink.txt
@@ -5,13 +5,11 @@ ++++++++rowGroup ignored ++++++++++row ++++++++++++cell ignored invisible -++++++++++++++staticText ignored name='AB' ++++++++++++cell name='B' ariaCellColumnIndex=1 tableCellColumnIndex=0 ++++++++++++++staticText name='B' ++++++++++++++++inlineTextBox name='B' ++++++++++row ++++++++++++cell ignored invisible -++++++++++++++staticText ignored name='CD' ++++++++++++cell name='D' ariaCellColumnIndex=1 tableCellColumnIndex=0 ++++++++++++++staticText name='D' ++++++++++++++++inlineTextBox name='D' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/wbr-expected-blink.txt b/content/test/data/accessibility/html/wbr-expected-blink.txt index 0742839..3fc0cb2 100644 --- a/content/test/data/accessibility/html/wbr-expected-blink.txt +++ b/content/test/data/accessibility/html/wbr-expected-blink.txt
@@ -3,9 +3,7 @@ ++++genericContainer ++++++staticText name='Supercali' ++++++++inlineTextBox name='Supercali' -++++++genericContainer ignored ++++++staticText name='fragilistic' ++++++++inlineTextBox name='fragilistic' -++++++genericContainer ignored ++++++staticText name='expialidocious' ++++++++inlineTextBox name='expialidocious'
diff --git a/content/test/data/accessibility/regression/add-child-of-not-included-in-tree-chain-expected-blink.txt b/content/test/data/accessibility/regression/add-child-of-not-included-in-tree-chain-expected-blink.txt index 8ceaa02..b60a621 100644 --- a/content/test/data/accessibility/regression/add-child-of-not-included-in-tree-chain-expected-blink.txt +++ b/content/test/data/accessibility/regression/add-child-of-not-included-in-tree-chain-expected-blink.txt
@@ -1,10 +1,7 @@ rootWebArea htmlTag='#document' ++genericContainer ignored htmlTag='html' ++++genericContainer ignored htmlTag='body' -++++++genericContainer ignored invisible htmlTag='div' -++++++++heading ignored invisible htmlTag='h2' -++++++++++genericContainer ignored invisible htmlTag='div' -++++++++++++genericContainer ignored invisible htmlTag='here' -++++++++++++++paragraph ignored invisible htmlTag='p' -++++++++++++++++button ignored invisible htmlTag='li' +++++++heading ignored invisible htmlTag='h2' +++++++++paragraph ignored invisible htmlTag='p' +++++++++++button ignored invisible htmlTag='li' ++++++group htmlTag='div' name='Done'
diff --git a/content/test/data/accessibility/regression/content-visibility-label-expected-blink.txt b/content/test/data/accessibility/regression/content-visibility-label-expected-blink.txt index b9c2083..eff0848e 100644 --- a/content/test/data/accessibility/regression/content-visibility-label-expected-blink.txt +++ b/content/test/data/accessibility/regression/content-visibility-label-expected-blink.txt
@@ -2,6 +2,4 @@ ++genericContainer ignored ++++genericContainer ignored ++++++genericContainer name='abc' -++++++++staticText ignored invisible name='<newline> ' ++++++++genericContainer ignored invisible -++++++++++staticText ignored invisible name='abc'
diff --git a/content/test/data/accessibility/regression/missing-parent-expected-blink.txt b/content/test/data/accessibility/regression/missing-parent-expected-blink.txt index 71859345..5d65ffe 100644 --- a/content/test/data/accessibility/regression/missing-parent-expected-blink.txt +++ b/content/test/data/accessibility/regression/missing-parent-expected-blink.txt
@@ -2,7 +2,3 @@ ++genericContainer ignored ++++genericContainer ++++++image -++++++++genericContainer ignored -++++++++++genericContainer ignored -++++++++++++genericContainer ignored -++++++++++++++genericContainer ignored
diff --git a/content/test/data/accessibility/regression/slot-creation-crash-expected-blink.txt b/content/test/data/accessibility/regression/slot-creation-crash-expected-blink.txt index 2eb007a..83ff70a2 100644 --- a/content/test/data/accessibility/regression/slot-creation-crash-expected-blink.txt +++ b/content/test/data/accessibility/regression/slot-creation-crash-expected-blink.txt
@@ -2,7 +2,6 @@ ++genericContainer ignored htmlTag='html' ++++genericContainer ignored htmlTag='body' ++++++genericContainer htmlTag='div' -++++++++genericContainer ignored invisible htmlTag='junk' ++++++++paragraph htmlTag='p' ++++++++++staticText name='paragraph' ++++++++++++inlineTextBox name='paragraph'
diff --git a/content/test/data/accessibility/regression/title-in-shadow-expected-blink.txt b/content/test/data/accessibility/regression/title-in-shadow-expected-blink.txt index 099b17be..8d47ca2 100644 --- a/content/test/data/accessibility/regression/title-in-shadow-expected-blink.txt +++ b/content/test/data/accessibility/regression/title-in-shadow-expected-blink.txt
@@ -5,4 +5,3 @@ ++++++++genericContainer ++++++++++genericContainer ++++++++++++genericContainer ignored -++++++++genericContainer ignored invisible
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 d62536c7..91bd390 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
@@ -407,13 +407,13 @@ crbug.com/angleproject/6430 [ mac passthrough angle-metal ] deqp/functional/gles3/transformfeedback/random_separate_lines.html [ Failure ] crbug.com/angleproject/6430 [ mac passthrough angle-metal ] deqp/functional/gles3/transformfeedback/random_separate_points.html [ Failure ] crbug.com/angleproject/6430 [ mac passthrough angle-metal ] deqp/functional/gles3/transformfeedback/random_separate_triangles.html [ Failure ] +crbug.com/angleproject/6430 [ mac passthrough angle-metal ] deqp/functional/gles3/fbomultisample.2_samples.html [ Failure ] +crbug.com/angleproject/6430 [ mac passthrough angle-metal ] deqp/functional/gles3/fbomultisample.4_samples.html [ Failure ] +crbug.com/angleproject/6430 [ mac passthrough angle-metal ] deqp/functional/gles3/fbomultisample.8_samples.html [ Failure ] # Metal AMD crbug.com/angleproject/6430 [ mac passthrough angle-metal amd ] conformance2/textures/misc/tex-srgb-mipmap.html [ Failure ] crbug.com/angleproject/6430 [ mac passthrough angle-metal amd ] conformance2/textures/misc/tex-storage-compressed-formats.html [ Failure ] -crbug.com/angleproject/6430 [ mac passthrough angle-metal amd ] deqp/functional/gles3/fbomultisample.2_samples.html [ Failure ] -crbug.com/angleproject/6430 [ mac passthrough angle-metal amd ] deqp/functional/gles3/fbomultisample.4_samples.html [ Failure ] -crbug.com/angleproject/6430 [ mac passthrough angle-metal amd ] deqp/functional/gles3/fbomultisample.8_samples.html [ Failure ] crbug.com/angleproject/6430 [ mac passthrough angle-metal amd ] deqp/functional/gles3/pixelbufferobject.html [ Failure ] crbug.com/angleproject/6430 [ mac passthrough angle-metal amd ] deqp/functional/gles3/shaderpackingfunction.html [ Failure ] crbug.com/angleproject/6430 [ mac passthrough angle-metal amd ] deqp/functional/gles3/textureshadow/2d_array_linear_mipmap_nearest_greater_or_equal.html [ Failure ]
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 b5ea88b..2bb382e3 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
@@ -608,12 +608,12 @@ crbug.com/angleproject/4846 [ mac angle-metal passthrough nvidia ] conformance/rendering/more-than-65536-indices.html [ Failure ] # Mac / M1 / OpenGL -crbug.com/1130703 [ mac angle-opengl apple-apple-m1 passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] -crbug.com/1130703 [ mac angle-opengl apple-apple-m1 no-passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] -crbug.com/1130703 [ mac angle-opengl apple-apple-m1 passthrough ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] -crbug.com/1130703 [ mac angle-opengl apple-apple-m1 no-passthrough ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] +crbug.com/1130703 [ mac apple-apple-m1 passthrough angle-opengl ] conformance/textures/misc/texture-copying-and-deletion.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 passthrough angle-opengl ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] +crbug.com/1130703 [ mac apple-apple-m1 no-passthrough ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] # No active browser window, but no crash stack. -crbug.com/1240443 [ mac angle-opengl apple-apple-m1 passthrough ] conformance/renderbuffers/stencil-renderbuffer-initialization.html [ RetryOnFailure ] +crbug.com/1240443 [ mac apple-apple-m1 passthrough angle-opengl ] conformance/renderbuffers/stencil-renderbuffer-initialization.html [ RetryOnFailure ] # Mac / M1 / Metal crbug.com/1130758 [ mac passthrough angle-metal apple-angle-metal-renderer:-apple-m1 ] conformance/extensions/webgl-depth-texture.html [ Failure ]
diff --git a/content/test/gpu/gpu_tests/webgl_conformance_integration_test.py b/content/test/gpu/gpu_tests/webgl_conformance_integration_test.py index cd225a8e..a8508a78 100644 --- a/content/test/gpu/gpu_tests/webgl_conformance_integration_test.py +++ b/content/test/gpu/gpu_tests/webgl_conformance_integration_test.py
@@ -227,7 +227,7 @@ def _ShouldForceRetryOnFailureFirstTest(self): # Force RetryOnFailure of the first test on a shard on ChromeOS VMs. # See crbug.com/1079244. - return False + return 'chromeos-board-amd64-generic' in self.GetPlatformTags(self.browser) def RunActualGpuTest(self, test_path, *args): # This indirection allows these tests to trampoline through
diff --git a/content/utility/BUILD.gn b/content/utility/BUILD.gn index fee01b9..fe84145 100644 --- a/content/utility/BUILD.gn +++ b/content/utility/BUILD.gn
@@ -85,6 +85,9 @@ "//ash/services/ime:sandbox_hook", "//chromeos/assistant:buildflags", "//chromeos/services/tts:sandbox_hook", + "//gpu/config", + "//media/gpu/sandbox", + "//third_party/angle:angle_gpu_info_util", ] if (use_vaapi || use_v4l2_codec) { deps += [ "//ash/components/arc/video_accelerator" ]
diff --git a/content/utility/services.cc b/content/utility/services.cc index 297571dc..f0e76b6 100644 --- a/content/utility/services.cc +++ b/content/utility/services.cc
@@ -74,7 +74,8 @@ #include "sandbox/policy/sandbox_type.h" #endif // defined(OS_LINUX) || defined(OS_CHROMEOS) -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && \ + (BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)) #include "services/shape_detection/public/mojom/shape_detection_service.mojom.h" // nogncheck #include "services/shape_detection/shape_detection_service.h" // nogncheck #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) && BUILDFLAG(IS_CHROMEOS_ASH) @@ -226,7 +227,8 @@ return audio::CreateStandaloneService(std::move(receiver)); } -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && \ + (BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)) auto RunShapeDetectionService( mojo::PendingReceiver<shape_detection::mojom::ShapeDetectionService> receiver) { @@ -315,7 +317,8 @@ services.Add(RunTracing); services.Add(RunVideoCapture); -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && \ + (BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)) services.Add(RunShapeDetectionService); #endif
diff --git a/content/utility/utility_main.cc b/content/utility/utility_main.cc index c40836cb..bac1019b 100644 --- a/content/utility/utility_main.cc +++ b/content/utility/utility_main.cc
@@ -45,11 +45,17 @@ #include "ash/services/ime/ime_sandbox_hook.h" #include "chromeos/assistant/buildflags.h" #include "chromeos/services/tts/tts_sandbox_hook.h" +#include "gpu/config/gpu_info_collector.h" +#include "media/gpu/sandbox/hardware_video_decoding_sandbox_hook_linux.h" + +// gn check is not smart enough to realize that this include only applies to +// ash-chrome and the BUILD.gn dependencies correctly account for that. +#include "third_party/angle/src/gpu_info_util/SystemInfo.h" // nogncheck #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #include "chromeos/services/libassistant/libassistant_sandbox_hook.h" // nogncheck #endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) -#endif +#endif // BUILDFLAG(IS_CHROMEOS_ASH) #if defined(OS_MAC) #include "base/message_loop/message_pump_mac.h" @@ -139,6 +145,10 @@ base::BindOnce(&speech::SpeechRecognitionPreSandboxHook); break; #if BUILDFLAG(IS_CHROMEOS_ASH) + case sandbox::mojom::Sandbox::kHardwareVideoDecoding: + pre_sandbox_hook = + base::BindOnce(&media::HardwareVideoDecodingPreSandboxHook); + break; case sandbox::mojom::Sandbox::kIme: pre_sandbox_hook = base::BindOnce(&chromeos::ime::ImePreSandboxHook); break; @@ -156,9 +166,19 @@ break; } if (parameters.zygote_child || !pre_sandbox_hook.is_null()) { + sandbox::policy::SandboxLinux::Options sandbox_options; +#if BUILDFLAG(IS_CHROMEOS_ASH) + if (sandbox_type == sandbox::mojom::Sandbox::kHardwareVideoDecoding) { + // The kHardwareVideoDecoding sandbox needs to know the GPU type in order + // to select the right policy. + gpu::GPUInfo gpu_info{}; + gpu::CollectBasicGraphicsInfo(&gpu_info); + sandbox_options.use_amd_specific_policies = + angle::IsAMD(gpu_info.active_gpu().vendor_id); + } +#endif // BUILDFLAG(IS_CHROMEOS_ASH) sandbox::policy::Sandbox::Initialize( - sandbox_type, std::move(pre_sandbox_hook), - sandbox::policy::SandboxLinux::Options()); + sandbox_type, std::move(pre_sandbox_hook), sandbox_options); } #elif defined(OS_WIN) g_utility_target_services = parameters.sandbox_info->target_services;
diff --git a/device/bluetooth/floss/bluetooth_adapter_floss.cc b/device/bluetooth/floss/bluetooth_adapter_floss.cc index 6bfcff8c..329d85e 100644 --- a/device/bluetooth/floss/bluetooth_adapter_floss.cc +++ b/device/bluetooth/floss/bluetooth_adapter_floss.cc
@@ -330,6 +330,39 @@ } } +void BluetoothAdapterFloss::OnGetConnectionState( + const FlossDeviceId& device_id, + const absl::optional<uint32_t>& ret, + const absl::optional<Error>& error) { + BluetoothDeviceFloss* device = + static_cast<BluetoothDeviceFloss*>(GetDevice(device_id.address)); + + if (!device) { + LOG(WARNING) << "GetConnectionState returned for a non-existing device " + << device_id; + return; + } + + // Connected if connection state >= 1: + // https://android.googlesource.com/platform/packages/modules/Bluetooth/+/84eff3217e552cbb3399e6deecdfce6748ae34ef/system/btif/src/btif_dm.cc#693 + device->SetIsConnected(*ret >= 1); +} + +void BluetoothAdapterFloss::OnGetBondState(const FlossDeviceId& device_id, + const absl::optional<uint32_t>& ret, + const absl::optional<Error>& error) { + BluetoothDeviceFloss* device = + static_cast<BluetoothDeviceFloss*>(GetDevice(device_id.address)); + + if (!device) { + LOG(WARNING) << "GetBondState returned for a non-existing device " + << device_id; + return; + } + + device->SetBondState(static_cast<FlossAdapterClient::BondState>(*ret)); +} + // Announce to observers a change in the adapter state. void BluetoothAdapterFloss::DiscoverableChanged(bool discoverable) { NOTIMPLEMENTED(); @@ -421,13 +454,21 @@ std::string canonical_address = device::CanonicalizeBluetoothAddress(device_floss->GetAddress()); if (!base::Contains(devices_, canonical_address)) { - // TODO(b/204708206): Populate initial device properties first, e.g. - // connection state. - // Take copy of pointer before moving ownership. BluetoothDeviceFloss* device_ptr = device_floss.get(); devices_.emplace(canonical_address, std::move(device_floss)); + // TODO(b/204708206): Convert "Paired" and "Connected" property into a + // property framework. + FlossDBusManager::Get()->GetAdapterClient()->GetBondState( + base::BindOnce(&BluetoothAdapterFloss::OnGetBondState, + weak_ptr_factory_.GetWeakPtr(), device_found), + device_found); + FlossDBusManager::Get()->GetAdapterClient()->GetConnectionState( + base::BindOnce(&BluetoothAdapterFloss::OnGetConnectionState, + weak_ptr_factory_.GetWeakPtr(), device_found), + device_found); + for (auto& observer : observers_) observer.DeviceAdded(this, device_ptr); } else {
diff --git a/device/bluetooth/floss/bluetooth_adapter_floss.h b/device/bluetooth/floss/bluetooth_adapter_floss.h index 5fd320e..28a2505 100644 --- a/device/bluetooth/floss/bluetooth_adapter_floss.h +++ b/device/bluetooth/floss/bluetooth_adapter_floss.h
@@ -147,6 +147,12 @@ const absl::optional<Error>& error); void OnGetBondedDevices(const absl::optional<std::vector<FlossDeviceId>>& ret, const absl::optional<Error>& error); + void OnGetConnectionState(const FlossDeviceId& device_id, + const absl::optional<uint32_t>& ret, + const absl::optional<Error>& error); + void OnGetBondState(const FlossDeviceId& device_id, + const absl::optional<uint32_t>& ret, + const absl::optional<Error>& error); // Announce to observers a change in the adapter state. void DiscoverableChanged(bool discoverable);
diff --git a/device/bluetooth/floss/bluetooth_floss_unittest.cc b/device/bluetooth/floss/bluetooth_floss_unittest.cc index a3e569c..db81b5b 100644 --- a/device/bluetooth/floss/bluetooth_floss_unittest.cc +++ b/device/bluetooth/floss/bluetooth_floss_unittest.cc
@@ -255,12 +255,19 @@ base::BindLambdaForTesting([](FlossManagerClient::Observer* observer) { observer->AdapterEnabledChanged(/*hci=*/0, /*enabled=*/true); })); + base::RunLoop().RunUntilIdle(); // After adapter is enabled, there are known devices. - EXPECT_TRUE(adapter_->GetDevice(FakeFlossAdapterClient::kBondedAddress1) != - nullptr); - EXPECT_TRUE(adapter_->GetDevice(FakeFlossAdapterClient::kBondedAddress2) != - nullptr); + BluetoothDevice* device1 = + adapter_->GetDevice(FakeFlossAdapterClient::kBondedAddress1); + BluetoothDevice* device2 = + adapter_->GetDevice(FakeFlossAdapterClient::kBondedAddress2); + ASSERT_TRUE(device1); + ASSERT_TRUE(device2); + EXPECT_TRUE(device1->IsPaired()); + EXPECT_TRUE(device2->IsPaired()); + EXPECT_TRUE(device1->IsConnected()); + EXPECT_FALSE(device2->IsConnected()); } } // namespace floss
diff --git a/device/bluetooth/floss/fake_floss_adapter_client.cc b/device/bluetooth/floss/fake_floss_adapter_client.cc index 15c5194..774ea6ad 100644 --- a/device/bluetooth/floss/fake_floss_adapter_client.cc +++ b/device/bluetooth/floss/fake_floss_adapter_client.cc
@@ -97,6 +97,28 @@ } } +void FakeFlossAdapterClient::GetConnectionState( + ResponseCallback<uint32_t> callback, + const FlossDeviceId& device) { + // One of the bonded devices is already connected at the beginning. + uint32_t conn_state = (device.address == kBondedAddress1) ? 1 : 0; + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(std::move(callback), conn_state, /*err=*/absl::nullopt)); +} + +void FakeFlossAdapterClient::GetBondState(ResponseCallback<uint32_t> callback, + const FlossDeviceId& device) { + FlossAdapterClient::BondState bond_state = + (device.address == kBondedAddress1 || device.address == kBondedAddress2) + ? floss::FlossAdapterClient::BondState::kBonded + : floss::FlossAdapterClient::BondState::kNotBonded; + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(std::move(callback), static_cast<uint32_t>(bond_state), + /*err=*/absl::nullopt)); +} + void FakeFlossAdapterClient::ConnectAllEnabledProfiles( ResponseCallback<Void> callback, const FlossDeviceId& device) { @@ -148,7 +170,9 @@ FlossDeviceId({.address = kBondedAddress1, .name = ""})); known_devices.push_back( FlossDeviceId({.address = kBondedAddress2, .name = ""})); - std::move(callback).Run(known_devices, absl::nullopt); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), known_devices, + /*err=*/absl::nullopt)); } } // namespace floss
diff --git a/device/bluetooth/floss/fake_floss_adapter_client.h b/device/bluetooth/floss/fake_floss_adapter_client.h index 0d8a9c7..fd219a7d 100644 --- a/device/bluetooth/floss/fake_floss_adapter_client.h +++ b/device/bluetooth/floss/fake_floss_adapter_client.h
@@ -36,6 +36,10 @@ void CreateBond(ResponseCallback<Void> callback, FlossDeviceId device, BluetoothTransport transport) override; + void GetConnectionState(ResponseCallback<uint32_t> callback, + const FlossDeviceId& device) override; + void GetBondState(ResponseCallback<uint32_t> callback, + const FlossDeviceId& device) override; void ConnectAllEnabledProfiles(ResponseCallback<Void> callback, const FlossDeviceId& device) override; void SetPairingConfirmation(ResponseCallback<Void> callback,
diff --git a/device/bluetooth/floss/floss_adapter_client.cc b/device/bluetooth/floss/floss_adapter_client.cc index c254d23..a513e771d 100644 --- a/device/bluetooth/floss/floss_adapter_client.cc +++ b/device/bluetooth/floss/floss_adapter_client.cc
@@ -65,6 +65,12 @@ adapter::kGetConnectionState, device); } +void FlossAdapterClient::GetBondState(ResponseCallback<uint32_t> callback, + const FlossDeviceId& device) { + CallAdapterMethod1<uint32_t>(std::move(callback), adapter::kGetBondState, + device); +} + void FlossAdapterClient::ConnectAllEnabledProfiles( ResponseCallback<Void> callback, const FlossDeviceId& device) {
diff --git a/device/bluetooth/floss/floss_adapter_client.h b/device/bluetooth/floss/floss_adapter_client.h index 17952c60..297944d 100644 --- a/device/bluetooth/floss/floss_adapter_client.h +++ b/device/bluetooth/floss/floss_adapter_client.h
@@ -138,6 +138,10 @@ virtual void GetConnectionState(ResponseCallback<uint32_t> callback, const FlossDeviceId& device); + // Get bonding state of a device. + virtual void GetBondState(ResponseCallback<uint32_t> callback, + const FlossDeviceId& device); + // Connect to all enabled profiles. virtual void ConnectAllEnabledProfiles(ResponseCallback<Void> callback, const FlossDeviceId& device);
diff --git a/device/bluetooth/floss/floss_dbus_client.cc b/device/bluetooth/floss/floss_dbus_client.cc index 4996584..56c14522 100644 --- a/device/bluetooth/floss/floss_dbus_client.cc +++ b/device/bluetooth/floss/floss_dbus_client.cc
@@ -76,6 +76,7 @@ const char kCreateBond[] = "CreateBond"; const char kCancelBondProcess[] = "CancelBondProcess"; const char kGetConnectionState[] = "GetConnectionState"; +const char kGetBondState[] = "GetBondState"; const char kConnectAllEnabledProfiles[] = "ConnectAllEnabledProfiles"; const char kRegisterCallback[] = "RegisterCallback"; const char kRegisterConnectionCallback[] = "RegisterConnectionCallback";
diff --git a/device/bluetooth/floss/floss_dbus_client.h b/device/bluetooth/floss/floss_dbus_client.h index c8abbcc..4fec209 100644 --- a/device/bluetooth/floss/floss_dbus_client.h +++ b/device/bluetooth/floss/floss_dbus_client.h
@@ -36,6 +36,7 @@ extern DEVICE_BLUETOOTH_EXPORT const char kCreateBond[]; extern DEVICE_BLUETOOTH_EXPORT const char kCancelBondProcess[]; extern DEVICE_BLUETOOTH_EXPORT const char kGetConnectionState[]; +extern DEVICE_BLUETOOTH_EXPORT const char kGetBondState[]; extern DEVICE_BLUETOOTH_EXPORT const char kConnectAllEnabledProfiles[]; extern DEVICE_BLUETOOTH_EXPORT const char kRegisterCallback[]; extern DEVICE_BLUETOOTH_EXPORT const char kRegisterConnectionCallback[];
diff --git a/docs/testing/web_platform_tests.md b/docs/testing/web_platform_tests.md index 334e447..a446c5ce 100644 --- a/docs/testing/web_platform_tests.md +++ b/docs/testing/web_platform_tests.md
@@ -387,3 +387,58 @@ and `GH_TOKEN`, the access token you have just generated. After that, pass `--credentials-json <path-to-json>` to `wpt-export` and `wpt-import`. + +### Debugging failed web platform tests + +This section explains the way to debug web platform tests. +Please build `blink_tests` before running commands below. +It is explained in [Running Web Tests](./web_tests.md#running-web-tests). + +#### Running test(s) + +The way to run web tests is explained in [Running the +Tests](./web_tests.md#running-the-tests). + +Assume that you are writing the test named `wpt_internal/fake/foobar.html`. +You may want to run only the tests and you do not want to run all tests under +`wpt_internal/fake`. The following command narrows down the test to only +`wpt_internal/fake/foobar.html`. + +```bash +third_party/blink/tools/run_web_tests.py -t Default \ +third_party/blink/web_tests/wpt_internal/fake/foobar.html +``` + +#### Logging + +During the debug, you may want to log what happens during the test. +You can use `console.log` in JavaScript to log arbitrary strings. + +``` +e.g. +console.log('fake has been executed.'); +console.log('foo=' + foo); +``` + +Logs are written under `$root_build_dir/layout-test-results`. +If you have tested `wpt_internal/fake/foobar.html`, the log will be stored in +`$root_build_dir/layout-test-results/wpt_internal/fake/foobar-stderr.txt`. +You can change output directory with `--results-directory=<output directory>`. + +#### Checking HTTP servers + +For some test cases, you may use .headers file to set arbitrary HTTP headers. +To verify what is set to headers, you can run an HTTP server used for WPT +by yourself. The following command starts the HTTP server for you: + +```bash +third_party/blink/tools/run_blink_wptserve.py +``` + +To see headers returned by the server, you can use `curl -v`. +`curl` will show headers in stderr. You may want to use `|& less` to +see output if it is too long. + +```bash +curl -v http://localhost:8081/wpt_internal/fake/foobar.html |& less +```
diff --git a/docs/testing/web_tests.md b/docs/testing/web_tests.md index 2968f47..899bc04 100644 --- a/docs/testing/web_tests.md +++ b/docs/testing/web_tests.md
@@ -19,6 +19,10 @@ Tests that should work across browsers go there. Other directories are for Chrome-specific tests only. +Note: if you are looking for a guide for the Web Platform Test, you should read +["Web platform tests"](./web_platform_tests.md) (WPT). This document does not +cover WPT specific features/behaviors. + [TOC] ## Running Web Tests @@ -452,6 +456,12 @@ ### Debugging HTTP Tests +Note: HTTP Tests mean tests under `web_tests/http/tests/`, +which is a subset of WebKit Layout Tests originated suite. +If you want to debug WPT's HTTP behavior, you should read +["Web platform tests"](./web_platform_tests.md) instead. + + To run the server manually to reproduce/debug a failure: ```bash
diff --git a/docs/testing/writing_web_tests.md b/docs/testing/writing_web_tests.md index 33ae397..4e02660 100644 --- a/docs/testing/writing_web_tests.md +++ b/docs/testing/writing_web_tests.md
@@ -20,6 +20,11 @@ These tests will use Blink-specific testing APIs that are only available in [content_shell](./web_tests_in_content_shell.md). +Note: if you are looking for a guide for the Web Platform Test, you should read +["Web platform tests"](./web_platform_tests.md) (WPT). This document does not +cover WPT specific features/behaviors. The WPT is recommended today rather than +test types mentioned below! + *** promo If you know that Blink web tests are upstreamed to other projects, such as [test262](https://github.com/tc39/test262), please update this document. Most
diff --git a/ios/chrome/app/application_delegate/metrics_mediator.h b/ios/chrome/app/application_delegate/metrics_mediator.h index ce56e664f..345659f 100644 --- a/ios/chrome/app/application_delegate/metrics_mediator.h +++ b/ios/chrome/app/application_delegate/metrics_mediator.h
@@ -18,6 +18,10 @@ // handler was called. extern NSString* const kAppEnteredBackgroundDateKey; +// The key to a NSUserDefaults entry logging the number of times application +// didFinishLaunching is called before a scene is attached. +extern NSString* const kAppDidFinishLaunchingConsecutiveCallsKey; + // Struct containing histogram names and number of buckets. Used for recording // histograms fired in extensions. struct HistogramNameCountPair {
diff --git a/ios/chrome/app/application_delegate/metrics_mediator.mm b/ios/chrome/app/application_delegate/metrics_mediator.mm index 28e0e0db..da8b6db 100644 --- a/ios/chrome/app/application_delegate/metrics_mediator.mm +++ b/ios/chrome/app/application_delegate/metrics_mediator.mm
@@ -176,6 +176,8 @@ namespace metrics_mediator { NSString* const kAppEnteredBackgroundDateKey = @"kAppEnteredBackgroundDate"; +NSString* const kAppDidFinishLaunchingConsecutiveCallsKey = + @"kAppDidFinishLaunchingConsecutiveCallsKey"; void RecordWidgetUsage(base::span<const HistogramNameCountPair> histograms) { using base::SysNSStringToUTF8; @@ -247,6 +249,7 @@ } // namespace metrics_mediator using metrics_mediator::kAppEnteredBackgroundDateKey; +using metrics_mediator::kAppDidFinishLaunchingConsecutiveCallsKey; @interface MetricsMediator () // Starts or stops metrics recording. @@ -298,6 +301,9 @@ NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; int consecutiveLoads = [defaults integerForKey:kLoadTimePreferenceKey]; [defaults removeObjectForKey:kLoadTimePreferenceKey]; + int consecutiveDidFinishLaunching = + [defaults integerForKey:kAppDidFinishLaunchingConsecutiveCallsKey]; + [defaults removeObjectForKey:kAppDidFinishLaunchingConsecutiveCallsKey]; base::UmaHistogramTimes("Startup.ColdStartFromProcessCreationTimeV2", processStartToNowTime); @@ -312,6 +318,9 @@ processStartToNowTime - sceneConnectionToNowTime); base::UmaHistogramCounts100("Startup.ConsecutiveLoadsWithoutLaunch", consecutiveLoads); + base::UmaHistogramCounts100( + "Startup.ConsecutiveDidFinishLaunchingWithoutLaunch", + consecutiveDidFinishLaunching); if ([connectionInformation startupParameters]) { base::UmaHistogramTimes("Startup.ColdStartWithExternalURLTime",
diff --git a/ios/chrome/app/main_application_delegate.mm b/ios/chrome/app/main_application_delegate.mm index a33f831e..6a6b926 100644 --- a/ios/chrome/app/main_application_delegate.mm +++ b/ios/chrome/app/main_application_delegate.mm
@@ -92,6 +92,13 @@ self.didFinishLaunching = YES; _appState.startupInformation.didFinishLaunchingTime = base::TimeTicks::Now(); + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + [defaults + setInteger:[defaults integerForKey: + metrics_mediator:: + kAppDidFinishLaunchingConsecutiveCallsKey] + + 1 + forKey:metrics_mediator::kAppDidFinishLaunchingConsecutiveCallsKey]; BOOL inBackground = [application applicationState] == UIApplicationStateBackground; BOOL requiresHandling =
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm index 9a7b13f37..b521b120 100644 --- a/ios/chrome/app/main_controller.mm +++ b/ios/chrome/app/main_controller.mm
@@ -27,6 +27,7 @@ #include "components/feature_engagement/public/tracker.h" #include "components/metrics/metrics_pref_names.h" #include "components/metrics/metrics_service.h" +#include "components/password_manager/core/common/password_manager_features.h" #include "components/password_manager/core/common/passwords_directory_util_ios.h" #include "components/prefs/ios/pref_observer_bridge.h" #include "components/prefs/pref_change_registrar.h" @@ -985,6 +986,8 @@ // field trial infrastruction isn't in extensions. Save the necessary values to // NSUserDefaults here. - (void)saveFieldTrialValuesForExtensions { + using password_manager::features::kIOSEnablePasswordManagerBrandingUpdate; + NSUserDefaults* sharedDefaults = app_group::GetGroupUserDefaults(); NSNumber* passwordCreationValue = [NSNumber @@ -998,6 +1001,11 @@ NSNumber* credentialProviderExtensionPromoVersion = [NSNumber numberWithInt:kCredentialProviderExtensionPromoFeatureVersion]; + NSNumber* passwordManagerBrandingUpdateValue = + @(base::FeatureList::IsEnabled(kIOSEnablePasswordManagerBrandingUpdate)); + NSNumber* passwordManagerBrandingUpdateVersion = + [NSNumber numberWithInt:kPasswordManagerBrandingUpdateFeatureVersion]; + // Add other field trial values here if they are needed by extensions. // The general format is // { @@ -1014,6 +1022,10 @@ base::SysUTF8ToNSString(kCredentialProviderExtensionPromo.name) : @{ kFieldTrialValueKey : credentialProviderExtensionPromoValue, kFieldTrialVersionKey : credentialProviderExtensionPromoVersion, + }, + base::SysUTF8ToNSString(kIOSEnablePasswordManagerBrandingUpdate.name) : @{ + kFieldTrialValueKey : passwordManagerBrandingUpdateValue, + kFieldTrialVersionKey : passwordManagerBrandingUpdateVersion, } }; [sharedDefaults setObject:fieldTrialValues
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_LEAK_CHANGE_CREDENTIALS.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_LEAK_CHANGE_CREDENTIALS.png.sha1 new file mode 100644 index 0000000..32ad8d0 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_LEAK_CHANGE_CREDENTIALS.png.sha1
@@ -0,0 +1 @@ +1aa2d21168142fa2fb57d27b3f4ffbc2f5f75537 \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb index 16df487e..d929bc40 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb
@@ -31,6 +31,7 @@ <translation id="2478931088402984578">Επιλέξτε το <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> <translation id="2567507405773541360">Κάντε περισσότερα με ένα απλό, ασφαλές και πιο γρήγορο από ποτέ Chromium</translation> <translation id="2590893390871230428">Συγχρονισμός δεδομένων Chromium</translation> +<translation id="259094968798709429">Οι κωδικοί πρόσβασης αποθηκεύονται στον <ph name="BEGIN_LINK" />Διαχειριστή κωδικών πρόσβασης<ph name="END_LINK" />, έτσι ώστε να μπορείτε να τους χρησιμοποιήσετε σε οποιαδήποτε συσκευή.</translation> <translation id="2650312721222849884">Για να βλέπετε τις καρτέλες σας από όπου και αν χρησιμοποιείτε το Chromium, ενεργοποιήστε τον συγχρονισμό.</translation> <translation id="2684230048001240293">Ορίστε το Chromium ως το προεπιλεγμένο πρόγραμμα περιήγησης για συγχρονισμό καρτελών, κωδικών πρόσβασης και πληροφοριών πληρωμών σε όλες τις συσκευές σας</translation> <translation id="2730884209570016437">Το Chromium δεν μπορεί να χρησιμοποιήσει την κάμερά σας επειδή χρησιμοποιείται από μια άλλη εφαρμογή</translation> @@ -44,6 +45,7 @@ <translation id="3639997914391704523">Το Chromium μπορεί να ελέγξει τους κωδικούς πρόσβασής σας όταν συνδέεστε με τον Λογαριασμό σας Google.</translation> <translation id="3805899903892079518">Το Chromium δεν έχει πρόσβαση σε φωτογραφίες ή βίντεό σας. Ενεργ. πρόσβασης στις Ρυθμίσεις iOS > Απόρρητο > Φωτογραφίες.</translation> <translation id="3946918322491238254">Μπορείτε ακόμη να δείτε όλους τους σελιδοδείκτες, το ιστορικό, τους κωδικούς πρόσβασης και άλλες ρυθμίσεις σε αυτήν τη συσκευή. Εάν πραγματοποιήσετε αλλαγές, δεν θα συγχρονιστούν στον λογαριασμό σας.</translation> +<translation id="4043291146360695975">Οι κωδικοί πρόσβασης αποθηκεύονται στον Διαχειριστή κωδικών πρόσβασης μόνο σε αυτήν τη συσκευή.</translation> <translation id="4099085513035183040">Δεν υποστηρίζεται στο Chromium Beta</translation> <translation id="4555020257205549924">Όταν αυτή η λειτουργία είναι ενεργοποιημένη, το Chromium θα προσφέρει τη μετάφραση σελίδων που είναι γραμμένες σε άλλες γλώσσες χρησιμοποιώντας τη Μετάφραση Google. <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation> <translation id="4585809515399340748">Μπορείτε πλέον να χρησιμοποιείτε το Chromium κάθε φορά που πατάτε συνδέσμους σε μηνύματα, έγγραφα και άλλες εφαρμογές.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb index 62a44aa..ab4c60f 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb
@@ -31,6 +31,7 @@ <translation id="2478931088402984578">Selecciona <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" />.</translation> <translation id="2567507405773541360">Realiza más tareas con una versión de Chromium más simple, segura y rápida que nunca</translation> <translation id="2590893390871230428">Sincronizar tus datos de Chromium</translation> +<translation id="259094968798709429">Las contraseñas se guardan en el <ph name="BEGIN_LINK" />Administrador de contraseñas<ph name="END_LINK" /> para que puedas usarlas en cualquier dispositivo.</translation> <translation id="2650312721222849884">Para ver tus pestañas donde sea que uses Chromium, activa la sincronización</translation> <translation id="2684230048001240293">Establece Chromium como navegador predeterminado para sincronizar tus pestañas, información de pago y contraseñas en todos tus dispositivos</translation> <translation id="2730884209570016437">Chromium no puede utilizar tu cámara porque la está usando otra aplicación</translation> @@ -44,6 +45,7 @@ <translation id="3639997914391704523">Chromium puede revisar las contraseñas cuando accedes con tu Cuenta de Google.</translation> <translation id="3805899903892079518">Chromium no tiene acceso a tus fotos o videos. Habilita el acceso en Configuración de iOS > Privacidad > Fotos.</translation> <translation id="3946918322491238254">Podrás seguir viendo todos tus favoritos, el historial, las contraseñas y otras opciones de configuración en este dispositivo. Si realizas cambios, no se sincronizarán con tu cuenta.</translation> +<translation id="4043291146360695975">Las contraseñas se guardan en el Administrador de contraseñas solo en este dispositivo.</translation> <translation id="4099085513035183040">No es compatible en la versión beta de Chromium</translation> <translation id="4555020257205549924">Si activas esta función, Chromium te preguntará si deseas usar Google Traductor para traducir páginas en otros idiomas. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="4585809515399340748">Ahora puedes usar Chromium cada vez que presionas vínculos que aparecen en mensajes, documentos u otras apps.</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 09a9c5a..0d7c5f1 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="kk"> <translation id="102360288709523007">Пайдалану статистикасы мен жаңылыс туралы есептерді Google-ға жіберіп, Chromium қызметін жақсартыңыз.</translation> +<translation id="1047130070405668746">Chromium браузерін таңдаңыз.</translation> <translation id="1185134272377778587">Chromium туралы ақпарат</translation> <translation id="1257458525759135959">Суреттерді сақтау үшін "Параметрлер" бөлімін түртіп, Chromium браузеріне суреттер қосуға рұқсат етіңіз.</translation> <translation id="1289216811211435351">Chromium браузеріне ауысыңыз</translation> @@ -18,6 +19,7 @@ <translation id="1838412507805038478">Chromium браузері <ph name="ISSUER" /> осы вебсайт сертификатын шығарғанын растады.</translation> <translation id="1843424232666537147">Chromium интернет деректеріңізді және веббеттерді жүктеу жылдамдығын басқаруға көмектесетін функцияларға ие. <ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation> +<translation id="1867772173333403444">4. Chromium браузерін таңдаңыз.</translation> <translation id="2006345422933397527">Chromium жаңа нұсқалардың бар-жоғын тексере алмады. Интернет байланысын тексеріп көріңіз.</translation> <translation id="2054703085270098503">Chromium-нің көмегімен қауіпсіз күйде қалыңыз</translation> <translation id="2168108852149185974">Кейбір қондырмалар Chromium браузерін бұзады. Мыналарды жойыңыз:</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ne.xtb index cd2438d..6de6b0a6 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ne.xtb
@@ -30,6 +30,7 @@ <translation id="2478931088402984578"><ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> चयन गर्नुहोस्</translation> <translation id="2567507405773541360">सरल, सुरक्षित र अहिलेसम्मकै छिटो Chromium प्रयोग गरी अझ धेरै काम सकाउनुहोस्</translation> <translation id="2590893390871230428">Chromium को आफ्नो डेटा सिंक गर्नुहोस्</translation> +<translation id="259094968798709429">तपाईं आफ्ना पासवर्डहरू जुनसुकै डिभाइसमा प्रयोग गर्न सक्नुहोस् भन्नाका लागि पासवर्डहरू <ph name="BEGIN_LINK" />पासवर्ड म्यानेजर<ph name="END_LINK" />मा सेभ गरिन्छन्।</translation> <translation id="2650312721222849884">आफूले Chromium प्रयोग गर्ने सबै डिभाइसमा खोलिएका ट्याबहरू हेर्न सिंक गर्ने सुविधा अन गर्नुहोस्</translation> <translation id="2684230048001240293">आफ्ना सबै यन्त्रबाट आफ्ना ट्याब, पासवर्ड तथा भुक्तानीसम्बन्धी जानकारी सिंक गर्न Chromium लाई डिफल्ट ब्राउजर बनाउनुहोस्</translation> <translation id="2730884209570016437">अर्को अनुप्रयोगले तपाईँको क्यामेराको प्रयोग गरिरहेको हुनाले Chromium ले उक्त क्यामेराको प्रयोग गर्न सक्दैन</translation> @@ -43,6 +44,7 @@ <translation id="3639997914391704523">तपाईंले आफ्नो Google खातामा साइन इन गरेपछि मात्र Chromium ले तपाईंका पासवर्डहरू जाँच्न सक्छ।</translation> <translation id="3805899903892079518">Chromiumसँग तपाईंको तस्बिर वा भिडियोहरूमा पहुँच छैन। iOS सेटिङहरू > गोपनीयता > तस्बिरहरूमा पहुँच सक्रिय गर्नुहोस्।</translation> <translation id="3946918322491238254">तपाईं यो डिभाइसमा आफ्ना सबै बुकमार्क, इतिहास, पासवर्ड र अन्य सेटिङ देखिरहनु हुने छ। तपाईंले यी कुरामा परिवर्तन गर्नुभयो भने ती परिवर्तन तपाईंको खातामा सिंक हुने छैनन्।</translation> +<translation id="4043291146360695975">पासवर्डहरू यो डिभाइसको पासवर्ड म्यानेजरमा मात्र सेभ गरिन्छन्।</translation> <translation id="4099085513035183040">Chromium को बिटा संस्करणमा प्रयोग गर्न मिल्दैन</translation> <translation id="4555020257205549924">यो सुविधा सक्रिय भएपछि, Chromium ले Google अनुवादकको प्रयोग गरी अन्य भाषाहरूमा लेखिएका पृष्ठहरू अनुवाद गर्न प्रस्ताव गर्ने छ। <ph name="BEGIN_LINK" />थप जान्नुहोस्<ph name="END_LINK" /></translation> <translation id="4585809515399340748">तपाईंले अब कुनै म्यासेज, डकुमेन्ट र अन्य एपमा भएका लिंकमा ट्याप गर्दा ती लिंक Chromium मा खुल्ने छन्।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb index d24d1c5..1bebb47 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb
@@ -31,6 +31,7 @@ <translation id="2478931088402984578">Selecteer <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" />.</translation> <translation id="2567507405773541360">Krijg meer gedaan met Chromium. Nu nog eenvoudiger, veiliger en sneller dan ooit</translation> <translation id="2590893390871230428">Je Chromium-gegevens synchroniseren</translation> +<translation id="259094968798709429">Wachtwoorden worden opgeslagen in <ph name="BEGIN_LINK" />Wachtwoordmanager<ph name="END_LINK" /> zodat je ze op elk apparaat kunt gebruiken.</translation> <translation id="2650312721222849884">Zet de synchronisatie aan om je tabbladen te bekijken vanaf elk apparaat waarop je Chromium gebruikt</translation> <translation id="2684230048001240293">Stel Chromium in als je standaardbrowser om je tabbladen, wachtwoorden en betalingsgegevens op al je apparaten te synchroniseren</translation> <translation id="2730884209570016437">Chromium kan je camera niet gebruiken omdat deze wordt gebruikt door een andere app</translation> @@ -44,6 +45,7 @@ <translation id="3639997914391704523">Chromium kan je wachtwoorden checken als je inlogt met je Google-account.</translation> <translation id="3805899903892079518">Chromium heeft geen toegang tot je foto's of video's. Geef in iOS toegang via Instellingen > Privacy > Foto's.</translation> <translation id="3946918322491238254">Je bookmarks, geschiedenis, wachtwoorden en andere instellingen blijven zichtbaar op dit apparaat. Als je wijzigingen aanbrengt, worden deze niet gesynchroniseerd met je account.</translation> +<translation id="4043291146360695975">Wachtwoorden worden alleen opgeslagen in Wachtwoordmanager op dit apparaat.</translation> <translation id="4099085513035183040">Niet ondersteund in Chromium (bèta)</translation> <translation id="4555020257205549924">Als deze functie aanstaat, biedt Chromium aan pagina's die zijn geschreven in andere talen te vertalen met Google Translate. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation> <translation id="4585809515399340748">Je kunt Chromium nu gebruiken als je op links in berichten, documenten en andere apps tikt.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb index 525ed36..247de5f4 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
@@ -31,6 +31,7 @@ <translation id="2478931088402984578">Selecione o <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" />.</translation> <translation id="2567507405773541360">Seja mais eficiente com um Chromium simples, seguro e mais rápido do que nunca</translation> <translation id="2590893390871230428">Sincronizar seus dados do Chromium</translation> +<translation id="259094968798709429">As senhas são salvas no <ph name="BEGIN_LINK" />Gerenciador de senhas<ph name="END_LINK" /> para que você as use em qualquer dispositivo.</translation> <translation id="2650312721222849884">Para ver suas guias em qualquer lugar onde você usar o Chromium, ative a sincronização</translation> <translation id="2684230048001240293">Defina o Chromium como padrão para sincronizar guias, senhas e informações de pagamento em todos os seus dispositivos</translation> <translation id="2730884209570016437">O Chromium não pode usar a câmera porque ela está sendo usada por outro app</translation> @@ -44,6 +45,7 @@ <translation id="3639997914391704523">O Chromium pode verificar suas senhas quando você faz login com sua Conta do Google.</translation> <translation id="3805899903892079518">O Chromium não têm acesso às suas fotos ou seus vídeos. Permita o acesso em "Configurações do iOS" > "Privacidade" > "Fotos".</translation> <translation id="3946918322491238254">Ainda é possível ver seus favoritos, seu histórico, suas senhas e outras configurações neste dispositivo. Se você fizer mudanças, elas não serão sincronizadas com sua conta.</translation> +<translation id="4043291146360695975">As senhas são salvas no Gerenciador de senhas somente neste dispositivo.</translation> <translation id="4099085513035183040">Indisponível no Chromium Beta</translation> <translation id="4555020257205549924">Quando este recurso está ativado, o Chromium oferece a tradução de páginas escritas em outros idiomas usando o Google Tradutor. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation> <translation id="4585809515399340748">Agora você poderá usar o Chromium sempre que tocar em links em mensagens, documentos e outros apps.</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 f55c711..cf49f780 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
@@ -31,6 +31,7 @@ <translation id="2478931088402984578">Selectează <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> <translation id="2567507405773541360">Poți să faci mai multe cu browserul Chromium, simplu, sigur și mai rapid ca oricând</translation> <translation id="2590893390871230428">Sincronizează-ți datele din Chromium</translation> +<translation id="259094968798709429">Parolele sunt salvate în <ph name="BEGIN_LINK" />Managerul de parole<ph name="END_LINK" /> pentru a le putea folosi pe orice dispozitiv.</translation> <translation id="2650312721222849884">Activează sincronizarea ca să vezi toate filele tale deschise în Chromium</translation> <translation id="2684230048001240293">Setează Chromium ca browser prestabilit pentru a sincroniza filele, parolele și informațiile de plată pe toate dispozitivele</translation> <translation id="2730884209570016437">Chromium nu poate folosi camera foto, deoarece este folosită de o altă aplicație</translation> @@ -44,6 +45,7 @@ <translation id="3639997914391704523">Chromium poate să îți verifice parolele atunci când te conectezi folosind Contul Google.</translation> <translation id="3805899903892079518">Chromium nu are acces la fotografii și videoclipuri. Activează accesul din Setări iOS > Confidențialitate > Fotografii.</translation> <translation id="3946918322491238254">Poți vedea în continuare toate marcajele, istoricul, parolele și alte setări pe acest dispozitiv. Dacă faci modificări, ele nu se vor sincroniza cu contul.</translation> +<translation id="4043291146360695975">Parolele sunt salvate în Managerul de parole numai pe acest dispozitiv.</translation> <translation id="4099085513035183040">Nu se acceptă în Chromium Beta</translation> <translation id="4555020257205549924">Când această funcție este activată, Chromium se va oferi să traducă paginile scrise în alte limbi utilizând Google Traducere. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation> <translation id="4585809515399340748">Acum poți folosi Chromium oricând atingi linkuri în mesaje, documente și alte aplicații.</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 f9161a1..48a76c32 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb
@@ -105,7 +105,7 @@ <translation id="8586442755830160949">© The Chromium Authors, <ph name="YEAR" /> . Все права защищены.</translation> <translation id="8663480472502753423">Обновляет Chromium до последней версии</translation> <translation id="8776843108004031667">Этот аккаунт и все несохраненные данные будут удалены из Chromium.</translation> -<translation id="894437814105052438">Выйдя из Chromium, вы остановите синхронизацию данных с аккаунтом Google. Уже синхронизированные данные не будут удалены.</translation> +<translation id="894437814105052438">Выйдя из Chromium, вы остановите синхронизацию данных с аккаунтом Google. Синхронизированные ранее данные не будут удалены.</translation> <translation id="9022552996538154597">Войти в Chromium</translation> <translation id="9089354809943900324">Версия Chromium устарела</translation> <translation id="9110075932708282655">Используйте Chromium по умолчанию</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 7f9a2abd..1f4a16b 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
@@ -31,6 +31,7 @@ <translation id="2478931088402984578"><ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> உலாவியைத் தேர்ந்தெடுக்கவும்</translation> <translation id="2567507405773541360">எளிய, பாதுகாப்பான & மிகவும் விரைவான Chromium மூலம் மேலும் பலவற்றைச் செய்திடுங்கள்</translation> <translation id="2590893390871230428">Chromium தரவை ஒத்திசை</translation> +<translation id="259094968798709429">எந்தச் சாதனத்திலும் பயன்படுத்தும் வகையில் <ph name="BEGIN_LINK" />கடவுச்சொல் நிர்வாகியில்<ph name="END_LINK" /> கடவுச்சொற்கள் சேமிக்கப்படுகின்றன.</translation> <translation id="2650312721222849884">நீங்கள் Chromiumமைப் பயன்படுத்தும் சாதனங்களில் உங்கள் தாவல்களைப் பார்க்க, ஒத்திசைவை இயக்கவும்</translation> <translation id="2684230048001240293">உங்கள் சாதனங்கள் அனைத்திலும் உள்ள தாவல்கள், கடவுச்சொற்கள், பேமெண்ட் தகவல் ஆகியவற்றை ஒத்திசைக்க Chromiumமை இயல்பு உலாவியாக அமைக்கலாம்</translation> <translation id="2730884209570016437">கேமராவை மற்றொரு ஆப்ஸ் உபயோகிப்பதால், Chromium அதைப் பயன்படுத்த முடியாது</translation> @@ -44,6 +45,7 @@ <translation id="3639997914391704523">நீங்கள் Google கணக்கைக் கொண்டு உள்நுழையும்போது Chromium உலாவியால் உங்கள் கடவுச்சொற்களைச் சரிபார்க்க முடியும்.</translation> <translation id="3805899903892079518">Chromiumமுக்குப் படங்களையோ வீடியோக்களையோ அணுக அனுமதி இல்லை. அணுகலை 'iOS அமைப்புகள் > தனியுரிமை > படங்கள்' என்பதில் இயக்கவும்.</translation> <translation id="3946918322491238254">இருப்பினும் இந்தச் சாதனத்தில் உள்ள உங்கள் புக்மார்க்குகள், இதுவரையான செயல்பாடுகள், கடவுச்சொற்கள், பிற அமைப்புகள் ஆகிய அனைத்தையும் உங்களால் பார்க்க முடியும். மாற்றங்களைச் செய்தால் அவை உங்கள் கணக்குடன் ஒத்திசைக்கப்படாது.</translation> +<translation id="4043291146360695975">இந்தச் சாதனத்தில் மட்டுமே உள்ள கடவுச்சொல் நிர்வாகியில் கடவுச்சொற்கள் சேமிக்கப்படுகின்றன.</translation> <translation id="4099085513035183040">Chromium பீட்டாவில் ஆதரிக்கப்படாது</translation> <translation id="4555020257205549924">இந்த அம்சம் இயக்கப்பட்டிருக்கும் போது, பிற மொழிகளில் எழுதப்பட்டுள்ள பக்கங்களை Google மொழியாக்கத்தைப் பயன்படுத்தி, உங்கள் மொழியில் மொழிபெயர்த்துக்கொள்ளும் வசதியை Chromium வழங்கும். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation> <translation id="4585809515399340748">இனி எப்போது வேண்டுமானாலும் மெசேஜ்கள், ஆவணங்கள் & பிற ஆப்ஸில் உள்ள இணைப்புகளைத் தட்டி, அவற்றை Chromiumமில் திறந்து பயன்படுத்தலாம்.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_el.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_el.xtb index 66198dae..fc3006fc 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_el.xtb
@@ -50,6 +50,7 @@ <translation id="4214277427269650960">Συνδεθείτε σε αυτόν τον ιστότοπο και στο Chrome. Μπορείτε να ενεργοποιήσετε τον συγχρονισμό αργότερα.</translation> <translation id="424864128008805179">Αποσύνδεση από το Chrome;</translation> <translation id="4249068189593983585">Συμβουλή για το Chrome. Για περισσότερες επιλογές καρτελών, αγγίξτε παρατεταμένα το κουμπί Εμφάνιση καρτελών στη γραμμή εργαλείων, η οποία βρίσκεται στο κάτω ή το επάνω τμήμα της οθόνης.</translation> +<translation id="4267862249323750454">Οι κωδικοί πρόσβασης αποθηκεύονται στον <ph name="BEGIN_LINK" />Διαχειριστή κωδικών πρόσβασης Google<ph name="END_LINK" />, έτσι ώστε να μπορείτε να τους χρησιμοποιήσετε σε οποιαδήποτε συσκευή.</translation> <translation id="4523886039239821078">Ορισμένα πρόσθετα προκαλούν σφάλματα στο Chrome. Aπεγκαταστήστε τα.</translation> <translation id="4633328489441962921">Το Chrome δεν μπορεί να ελέγξει για ενημερώσεις.</translation> <translation id="4698415050768537821">Το Chrome δεν μπόρεσε να ελέγξει όλους τους κωδικούς πρόσβασης. Δοκιμάστε ξανά αύριο ή <ph name="BEGIN_LINK" />ελέγξτε τους κωδικούς πρόσβασης στον Λογαριασμό σας Google<ph name="END_LINK" />.</translation> @@ -70,6 +71,7 @@ <translation id="6063091872902370735">Να επιτρέπεται η σύνδεση στο Chrome</translation> <translation id="6181930887571472871">Εναλλαγή σε Chrome</translation> <translation id="6238746320622508509">Επιτρέψτε στο Chrome να κλειδώνει τις καρτέλες ανώνυμης περιήγησης.</translation> +<translation id="6387994324662817823">Οι κωδικοί πρόσβασης αποθηκεύονται στον Διαχειριστή κωδικών πρόσβασης Google μόνο σε αυτήν τη συσκευή.</translation> <translation id="6427126399757991875">Ο οργανισμός σας ρυθμίζει το Chrome…</translation> <translation id="6600954340915313787">Αντιγράφηκε στο Chrome</translation> <translation id="6634107063912726160">Όταν αποσυνδέεστε, το Chrome δεν θα συγχρονίζει τυχόν νέα δεδομένα στον Λογαριασμό σας Google. Τα δεδομένα που έχουν συγχρονιστεί στο παρελθόν, παραμένουν στον λογαριασμό σας.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb index 73788efb1..9308cc1 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb
@@ -50,6 +50,7 @@ <translation id="4214277427269650960">Accede a este sitio y a Chrome. Puedes activar la sincronización más tarde.</translation> <translation id="424864128008805179">¿Quieres salir de Chrome?</translation> <translation id="4249068189593983585">Sugerencia de Chrome: Para obtener más opciones de pestañas, mantén presionado el botón Mostrar pestañas de la barra de herramientas, que se encuentra en la parte inferior o superior de la pantalla.</translation> +<translation id="4267862249323750454">Las contraseñas se guardan en el <ph name="BEGIN_LINK" />Administrador de contraseñas de Google<ph name="END_LINK" /> para que puedas usarlas en cualquier dispositivo.</translation> <translation id="4523886039239821078">Algunos complementos causan bloqueos en Chrome. Desinstala:</translation> <translation id="4633328489441962921">Chrome no puede buscar actualizaciones</translation> <translation id="4698415050768537821">Chrome no pudo revisar todas las contraseñas. Vuelve a intentarlo mañana o <ph name="BEGIN_LINK" />revisa las contraseñas guardadas en tu Cuenta de Google.<ph name="END_LINK" /></translation> @@ -70,6 +71,7 @@ <translation id="6063091872902370735">Permitir el acceso a Chrome</translation> <translation id="6181930887571472871">Cambia a Chrome</translation> <translation id="6238746320622508509">Permite que Chrome bloquee tus pestañas de incógnito.</translation> +<translation id="6387994324662817823">Las contraseñas se guardan en el Administrador de contraseñas de Google solo en este dispositivo.</translation> <translation id="6427126399757991875">Tu organización está configurando Chrome…</translation> <translation id="6600954340915313787">Se copió en Chrome.</translation> <translation id="6634107063912726160">Si sales de la cuenta, Chrome no sincronizará ningún dato nuevo con tu Cuenta de Google. Los datos sincronizados anteriormente permanecerán en la cuenta.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb index 0a07256..5ea744b 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb
@@ -55,8 +55,10 @@ <translation id="4698415050768537821">Chrome барлық құпия сөзді тексере алмады. Ертең қайталап көріңіз немесе <ph name="BEGIN_LINK" />құпия сөздерді Google аккаунтында тексеріңіз<ph name="END_LINK" />.</translation> <translation id="484033449593719797">Chrome (бета нұсқасы) браузерінде қолдау көрсетілмейді.</translation> <translation id="5030102366287574140">Chrome деректердің қолды болуынан, қауіпті веб-сайттардан және басқа зиянды нәрселерден қорғайды.</translation> +<translation id="5119391094379141756">Chrome браузерін таңдаңыз.</translation> <translation id="5162467219239570114">Chrome ескірген. Егер <ph name="BEGIN_LINK" />App Store<ph name="END_LINK" /> дүкенінде жаңа нұсқа болмаса, құрылғыңыз Chrome-ның жаңа нұсқаларын бұдан былай қолдамайтын болуы мүмкін.</translation> <translation id="5389212809648216794">Камераны басқа қолданба пайдаланып жатқандықтан, Google Chrome оны пайдалана алмайды</translation> +<translation id="5460571915754665838">4. Chrome браузерін таңдаңыз.</translation> <translation id="5639704535586432836">"Параметрлер > Құпиялылық > Камера > Google Chrome" тармағын ашып, микрофонды қосыңыз.</translation> <translation id="5642200033778930880">Google Chrome қолданбасы камераны қатар ашу режимінде пайдалана алмайды</translation> <translation id="5690427481109656848">Google LLC</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ne.xtb index 212bcbd..bdb93aea 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ne.xtb
@@ -50,6 +50,7 @@ <translation id="4214277427269650960">यो साइट र Chrome मा साइन इन गर्नुहोस्। तपाईं सिंक गर्ने सुविधा पछि अन गर्न सक्नुहुन्छ।</translation> <translation id="424864128008805179">Chrome बाट साइन आउट गर्ने हो?</translation> <translation id="4249068189593983585">Chrome सम्बन्धी सुझाव। ट्यापसम्बन्धी थप विकल्पहरू हेर्न, तपाईंको स्क्रिनको सिरान वा पुछारमा रहेको उपकरणपट्टीमा ट्याबहरू देखाउनुहोस् नामक बटनमा टच एण्ड होल्ड गर्नुहोस्।</translation> +<translation id="4267862249323750454">तपाईं आफ्ना पासवर्डहरू जुनसुकै डिभाइसमा प्रयोग गर्न सक्नुहोस् भन्नाका लागि पासवर्डहरू <ph name="BEGIN_LINK" />Google पासवर्ड म्यानेजर<ph name="END_LINK" />मा सेभ गरिन्छन्।</translation> <translation id="4523886039239821078">केही एड्-अनहरूले गर्दा Chrome लाई क्र्याश गराउँछ। कृपया विस्थापन गर्नुहोस्:</translation> <translation id="4633328489441962921">Chrome ले अपडेटहरू उपलब्ध छन् कि छैनन् भन्ने कुरा जाँच गर्न सकेन</translation> <translation id="4698415050768537821">Chrome ले सबै पासवर्डहरू जाँच्न सकेन। भोलि फेरि प्रयास गर्नुहोस् वा <ph name="BEGIN_LINK" />आफ्नो Google खातामा रहेका पासवर्डहरू जाँच्नुहोस्<ph name="END_LINK" /></translation> @@ -70,6 +71,7 @@ <translation id="6063091872902370735">Chrome मा साइन इन गर्ने अनुमति दिनुहोस्</translation> <translation id="6181930887571472871">Chrome प्रयोग गर्न थाल्नुहोस्</translation> <translation id="6238746320622508509">Chrome लाई आफ्ना इन्कोग्निटो ट्याबहरू लक गर्ने अनुमति दिनुहोस्।</translation> +<translation id="6387994324662817823">पासवर्डहरू यो डिभाइसको Google पासवर्ड म्यानेजरमा मात्र सेभ गरिन्छन्।</translation> <translation id="6427126399757991875">तपाईंको सङ्गठनले Chrome सेटअप गर्दै छ...</translation> <translation id="6600954340915313787">Chrome मा प्रतिलिपि गरियो</translation> <translation id="6634107063912726160">तपाईंले साइन आउट गर्नुभयो भने Chrome ले तपाईंको Google खातामा कुनै पनि नयाँ डेटा सिंक गर्ने छैन। यसअघि सिंक भएका डेटा खातामा सुरक्षित रहिरहन्छन्।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb index 948179b..9f38a80 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb
@@ -50,6 +50,7 @@ <translation id="4214277427269650960">Log in bij deze site en Chrome. Je kunt synchronisatie later aanzetten.</translation> <translation id="424864128008805179">Uitloggen bij Chrome?</translation> <translation id="4249068189593983585">Chrome-tip. Voor meer tabbladopties tik je in de werkbalk onder- of bovenaan het scherm op de knop Tabbladen bekijken en houd je deze vast.</translation> +<translation id="4267862249323750454">Wachtwoorden worden opgeslagen in <ph name="BEGIN_LINK" />Google Wachtwoordmanager<ph name="END_LINK" /> zodat je ze op elk apparaat kunt gebruiken.</translation> <translation id="4523886039239821078">Sommige add-ons kunnen ervoor zorgen dat Chrome crasht. Verwijder de volgende add-ons:</translation> <translation id="4633328489441962921">Chrome kan niet checken op updates</translation> <translation id="4698415050768537821">Chrome kan niet alle wachtwoorden checken. Probeer het morgen opnieuw of <ph name="BEGIN_LINK" />check de wachtwoorden in je Google-account<ph name="END_LINK" />.</translation> @@ -70,6 +71,7 @@ <translation id="6063091872902370735">Inloggen bij Chrome toestaan</translation> <translation id="6181930887571472871">Overschakelen naar Chrome</translation> <translation id="6238746320622508509">Laat Chrome je incognitotabbladen vergrendelen.</translation> +<translation id="6387994324662817823">Wachtwoorden worden alleen opgeslagen in Google Wachtwoordmanager op dit apparaat.</translation> <translation id="6427126399757991875">Je organisatie stelt Chrome in…</translation> <translation id="6600954340915313787">Gekopieerd naar Chrome</translation> <translation id="6634107063912726160">Als je uitlogt, synchroniseert Chrome geen nieuwe gegevens met je Google-account. Eerder gesynchroniseerde gegevens blijven in het account staan.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb index a57d3a4..8c0d158 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb
@@ -50,6 +50,7 @@ <translation id="4214277427269650960">Faça login neste site e no Chrome. É possível ativar a sincronização mais tarde.</translation> <translation id="424864128008805179">Sair do Google Chrome?</translation> <translation id="4249068189593983585">Dica do Chrome. Para ver mais opções de guia, toque no botão "Mostrar guias" na barra de ferramentas localizada na parte superior ou inferior da tela e mantenha-o pressionado.</translation> +<translation id="4267862249323750454">As senhas são salvas no <ph name="BEGIN_LINK" />Gerenciador de senhas do Google<ph name="END_LINK" /> para que você as use em qualquer dispositivo.</translation> <translation id="4523886039239821078">Alguns complementos causam a falha do Google Chrome. Desinstale-os.</translation> <translation id="4633328489441962921">Não é possível verificar se há atualizações</translation> <translation id="4698415050768537821">Não foi possível verificar todas as senhas com o Chrome. Tente novamente amanhã ou <ph name="BEGIN_LINK" />verifique-as na sua Conta do Google<ph name="END_LINK" />.</translation> @@ -70,6 +71,7 @@ <translation id="6063091872902370735">Permitir login no Chrome</translation> <translation id="6181930887571472871">Mudar para o Chrome</translation> <translation id="6238746320622508509">Permita que o Chrome bloqueie suas guias anônimas.</translation> +<translation id="6387994324662817823">As senhas são salvas no Gerenciador de senhas do Google somente neste dispositivo.</translation> <translation id="6427126399757991875">Sua organização está configurando o Chrome…</translation> <translation id="6600954340915313787">Copiado no Chrome</translation> <translation id="6634107063912726160">Quando você se desconecta, o Chrome não sincroniza nenhum dado novo com sua Conta do Google. Os dados sincronizados anteriormente permanecem na conta.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb index e6e0b95..c7eefce 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb
@@ -50,6 +50,7 @@ <translation id="4214277427269650960">Conectează-te la acest site și la Chrome. Poți activa sincronizarea mai târziu.</translation> <translation id="424864128008805179">Te deconectezi de la Chrome?</translation> <translation id="4249068189593983585">Sfat pentru Chrome: pentru mai multe opțiuni de file, atinge lung butonul Afișează filele din bara de instrumente, care se află în partea de sus sau de jos a ecranului.</translation> +<translation id="4267862249323750454">Parolele sunt salvate în <ph name="BEGIN_LINK" />Managerul de parole Google<ph name="END_LINK" /> pentru a le putea folosi pe orice dispozitiv.</translation> <translation id="4523886039239821078">Unele suplimente determină blocarea browserului Chrome. Dezinstalează:</translation> <translation id="4633328489441962921">Chrome nu poate căuta actualizări</translation> <translation id="4698415050768537821">Chrome nu a putut verifica toate parolele. Încearcă din nou mâine sau <ph name="BEGIN_LINK" />verifică parolele din Contul Google<ph name="END_LINK" />.</translation> @@ -70,6 +71,7 @@ <translation id="6063091872902370735">Permite conectarea la Chrome</translation> <translation id="6181930887571472871">Treci la Chrome</translation> <translation id="6238746320622508509">Permite ca Chrome să blocheze filele incognito.</translation> +<translation id="6387994324662817823">Parolele sunt salvate în Managerul de parole Google numai pe acest dispozitiv.</translation> <translation id="6427126399757991875">Organizația ta configurează Chrome...</translation> <translation id="6600954340915313787">Copiat în Chrome</translation> <translation id="6634107063912726160">Când te deconectezi, Chrome nu va sincroniza datele noi cu Contul tău Google. Datele sincronizate anterior rămân în cont.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb index 2c855b0d..d68d547 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb
@@ -72,7 +72,7 @@ <translation id="6238746320622508509">Разрешите Chrome блокировать для посторонних доступ к вашим вкладкам инкогнито.</translation> <translation id="6427126399757991875">Ваша организация настраивает браузер Chrome…</translation> <translation id="6600954340915313787">Скопировано в Chrome</translation> -<translation id="6634107063912726160">Выйдя из Chrome, вы остановите синхронизацию данных с аккаунтом Google. Уже синхронизированные данные не будут удалены.</translation> +<translation id="6634107063912726160">Выйдя из Chrome, вы остановите синхронизацию данных с аккаунтом Google. Синхронизированные ранее данные не будут удалены.</translation> <translation id="6648150602980899529">Вы входите в аккаунт, которым управляет администратор домена <ph name="DOMAIN" />. Он может контролировать ваши данные Chrome, причем теперь они будут связаны с управляемым аккаунтом. При выходе из системы все данные Chrome, хранящиеся на этом устройстве, будут удалены, но останутся в вашем аккаунте Google.</translation> <translation id="6676840375528380067">Удалить данные Chrome с этого устройства?</translation> <translation id="6709398533399187136">Ваш пароль раскрыт из-за утечки данных. Измените его прямо сейчас в Диспетчере паролей Google.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb index fa8444a..24e7126 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb
@@ -50,6 +50,7 @@ <translation id="4214277427269650960">இந்த தளத்திலும் Chromeமிலும் உள்நுழையுங்கள். ஒத்திசைவைப் பின்னர் இயக்கலாம்.</translation> <translation id="424864128008805179">Chrome இலிருந்து வெளியேறவா?</translation> <translation id="4249068189593983585">Chrome உதவிக்குறிப்பு. கூடுதல் தாவல் விருப்பங்களைப் பார்க்க திரையின் கீழிருக்கும் / மேலிருக்கும் கருவிப்பட்டியிலுள்ள ‘தாவல்களைக் காட்டு’ பட்டனைத் தொட்டுப் பிடிக்கவும்.</translation> +<translation id="4267862249323750454">எந்தச் சாதனத்திலும் பயன்படுத்தும் வகையில் <ph name="BEGIN_LINK" />Google கடவுச்சொல் நிர்வாகியில்<ph name="END_LINK" /> கடவுச்சொற்கள் சேமிக்கப்படுகின்றன.</translation> <translation id="4523886039239821078">சில செருகு நிரல்களினால் Chrome சிதைவுக்குட்படுகிறது. பின்வருபவற்றை நிறுவல் நீக்கம் செய்யவும்:</translation> <translation id="4633328489441962921">Chrome உலாவியால் புதுப்பிப்புகள் உள்ளனவா எனப் பார்க்க முடியவில்லை</translation> <translation id="4698415050768537821">Chrome உலாவியால் கடவுச்சொற்கள் அனைத்தையும் சரிபார்க்க முடியவில்லை. நாளை முயலவும் அல்லது <ph name="BEGIN_LINK" />உங்கள் Google கணக்கில் கடவுச்சொற்களைச் சரிபார்க்கவும்.<ph name="END_LINK" /></translation> @@ -70,6 +71,7 @@ <translation id="6063091872902370735">Chrome உள்நுழைவை அனுமதி</translation> <translation id="6181930887571472871">Chromeமிற்கு மாறுங்கள்</translation> <translation id="6238746320622508509">மறைநிலைத் தாவல்களைப் பூட்ட Chromeமை அனுமதிக்கவும்.</translation> +<translation id="6387994324662817823">இந்தச் சாதனத்தில் மட்டுமே உள்ள Google கடவுச்சொல் நிர்வாகியில் கடவுச்சொற்கள் சேமிக்கப்படுகின்றன.</translation> <translation id="6427126399757991875">Chromeமை உங்கள் நிறுவனம் அமைக்கிறது...</translation> <translation id="6600954340915313787">Chromeக்கு நகலெடுக்கப்பட்டது</translation> <translation id="6634107063912726160">வெளியேறிவிட்டால் எந்தவொரு புதிய தரவையும் உங்கள் Google கணக்குடன் Chrome ஒத்திசைக்காது. ஏற்கெனவே ஒத்திசைக்கப்பட்ட தரவு கணக்கிலேயே இருக்கும்.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb index d6c75dd..7a2c1cf 100644 --- a/ios/chrome/app/strings/resources/ios_strings_as.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">একাউণ্ট যোগ দিয়ক…</translation> <translation id="2600682495497606169">ছাইটৰ কুকিসমূহ মচক</translation> <translation id="2625189173221582860">পাছৱর্ডৰ প্ৰতিলিপি কৰা হ’ল</translation> +<translation id="2626236249646841566">আপোনাৰ সংযোগ পৰীক্ষা কৰক আৰু পুনৰ ছাইন ইন কৰি চাওক।</translation> <translation id="2647269890314209800">ব্যৱহাৰ হৈ থকা কুকিসমূহ</translation> <translation id="2648803196158606475">পঢ়া প্ৰৱিষ্টি মচক</translation> <translation id="2653659639078652383">দাখিল কৰক</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">ছাইন প্ৰ’ম’ বন্ধ কৰক</translation> <translation id="4526249700380860531">ছেভ কৰি থোৱা পাছৱৰ্ডসমূহ <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />ত চাওক আৰু পৰিচালনা কৰক</translation> <translation id="4536418791685807335">পুনৰ ছাইন ইন কৰি চাওক।</translation> +<translation id="4540780316273593836">কিবা ভুল হ’ল</translation> <translation id="457386861538956877">অধিক…</translation> <translation id="4592368184551360546">কীব’ৰ্ড</translation> <translation id="461440297010471931">Googleৰ জৰিয়তে সন্ধান কৰি থকা হৈছে</translation> @@ -478,6 +480,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">সংস্কৰণ <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{এতিয়া ১ খন Chromeৰ ৱিণ্ড দেখুৱাই থকা হৈছে}one{এতিয়া {count} খন Chromeৰ ৱিণ্ড দেখুৱাই থকা হৈছে}other{এতিয়া {count} খন Chromeৰ ৱিণ্ড দেখুৱাই থকা হৈছে}}</translation> +<translation id="5704908597376970822">ছাইন ইন কৰিব নোৱাৰি।</translation> <translation id="5706552126692816153">১দিনৰ পূর্বে সক্ৰিয় আছিল</translation> <translation id="5711039611392265845">গোপনীয়তা, সুৰক্ষা আৰু ডেটা সংগ্ৰহ সম্পর্কীয় অধিক ছেটিংসমূহৰ বাবে <ph name="BEGIN_LINK" />ছিংক কৰক আৰু Google সেৱাসমূহ<ph name="END_LINK" /> চাওক।</translation> <translation id="5724941645893276623">ব্যক্তিগতভাৱে ৱেব ব্ৰাউজ কৰিবলৈ এটা নতুন টেব যোগ দিয়ক</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index 70957c5..53b4b58 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">Přidat účet...</translation> <translation id="2600682495497606169">Vymazat soubory cookie webu</translation> <translation id="2625189173221582860">Heslo bylo zkopírováno</translation> +<translation id="2626236249646841566">Zkontrolujte připojení a zkuste se přihlásit znovu.</translation> <translation id="2647269890314209800">Používané soubory cookie</translation> <translation id="2648803196158606475">Smazat přečtené</translation> <translation id="2653659639078652383">Odeslat</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">Zavřít propagační zprávu ohledně přihlášení</translation> <translation id="4526249700380860531">Uložená hesla můžete zobrazit a upravit na adrese <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="4536418791685807335">Zkuste se přihlásit znovu.</translation> +<translation id="4540780316273593836">Něco se pokazilo</translation> <translation id="457386861538956877">Další...</translation> <translation id="4592368184551360546">Klávesnice</translation> <translation id="461440297010471931">Vyhledává se pomocí Googlu</translation> @@ -478,6 +480,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Verze <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{Je zobrazeno 1 okno prohlížeče Chrome}few{Jsou zobrazena {count} okna prohlížeče Chrome}many{Je zobrazeno {count} okna prohlížeče Chrome}other{Je zobrazeno {count} oken prohlížeče Chrome}}</translation> +<translation id="5704908597376970822">Nepodařilo se přihlásit.</translation> <translation id="5706552126692816153">Aktivní včera</translation> <translation id="5711039611392265845">Další nastavení související s ochranou soukromí, zabezpečením a shromažďováním dat naleznete v části <ph name="BEGIN_LINK" />Synchronizace a služby Google<ph name="END_LINK" />.</translation> <translation id="5724941645893276623">Chcete-li procházet web v soukromí, přidejte novou kartu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index e5441505..540b1c7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">Προσθήκη λογαριασμού…</translation> <translation id="2600682495497606169">Εκκαθάριση cookie ιστοτόπου</translation> <translation id="2625189173221582860">Ο κωδικός πρόσβασης αντιγράφηκε</translation> +<translation id="2626236249646841566">Ελέγξτε τη σύνδεσή σας και δοκιμάστε να συνδεθείτε ξανά.</translation> <translation id="2647269890314209800">Χρησιμοποιούνται cookie</translation> <translation id="2648803196158606475">Διαγραφή αναγνωσμένων</translation> <translation id="2653659639078652383">Υποβολή</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">Κλείσιμο προσφοράς σύνδεσης</translation> <translation id="4526249700380860531">Προβολή και διαχείριση των αποθηκευμένων κωδικών πρόσβασης στη διεύθυνση <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="4536418791685807335">Δοκιμάστε να συνδεθείτε ξανά.</translation> +<translation id="4540780316273593836">Παρουσιάστηκε κάποιο πρόβλημα</translation> <translation id="457386861538956877">Περισσότερα...</translation> <translation id="4592368184551360546">Πληκτρολόγιο</translation> <translation id="461440297010471931">Αναζήτηση με το Google</translation> @@ -478,6 +480,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Έκδοση <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{Δεν εμφανίζεται 1 παράθυρο του Chrome}other{Δεν εμφανίζονται {count} παράθυρα του Chrome}}</translation> +<translation id="5704908597376970822">Δεν είναι δυνατή η σύνδεση.</translation> <translation id="5706552126692816153">Ενεργή 1 ημέρα πριν</translation> <translation id="5711039611392265845">Για περισσότερες ρυθμίσεις που σχετίζονται με το απόρρητο, την ασφάλεια και τη συλλογή δεδομένων, ανατρέξτε στην ενότητα <ph name="BEGIN_LINK" />Συγχρονισμός και υπηρεσίες Google<ph name="END_LINK" />.</translation> <translation id="5724941645893276623">Για να περιηγηθείτε στον ιστό ιδιωτικά, προσθέστε μια νέα καρτέλα.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb index 9c9db6b..77a8f06 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">Ավելացնել հաշիվ</translation> <translation id="2600682495497606169">Ջնջել կայքի քուքիները</translation> <translation id="2625189173221582860">Գաղտնաբառը պատճենվեց</translation> +<translation id="2626236249646841566">Ստուգեք կապը և նորից փորձեք մուտք գործել։</translation> <translation id="2647269890314209800">Օգտագործվող քուքիներ</translation> <translation id="2648803196158606475">Ջնջել կարդացվածները</translation> <translation id="2653659639078652383">Ուղարկել</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">Փակել մուտք գործելու առաջարկը</translation> <translation id="4526249700380860531">Դիտեք և կառավարեք պահված գաղտնաբառերը <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> կայքում</translation> <translation id="4536418791685807335">Փորձեք նորից մուտք գործել:</translation> +<translation id="4540780316273593836">Սխալ առաջացավ</translation> <translation id="457386861538956877">Ավելին…</translation> <translation id="4592368184551360546">Ստեղնաշար</translation> <translation id="461440297010471931">Որոնեք Google-ով</translation> @@ -478,6 +480,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Տարբերակ <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{Այժմ ցուցադրվում է Chrome-ի 1 պատուհան}one{Այժմ ցուցադրվում է Chrome-ի {count} պատուհան}other{Այժմ ցուցադրվում է Chrome-ի {count} պատուհան}}</translation> +<translation id="5704908597376970822">Չհաջողվեց մուտք գործել։</translation> <translation id="5706552126692816153">Ակտիվ է եղել 1 օր առաջ</translation> <translation id="5711039611392265845"><ph name="BEGIN_LINK" />Համաժամացում և Google-ի ծառայություններ<ph name="END_LINK" /> բաժնում կարող եք գտնել գաղտնիության, անվտանգության և տվյալների հավաքման հետ կապված լրացուցիչ կարգավորումներ։</translation> <translation id="5724941645893276623">Համացանցում անանուն կերպով կայքեր այցելելու համար ավելացրեք նոր ներդիր</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index 06a5b24..60a705f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -843,7 +843,7 @@ <translation id="8976382372951310360">ヘルプ</translation> <translation id="8976414606286374109">カードは Google アカウントに保存されます。</translation> <translation id="8981454092730389528">Google アクティビティ管理</translation> -<translation id="8985320356172329008">次のユーザーとして Google にログインしています</translation> +<translation id="8985320356172329008">Google にログイン済みのユーザー</translation> <translation id="9000089900434778519">検索エンジンは <ph name="DSE_NAME" /> に設定されています。検索履歴を削除する場合は、検索エンジンの手順をご確認ください(該当する場合)。</translation> <translation id="9034759925968272072">Google アカウントへのログイン状態は維持されます。Google アカウントでの他の形式の閲覧履歴が <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> に残ることがあります。</translation> <translation id="9037965129289936994">原文のページを表示</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index 92f7d8a0..0f12340 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -137,6 +137,7 @@ <translation id="225943865679747347">Қате коды: <ph name="ERROR_CODE" /></translation> <translation id="2267753748892043616">Аккаунт қосу</translation> <translation id="2268044343513325586">Нақтылау</translation> +<translation id="2271351792809375263">Chrome-да сақталған құпия сөздерді құрылғыңыздағы басқа қолданбаларда пайдаланыңыз.</translation> <translation id="2273327106802955778">"Тағы" мәзірі</translation> <translation id="2302742851632557585">Құпия сөзді веб-сайтта өзгерту</translation> <translation id="2316709634732130529">Ұсынылған құпия сөзді қолдану</translation> @@ -257,6 +258,7 @@ <translation id="3393920035788932672">Қалқымалы терезелерге рұқсат берілген</translation> <translation id="3399930248910934354">Chrome параметрлерін ашу</translation> <translation id="3404744938087714423">Аккаунттан шықсаңыз, синхрондау өшіріледі.</translation> +<translation id="3414451675185661089">2. "Құпия сөздер" дегенді түртіңіз.</translation> <translation id="3425644765244388016">Картаның лақап аты</translation> <translation id="3433057996795775706">Құпия сөзді жойсаңыз, <ph name="WEBSITE" /> доменіндегі аккаунтыңыз жойылмайды. <ph name="WEBSITE" /> веб-сайтындағы құпия сөзіңізді өзгертіп, деректеріңізді қорғаңыз.</translation> <translation id="3443810440409579745">Қойынды қабылданды.</translation> @@ -378,6 +380,7 @@ <translation id="4666531726415300315"><ph name="EMAIL" /> ретінді кірдіңіз. Деректер синхрондаудың құпия фразасымен шифрланған. Синхрондауды бастау үшін оны енгізіңіз.</translation> +<translation id="4682686630151240767">1. iPhone параметрлерін ашыңыз.</translation> <translation id="4689564913179979534">Төлеу әдістерін басқару…</translation> <translation id="470966556546083668">Синхрондауды қоспау</translation> <translation id="473775607612524610">Жаңарту</translation> @@ -458,6 +461,7 @@ <translation id="5489208564673669003">Барлық сайттар үшін cookie файлдарын басқару үшін <ph name="BEGIN_LINK" />Cookie параметрлері<ph name="END_LINK" /> бөлімін қараңыз.</translation> <translation id="5490005495580364134">Барлық cookie файлын бөгеу (ұсынылмайды)</translation> <translation id="5513681519188741830"><ph name="TIME" /> сағ бұрын</translation> +<translation id="5523579157975978438">Өшіру үшін <ph name="BEGIN_LINK" />Параметрлерді<ph name="END_LINK" /> ашып, "Құпия сөздер" бөліміне өтіңіз.</translation> <translation id="5525269841082836315">Құпия фраза жасау</translation> <translation id="5548760955356983418">Handoff функциясы веб-сайтты осы құрылғыда ашып, шолуды Mac жүйесінде жеңіл жалғастыруға мүмкіндік береді. Ағымдағы ашылған веб-сайт Мac жүйеңіздегі Dock тақтасында пайда болады. @@ -739,6 +743,7 @@ Сайттар түрлі сайттардағы браузерді қолдану мәліметін көру үшін (мысалы, жарнамаларды жекелендіру мақсатында) cookie файлдарын пайдалана алады.</translation> <translation id="7971521879845308059">Қалқымалы терезелерге тыйым салу</translation> <translation id="797413074872316787">Барлық құрылғыда синхрондау және жекелендіру үшін синхрондау функциясын қосыңыз.</translation> +<translation id="7978018860671536736">3. "Құпия сөздерді автотолтыру" дегенді түртіңіз.</translation> <translation id="7982789257301363584">Желі</translation> <translation id="7993619969781047893">Кейбір сайттағы функциялар дұрыс жұмыс істемеуі мүмкін.</translation> <translation id="800361585186029508">Google Chrome браузерінде енгізілген URL мекенжайларын ашады.</translation> @@ -765,6 +770,7 @@ <translation id="8205564605687841303">Бас тарту</translation> <translation id="8206354486702514201">Бұл параметрді әкімші күштеп орнатқан.</translation> <translation id="8225985093977202398">Кэштелген кескіндер мен файлдар</translation> +<translation id="8237382152611443140">Құпия сөздерді автотолтыру параметрлерін ашыңыз.</translation> <translation id="8261506727792406068">Жою</translation> <translation id="8271720166617117963">Қабылдау және кіру</translation> <translation id="8281781826761538115">Әдепкі - <ph name="DEFAULT_LOCALE" /></translation> @@ -833,6 +839,7 @@ <translation id="8917490105272468696">Жарайды</translation> <translation id="8952559610785099500">Құпия сөз қосу</translation> <translation id="895541991026785598">Ақау туралы хабарлау</translation> +<translation id="8974714402877957201">1. iPad параметрлерін ашыңыз.</translation> <translation id="8976382372951310360">Анықтама</translation> <translation id="8976414606286374109">Карталар Google аккаунтыңызға сақталады.</translation> <translation id="8981454092730389528">Google әрекеттерді басқару элементтері</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb index f5a22b9..4712d750 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">Аккаунт кошуу…</translation> <translation id="2600682495497606169">Сайттын cookie файлдарын өчүрүү</translation> <translation id="2625189173221582860">Сырсөз көчүрүлдү</translation> +<translation id="2626236249646841566">Интернет байланышын текшерип, кайталап көрүңүз.</translation> <translation id="2647269890314209800">Колдонулган кукилер</translation> <translation id="2648803196158606475">Окулгандарды жок кылуу</translation> <translation id="2653659639078652383">Тапшыруу</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">Кирүүгө үндөгөн жарнама жабылсын</translation> <translation id="4526249700380860531">Сакталган сырсөздөрдү <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> дарегинен көрүп жана башкарыңыз</translation> <translation id="4536418791685807335">Кайра кирип көрүңүз.</translation> +<translation id="4540780316273593836">Бир жерден ката кетти</translation> <translation id="457386861538956877">Дагы…</translation> <translation id="4592368184551360546">Баскычтоп</translation> <translation id="461440297010471931">Google менен изделүүдө</translation> @@ -478,6 +480,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Версия <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{1 Chrome терезеси көрсөтүлүүдө}other{{count} Chrome терезеси көрсөтүлүүдө}}</translation> +<translation id="5704908597376970822">Аккаунтка кирген жоксуз.</translation> <translation id="5706552126692816153">Акыркы аракеттер: 1 күн мурун</translation> <translation id="5711039611392265845">Купуялыкка, коопсуздукка жана дайындарды чогултууга байланыштуу дагы башка жөндөөлөрдү көрүү үчүн <ph name="BEGIN_LINK" />Шайкештирүү жана Google кызматтары<ph name="END_LINK" /> бөлүмүнө өтүңүз.</translation> <translation id="5724941645893276623">Интернетти купуя серептөө үчүн жаңы өтмөк кошуңуз</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index 17d6005..d106419 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">အကောင့် ထည့်သွင်းပါ…</translation> <translation id="2600682495497606169">ဝဘ်ဆိုက်ကွတ်ကီးများ ရှင်းထုတ်ခြင်း</translation> <translation id="2625189173221582860">စကားဝှက်ကို ကူးပြီးပါပြီ</translation> +<translation id="2626236249646841566">သင့်ချိတ်ဆက်မှုကို စစ်ဆေးပြီး ထပ်မံလက်မှတ်ထိုးဝင်ကြည့်ပါ။</translation> <translation id="2647269890314209800">အသုံးပြုနေသော ကွတ်ကီးများ</translation> <translation id="2648803196158606475">ဖတ်ပြီးသည်ကို ဖျက်ရန်</translation> <translation id="2653659639078652383">ပေးပို့ရန်</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">လက်မှတ်ထိုးဝင်ထားသော ပရိုမိုးရှင်းများကို ပိတ်ရန်</translation> <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> တွင် သိမ်းဆည်းထားသော စကားဝှက်များအား ကြည့်ပြီး စီမံပါ</translation> <translation id="4536418791685807335">ထပ်မံ၍ လက်မှတ်ထိုးဝင်ကြည့်ပါ။</translation> +<translation id="4540780316273593836">တစ်ခုခု မှားသွားပါသည်</translation> <translation id="457386861538956877">နောက်ထပ်...</translation> <translation id="4592368184551360546">ကီးဘုတ်</translation> <translation id="461440297010471931">Google ဖြင့် ရှာနေသည်</translation> @@ -477,6 +479,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">ဗားရှင်း <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{ယခု Chrome ဝင်းဒိုး 1 ခုကို ပြထားသည်}other{ယခု Chrome ဝင်းဒိုး {count} ခုကို ပြထားသည်}}</translation> +<translation id="5704908597376970822">လက်မှတ်ထိုးဝင်၍ မရပါ။</translation> <translation id="5706552126692816153">ပြီးခဲ့သော ၁ ရက်က အသုံးပြုထားသည်</translation> <translation id="5711039611392265845">ပုဂ္ဂိုလ်ရေးရာ၊ လုံခြုံမှုနှင့် ဒေတာစုဆောင်းမှုတို့နှင့် ဆက်စပ်နေသည့် နောက်ထပ် ဆက်တင်များအတွက် <ph name="BEGIN_LINK" />စင့်ခ်လုပ်ခြင်းနှင့် Google ဝန်ဆောင်မှုများ<ph name="END_LINK" /> ကိုကြည့်ပါ။</translation> <translation id="5724941645893276623">ဝဘ်ကို သီးသန့်ကြည့်ရန် တဘ်အသစ်ဖွင့်ပါ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb index 9a1f15a..6665c0d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">खाता थप्नुहोस्...</translation> <translation id="2600682495497606169">साइटका कुकीहरू हटाउनुहोस्</translation> <translation id="2625189173221582860">पासवर्ड प्रतिलिपि गरियो</translation> +<translation id="2626236249646841566">आफ्नो इन्टरनेट जाँच्नुहोस् र फेरि साइन इन गरी हेर्नुहोस्।</translation> <translation id="2647269890314209800">प्रयोगमा रहेका कुकीहरू</translation> <translation id="2648803196158606475">पढिसकिएकोलाई मेट्नुहोस्</translation> <translation id="2653659639078652383">पेश गर्नुहोस्</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">साइन-इन प्रोमो बन्द गर्नुहोस्</translation> <translation id="4526249700380860531">हेर्नुहोस् र <ph name="BEGIN_LINK" /> passwords.google.com <ph name="END_LINK" /> सुरक्षित गरिएका पासवर्डहरू व्यवस्थापन गर्नुहोस्</translation> <translation id="4536418791685807335">फेरि साइन इन गरी हेर्नुहोस्।</translation> +<translation id="4540780316273593836">केही चिज गडबड भयो</translation> <translation id="457386861538956877">थप...</translation> <translation id="4592368184551360546">किबोर्ड</translation> <translation id="461440297010471931">Google मार्फत खोज गर्दै</translation> @@ -478,6 +480,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">संस्करण <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{अहिले Chrome को एउटा विन्डो देखाइँदै छ}other{अहिले Chrome का {count} वटा विन्डो देखाइँदै छन्}}</translation> +<translation id="5704908597376970822">साइन इन गर्न सकिएन।</translation> <translation id="5706552126692816153">१ दिनअघि सक्रिय</translation> <translation id="5711039611392265845">गोपनीयता, सुरक्षा र डेटाको सङ्कलनसँग सम्बन्धित थप सेटिङका लागि <ph name="BEGIN_LINK" />सिंक तथा Google का सेवाहरू<ph name="END_LINK" /> नामक खण्ड हेर्नुहोस्।</translation> <translation id="5724941645893276623">निजी रूपमा वेब ब्राउज गर्न कुनै नयाँ ट्याब थप्नुहोस्</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb index b4f2238..6a938fe7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_or.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">ଆକାଉଣ୍ଟ ଯୋଗ କରନ୍ତୁ…</translation> <translation id="2600682495497606169">ସାଇଟ୍ କୁକୀଗୁଡ଼ିକ ଖାଲି କରନ୍ତୁ</translation> <translation id="2625189173221582860">ପାସ୍ୱର୍ଡ କପି ହୋଇଛି</translation> +<translation id="2626236249646841566">ଆପଣଙ୍କ ସଂଯୋଗ ଯାଞ୍ଚ କରି ପୁଣି ସାଇନ ଇନ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="2647269890314209800">ବ୍ୟବହାର ହେଉଥିବା କୁକୀଗୁଡ଼ିକ</translation> <translation id="2648803196158606475">"ପଢ଼ାଯାଇଥିବା"କୁ ଡିଲିଟ୍ କରନ୍ତୁ</translation> <translation id="2653659639078652383">ଉପସ୍ଥାପନ</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">ସାଇନ୍-ଇନ୍ ପ୍ରୋମୋକୁ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />ରେ ସେଭ୍ ହୋଇଥିବା ପାସ୍ୱର୍ଡଗୁଡ଼ିକ ଦେଖନ୍ତୁ ଏବଂ ପରିଚାଳନା କରନ୍ତୁ</translation> <translation id="4536418791685807335">ପୁଣି ସାଇନ୍ ଇନ୍ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> +<translation id="4540780316273593836">କିଛି ତ୍ରୁଟି ହୋଇଛି</translation> <translation id="457386861538956877">ଅଧିକ...</translation> <translation id="4592368184551360546">କୀବୋର୍ଡ</translation> <translation id="461440297010471931">Google ମାଧ୍ୟମରେ ସନ୍ଧାନ କରାଯାଉଛି</translation> @@ -476,6 +478,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783"><ph name="PRODUCT_VERSION" /> ସଂସ୍କରଣ</translation> <translation id="5690398455483874150">{count,plural, =1{ଏବେ 1ଟି Chrome ୱିଣ୍ଡୋ ଦେଖାଉଛି}other{ଏବେ {count}ଟି Chrome ୱିଣ୍ଡୋ ଦେଖାଉଛି}}</translation> +<translation id="5704908597376970822">ସାଇନ-ଇନ କରାଯାଇପାରିବ ନାହିଁ।</translation> <translation id="5706552126692816153">1 ଦିନ ପୂର୍ବେ ସକ୍ରିୟ ଥିଲା</translation> <translation id="5711039611392265845">ଗୋପନୀୟତା, ସୁରକ୍ଷା ଏବଂ ଡାଟା ସଂଗ୍ରହ ସମ୍ବନ୍ଧିତ ଅଧିକ ସେଟିଂସ୍ ପାଇଁ <ph name="BEGIN_LINK" />ସିଙ୍କ୍ ଓ Google ସେବାଗୁଡ଼ିକୁ<ph name="END_LINK" /> ଦେଖନ୍ତୁ।</translation> <translation id="5724941645893276623">ବ୍ୟକ୍ତିଗତ ଭାବେ ୱେବ୍ ବ୍ରାଉଜ୍ କରିବାକୁ, ଏକ ନୂଆ ଟାବ୍ ଯୋଗ କରନ୍ତୁ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb index 2ec429f..8d3a76ca 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">Adicionar conta…</translation> <translation id="2600682495497606169">Apagar cookies do site</translation> <translation id="2625189173221582860">Senha copiada</translation> +<translation id="2626236249646841566">Verifique sua conexão e tente fazer login novamente.</translation> <translation id="2647269890314209800">Cookies em uso</translation> <translation id="2648803196158606475">Excluir lidas</translation> <translation id="2653659639078652383">Enviar</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">Fechar promoção de login</translation> <translation id="4526249700380860531">Ver e gerenciar as senhas salvas em <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="4536418791685807335">Tente fazer login novamente.</translation> +<translation id="4540780316273593836">Ocorreu um erro</translation> <translation id="457386861538956877">Mais...</translation> <translation id="4592368184551360546">Teclado</translation> <translation id="461440297010471931">Pesquisando com o Google</translation> @@ -478,6 +480,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Versão <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{Mostrando agora 1 janela do Chrome}one{Mostrando agora {count} janela do Chrome}other{Mostrando agora {count} janelas do Chrome}}</translation> +<translation id="5704908597376970822">Não é possível fazer login.</translation> <translation id="5706552126692816153">Ativado há um dia</translation> <translation id="5711039611392265845">Para ver mais configurações relacionadas à privacidade, segurança e coleta de dados, acesse <ph name="BEGIN_LINK" />Serviços do Google e de sincronização<ph name="END_LINK" />.</translation> <translation id="5724941645893276623">Para navegar na Web com privacidade, adicione uma nova guia</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index a5ad640..0f772f83 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">Adaugă un cont…</translation> <translation id="2600682495497606169">Șterge cookie-urile site-ului</translation> <translation id="2625189173221582860">Parola a fost copiată</translation> +<translation id="2626236249646841566">Verifică-ți conexiunea și încearcă să te conectezi din nou.</translation> <translation id="2647269890314209800">Cookie-uri utilizate</translation> <translation id="2648803196158606475">Șterge-le pe cele citite</translation> <translation id="2653659639078652383">Trimite</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">Închide mesajul promoțional de conectare</translation> <translation id="4526249700380860531">Vezi și gestionează parolele salvate la <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="4536418791685807335">Încearcă să te conectezi din nou.</translation> +<translation id="4540780316273593836">A apărut o eroare</translation> <translation id="457386861538956877">Mai multe...</translation> <translation id="4592368184551360546">Tastatură</translation> <translation id="461440297010471931">Căutare cu Google</translation> @@ -478,6 +480,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Versiunea <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{Se afișează o fereastră Chrome}few{Se afișează {count} ferestre Chrome}other{Se afișează {count} de ferestre Chrome}}</translation> +<translation id="5704908597376970822">Conectare nereușită.</translation> <translation id="5706552126692816153">Activ acum o zi</translation> <translation id="5711039611392265845">Pentru mai multe setări privind confidențialitatea, securitatea și colectarea datelor, consultă <ph name="BEGIN_LINK" />Sincronizarea și serviciile Google<ph name="END_LINK" /></translation> <translation id="5724941645893276623">Pentru a răsfoi în privat pe web, adaugă o filă nouă</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 074fdf30..eecfbb6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">கணக்கைச் சேர்...</translation> <translation id="2600682495497606169">தளத்தின் குக்கீகளை அழி</translation> <translation id="2625189173221582860">கடவுச்சொல் நகலெடுக்கப்பட்டது</translation> +<translation id="2626236249646841566">இணைப்பைச் சரிபார்த்துவிட்டு மீண்டும் உள்நுழைய முயலவும்.</translation> <translation id="2647269890314209800">பயன்படுத்தப்படும் குக்கீகள்</translation> <translation id="2648803196158606475">படித்தவற்றை நீக்கு</translation> <translation id="2653659639078652383">சமர்ப்பி</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">உள்நுழைவு விளம்பரத்தை மூடு</translation> <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> இல் சேமித்த கடவுச்சொற்களைப் பார்க்கலாம் மற்றும் நிர்வகிக்கலாம்.</translation> <translation id="4536418791685807335">மீண்டும் உள்நுழைந்து முயலவும்.</translation> +<translation id="4540780316273593836">ஏதோ தவறாகிவிட்டது</translation> <translation id="457386861538956877">மேலும்...</translation> <translation id="4592368184551360546">கீபோர்டு</translation> <translation id="461440297010471931">Google மூலம் தேடுகிறது</translation> @@ -478,6 +480,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">பதிப்பு <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{இப்போது ஒரு Chrome சாளரம் காட்டப்படுகிறது}other{இப்போது {count} Chrome சாளரங்கள் காட்டப்படுகின்றன}}</translation> +<translation id="5704908597376970822">உள்நுழைய முடியவில்லை.</translation> <translation id="5706552126692816153">கடைசியாக 1 நாளுக்கு முன் பயன்படுத்தியுள்ளார்</translation> <translation id="5711039611392265845">தனியுரிமை, பாதுகாப்பு மற்றும் தரவுச் சேகரிப்புடன் தொடர்புடைய மேலும் பல அமைப்புகளுக்கு <ph name="BEGIN_LINK" />ஒத்திசைவும் Google சேவைகளும்<ph name="END_LINK" /> என்பதைப் பார்க்கவும்.</translation> <translation id="5724941645893276623">தனிப்பட்ட முறையில் இணையத்தில் உலாவ, புதிய தாவலைச் சேர்த்திடுங்கள்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index 7e351fe..c0df4150 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">اکاؤنٹ شامل کریں…</translation> <translation id="2600682495497606169">سائٹ کوکیز صاف کریں</translation> <translation id="2625189173221582860">پاس ورڈ کاپی ہو گیا</translation> +<translation id="2626236249646841566">اپنا کنکشن چیک کریں اور دوبارہ سائن ان کرنے کی کوشش کریں۔</translation> <translation id="2647269890314209800">زیر استعمال کوکیز</translation> <translation id="2648803196158606475">پڑھے ہوئے کو حذف کریں</translation> <translation id="2653659639078652383">جمع کرائیں</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">سائن ان پرومو بند کریں</translation> <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> پر محفوظ کردہ پاس ورڈز دیکھیں اور ان کا نظم کریں</translation> <translation id="4536418791685807335">دوبارہ سائن ان کرنے کی کوشش کریں۔</translation> +<translation id="4540780316273593836">کچھ غلط ہو گیا</translation> <translation id="457386861538956877">مزید…</translation> <translation id="4592368184551360546">کی بورڈ</translation> <translation id="461440297010471931">Google کے ذریعے تلاش کیا جا رہا ہے</translation> @@ -478,6 +480,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">ورژن <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{ابھی 1 Chrome ونڈو نظر آ رہا ہے}other{ابھی {count} Chrome ونڈوز نظر آ رہے ہیں}}</translation> +<translation id="5704908597376970822">سائن نہیں کیا جا سکتا۔</translation> <translation id="5706552126692816153">1 دن پہلے فعال تھا</translation> <translation id="5711039611392265845">رازداری، سیکیورٹی اور ڈیٹا کو جمع کرنے سے متعلق مزید ترتیبات کے لیے، <ph name="BEGIN_LINK" />مطابقت پذیری اور Google سروسز<ph name="END_LINK" /> دیکھیں۔</translation> <translation id="5724941645893276623">نجی طور پر ویب براؤز کرنے کیلئے، نیا ٹیب شامل کریں۔</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 5cce057..630e23a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">新增帳戶…</translation> <translation id="2600682495497606169">清除網站 Cookie</translation> <translation id="2625189173221582860">已複製密碼</translation> +<translation id="2626236249646841566">請檢查你的連線狀態,然後再次嘗試登入。</translation> <translation id="2647269890314209800">使用中的 Cookie</translation> <translation id="2648803196158606475">刪除已閱讀的項目</translation> <translation id="2653659639078652383">提交</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">閂登入宣傳元素</translation> <translation id="4526249700380860531">檢視及管理您在 <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> 中已儲存的密碼</translation> <translation id="4536418791685807335">請嘗試再次登入。</translation> +<translation id="4540780316273593836">發生錯誤</translation> <translation id="457386861538956877">更多語言…</translation> <translation id="4592368184551360546">鍵盤</translation> <translation id="461440297010471931">目前嘅搜尋引擎係 Google</translation> @@ -478,6 +480,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">版本 <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{宜家顯示緊 1 個 Chrome 視窗}other{宜家顯示緊 {count} 個 Chrome 視窗}}</translation> +<translation id="5704908597376970822">無法登入。</translation> <translation id="5706552126692816153">曾於 1 天前在線</translation> <translation id="5711039611392265845">如需更多與私隱權、安全性和資料收集相關的設定,請參閱<ph name="BEGIN_LINK" />同步處理和 Google 服務<ph name="END_LINK" />。</translation> <translation id="5724941645893276623">如要以無痕模式瀏覽網頁,請開啟新分頁</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 37d2d10..71180a4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">新增帳戶…</translation> <translation id="2600682495497606169">清除網站 Cookie</translation> <translation id="2625189173221582860">已複製密碼</translation> +<translation id="2626236249646841566">請檢查你的連線狀態,然後再次嘗試登入。</translation> <translation id="2647269890314209800">使用中的 Cookie</translation> <translation id="2648803196158606475">刪除已讀取的項目</translation> <translation id="2653659639078652383">提交</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">關閉登入提示</translation> <translation id="4526249700380860531">您可以前往 <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> 查看及管理已儲存的密碼</translation> <translation id="4536418791685807335">請嘗試重新登入。</translation> +<translation id="4540780316273593836">發生錯誤</translation> <translation id="457386861538956877">更多…</translation> <translation id="4592368184551360546">鍵盤</translation> <translation id="461440297010471931">目前的搜尋引擎是 Google</translation> @@ -478,6 +480,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">版本 <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{目前顯示 1 個 Chrome 視窗}other{目前顯示 {count} 個 Chrome 視窗}}</translation> +<translation id="5704908597376970822">無法登入。</translation> <translation id="5706552126692816153">上次使用時間:1 天前</translation> <translation id="5711039611392265845">如需更多隱私權、安全性和資料收集的相關設定,請參閱<ph name="BEGIN_LINK" />同步處理和 Google 服務<ph name="END_LINK" />。</translation> <translation id="5724941645893276623">如要以私密模式瀏覽網頁,請開啟新分頁</translation>
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 53dec1a..742de13 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -612,12 +612,6 @@ flag_descriptions::kUpdateHistoryEntryPointsInIncognitoDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kUpdateHistoryEntryPointsInIncognito)}, - {"enable-autofill-account-wallet-storage", - flag_descriptions::kEnableAutofillAccountWalletStorageName, - flag_descriptions::kEnableAutofillAccountWalletStorageDescription, - flags_ui::kOsIos, - FEATURE_VALUE_TYPE( - autofill::features::kAutofillEnableAccountWalletStorage)}, {"reading-list-messages", flag_descriptions::kReadingListMessagesName, flag_descriptions::kReadingListMessagesDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kReadingListMessages)},
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index 03ce72e..4a2bdf9 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -141,11 +141,6 @@ const char kEditPasswordsInSettingsDescription[] = "Enables password editing in settings."; -const char kEnableAutofillAccountWalletStorageName[] = - "Enable the account data storage for autofill"; -const char kEnableAutofillAccountWalletStorageDescription[] = - "Enable the ephemeral storage for account data for autofill."; - const char kEnableAutofillAddressSavePromptAddressVerificationName[] = "Autofill Address Save Prompts Address Verification"; const char kEnableAutofillAddressSavePromptAddressVerificationDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 97c9095..6a63ee9 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -128,9 +128,6 @@ extern const char kEditPasswordsInSettingsName[]; extern const char kEditPasswordsInSettingsDescription[]; -extern const char kEnableAutofillAccountWalletStorageName[]; -extern const char kEnableAutofillAccountWalletStorageDescription[]; - // Title and description for the flag to enable address verification support in // autofill address save prompts. extern const char kEnableAutofillAddressSavePromptAddressVerificationName[];
diff --git a/ios/chrome/browser/policy/policy_egtest.mm b/ios/chrome/browser/policy/policy_egtest.mm index 6eb3b63..3cd65d773 100644 --- a/ios/chrome/browser/policy/policy_egtest.mm +++ b/ios/chrome/browser/policy/policy_egtest.mm
@@ -522,4 +522,31 @@ GREYAssertTrue(promptPresented, @"'Signed Out' prompt not shown"); } +// Tests that the UI notifying the user of their sign out is displayed when the +// primary account is restricted. +- (void)testBrowserAccountRestrictedAlert { + FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1]; + [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity]; + + // Set restrictions. + std::vector<base::Value> restrictions; + restrictions.push_back(base::Value("restricted")); + SetPolicy(base::Value(std::move(restrictions)), + policy::key::kRestrictAccountsToPatterns); + + // Check that the sign out pop up is presented. + ConditionBlock condition = ^{ + NSError* error = nil; + [[EarlGrey + selectElementWithMatcher:grey_accessibilityLabel(l10n_util::GetNSString( + IDS_IOS_ENTERPRISE_SIGNED_OUT))] + assertWithMatcher:grey_sufficientlyVisible() + error:&error]; + return error == nil; + }; + bool promptPresented = base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForUIElementTimeout, condition); + GREYAssertTrue(promptPresented, @"'Signed Out' prompt not shown"); +} + @end
diff --git a/ios/chrome/browser/ui/authentication/enterprise/enterprise_signout/BUILD.gn b/ios/chrome/browser/ui/authentication/enterprise/enterprise_signout/BUILD.gn index a66e31f..6cdd6d0b3 100644 --- a/ios/chrome/browser/ui/authentication/enterprise/enterprise_signout/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/enterprise/enterprise_signout/BUILD.gn
@@ -11,15 +11,10 @@ "enterprise_signout_view_controller.mm", ] deps = [ - "//components/signin/public/base", - "//components/signin/public/identity_manager/objc", "//ios/chrome/app/strings", "//ios/chrome/app/strings:ios_google_chrome_strings", - "//ios/chrome/browser/browser_state", "//ios/chrome/browser/main:public", "//ios/chrome/browser/policy/resources:enterprise_grey_icon_large", - "//ios/chrome/browser/signin", - "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/coordinators:chrome_coordinators", "//ios/chrome/common/ui/confirmation_alert", "//ui/base",
diff --git a/ios/chrome/browser/ui/authentication/enterprise/enterprise_signout/enterprise_signout_coordinator.mm b/ios/chrome/browser/ui/authentication/enterprise/enterprise_signout/enterprise_signout_coordinator.mm index 02c1e5c..f5fb485 100644 --- a/ios/chrome/browser/ui/authentication/enterprise/enterprise_signout/enterprise_signout_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/enterprise/enterprise_signout/enterprise_signout_coordinator.mm
@@ -5,15 +5,8 @@ #import "ios/chrome/browser/ui/authentication/enterprise/enterprise_signout/enterprise_signout_coordinator.h" #include "base/mac/foundation_util.h" -#include "base/notreached.h" -#include "components/signin/public/base/signin_metrics.h" -#import "components/signin/public/identity_manager/objc/identity_manager_observer_bridge.h" #include "ios/chrome/browser/main/browser.h" -#include "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/ui/authentication/enterprise/enterprise_signout/enterprise_signout_view_controller.h" -#import "ios/chrome/browser/ui/commands/application_commands.h" -#import "ios/chrome/browser/ui/commands/command_dispatcher.h" -#import "ios/chrome/browser/ui/commands/show_signin_command.h" #import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_action_handler.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -28,17 +21,11 @@ @interface EnterpriseSignoutCoordinator () < ConfirmationAlertActionHandler, - IdentityManagerObserverBridgeDelegate, - UIAdaptivePresentationControllerDelegate> { - std::unique_ptr<signin::IdentityManagerObserverBridge> - _identityManagerObserver; -} + UIAdaptivePresentationControllerDelegate> + // ViewController that contains enterprise signout information. @property(nonatomic, strong) EnterpriseSignoutViewController* viewController; -// Dispatcher to present the sign in screen. -@property(nonatomic, strong) id<ApplicationCommands> handler; - // YES if the sign-in is in progress. @property(nonatomic, assign) BOOL isSigninInProgress; @@ -46,22 +33,6 @@ @implementation EnterpriseSignoutCoordinator -- (instancetype)initWithBaseViewController:(UIViewController*)viewController - browser:(Browser*)browser { - self = [super initWithBaseViewController:viewController browser:browser]; - - if (self) { - _handler = HandlerForProtocol(self.browser->GetCommandDispatcher(), - ApplicationCommands); - _identityManagerObserver = - std::make_unique<signin::IdentityManagerObserverBridge>( - IdentityManagerFactory::GetForBrowserState( - self.browser->GetBrowserState()), - self); - } - return self; -} - - (void)start { [super start]; @@ -94,7 +65,6 @@ - (void)stop { [self dismissSignOutViewController]; - _identityManagerObserver.reset(); [super stop]; } @@ -123,52 +93,4 @@ } } -// Presents the sign-in dialog to the user. -- (void)showSignIn { - DCHECK(self.handler); - DCHECK(!self.isSigninInProgress); - self.isSigninInProgress = YES; - - signin_metrics::RecordSigninUserActionForAccessPoint( - signin_metrics::AccessPoint::ACCESS_POINT_ENTERPRISE_SIGNOUT_COORDINATOR, - signin_metrics::PromoAction::PROMO_ACTION_NO_SIGNIN_PROMO); - - __weak __typeof(self) weakSelf = self; - ShowSigninCommand* command = [[ShowSigninCommand alloc] - initWithOperation:AUTHENTICATION_OPERATION_SIGNIN - identity:nil - accessPoint:signin_metrics::AccessPoint:: - ACCESS_POINT_ENTERPRISE_SIGNOUT_COORDINATOR - promoAction:signin_metrics::PromoAction:: - PROMO_ACTION_NO_SIGNIN_PROMO - callback:^(BOOL success) { - [weakSelf didFinishSignin]; - }]; - [self.handler showSignin:command baseViewController:self.baseViewController]; -} - -// Updates isSigninInProgress when sign-in process is done. -- (void)didFinishSignin { - DCHECK(self.isSigninInProgress); - self.isSigninInProgress = NO; - [self.delegate enterpriseSignoutCoordinatorDidDismiss]; -} - -#pragma mark - IdentityManagerObserverBridgeDelegate - -// Called when a user changes the syncing state. -- (void)onPrimaryAccountChanged: - (const signin::PrimaryAccountChangeEvent&)event { - switch (event.GetEventTypeFor(signin::ConsentLevel::kSync)) { - case signin::PrimaryAccountChangeEvent::Type::kSet: - if (!self.isSigninInProgress) - [self.baseViewController dismissViewControllerAnimated:true - completion:nil]; - break; - case signin::PrimaryAccountChangeEvent::Type::kCleared: - case signin::PrimaryAccountChangeEvent::Type::kNone: - break; - } -} - @end
diff --git a/ios/chrome/browser/ui/authentication/signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/BUILD.gn index 2d1bcbfd..9ca7dde 100644 --- a/ios/chrome/browser/ui/authentication/signin/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/signin/BUILD.gn
@@ -121,11 +121,13 @@ deps = [ "//base", "//base/test:test_support", + "//components/policy:policy_code_generate", "//components/signin/public/base", "//components/strings:components_strings_grit", "//ios/chrome/app/strings", "//ios/chrome/browser:pref_names", "//ios/chrome/browser/metrics:eg_test_support+eg2", + "//ios/chrome/browser/policy:eg_test_support+eg2", "//ios/chrome/browser/policy:policy_util", "//ios/chrome/browser/ui/authentication:eg_test_support+eg2", "//ios/chrome/browser/ui/authentication/views:views_constants",
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm b/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm index de06591d..ada4eaf 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm +++ b/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm
@@ -6,9 +6,11 @@ #include "base/ios/ios_util.h" #include "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" +#include "components/policy/policy_constants.h" #include "components/signin/public/base/signin_metrics.h" #include "components/strings/grit/components_strings.h" #import "ios/chrome/browser/metrics/metrics_app_interface.h" +#import "ios/chrome/browser/policy/policy_earl_grey_utils.h" #include "ios/chrome/browser/policy/policy_util.h" #include "ios/chrome/browser/pref_names.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey.h" @@ -983,4 +985,42 @@ [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity2]; } +// Tests that when the syncTypesListDisabled policy is enabled, the signin promo +// description is updated and when opening the sign-in screen a policy warning +// is displayed. +- (void)testSynTypesDisabledPolicy { + // Set policy. + std::vector<base::Value> values; + values.push_back(base::Value("tabs")); + policy_test_utils::SetPolicy(base::Value(std::move(values)), + policy::key::kSyncTypesListDisabled); + + // Check that the promo description is updated. + [ChromeEarlGreyUI openSettingsMenu]; + [[EarlGrey + selectElementWithMatcher: + grey_allOf( + grey_accessibilityLabel(l10n_util::GetNSString( + IDS_IOS_SIGN_IN_TO_CHROME_SETTING_SUBTITLE_SYNC_MANAGED)), + grey_sufficientlyVisible(), nil)] + + assertWithMatcher:grey_sufficientlyVisible()]; + + [ChromeEarlGreyUI tapSettingsMenuButton:PrimarySignInButton()]; + [ChromeEarlGreyUI waitForAppToIdle]; + + NSString* policyText = + l10n_util::GetNSString(IDS_IOS_ENTERPRISE_MANAGED_SIGNIN_LEARN_MORE); + policyText = [policyText stringByReplacingOccurrencesOfString:@"BEGIN_LINK" + withString:@""]; + policyText = [policyText stringByReplacingOccurrencesOfString:@"END_LINK" + withString:@""]; + + // Check that the policy warning is presented. + [[EarlGrey + selectElementWithMatcher:grey_allOf(grey_text(policyText), + grey_sufficientlyVisible(), nil)] + assertWithMatcher:grey_notNil()]; +} + @end
diff --git a/ios/chrome/browser/ui/autofill/cells/cvc_item.mm b/ios/chrome/browser/ui/autofill/cells/cvc_item.mm index 4cd9822..0979550 100644 --- a/ios/chrome/browser/ui/autofill/cells/cvc_item.mm +++ b/ios/chrome/browser/ui/autofill/cells/cvc_item.mm
@@ -121,22 +121,18 @@ _instructionsTextLabel.translatesAutoresizingMaskIntoConstraints = NO; [contentView addSubview:_instructionsTextLabel]; - UIImageView* googlePayBadge = nil; - if (base::FeatureList::IsEnabled( - autofill::features::kAutofillEnableAccountWalletStorage)) { - googlePayBadge = [[UIImageView alloc] init]; - googlePayBadge.translatesAutoresizingMaskIntoConstraints = NO; - googlePayBadge.contentMode = UIViewContentModeScaleAspectFit; - googlePayBadge.image = NativeImage(IDR_AUTOFILL_GOOGLE_PAY); + UIImageView* googlePayBadge = [[UIImageView alloc] init]; + googlePayBadge.translatesAutoresizingMaskIntoConstraints = NO; + googlePayBadge.contentMode = UIViewContentModeScaleAspectFit; + googlePayBadge.image = NativeImage(IDR_AUTOFILL_GOOGLE_PAY); // IDR_AUTOFILL_GOOGLE_PAY_DARK only exists in official builds. #if BUILDFLAG(GOOGLE_CHROME_BRANDING) - if (UITraitCollection.currentTraitCollection.userInterfaceStyle == - UIUserInterfaceStyleDark) { - googlePayBadge.image = NativeImage(IDR_AUTOFILL_GOOGLE_PAY_DARK); - } -#endif - [contentView addSubview:googlePayBadge]; + if (UITraitCollection.currentTraitCollection.userInterfaceStyle == + UIUserInterfaceStyleDark) { + googlePayBadge.image = NativeImage(IDR_AUTOFILL_GOOGLE_PAY_DARK); } +#endif + [contentView addSubview:googlePayBadge]; _errorLabel = [[UILabel alloc] init]; _errorLabel.font = [[MDCTypography fontLoader] regularFontOfSize:12]; @@ -203,27 +199,6 @@ _buttonForNewCard.translatesAutoresizingMaskIntoConstraints = NO; [contentView addSubview:_buttonForNewCard]; - if (googlePayBadge) { - [NSLayoutConstraint activateConstraints:@[ - [_dateContainerView.topAnchor - constraintEqualToAnchor:googlePayBadge.bottomAnchor - constant:kUISpacing], - [googlePayBadge.topAnchor - constraintEqualToAnchor:_instructionsTextLabel.bottomAnchor - constant:kUISpacing], - [googlePayBadge.leadingAnchor - constraintEqualToAnchor:_instructionsTextLabel.leadingAnchor], - [googlePayBadge.heightAnchor - constraintEqualToConstant:kGooglePayBadgeHeight], - ]]; - } else { - [NSLayoutConstraint activateConstraints:@[ - [_dateContainerView.topAnchor - constraintEqualToAnchor:_instructionsTextLabel.bottomAnchor - constant:kUISpacing], - ]]; - } - [NSLayoutConstraint activateConstraints:@[ // Text label [_instructionsTextLabel.topAnchor @@ -236,7 +211,19 @@ constraintEqualToAnchor:contentView.trailingAnchor constant:-kHorizontalPadding], + // Google Pay badge. + [googlePayBadge.topAnchor + constraintEqualToAnchor:_instructionsTextLabel.bottomAnchor + constant:kUISpacing], + [googlePayBadge.leadingAnchor + constraintEqualToAnchor:_instructionsTextLabel.leadingAnchor], + [googlePayBadge.heightAnchor + constraintEqualToConstant:kGooglePayBadgeHeight], + // Date container + [_dateContainerView.topAnchor + constraintEqualToAnchor:googlePayBadge.bottomAnchor + constant:kUISpacing], [_dateContainerView.leadingAnchor constraintEqualToAnchor:_instructionsTextLabel.leadingAnchor], [_dateContainerView.heightAnchor
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm index 14f5920..c8f39df 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -883,9 +883,16 @@ : nullptr; } +// TODO(crbug.com/1265565): Remove once kSingleNtp feature is launched and +// directly reference |self.ntpCoordinator|. - (NewTabPageCoordinator*)ntpCoordinatorForWebState:(web::WebState*)webState { if (IsSingleNtpEnabled()) { - return self.isNTPActiveForCurrentWebState ? _ntpCoordinator : nil; + NewTabPageTabHelper* NTPHelper = + NewTabPageTabHelper::FromWebState(webState); + BOOL activeNtp = self.isNTPActiveForCurrentWebState || + (NTPHelper && NTPHelper->IsActive()); + DCHECK(activeNtp); + return _ntpCoordinator; } auto found = _ntpCoordinatorsForWebStates.find(webState); if (found != _ntpCoordinatorsForWebStates.end())
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.mm index 652a01d..6858dbb 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.mm
@@ -29,7 +29,6 @@ CGFloat ntpHeight = collectionViewHeight + headerHeight; CGFloat minimumHeight = ntpHeight - ntp_header::kScrolledToTopOmniboxBottomMargin; - CGFloat topSafeArea = self.collectionView.safeAreaInsets.top; if (!IsRegularXRegularSizeClass(self.collectionView)) { CGFloat toolbarHeight = IsSplitToolbarMode(self.collectionView) @@ -37,7 +36,7 @@ .preferredContentSizeCategory) : 0; CGFloat additionalHeight = - toolbarHeight + topSafeArea + self.collectionView.contentInset.bottom; + toolbarHeight + self.collectionView.contentInset.bottom; minimumHeight -= additionalHeight; ntpHeight += additionalHeight; }
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm index 6273ea0..8dc6c0a 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -754,20 +754,14 @@ [self checkIfNTPIsScrollable]; // Hide feed. - // TODO(crbug.com/1194106): Hide feed using feed header menu instead of - // manipulating pref directly. - [ChromeEarlGreyAppInterface - setBoolValue:NO - forUserPref:base::SysUTF8ToNSString(feed::prefs::kArticlesListVisible)]; + [self hideFeedFromNTPMenu]; // Check feed label and if NTP is scrollable. [self checkFeedLabelForFeedVisible:NO]; [self checkIfNTPIsScrollable]; // Show feed again. - [ChromeEarlGreyAppInterface - setBoolValue:YES - forUserPref:base::SysUTF8ToNSString(feed::prefs::kArticlesListVisible)]; + [self showFeedFromNTPMenu]; // Check feed label and if NTP is scrollable. [self checkFeedLabelForFeedVisible:YES]; @@ -846,6 +840,71 @@ assertWithMatcher:grey_sufficientlyVisible()]; } +#pragma mark - New Tab menu tests + +// Tests the "new search" menu item from the new tab menu. +- (void)testNewSearchFromNewTabMenu { + if ([ChromeEarlGrey isIPadIdiom]) { + EARL_GREY_TEST_SKIPPED(@"New Search is only available in phone layout."); + } + + [ChromeEarlGreyUI openNewTabMenu]; + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(kToolsMenuSearch)] + performAction:grey_tap()]; + GREYWaitForAppToIdle(@"App failed to idle"); + + // Check that there's now a new tab, that the new (second) tab is the active + // one, and the that the omnibox is first responder. + [ChromeEarlGrey waitForMainTabCount:2]; + + GREYAssertEqual(1, [ChromeEarlGrey indexOfActiveNormalTab], + @"Tab 1 should be active after starting a new search."); + + [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()] + assertWithMatcher:grey_sufficientlyVisible()]; + + [[EarlGrey selectElementWithMatcher:chrome_test_util::DefocusedLocationView()] + assertWithMatcher:grey_notVisible()]; + // Fakebox should be covered. + [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()] + assertWithMatcher:grey_notVisible()]; + GREYWaitForAppToIdle(@"App failed to idle"); +} + +// Tests the "new search" menu item from the new tab menu after disabling the +// feed. +- (void)testNewSearchFromNewTabMenuAfterTogglingFeed { + if ([ChromeEarlGrey isIPadIdiom]) { + EARL_GREY_TEST_SKIPPED(@"New Search is only available in phone layout."); + } + + // Hide feed. + [self hideFeedFromNTPMenu]; + + [ChromeEarlGreyUI openNewTabMenu]; + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(kToolsMenuSearch)] + performAction:grey_tap()]; + GREYWaitForAppToIdle(@"App failed to idle"); + + // Check that there's now a new tab, that the new (third) tab is the active + // one, and the that the omnibox is first responder. + [ChromeEarlGrey waitForMainTabCount:2]; + + GREYAssertEqual(1, [ChromeEarlGrey indexOfActiveNormalTab], + @"Tab 1 should be active after starting a new search."); + + [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()] + assertWithMatcher:grey_sufficientlyVisible()]; + + [[EarlGrey selectElementWithMatcher:chrome_test_util::DefocusedLocationView()] + assertWithMatcher:grey_notVisible()]; + + // Fakebox should be covered. + [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()] + assertWithMatcher:grey_notVisible()]; + GREYWaitForAppToIdle(@"App failed to idle"); +} + #pragma mark - Helpers - (void)addMostVisitedTile { @@ -921,4 +980,48 @@ performAction:grey_scrollToContentEdge(kGREYContentEdgeTop)]; } +- (void)showFeedFromNTPMenu { + bool feed_visible = + [ChromeEarlGrey userBooleanPref:feed::prefs::kArticlesListVisible]; + GREYAssertFalse(feed_visible, @"Expect feed to be hidden!"); + + // The feed header button may be offscreen, so scroll to find it if needed. + id<GREYMatcher> headerButton = + grey_allOf(grey_accessibilityID(kNTPFeedHeaderButtonIdentifier), + grey_sufficientlyVisible(), nil); + [[[EarlGrey selectElementWithMatcher:headerButton] + usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, 100.0f) + onElementWithMatcher:chrome_test_util::NTPCollectionView()] + performAction:grey_tap()]; + + [[EarlGrey + selectElementWithMatcher:chrome_test_util::NTPFeedMenuEnableButton()] + performAction:grey_tap()]; + feed_visible = + [ChromeEarlGrey userBooleanPref:feed::prefs::kArticlesListVisible]; + GREYAssertTrue(feed_visible, @"Expect feed to be visible!"); +} + +- (void)hideFeedFromNTPMenu { + bool feed_visible = + [ChromeEarlGrey userBooleanPref:feed::prefs::kArticlesListVisible]; + GREYAssertTrue(feed_visible, @"Expect feed to be visible!"); + + // The feed header button may be offscreen, so scroll to find it if needed. + id<GREYMatcher> headerButton = + grey_allOf(grey_accessibilityID(kNTPFeedHeaderButtonIdentifier), + grey_sufficientlyVisible(), nil); + [[[EarlGrey selectElementWithMatcher:headerButton] + usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, 100.0f) + onElementWithMatcher:chrome_test_util::NTPCollectionView()] + performAction:grey_tap()]; + + [[EarlGrey + selectElementWithMatcher:chrome_test_util::NTPFeedMenuDisableButton()] + performAction:grey_tap()]; + feed_visible = + [ChromeEarlGrey userBooleanPref:feed::prefs::kArticlesListVisible]; + GREYAssertFalse(feed_visible, @"Expect feed to be hidden!"); +} + @end
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_list.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_list.swift index 7f34772..d9ebedf 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_list.swift +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_list.swift
@@ -6,11 +6,6 @@ /// A view that displays a list of actions in the overflow menu. struct OverflowMenuActionList: View { - enum Offsets { - // List inset is 20, UX requires 16, hence offset by -4 left and right. - static let horizontalOffset: CGFloat = -4 - } - /// The list of action groups for this view. var actionGroups: [OverflowMenuActionGroup] @@ -21,6 +16,7 @@ } } .listStyle(InsetGroupedListStyle()) - .padding([.leading, .trailing], Offsets.horizontalOffset) + // Allow sections to have very small headers controlling section spacing. + .environment(\.defaultMinListHeaderHeight, 0) } }
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_section.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_section.swift index 1d2fb03..b2ce3d78 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_section.swift +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_section.swift
@@ -6,19 +6,37 @@ /// A SwiftUI view for the overflow menu displaying a subsection of the actions list. struct OverflowMenuActionSection: View { + + enum Dimensions { + // Default height if no other header or footer. This spaces the sections + // out properly. + static let headerFooterHeight: CGFloat = 20 + } + @ObservedObject var actionGroup: OverflowMenuActionGroup var body: some View { - let footer: OverflowMenuFooterRow? - if let actionFooter = actionGroup.footer { - footer = OverflowMenuFooterRow(footer: actionFooter) - } else { - footer = nil - } - return Section(footer: footer) { - ForEach(actionGroup.actions) { action in - OverflowMenuActionRow(action: action) - } - } + Section( + content: { + ForEach(actionGroup.actions) { action in + OverflowMenuActionRow(action: action) + } + }, + header: { + Spacer() + .frame(height: Dimensions.headerFooterHeight) + .listRowInsets(EdgeInsets()) + }, + footer: { + if let actionFooter = actionGroup.footer { + OverflowMenuFooterRow(footer: actionFooter) + } else { + Spacer() + // Use `leastNonzeroMagnitude` to remove the footer. Otherwise, + // it uses a default height. + .frame(height: CGFloat.leastNonzeroMagnitude) + .listRowInsets(EdgeInsets()) + } + }) } }
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift index 25f69d72..396bb1f 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift
@@ -6,7 +6,7 @@ struct OverflowMenuView: View { enum Dimensions { - static let destinationListHeight: CGFloat = 129 + static let destinationListHeight: CGFloat = 123 } @EnvironmentObject var model: OverflowMenuModel
diff --git a/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm b/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm index 85fa01f..7eec3af 100644 --- a/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm +++ b/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm
@@ -104,7 +104,8 @@ // Tests that a bookmark injected in the FakeServer is synced down to the // client. -- (void)testSyncDownloadBookmark { +// Flaky test. See crbug.com/1275849. +- (void)DISABLED_testSyncDownloadBookmark { [BookmarkEarlGrey verifyBookmarksWithTitle:@"hoo" expectedCount:0]; const GURL URL = web::test::HttpServer::MakeUrl("http://www.hoo.com"); [ChromeEarlGrey addFakeSyncServerBookmarkWithURL:URL title:"hoo"];
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm index ef3ba5f..d0bf2d4 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm
@@ -120,6 +120,10 @@ // horizontal to grid layout. @property(nonatomic, strong) UICollectionViewTransitionLayout* gridHorizontalTransitionLayout; +// YES while |self.gridHorizontalTransitionLayout| is finishing (or cancelling) +// the transition. Is used to avoid cancelling again during enabling/disabling +// of the thumbstrip. +@property(nonatomic, assign) BOOL transitionLayoutIsFinishing; // Tap gesture recognizer to dismiss the thumb strip. @property(nonatomic, strong) @@ -164,6 +168,10 @@ forCellWithReuseIdentifier:kCellIdentifier]; [collectionView registerClass:[PlusSignCell class] forCellWithReuseIdentifier:kPlusSignCellIdentifier]; + // During deletion (in horizontal layout) the backgroundView can resize, + // revealing temporarily the collectionView background. This makes sure + // both are the same color. + collectionView.backgroundColor = [UIColor colorNamed:kGridBackgroundColor]; // If this stays as the default |YES|, then cells aren't highlighted // immediately on touch, but after a short delay. collectionView.delaysContentTouches = NO; @@ -953,6 +961,8 @@ weakSelf.thumbStripDismissRecognizer.enabled = YES; weakSelf.thumbStripSwipeUpDismissRecognizer.enabled = YES; } + weakSelf.transitionLayoutIsFinishing = NO; + weakSelf.gridHorizontalTransitionLayout = nil; if (completion) { completion(completed, finished); } @@ -971,6 +981,7 @@ } - (void)didTransitionToLayoutSuccessfully:(BOOL)success { + self.transitionLayoutIsFinishing = YES; if (success) { [self.collectionView finishInteractiveTransition]; } else { @@ -1342,14 +1353,22 @@ - (void)thumbStripEnabledWithPanHandler: (ViewRevealingVerticalPanHandler*)panHandler { + // Make sure the collection view isn't in the middle of a transition. + if (self.gridHorizontalTransitionLayout) { + if (!self.transitionLayoutIsFinishing) { + [self didTransitionToLayoutSuccessfully:NO]; + } + __weak GridViewController* weakSelf = self; + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf thumbStripEnabledWithPanHandler:panHandler]; + }); + return; + } + DCHECK(!self.thumbStripEnabled); UICollectionView* collectionView = self.collectionView; - // Make sure the collection view isn't in the middle of a transition. - DCHECK(![collectionView.collectionViewLayout - isKindOfClass:[UICollectionViewTransitionLayout class]]); - // Install tap gesture recognizer in collection to handle user taps on the // thumb strip background, assuming it hasn't already been installed. @@ -1390,15 +1409,23 @@ } - (void)thumbStripDisabled { + // Make sure the collection view isn't in the middle of a transition. + if (self.gridHorizontalTransitionLayout) { + if (!self.transitionLayoutIsFinishing) { + [self didTransitionToLayoutSuccessfully:NO]; + } + __weak GridViewController* weakSelf = self; + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf thumbStripDisabled]; + }); + return; + } + DCHECK(self.thumbStripEnabled); UICollectionView* collectionView = self.collectionView; FlowLayout* gridLayout = self.gridLayout; - // Make sure the collection view isn't in the middle of a transition. - DCHECK(![collectionView.collectionViewLayout - isKindOfClass:[UICollectionViewTransitionLayout class]]); - [collectionView.backgroundView removeGestureRecognizer:self.thumbStripDismissRecognizer]; [collectionView.backgroundView
diff --git a/ios/chrome/common/app_group/app_group_field_trial_version.h b/ios/chrome/common/app_group/app_group_field_trial_version.h index 13354f8..6fedd97 100644 --- a/ios/chrome/common/app_group/app_group_field_trial_version.h +++ b/ios/chrome/common/app_group/app_group_field_trial_version.h
@@ -25,4 +25,8 @@ // feature. extern const int kCredentialProviderExtensionPromoFeatureVersion; +// The current version of the credential provider extension's password manager +// branding update feature. +extern const int kPasswordManagerBrandingUpdateFeatureVersion; + #endif // IOS_CHROME_COMMON_APP_GROUP_APP_GROUP_FIELD_TRIAL_VERSION_H_
diff --git a/ios/chrome/common/app_group/app_group_field_trial_version.mm b/ios/chrome/common/app_group/app_group_field_trial_version.mm index 43b1b11..ae48a96d 100644 --- a/ios/chrome/common/app_group/app_group_field_trial_version.mm +++ b/ios/chrome/common/app_group/app_group_field_trial_version.mm
@@ -14,3 +14,5 @@ const int kPasswordCreationFeatureVersion = 0; const int kCredentialProviderExtensionPromoFeatureVersion = 0; + +const int kPasswordManagerBrandingUpdateFeatureVersion = 0;
diff --git a/ios/chrome/credential_provider_extension/credential_provider_extension_localize_strings_config.plist b/ios/chrome/credential_provider_extension/credential_provider_extension_localize_strings_config.plist index 74391fa..5ae3803 100644 --- a/ios/chrome/credential_provider_extension/credential_provider_extension_localize_strings_config.plist +++ b/ios/chrome/credential_provider_extension/credential_provider_extension_localize_strings_config.plist
@@ -19,10 +19,15 @@ <string>IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_ENABLE_BUTTON_TITLE_LEGACY</string> <string>IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_MORE_INFO_STRING</string> <string>IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE</string> + <string>IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_BRANDED_NO_SYNC</string> + <string>IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_BRANDED_SYNC</string> <string>IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_LEGACY</string> <string>IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_TITLE_LEGACY</string> <string>IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_TITLE</string> <string>IDS_IOS_CREDENTIAL_PROVIDER_CREATE_PASSWORD_ROW</string> + <string>IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_HEADER_NO_SYNC</string> + <string>IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_HEADER_SYNC</string> + <string>IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_TITLE</string> <string>IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_TITLE</string> <string>IDS_IOS_CREDENTIAL_PROVIDER_DETAILS_COPY</string> <string>IDS_IOS_CREDENTIAL_PROVIDER_DETAILS_PASSWORD</string>
diff --git a/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings.grd b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings.grd index 6b97c01c..2c3cbaf 100644 --- a/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings.grd +++ b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings.grd
@@ -171,7 +171,7 @@ Got it </message> <message name="IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_CAPTION" desc="Caption message under subtitle for consent screen that shows user tips" meaning="The user taps this button to enable the AutoFill extension."> - To get to your messages faster, deselect iCloud keychain + To get to your passwords faster, deselect iCloud keychain </message> <message name="IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_ENABLE_BUTTON_TITLE_LEGACY" desc="Legacy title for the button that triggers auth, in order to enable the extension. 'AutoFill' matches what Apple shows in settings. For other languages see: Settings > Safari > AutoFill." meaning="The user taps this button to enable the AutoFill extension."> Turn on AutoFill @@ -182,6 +182,12 @@ <message name="IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE" desc="Subtitle for consent screen" meaning="Subtitle to show when enabling the extension"> Use Chrome to autofill your saved passwords in other apps on your device </message> + <message name="IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_BRANDED_NO_SYNC" desc="Subtitle for consent screen" meaning="Subtitle to show when enabling the extension when the user is not sync"> + You can use saved passwords in other apps on your device. They're saved to Google Password Manager on this device only. + </message> + <message name="IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_BRANDED_SYNC" desc="Subtitle for consent screen" meaning="Subtitle to show when enabling the extension when user the is not sync"> + You can use saved passwords in other apps on your device. They're saved to Google Password Manager for <ph name="EMAIL">$1<ex>example@google.com</ex></ph>. + </message> <message name="IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_LEGACY" desc="Subtitle for legacy consent screen" meaning="Subtitle to show when enabling the extension"> Access the passwords you save in Chrome from any app. </message> @@ -191,6 +197,15 @@ <message name="IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_TITLE_LEGACY" desc="Title for legacy consent screen. 'AutoFill' matches what Apple shows in settings. For other languages see: Settings > Safari > AutoFill." meaning="Title to show when enabling the extension [CHAR_LIMIT=25]"> AutoFill Chrome Passwords </message> + <message name="IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_HEADER_NO_SYNC" desc="No sync header for credential list screen." meaning="Header to show when showing list of credentials of no sync user"> + Passwords are saved to Google Password Manager on this device only. + </message> + <message name="IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_HEADER_SYNC" desc="Sync header for credential list screen." meaning="Header to show when showing list of credentials of sync user"> + Passwords are saved to Google Password Manager and you can use them on any device. + </message> + <message name="IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_TITLE" desc="Title for credential list screen." meaning="Title to show when showing list of credentials [CHAR_LIMIT=25]"> + Google Password Manager + </message> <message name="IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_TITLE" desc="Title for credential list screen. 'AutoFill' matches what Apple shows in settings. For other languages see: Settings > Safari > AutoFill." meaning="Title to show when showing list of credentials [CHAR_LIMIT=25]"> AutoFill Chrome Password </message>
diff --git a/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_CAPTION.png.sha1 b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_CAPTION.png.sha1 index 7b485e32..3a06391 100644 --- a/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_CAPTION.png.sha1 +++ b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_CAPTION.png.sha1
@@ -1 +1 @@ -b6df8364ec4463205b12d33dedb2cc927af6712a \ No newline at end of file +9ff1d52e5922a9402e4d87cc049763e2e10e4f9c \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_BRANDED_NO_SYNC.png.sha1 b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_BRANDED_NO_SYNC.png.sha1 new file mode 100644 index 0000000..142cc92f --- /dev/null +++ b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_BRANDED_NO_SYNC.png.sha1
@@ -0,0 +1 @@ +d87a57bd8307fb1c31108a66a2ce631512e47745 \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_BRANDED_SYNC.png.sha1 b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_BRANDED_SYNC.png.sha1 new file mode 100644 index 0000000..2b3d60e --- /dev/null +++ b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_BRANDED_SYNC.png.sha1
@@ -0,0 +1 @@ +679edf8d06b4fee64aa0febd4273362ea1c7cadf \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_HEADER_NO_SYNC.png.sha1 b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_HEADER_NO_SYNC.png.sha1 new file mode 100644 index 0000000..f50f800 --- /dev/null +++ b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_HEADER_NO_SYNC.png.sha1
@@ -0,0 +1 @@ +81d6934d8e927b0c401b977e2f23fbc013cde5a3 \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_HEADER_SYNC.png.sha1 b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_HEADER_SYNC.png.sha1 new file mode 100644 index 0000000..a88b0bf --- /dev/null +++ b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_HEADER_SYNC.png.sha1
@@ -0,0 +1 @@ +b6d21d1edf5582238a2a96d5333af3c166596f9c \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_TITLE.png.sha1 b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_TITLE.png.sha1 new file mode 100644 index 0000000..f50f800 --- /dev/null +++ b/ios/chrome/credential_provider_extension/strings/ios_credential_provider_extension_strings_grd/IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_TITLE.png.sha1
@@ -0,0 +1 @@ +81d6934d8e927b0c401b977e2f23fbc013cde5a3 \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/ui/BUILD.gn b/ios/chrome/credential_provider_extension/ui/BUILD.gn index 4e3eaf2..a7bdd02 100644 --- a/ios/chrome/credential_provider_extension/ui/BUILD.gn +++ b/ios/chrome/credential_provider_extension/ui/BUILD.gn
@@ -18,6 +18,8 @@ "credential_list_consumer.h", "credential_list_coordinator.h", "credential_list_coordinator.mm", + "credential_list_global_header_view.h", + "credential_list_global_header_view.mm", "credential_list_header_view.h", "credential_list_header_view.mm", "credential_list_mediator.h",
diff --git a/ios/chrome/credential_provider_extension/ui/consent_view_controller.mm b/ios/chrome/credential_provider_extension/ui/consent_view_controller.mm index e78d6220..2c3b39f 100644 --- a/ios/chrome/credential_provider_extension/ui/consent_view_controller.mm +++ b/ios/chrome/credential_provider_extension/ui/consent_view_controller.mm
@@ -3,7 +3,11 @@ // found in the LICENSE file. #import "ios/chrome/credential_provider_extension/ui/consent_view_controller.h" + +#include "ios/chrome/common/app_group/app_group_constants.h" +#import "ios/chrome/common/credential_provider/constants.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/credential_provider_extension/ui/feature_flags.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -20,13 +24,34 @@ - (void)viewDidLoad { self.view.accessibilityIdentifier = kConsentViewControllerIdentifier; + + if (IsPasswordManagerBrandingUpdateEnable()) { + self.bannerImage = [UIImage imageNamed:@"consent_view_controller"]; + + NSString* userEmail = [app_group::GetGroupUserDefaults() + stringForKey:AppGroupUserDefaultsCredentialProviderUserEmail()]; + + if (userEmail.length) { + NSString* baseLocalizedString = NSLocalizedString( + @"IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_BRANDED_SYNC", + @"The subtitle in the consent screen."); + self.subtitleText = + [baseLocalizedString stringByReplacingOccurrencesOfString:@"$1" + withString:userEmail]; + } else { + self.subtitleText = NSLocalizedString( + @"IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE_BRANDED_NO_SYNC", + @"The subtitle in the consent screen."); + } + } else { + self.bannerImage = [UIImage imageNamed:@"legacy_consent_view_controller"]; + self.subtitleText = + NSLocalizedString(@"IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE", + @"The subtitle in the consent screen."); + } self.titleText = NSLocalizedString(@"IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_TITLE", @"The title in the consent screen."); - self.subtitleText = - NSLocalizedString(@"IDS_IOS_CREDENTIAL_PROVIDER_CONSENT_SUBTITLE", - @"The subtitle in the consent screen."); - self.bannerImage = [UIImage imageNamed:@"consent_view_controller"]; self.isTallBanner = NO; self.shouldShowLearnMoreButton = YES; self.primaryActionString = NSLocalizedString(
diff --git a/ios/chrome/credential_provider_extension/ui/credential_list_global_header_view.h b/ios/chrome/credential_provider_extension/ui/credential_list_global_header_view.h new file mode 100644 index 0000000..3714944d --- /dev/null +++ b/ios/chrome/credential_provider_extension/ui/credential_list_global_header_view.h
@@ -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. + +#ifndef IOS_CHROME_CREDENTIAL_PROVIDER_EXTENSION_UI_CREDENTIAL_LIST_GLOBAL_HEADER_VIEW_H_ +#define IOS_CHROME_CREDENTIAL_PROVIDER_EXTENSION_UI_CREDENTIAL_LIST_GLOBAL_HEADER_VIEW_H_ + +#import <UIKit/UIKit.h> + +@interface CredentialListGlobalHeaderView : UITableViewHeaderFooterView + +// ReuseID for this class. +@property(class, readonly) NSString* reuseID; + +@end + +#endif // IOS_CHROME_CREDENTIAL_PROVIDER_EXTENSION_UI_CREDENTIAL_LIST_GLOBAL_HEADER_VIEW_H_
diff --git a/ios/chrome/credential_provider_extension/ui/credential_list_global_header_view.mm b/ios/chrome/credential_provider_extension/ui/credential_list_global_header_view.mm new file mode 100644 index 0000000..45d4b029 --- /dev/null +++ b/ios/chrome/credential_provider_extension/ui/credential_list_global_header_view.mm
@@ -0,0 +1,94 @@ +// 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. + +#import "ios/chrome/credential_provider_extension/ui/credential_list_global_header_view.h" + +#include "ios/chrome/common/app_group/app_group_constants.h" +#import "ios/chrome/common/credential_provider/constants.h" +#import "ios/chrome/common/ui/colors/semantic_color_names.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +// Spacing above the label. +const CGFloat kTopSpacing = 8; + +// Spacing below the label. +const CGFloat kBottomSpacing = 20; + +} // namespace + +@interface CredentialListGlobalHeaderView () + +// Label to hold the actual text. +@property(nonatomic, strong) UILabel* headerTextLabel; + +@end + +@implementation CredentialListGlobalHeaderView + ++ (NSString*)reuseID { + return @"CredentialListGlobalHeaderView"; +} + +- (instancetype)initWithReuseIdentifier:(NSString*)reuseIdentifier { + if (self = [super initWithReuseIdentifier:reuseIdentifier]) { + _headerTextLabel = [[UILabel alloc] init]; + _headerTextLabel.translatesAutoresizingMaskIntoConstraints = NO; + _headerTextLabel.font = + [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; + _headerTextLabel.textColor = [UIColor colorNamed:kTextSecondaryColor]; + _headerTextLabel.numberOfLines = 0; + _headerTextLabel.text = [self headerText]; + + [self.contentView addSubview:_headerTextLabel]; + + [NSLayoutConstraint activateConstraints:@[ + [self.contentView.leadingAnchor + constraintEqualToAnchor:_headerTextLabel.leadingAnchor], + [self.contentView.trailingAnchor + constraintEqualToAnchor:_headerTextLabel.trailingAnchor], + [self.contentView.topAnchor + constraintEqualToAnchor:_headerTextLabel.topAnchor + constant:-kTopSpacing], + [self.contentView.bottomAnchor + constraintEqualToAnchor:_headerTextLabel.bottomAnchor + constant:kBottomSpacing], + ]]; + } + return self; +} + +- (void)prepareForReuse { + [super prepareForReuse]; + + // Update the text here, just in case it has changed in between uses. + self.headerTextLabel.text = [self headerText]; +} + +#pragma mark - Private + +// Returns the header text depending of password sync (represented by the user's +// email not being available as used in the sync disclaimer). +- (NSString*)headerText { + NSString* syncingUserEmail = [app_group::GetGroupUserDefaults() + stringForKey:AppGroupUserDefaultsCredentialProviderUserEmail()]; + + BOOL passwordSyncOn = syncingUserEmail != nil; + + if (passwordSyncOn) { + return NSLocalizedString( + @"IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_HEADER_SYNC", + @"The information provided in the header of password list."); + } else { + return NSLocalizedString( + @"IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_HEADER_NO_SYNC", + @"The information provided in the header of password list."); + } +} + +@end
diff --git a/ios/chrome/credential_provider_extension/ui/credential_list_view_controller.mm b/ios/chrome/credential_provider_extension/ui/credential_list_view_controller.mm index f9d4320..e730b8e9 100644 --- a/ios/chrome/credential_provider_extension/ui/credential_list_view_controller.mm +++ b/ios/chrome/credential_provider_extension/ui/credential_list_view_controller.mm
@@ -12,6 +12,7 @@ #import "ios/chrome/common/ui/elements/highlight_button.h" #import "ios/chrome/common/ui/util/pointer_interaction_util.h" #import "ios/chrome/credential_provider_extension/metrics_util.h" +#import "ios/chrome/credential_provider_extension/ui/credential_list_global_header_view.h" #import "ios/chrome/credential_provider_extension/ui/credential_list_header_view.h" #import "ios/chrome/credential_provider_extension/ui/feature_flags.h" @@ -86,9 +87,17 @@ - (void)viewDidLoad { [super viewDidLoad]; - self.title = - NSLocalizedString(@"IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_TITLE", - @"AutoFill Chrome Password"); + + if (IsPasswordManagerBrandingUpdateEnable()) { + self.title = NSLocalizedString( + @"IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_BRANDED_TITLE", + @"Google Password Manager"); + } else { + self.title = + NSLocalizedString(@"IDS_IOS_CREDENTIAL_PROVIDER_CREDENTIAL_LIST_TITLE", + @"AutoFill Chrome Password"); + } + self.view.backgroundColor = BackgroundColor(); if (IsPasswordCreationEnabled()) { self.navigationItem.leftBarButtonItem = [self navigationCancelButton]; @@ -142,6 +151,9 @@ forHeaderFooterViewReuseIdentifier:kHeaderIdentifier]; [self.tableView registerClass:[CredentialListHeaderView class] forHeaderFooterViewReuseIdentifier:CredentialListHeaderView.reuseID]; + [self.tableView registerClass:[CredentialListGlobalHeaderView class] + forHeaderFooterViewReuseIdentifier:CredentialListGlobalHeaderView + .reuseID]; } #pragma mark - CredentialListConsumer @@ -231,6 +243,10 @@ - (UIView*)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section { + if ([self isGlobalHeaderSection:section]) { + return [self.tableView dequeueReusableHeaderFooterViewWithIdentifier: + CredentialListGlobalHeaderView.reuseID]; + } if (IsPasswordCreationEnabled()) { CredentialListHeaderView* view = [self.tableView dequeueReusableHeaderFooterViewWithIdentifier:CredentialListHeaderView @@ -251,6 +267,9 @@ - (CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section { + if ([self isGlobalHeaderSection:section]) { + return UITableViewAutomaticDimension; + } if (IsPasswordCreationEnabled() && [self isSuggestedPasswordSection:section]) { return 0; @@ -371,6 +390,12 @@ } } +// Returns YES if given section is for global header. +- (BOOL)isGlobalHeaderSection:(int)section { + return section == 0 && IsPasswordManagerBrandingUpdateEnable() && + ![self isEmptyTable]; +} + // Returns the credential at the passed index. - (id<Credential>)credentialForIndexPath:(NSIndexPath*)indexPath { if ([self isSuggestedPasswordSection:indexPath.section]) {
diff --git a/ios/chrome/credential_provider_extension/ui/feature_flags.h b/ios/chrome/credential_provider_extension/ui/feature_flags.h index 2c63c72..cee87b7a 100644 --- a/ios/chrome/credential_provider_extension/ui/feature_flags.h +++ b/ios/chrome/credential_provider_extension/ui/feature_flags.h
@@ -15,4 +15,7 @@ BOOL IsCredentialProviderExtensionPromoEnabled(); +// Whether the password manager branding UI update feature is enabled. +BOOL IsPasswordManagerBrandingUpdateEnable(); + #endif // IOS_CHROME_CREDENTIAL_PROVIDER_EXTENSION_UI_FEATURE_FLAGS_H_
diff --git a/ios/chrome/credential_provider_extension/ui/feature_flags.mm b/ios/chrome/credential_provider_extension/ui/feature_flags.mm index 63ecdb1a..6ecbc0d1 100644 --- a/ios/chrome/credential_provider_extension/ui/feature_flags.mm +++ b/ios/chrome/credential_provider_extension/ui/feature_flags.mm
@@ -40,3 +40,15 @@ } return [featureData[kFieldTrialValueKey] boolValue]; } + +BOOL IsPasswordManagerBrandingUpdateEnable() { + NSDictionary* allFeatures = [app_group::GetGroupUserDefaults() + objectForKey:app_group::kChromeExtensionFieldTrialPreference]; + NSDictionary* featureData = + allFeatures[@"IOSEnablePasswordManagerBrandingUpdate"]; + if (!featureData || kPasswordManagerBrandingUpdateFeatureVersion != + [featureData[kFieldTrialVersionKey] intValue]) { + return NO; + } + return [featureData[kFieldTrialValueKey] boolValue]; +}
diff --git a/ios/chrome/credential_provider_extension/ui/resources/BUILD.gn b/ios/chrome/credential_provider_extension/ui/resources/BUILD.gn index 1ccf92d..62d48ae 100644 --- a/ios/chrome/credential_provider_extension/ui/resources/BUILD.gn +++ b/ios/chrome/credential_provider_extension/ui/resources/BUILD.gn
@@ -11,11 +11,22 @@ ":consent_view_controller", ":empty_credentials_illustration", ":info_icon", + ":legacy_consent_view_controller", ":password_hide_icon", ":password_reveal_icon", ] } +imageset("consent_view_controller") { + sources = [ + "consent_view_controller.imageset/Contents.json", + "consent_view_controller.imageset/promo_passwords_in_other_apps@2x.png", + "consent_view_controller.imageset/promo_passwords_in_other_apps@3x.png", + "consent_view_controller.imageset/promo_passwords_in_other_apps_dark@2x.png", + "consent_view_controller.imageset/promo_passwords_in_other_apps_dark@3x.png", + ] +} + imageset("consent_illustration") { sources = [ "consent_illustration.imageset/Contents.json", @@ -26,13 +37,13 @@ ] } -imageset("consent_view_controller") { +imageset("legacy_consent_view_controller") { sources = [ - "consent_view_controller.imageset/Contents.json", - "consent_view_controller.imageset/promo-passwords_in_other_apps-dark@2x.png", - "consent_view_controller.imageset/promo-passwords_in_other_apps-dark@3x.png", - "consent_view_controller.imageset/promo-passwords_in_other_apps-light@2x.png", - "consent_view_controller.imageset/promo-passwords_in_other_apps-light@3x.png", + "legacy_consent_view_controller.imageset/Contents.json", + "legacy_consent_view_controller.imageset/promo-passwords_in_other_apps-dark@2x.png", + "legacy_consent_view_controller.imageset/promo-passwords_in_other_apps-dark@3x.png", + "legacy_consent_view_controller.imageset/promo-passwords_in_other_apps-light@2x.png", + "legacy_consent_view_controller.imageset/promo-passwords_in_other_apps-light@3x.png", ] }
diff --git a/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/Contents.json b/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/Contents.json index d36f3ab1..717c1713 100644 --- a/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/Contents.json +++ b/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/Contents.json
@@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "promo-passwords_in_other_apps-light@2x.png", + "filename" : "promo_passwords_in_other_apps@2x.png", "idiom" : "universal", "scale" : "2x" }, @@ -12,12 +12,12 @@ "value" : "dark" } ], - "filename" : "promo-passwords_in_other_apps-dark@2x.png", + "filename" : "promo_passwords_in_other_apps_dark@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "promo-passwords_in_other_apps-light@3x.png", + "filename" : "promo_passwords_in_other_apps@3x.png", "idiom" : "universal", "scale" : "3x" }, @@ -28,7 +28,7 @@ "value" : "dark" } ], - "filename" : "promo-passwords_in_other_apps-dark@3x.png", + "filename" : "promo_passwords_in_other_apps_dark@3x.png", "idiom" : "universal", "scale" : "3x" }
diff --git a/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo_passwords_in_other_apps@2x.png b/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo_passwords_in_other_apps@2x.png new file mode 100644 index 0000000..eb4c6a33 --- /dev/null +++ b/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo_passwords_in_other_apps@2x.png Binary files differ
diff --git a/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo_passwords_in_other_apps@3x.png b/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo_passwords_in_other_apps@3x.png new file mode 100644 index 0000000..00b4626d --- /dev/null +++ b/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo_passwords_in_other_apps@3x.png Binary files differ
diff --git a/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo_passwords_in_other_apps_dark@2x.png b/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo_passwords_in_other_apps_dark@2x.png new file mode 100644 index 0000000..daa5c85 --- /dev/null +++ b/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo_passwords_in_other_apps_dark@2x.png Binary files differ
diff --git a/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo_passwords_in_other_apps_dark@3x.png b/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo_passwords_in_other_apps_dark@3x.png new file mode 100644 index 0000000..7b46bc8 --- /dev/null +++ b/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo_passwords_in_other_apps_dark@3x.png Binary files differ
diff --git a/ios/chrome/credential_provider_extension/ui/resources/legacy_consent_view_controller.imageset/Contents.json b/ios/chrome/credential_provider_extension/ui/resources/legacy_consent_view_controller.imageset/Contents.json new file mode 100644 index 0000000..d36f3ab1 --- /dev/null +++ b/ios/chrome/credential_provider_extension/ui/resources/legacy_consent_view_controller.imageset/Contents.json
@@ -0,0 +1,40 @@ +{ + "images" : [ + { + "filename" : "promo-passwords_in_other_apps-light@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "promo-passwords_in_other_apps-dark@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "promo-passwords_in_other_apps-light@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "promo-passwords_in_other_apps-dark@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +}
diff --git a/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo-passwords_in_other_apps-dark@2x.png b/ios/chrome/credential_provider_extension/ui/resources/legacy_consent_view_controller.imageset/promo-passwords_in_other_apps-dark@2x.png similarity index 100% rename from ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo-passwords_in_other_apps-dark@2x.png rename to ios/chrome/credential_provider_extension/ui/resources/legacy_consent_view_controller.imageset/promo-passwords_in_other_apps-dark@2x.png Binary files differ
diff --git a/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo-passwords_in_other_apps-dark@3x.png b/ios/chrome/credential_provider_extension/ui/resources/legacy_consent_view_controller.imageset/promo-passwords_in_other_apps-dark@3x.png similarity index 100% rename from ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo-passwords_in_other_apps-dark@3x.png rename to ios/chrome/credential_provider_extension/ui/resources/legacy_consent_view_controller.imageset/promo-passwords_in_other_apps-dark@3x.png Binary files differ
diff --git a/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo-passwords_in_other_apps-light@2x.png b/ios/chrome/credential_provider_extension/ui/resources/legacy_consent_view_controller.imageset/promo-passwords_in_other_apps-light@2x.png similarity index 100% rename from ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo-passwords_in_other_apps-light@2x.png rename to ios/chrome/credential_provider_extension/ui/resources/legacy_consent_view_controller.imageset/promo-passwords_in_other_apps-light@2x.png Binary files differ
diff --git a/ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo-passwords_in_other_apps-light@3x.png b/ios/chrome/credential_provider_extension/ui/resources/legacy_consent_view_controller.imageset/promo-passwords_in_other_apps-light@3x.png similarity index 100% rename from ios/chrome/credential_provider_extension/ui/resources/consent_view_controller.imageset/promo-passwords_in_other_apps-light@3x.png rename to ios/chrome/credential_provider_extension/ui/resources/legacy_consent_view_controller.imageset/promo-passwords_in_other_apps-light@3x.png Binary files differ
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.h b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.h index ac45af54..1858f44 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.h +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.h
@@ -54,6 +54,11 @@ // Sets and Leaves the root matcher to the given window with |windowNumber|. - (void)openSettingsMenuInWindowWithNumber:(int)windowNumber; +// Makes the toolbar visible by swiping downward, if necessary. Then long- +// presses on the New Tab menu button. At least one tab needs to be open and +// visible when calling this method. +- (void)openNewTabMenu; + // Scrolls to find the button in the Tools menu with the corresponding // |buttonMatcher|, and then taps it. If |buttonMatcher| is not found, or // the Tools menu is not open when this is called there will be a GREYAssert.
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm index d2e46e3..089763d0 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
@@ -126,6 +126,19 @@ [self tapToolsMenuButton:SettingsMenuButton()]; } +- (void)openNewTabMenu { + // TODO(crbug.com/639524): Add logic to ensure the app is in the correct + // state, for example DCHECK if no tabs are displayed. + [[[EarlGrey + selectElementWithMatcher:grey_allOf(chrome_test_util::NewTabButton(), + grey_sufficientlyVisible(), nil)] + usingSearchAction:grey_swipeSlowInDirection(kGREYDirectionDown) + onElementWithMatcher:chrome_test_util::WebStateScrollViewMatcher()] + performAction:grey_longPress()]; + // TODO(crbug.com/639517): Add webViewScrollView matcher so we don't have + // to always find it. +} + - (void)tapToolsMenuButton:(id<GREYMatcher>)buttonMatcher { ScopedDisableTimerTracking disabler; id<GREYMatcher> interactableSettingsButton =
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.h b/ios/chrome/test/earl_grey/chrome_matchers.h index 0ab8b4a..02ae426b 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers.h +++ b/ios/chrome/test/earl_grey/chrome_matchers.h
@@ -132,6 +132,9 @@ // Matcher for Tools menu button. id<GREYMatcher> ToolsMenuButton(); +// Matcher for the New Tab button, which can be long-pressed for a menu. +id<GREYMatcher> NewTabButton(); + // Matcher for the Share menu button. id<GREYMatcher> ShareButton(); @@ -340,6 +343,12 @@ // Returns matcher for the NTP view when the user is in incognito mode. id<GREYMatcher> NTPIncognitoView(); +// Returns matcher for the NTP Feed menu button which enables the feed. +id<GREYMatcher> NTPFeedMenuEnableButton(); + +// Returns matcher for the NTP Feed menu button which disables the feed. +id<GREYMatcher> NTPFeedMenuDisableButton(); + // Returns matcher for the warning message while filling in payment requests. id<GREYMatcher> WarningMessageView();
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm index 2c2c61a..35858632 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers.mm +++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -170,6 +170,10 @@ return [ChromeMatchersAppInterface toolsMenuButton]; } +id<GREYMatcher> NewTabButton() { + return [ChromeMatchersAppInterface openNewTabButton]; +} + id<GREYMatcher> ShareButton() { return [ChromeMatchersAppInterface shareButton]; } @@ -431,6 +435,14 @@ return [ChromeMatchersAppInterface ntpIncognitoView]; } +id<GREYMatcher> NTPFeedMenuEnableButton() { + return [ChromeMatchersAppInterface ntpFeedMenuEnableButton]; +} + +id<GREYMatcher> NTPFeedMenuDisableButton() { + return [ChromeMatchersAppInterface ntpFeedMenuDisableButton]; +} + id<GREYMatcher> WarningMessageView() { return [ChromeMatchersAppInterface warningMessageView]; }
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h index c4f9861..be81626c 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h +++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h
@@ -125,6 +125,11 @@ // Matcher for Tools menu button. + (id<GREYMatcher>)toolsMenuButton; +// Matcher for the New Tab button, which can be long-pressed for a menu. +// (This method can't be named +newTabButton, because starting a class method +// with 'new' implicitly treats it as a constructor). ++ (id<GREYMatcher>)openNewTabButton; + // Matcher for the Share... button. + (id<GREYMatcher>)shareButton; @@ -334,6 +339,12 @@ // Returns matcher for the NTP view when the user is in incognito mode. + (id<GREYMatcher>)ntpIncognitoView; +// Returns matcher for the NTP Feed menu button which enables the feed. ++ (id<GREYMatcher>)ntpFeedMenuEnableButton; + +// Returns matcher for the NTP Feed menu button which disables the feed. ++ (id<GREYMatcher>)ntpFeedMenuDisableButton; + // Returns matcher for the warning message while filling in payment requests. + (id<GREYMatcher>)warningMessageView;
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm index 550913a93..f574939 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm +++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
@@ -369,6 +369,13 @@ grey_sufficientlyVisible(), nil); } ++ (id<GREYMatcher>)openNewTabButton { + return grey_allOf( + [ChromeMatchersAppInterface + buttonWithAccessibilityLabelID:(IDS_IOS_TOOLS_MENU_NEW_TAB)], + grey_sufficientlyVisible(), nil); +} + + (id<GREYMatcher>)shareButton { return grey_allOf( [ChromeMatchersAppInterface @@ -714,6 +721,16 @@ return grey_accessibilityID(kNTPIncognitoViewIdentifier); } ++ (id<GREYMatcher>)ntpFeedMenuEnableButton { + return [ChromeMatchersAppInterface + buttonWithAccessibilityLabelID:IDS_IOS_DISCOVER_FEED_MENU_TURN_ON_ITEM]; +} + ++ (id<GREYMatcher>)ntpFeedMenuDisableButton { + return [ChromeMatchersAppInterface + buttonWithAccessibilityLabelID:IDS_IOS_DISCOVER_FEED_MENU_TURN_OFF_ITEM]; +} + // TODO(crbug.com/1021752): Remove this stub. + (id<GREYMatcher>)warningMessageView { return nil;
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index 0aab3d6..e37bfd6d 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -fc0b3f812abb8d7f5e6af171a420151aebf26a8d \ No newline at end of file +7307796b72b72f06e8de6c71a386cf65eeb42399 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index f2ed95b8..cc84481 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -7d551a58577125b31fe4ed58616fe61ae95fccf7 \ No newline at end of file +0dd57f5e63ed5c69891329e8498187adb20dbc9f \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index 46780d5..3d9f829 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -4de7f880fa8466140471226943e391d675986000 \ No newline at end of file +509f3f81735ec46dc036c0ba7e569a00cb08862b \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index 3f6f60b4..d65029d 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -a93b48bd11ebc032b3bbca334c5ad4a0f598a909 \ No newline at end of file +8cbae978098ec97ce3efefa1f35412293f703871 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 index f1a9be0c..3b5849ff 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -3c4234422fe56bff1a64b1afa56efaad7daffccb \ No newline at end of file +68c3bd45fa5474f5519e8334c4ec656e73368f88 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 index 0dc3d5d..94aafa76 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -05fd113b02392f06219659b1d6f2bdd2914f47e1 \ No newline at end of file +a1a9d3b162ff9f50f54de4c82b30acd7236e5939 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index 56c42faa..c726f58 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -5f10fb7df8f746b67f7d694079fcd12a85457c93 \ No newline at end of file +7d87f9e5188a67a6c0c70074066800945bdc5ba9 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index 89132a8..ad037792 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -f2663d1ddc17bc344ebee2652df0bffaa7feca46 \ No newline at end of file +f0a9dbf1afee22115461feb7486b8614b1446f79 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index 9ba4708..b4af616 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -af24bb41746ceff2d0f1f2d2314678cf051dca1e \ No newline at end of file +3e368cf76f6f76b7648eb2c5c0431aecf69a4fcc \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index 2552cfb9..88e73b9 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -8556f00cc6c5698a64af6678069180ed413ed361 \ No newline at end of file +2283d78578c82e313cd272ba96ff39acac06c987 \ No newline at end of file
diff --git a/ios/web_view/internal/web_view_web_main_parts.mm b/ios/web_view/internal/web_view_web_main_parts.mm index 65b74940..f715fc7 100644 --- a/ios/web_view/internal/web_view_web_main_parts.mm +++ b/ios/web_view/internal/web_view_web_main_parts.mm
@@ -59,7 +59,6 @@ std::string enable_features = base::JoinString( { autofill::features::kAutofillUpstream.name, - autofill::features::kAutofillEnableAccountWalletStorage.name, password_manager::features::kEnablePasswordsAccountStorage.name, switches::kSyncTrustedVaultPassphraseiOSRPC.name, switches::kSyncTrustedVaultPassphraseRecovery.name,
diff --git a/ipc/ipc_channel.cc b/ipc/ipc_channel.cc index 284d79b..8a37ba5 100644 --- a/ipc/ipc_channel.cc +++ b/ipc/ipc_channel.cc
@@ -35,13 +35,7 @@ // the creator, an identifier for the child instance, and a strong random // component. The strong random component prevents other processes from // hijacking or squatting on predictable channel names. -#if defined(OS_NACL_NONSFI) - // The seccomp sandbox disallows use of getpid(), so we provide a - // dummy PID. - int process_id = -1; -#else int process_id = base::GetCurrentProcId(); -#endif return base::StringPrintf("%d.%u.%d", process_id, g_last_id.GetNext(),
diff --git a/media/base/audio_processing.h b/media/base/audio_processing.h index 3e2f62b3..7113736e 100644 --- a/media/base/audio_processing.h +++ b/media/base/audio_processing.h
@@ -31,7 +31,7 @@ bool multi_channel_capture_processing = true; bool stereo_mirroring = false; - // TODO(https://crbug.com/1215061): Deprecate this setting. + // TODO(https://crbug.com/1269723): Deprecate this setting. // This flag preserves the behavior of the to-be-deprecated flag / constraint // |AudioProcessingProperties::goog_experimental_echo_cancellation|: It has no // effect on what effects are enabled, but for legacy reasons, it forces APM
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index 47eb87a0..23102a3 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc
@@ -408,11 +408,6 @@ const base::Feature kGlobalMediaControlsAutoDismiss{ "GlobalMediaControlsAutoDismiss", base::FEATURE_ENABLED_BY_DEFAULT}; -// Show Cast sessions in Global Media Controls. It is no-op if -// kGlobalMediaControls is not enabled. -const base::Feature kGlobalMediaControlsForCast{ - "GlobalMediaControlsForCast", base::FEATURE_ENABLED_BY_DEFAULT}; - // Allow Global Media Controls in system tray of CrOS. const base::Feature kGlobalMediaControlsForChromeOS{ "GlobalMediaControlsForChromeOS", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/media/base/media_switches.h b/media/base/media_switches.h index 36cd239..2136dce 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h
@@ -136,7 +136,6 @@ MEDIA_EXPORT extern const base::Feature kGav1VideoDecoder; MEDIA_EXPORT extern const base::Feature kGlobalMediaControls; MEDIA_EXPORT extern const base::Feature kGlobalMediaControlsAutoDismiss; -MEDIA_EXPORT extern const base::Feature kGlobalMediaControlsForCast; MEDIA_EXPORT extern const base::Feature kGlobalMediaControlsForChromeOS; MEDIA_EXPORT extern const base::Feature kGlobalMediaControlsPictureInPicture; MEDIA_EXPORT extern const base::Feature kGlobalMediaControlsSeamlessTransfer; @@ -209,7 +208,6 @@ MEDIA_EXPORT extern const base::Feature kForceHardwareVideoDecoders; MEDIA_EXPORT extern const base::Feature kForceHardwareAudioDecoders; - #if defined(OS_ANDROID) MEDIA_EXPORT extern const base::Feature kAllowNonSecureOverlays; MEDIA_EXPORT extern const base::Feature kMediaControlsExpandGesture;
diff --git a/media/gpu/chromeos/platform_video_frame_utils.cc b/media/gpu/chromeos/platform_video_frame_utils.cc index 4936475..ccddf60 100644 --- a/media/gpu/chromeos/platform_video_frame_utils.cc +++ b/media/gpu/chromeos/platform_video_frame_utils.cc
@@ -30,6 +30,7 @@ #include "media/base/video_util.h" #include "media/gpu/buffer_validation.h" #include "media/gpu/macros.h" +#include "ui/gfx/buffer_format_util.h" #include "ui/gfx/buffer_types.h" #include "ui/gfx/gpu_memory_buffer.h" #include "ui/gfx/linux/drm_util_linux.h" @@ -90,6 +91,20 @@ return gmb_handle; } + std::unique_ptr<ui::GbmBuffer> ImportGpuMemoryBuffer( + gfx::BufferFormat format, + const gfx::Size& size, + gfx::NativePixmapHandle handle) { + base::AutoLock lock(lock_); + if (!gbm_device_) + return nullptr; + const int fourcc_format = ui::GetFourCCFormatFromBufferFormat(format); + if (fourcc_format == DRM_FORMAT_INVALID) + return nullptr; + return gbm_device_->CreateBufferFromHandle(fourcc_format, size, + std::move(handle)); + } + private: GbmDeviceWrapper() { constexpr char kRenderNodeFilePattern[] = "/dev/dri/renderD%d"; @@ -363,4 +378,32 @@ return native_pixmap; } +bool CanImportGpuMemoryBufferHandle( + const gfx::Size& size, + gfx::BufferFormat format, + const gfx::GpuMemoryBufferHandle& gmb_handle) { + if (gmb_handle.type != gfx::GpuMemoryBufferType::NATIVE_PIXMAP) { + VLOGF(1) << "The handle type (" << gmb_handle.type << ") is unsupported"; + return false; + } + const auto pixel_format = GfxBufferFormatToVideoPixelFormat(format); + if (!pixel_format) { + VLOGF(1) << "Unsupported buffer format: " + << gfx::BufferFormatToString(format); + return false; + } + if (!VerifyGpuMemoryBufferHandle(*pixel_format, size, gmb_handle)) { + VLOGF(1) << "Invalid GpuMemoryBufferHandle provided"; + return false; + } + gfx::NativePixmapHandle native_pixmap_handle = + gfx::CloneHandleForIPC(gmb_handle.native_pixmap_handle); + if (native_pixmap_handle.planes.empty()) { + VLOGF(1) << "Could not duplicate the NativePixmapHandle"; + return false; + } + return !!GbmDeviceWrapper::Get()->ImportGpuMemoryBuffer( + format, size, std::move(native_pixmap_handle)); +} + } // namespace media
diff --git a/media/gpu/chromeos/platform_video_frame_utils.h b/media/gpu/chromeos/platform_video_frame_utils.h index 11cdb11..89833bb 100644 --- a/media/gpu/chromeos/platform_video_frame_utils.h +++ b/media/gpu/chromeos/platform_video_frame_utils.h
@@ -84,6 +84,13 @@ MEDIA_GPU_EXPORT scoped_refptr<gfx::NativePixmapDmaBuf> CreateNativePixmapDmaBuf(const VideoFrame* video_frame); +// Returns true if |gmb_handle| can be imported into minigbm and false +// otherwise. +bool CanImportGpuMemoryBufferHandle( + const gfx::Size& size, + gfx::BufferFormat format, + const gfx::GpuMemoryBufferHandle& gmb_handle); + } // namespace media #endif // MEDIA_GPU_CHROMEOS_PLATFORM_VIDEO_FRAME_UTILS_H_
diff --git a/media/gpu/chromeos/video_decoder_pipeline_unittest.cc b/media/gpu/chromeos/video_decoder_pipeline_unittest.cc index f0e69465..87514407 100644 --- a/media/gpu/chromeos/video_decoder_pipeline_unittest.cc +++ b/media/gpu/chromeos/video_decoder_pipeline_unittest.cc
@@ -105,6 +105,7 @@ const std::vector<uint8_t>&, chromeos::ChromeOsCdmContext::GetHwKeyDataCB)); MOCK_METHOD0(GetCdmContextRef, std::unique_ptr<CdmContextRef>()); + MOCK_CONST_METHOD0(UsingArcCdm, bool()); }; // A real implementation of this class would actually hold onto a reference of // the owner of the CdmContext to ensure it is not destructed before the
diff --git a/media/gpu/sandbox/BUILD.gn b/media/gpu/sandbox/BUILD.gn new file mode 100644 index 0000000..6dd29f38e --- /dev/null +++ b/media/gpu/sandbox/BUILD.gn
@@ -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. + +import("//build/config/chromeos/ui_mode.gni") +import("//media/gpu/args.gni") + +assert(is_chromeos_ash) + +source_set("sandbox") { + sources = [ + "hardware_video_decoding_sandbox_hook_linux.cc", + "hardware_video_decoding_sandbox_hook_linux.h", + ] + deps = [ + "//base", + "//media/gpu:buildflags", + "//sandbox/policy:policy", + ] + if (use_vaapi) { + deps += [ "//media/gpu/vaapi:common" ] + } +}
diff --git a/media/gpu/sandbox/DEPS b/media/gpu/sandbox/DEPS new file mode 100644 index 0000000..e6b9ce2 --- /dev/null +++ b/media/gpu/sandbox/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+sandbox/policy/linux", +]
diff --git a/media/gpu/sandbox/OWNERS b/media/gpu/sandbox/OWNERS new file mode 100644 index 0000000..70554b2 --- /dev/null +++ b/media/gpu/sandbox/OWNERS
@@ -0,0 +1,2 @@ +set noparent +file://sandbox/OWNERS
diff --git a/media/gpu/sandbox/hardware_video_decoding_sandbox_hook_linux.cc b/media/gpu/sandbox/hardware_video_decoding_sandbox_hook_linux.cc new file mode 100644 index 0000000..709f63e --- /dev/null +++ b/media/gpu/sandbox/hardware_video_decoding_sandbox_hook_linux.cc
@@ -0,0 +1,78 @@ +// 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 "media/gpu/sandbox/hardware_video_decoding_sandbox_hook_linux.h" + +#include <dlfcn.h> + +#include "media/gpu/buildflags.h" + +#if BUILDFLAG(USE_VAAPI) +#include "media/gpu/vaapi/vaapi_wrapper.h" +#endif + +using sandbox::syscall_broker::BrokerFilePermission; + +namespace media { + +bool HardwareVideoDecodingPreSandboxHook( + sandbox::policy::SandboxLinux::Options options) { + sandbox::syscall_broker::BrokerCommandSet command_set; + std::vector<BrokerFilePermission> permissions; + +#if BUILDFLAG(USE_V4L2_CODEC) + command_set.set(sandbox::syscall_broker::COMMAND_OPEN); + + // Device nodes for V4L2 video decode accelerator drivers. + // We do not use a FileEnumerator because the device files may not exist + // yet when the sandbox is created. But since we are restricting access + // to the video-dec* and media-dec* prefixes we know that we cannot + // authorize a non-decoder device by accident. + static constexpr size_t MAX_V4L2_DECODERS = 5; + static const base::FilePath::CharType kDevicePath[] = + FILE_PATH_LITERAL("/dev/"); + static const base::FilePath::CharType kVideoDecBase[] = "video-dec"; + static const base::FilePath::CharType kMediaDecBase[] = "media-dec"; + for (size_t i = 0; i < MAX_V4L2_DECODERS; i++) { + std::ostringstream decoderPath; + decoderPath << kDevicePath << kVideoDecBase << i; + permissions.push_back(BrokerFilePermission::ReadWrite(decoderPath.str())); + + std::ostringstream mediaDevicePath; + mediaDevicePath << kDevicePath << kMediaDecBase << i; + permissions.push_back( + BrokerFilePermission::ReadWrite(mediaDevicePath.str())); + } + + // Image processor used on ARM platforms. + // TODO(b/195769334): not all V4L2 platforms need an image processor for video + // decoding. Look into whether we can restrict this permission to only + // platforms that need it. + static const char kDevImageProc0Path[] = "/dev/image-proc0"; + permissions.push_back(BrokerFilePermission::ReadWrite(kDevImageProc0Path)); +#endif // BUILDFLAG(USE_V4L2_CODEC) + + sandbox::policy::SandboxLinux::GetInstance()->StartBrokerProcess( + command_set, permissions, sandbox::policy::SandboxLinux::PreSandboxHook(), + options); + + // TODO(b/195769334): the hardware video decoding sandbox is really only + // useful when building with VA-API or V4L2 (otherwise, we're not really doing + // hardware video decoding). Consider restricting the kHardwareVideoDecoding + // sandbox type to exist only in those configurations so that the presandbox + // hook is only reached in those scenarios. As it is now, + // kHardwareVideoDecoding exists for all ash-chrome builds because + // chrome/browser/ash/arc/video/gpu_arc_video_service_host.cc depends on it + // and that file is built for ash-chrome regardless of VA-API/V4L2. That means + // that bots like linux-chromeos-rel end up reaching this presandbox hook. +#if BUILDFLAG(USE_VAAPI) + VaapiWrapper::PreSandboxInitialization(); +#elif BUILDFLAG(USE_V4L2_CODEC) + dlopen("/usr/lib/libv4l2.so", RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE); +#endif // BUILDFLAG(USE_VAAPI) + + return true; +} + +} // namespace media
diff --git a/media/gpu/sandbox/hardware_video_decoding_sandbox_hook_linux.h b/media/gpu/sandbox/hardware_video_decoding_sandbox_hook_linux.h new file mode 100644 index 0000000..332c02e --- /dev/null +++ b/media/gpu/sandbox/hardware_video_decoding_sandbox_hook_linux.h
@@ -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. + +#ifndef MEDIA_GPU_SANDBOX_HARDWARE_VIDEO_DECODING_SANDBOX_HOOK_LINUX_H_ +#define MEDIA_GPU_SANDBOX_HARDWARE_VIDEO_DECODING_SANDBOX_HOOK_LINUX_H_ + +#include "sandbox/policy/linux/sandbox_linux.h" + +namespace media { + +bool HardwareVideoDecodingPreSandboxHook( + sandbox::policy::SandboxLinux::Options options); + +} // namespace media + +#endif // MEDIA_GPU_SANDBOX_HARDWARE_VIDEO_DECODING_SANDBOX_HOOK_LINUX_H_
diff --git a/media/gpu/v4l2/test/v4l2_ioctl_shim.cc b/media/gpu/v4l2/test/v4l2_ioctl_shim.cc index e8e2e494..861e22ca 100644 --- a/media/gpu/v4l2/test/v4l2_ioctl_shim.cc +++ b/media/gpu/v4l2/test/v4l2_ioctl_shim.cc
@@ -20,6 +20,9 @@ namespace v4l2_test { constexpr int kIoctlOk = 0; +// |kMaxRetryCount = 2^24| takes around 20 seconds to exhaust all retries on +// Trogdor when a decode stalls. +constexpr int kMaxRetryCount = 1 << 24; // TODO(stevecho): this might need to be changed for other platforms. static const base::FilePath kDecodeDevice("/dev/video-dec0"); @@ -42,6 +45,7 @@ V4L2_REQUEST_CODE_AND_STRING(VIDIOC_REQBUFS), V4L2_REQUEST_CODE_AND_STRING(VIDIOC_QUERYBUF), V4L2_REQUEST_CODE_AND_STRING(VIDIOC_QBUF), + V4L2_REQUEST_CODE_AND_STRING(VIDIOC_DQBUF), V4L2_REQUEST_CODE_AND_STRING(VIDIOC_STREAMON), V4L2_REQUEST_CODE_AND_STRING(VIDIOC_S_EXT_CTRLS), V4L2_REQUEST_CODE_AND_STRING(MEDIA_IOC_REQUEST_ALLOC), @@ -79,9 +83,12 @@ // Logs whether given ioctl request |request_code| succeeded // or failed given |ret|. void LogIoctlResult(int ret, int request_code) { - PLOG_IF(ERROR, ret != kIoctlOk) + PLOG_IF(ERROR, ret != kIoctlOk && errno != EAGAIN) << "Ioctl request failed for " << V4L2RequestCodeToString(request_code) << "."; + PLOG_IF(INFO, ret != kIoctlOk && errno == EAGAIN) + << "Ioctl request failed for " << V4L2RequestCodeToString(request_code) + << "with error code EAGAIN."; VLOG_IF(4, ret == kIoctlOk) << V4L2RequestCodeToString(request_code) << " succeeded."; } @@ -212,7 +219,8 @@ template <> bool V4L2IoctlShim::Ioctl(int request_code, struct v4l2_buffer* buffer) const { DCHECK(request_code == static_cast<int>(VIDIOC_QUERYBUF) || - request_code == static_cast<int>(VIDIOC_QBUF)); + request_code == static_cast<int>(VIDIOC_QBUF) || + request_code == static_cast<int>(VIDIOC_DQBUF)); LOG_ASSERT(buffer != nullptr) << "|buffer| check failed."; const int ret = ioctl(decode_fd_.GetPlatformFile(), request_code, buffer); @@ -382,6 +390,56 @@ return Ioctl(VIDIOC_QBUF, &v4l2_buffer); } +bool V4L2IoctlShim::DQBuf(const std::unique_ptr<V4L2Queue>& queue, + uint32_t* index) const { + LOG_ASSERT(queue->memory() == V4L2_MEMORY_MMAP) + << "Only V4L2_MEMORY_MMAP is currently supported."; + + struct v4l2_buffer v4l2_buffer; + std::vector<v4l2_plane> planes(VIDEO_MAX_PLANES); + + memset(&v4l2_buffer, 0, sizeof v4l2_buffer); + v4l2_buffer.type = queue->type(); + v4l2_buffer.memory = queue->memory(); + v4l2_buffer.m.planes = planes.data(); + v4l2_buffer.length = queue->num_planes(); + + if (queue->type() == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { + // If no buffers have been dequeued for more than |kMaxRetryCount| retries, + // we should exit the program. Something is wrong in the decoder or with + // how we are controlling it. + int num_tries = kMaxRetryCount; + + while ((num_tries != 0) && !Ioctl(VIDIOC_DQBUF, &v4l2_buffer)) { + if (errno != EAGAIN) + return false; + + num_tries--; + } + + if (num_tries == 0) { + LOG(ERROR) + << "Decoder appeared to stall. VIDIOC_DQBUF ioctl call timed out."; + return false; + } else { + // Successfully dequeued a buffer. Reset the |num_tries| counter. + num_tries = kMaxRetryCount; + } + + if (index) + *index = v4l2_buffer.index; + + return true; + } + + DCHECK_EQ(queue->type(), V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); + + // Currently, only 1 OUTPUT buffer is used. + *index = 0; + + return Ioctl(VIDIOC_DQBUF, &v4l2_buffer); +} + bool V4L2IoctlShim::StreamOn(const enum v4l2_buf_type type) const { int arg = static_cast<int>(type);
diff --git a/media/gpu/v4l2/test/v4l2_ioctl_shim.h b/media/gpu/v4l2/test/v4l2_ioctl_shim.h index 0ac9383..4ce56c2 100644 --- a/media/gpu/v4l2/test/v4l2_ioctl_shim.h +++ b/media/gpu/v4l2/test/v4l2_ioctl_shim.h
@@ -151,6 +151,11 @@ bool QBuf(const std::unique_ptr<V4L2Queue>& queue, const uint32_t index) const WARN_UNUSED_RESULT; + // Dequeues a filled (capturing) or decoded (output) buffer + // from the driver’s outgoing |queue|. + bool DQBuf(const std::unique_ptr<V4L2Queue>& queue, + uint32_t* index) const WARN_UNUSED_RESULT; + // Starts streaming |queue| (via VIDIOC_STREAMON). bool StreamOn(const enum v4l2_buf_type type) const WARN_UNUSED_RESULT;
diff --git a/media/gpu/v4l2/test/vp9_decoder.cc b/media/gpu/v4l2/test/vp9_decoder.cc index 829afa7..dd942f0c 100644 --- a/media/gpu/v4l2/test/vp9_decoder.cc +++ b/media/gpu/v4l2/test/vp9_decoder.cc
@@ -396,6 +396,19 @@ if (!v4l2_ioctl_->MediaRequestIocQueue(OUTPUT_queue_)) LOG(ERROR) << "MEDIA_REQUEST_IOC_QUEUE failed."; + uint32_t index; + + if (!v4l2_ioctl_->DQBuf(CAPTURE_queue_, &index)) + LOG(ERROR) << "VIDIOC_DQBUF failed for CAPTURE queue."; + + if (!v4l2_ioctl_->DQBuf(OUTPUT_queue_, &index)) + LOG(ERROR) << "VIDIOC_DQBUF failed for OUTPUT queue."; + + // TODO(stevecho): With current VP9 API, VIDIOC_G_EXT_CTRLS ioctl call is + // needed when forward probabilities update is used. With new VP9 API landing + // in kernel 5.17, VIDIOC_G_EXT_CTRLS ioctl call is no longer needed, see: + // https://lwn.net/Articles/855419/ + // TODO(stevecho): call RefreshReferenceSlots() once decoded buffer is ready. return Vp9Decoder::kOk;
diff --git a/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.cc b/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.cc index 7cd587e..c29fd670 100644 --- a/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.cc +++ b/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.cc
@@ -1609,15 +1609,27 @@ } memmove(dst_ptr + compressed_data_offset, dst_ptr, buffer_size); } else if (output_buffer_pixelformat_ == V4L2_PIX_FMT_JPEG) { - // Move data after SOI and APP0 marker for exif room. + // V4L2_PIX_FMT_JPEG refers to a valid JPEG bitstream. It does not + // imply a standard JFIF bitstream with JFIF-APP0 markers. + // Move data after SOI to make room for APP1 marker and EXIF data. + // If an APP0 marker is found directly after the SOI marker, skip + // over it. // The JPEG from V4L2_PIX_FMT_JPEG is - // SOI-APP0-DQT-marker1-marker2-...-markerN-compressed stream-EOI - // |......| <- src_data_offset = len(SOI) + len(APP0) + // SOI-marker1-marker2-...-SOS-compressed stream-EOI + // |......| <- src_data_offset = len(SOI) + len(APP0) (if APP0 found) // |...................| <- data_offset = len(SOI) + len(APP1) size_t data_offset = sizeof(kJpegStart) + sizeof(kAppSegment) + exif_buffer_size; - size_t app0_length = 2 + ((dst_ptr[4] << 16) | dst_ptr[5]); - size_t src_data_offset = sizeof(kJpegStart) + app0_length; + size_t src_data_offset = sizeof(kJpegStart); + // Check for APP0 segment following SOI marker and skip over it if found + if (dst_ptr[2] == JPEG_MARKER_PREFIX && dst_ptr[3] == JPEG_APP0) { + src_data_offset += 2 + ((dst_ptr[4] << 8) | dst_ptr[5]); + if (src_data_offset >= buffer_size) { + LOG(WARNING) + << "APP0 segment from encoder extends beyond JPEG buffer"; + return 0; + } + } buffer_size -= src_data_offset; if (buffer_size + data_offset > output_buffer_sizeimage_) { LOG(WARNING) << "JPEG buffer is too small for the EXIF metadata";
diff --git a/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc b/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc index 21a29b9..be4e2fd 100644 --- a/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc +++ b/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc
@@ -4,10 +4,15 @@ #include "media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.h" +#include "media/base/format_utils.h" +#include "media/gpu/buffer_validation.h" +#include "media/gpu/chromeos/platform_video_frame_utils.h" +#include "media/gpu/macros.h" #include "media/gpu/vaapi/va_surface.h" #include "media/gpu/vaapi/vaapi_status.h" #include "media/gpu/vaapi/vaapi_wrapper.h" #include "ui/gfx/gpu_memory_buffer.h" +#include "ui/gfx/linux/native_pixmap_dmabuf.h" #include "ui/gfx/native_pixmap.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_image_native_pixmap.h" @@ -117,6 +122,12 @@ gfx::GpuMemoryBufferHandle gpu_memory_buffer_handle) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!CanImportGpuMemoryBufferHandle(size_, format, + gpu_memory_buffer_handle)) { + VLOGF(1) << "Can't import the given GpuMemoryBufferHandle"; + return false; + } + const auto& plane = gpu_memory_buffer_handle.native_pixmap_handle.planes[0]; if (size_.width() > static_cast<int>(plane.stride) || size_.GetArea() > static_cast<int>(plane.size)) { @@ -126,19 +137,12 @@ return false; } - ui::OzonePlatform* platform = ui::OzonePlatform::GetInstance(); - ui::SurfaceFactoryOzone* factory = platform->GetSurfaceFactoryOzone(); - // CreateNativePixmapFromHandle() will take ownership of the handle. - auto pixmap = factory->CreateNativePixmapFromHandle( - gfx::kNullAcceleratedWidget, size_, format, - std::move(gpu_memory_buffer_handle.native_pixmap_handle)); - - if (!pixmap) { - LOG(ERROR) << "Failed creating a pixmap from a native handle"; - return false; - } - - return Initialize(std::move(pixmap)).is_ok(); + // gfx::NativePixmapDmaBuf() will take ownership of the handle. + return Initialize( + base::MakeRefCounted<gfx::NativePixmapDmaBuf>( + size_, format, + std::move(gpu_memory_buffer_handle.native_pixmap_handle))) + .is_ok(); } } // namespace media
diff --git a/media/webrtc/BUILD.gn b/media/webrtc/BUILD.gn index dcdf7c78..9b4da7c 100644 --- a/media/webrtc/BUILD.gn +++ b/media/webrtc/BUILD.gn
@@ -11,6 +11,8 @@ sources = [ "audio_delay_stats_reporter.cc", "audio_delay_stats_reporter.h", + "audio_processor.cc", + "audio_processor.h", "constants.h", "helpers.cc", "helpers.h", @@ -23,6 +25,7 @@ deps = [ "//base", "//build:chromecast_buildflags", + "//build:chromeos_buildflags", "//media", "//media:shared_memory_support", "//third_party/webrtc_overrides:webrtc_component", @@ -41,5 +44,8 @@ "//testing/gtest", "//third_party/webrtc_overrides:webrtc_component", ] - sources = [ "helpers_unittests.cc" ] + sources = [ + "audio_processor_test.cc", + "helpers_unittests.cc", + ] }
diff --git a/media/webrtc/audio_processor.cc b/media/webrtc/audio_processor.cc new file mode 100644 index 0000000..ccde078 --- /dev/null +++ b/media/webrtc/audio_processor.cc
@@ -0,0 +1,615 @@ +// 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 "media/webrtc/audio_processor.h" + +#include <stddef.h> +#include <stdint.h> + +#include <algorithm> +#include <array> +#include <limits> +#include <memory> +#include <utility> + +#include "base/feature_list.h" +#include "base/strings/stringprintf.h" +#include "base/task/thread_pool.h" +#include "base/trace_event/trace_event.h" +#include "build/build_config.h" +#include "build/chromecast_buildflags.h" +#include "build/chromeos_buildflags.h" +#include "media/base/audio_fifo.h" +#include "media/base/audio_parameters.h" +#include "media/base/channel_layout.h" +#include "media/base/limits.h" +#include "media/webrtc/constants.h" +#include "media/webrtc/helpers.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/webrtc/modules/audio_processing/include/audio_processing.h" +#include "third_party/webrtc_overrides/task_queue_factory.h" + +namespace media { + +namespace { + +constexpr int kBuffersPerSecond = 100; // 10 ms per buffer. + +// Creates a WebRTC audio processing module, if required by the processing +// settings. +rtc::scoped_refptr<webrtc::AudioProcessing> +MaybeCreateWebRtcAudioProcessingModule( + const AudioProcessingSettings& settings) { + // TODO(https://crbug.com/1269364): Share this logic with + // MediaStreamAudioProcessor::WouldModifyAudio(). +#if defined(OS_ANDROID) + const bool force_apm_creation = false; +#else + const bool force_apm_creation = settings.force_apm_creation; +#endif + + // Return immediately if none of the effects requiring webrtc::AudioProcessing + // are enabled. For example, the stereo mirroring effect is handled directly + // in the AudioProcessor implementation. + if (!settings.echo_cancellation && !force_apm_creation && + !settings.noise_suppression && !settings.high_pass_filter && + !settings.automatic_gain_control && + !settings.transient_noise_suppression) { + return nullptr; + } + + return media::CreateWebRtcAudioProcessingModule(settings); +} +} // namespace + +// Wraps AudioBus to provide access to the array of channel pointers, since this +// is the type webrtc::AudioProcessing deals in. The array is refreshed on every +// channel_ptrs() call, and will be valid until the underlying AudioBus pointers +// are changed, e.g. through calls to SetChannelData() or SwapChannels(). +// After construction, all methods are called on a single sequence. +class AudioProcessorCaptureBus { + public: + AudioProcessorCaptureBus(int channels, int frames) + : bus_(media::AudioBus::Create(channels, frames)), + channel_ptrs_(new float*[channels]) { + bus_->Zero(); + DETACH_FROM_SEQUENCE(sequence_checker_); + } + + media::AudioBus* bus() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return bus_.get(); + } + + float* const* channel_ptrs() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + for (int i = 0; i < bus_->channels(); ++i) { + channel_ptrs_[i] = bus_->channel(i); + } + return channel_ptrs_.get(); + } + + private: + SEQUENCE_CHECKER(sequence_checker_); + std::unique_ptr<media::AudioBus> bus_; + std::unique_ptr<float*[]> channel_ptrs_; +}; + +// Wraps AudioFifo to provide a cleaner interface to AudioProcessor. +// It avoids the FIFO when the source and destination frames match. If +// |source_channels| is larger than |destination_channels|, only the first +// |destination_channels| are kept from the source. +// After construction, all methods are called sequentially. +class AudioProcessorCaptureFifo { + public: + AudioProcessorCaptureFifo(int source_channels, + int destination_channels, + int source_frames, + int destination_frames, + int sample_rate) + : +#if DCHECK_IS_ON() + source_channels_(source_channels), + source_frames_(source_frames), +#endif + sample_rate_(sample_rate), + destination_( + std::make_unique<AudioProcessorCaptureBus>(destination_channels, + destination_frames)), + data_available_(false) { + DCHECK_GE(source_channels, destination_channels); + + if (source_channels > destination_channels) { + audio_source_intermediate_ = + media::AudioBus::CreateWrapper(destination_channels); + } + + if (source_frames != destination_frames) { + // Since we require every Push to be followed by as many Consumes as + // possible, twice the larger of the two is a (probably) loose upper bound + // on the FIFO size. + const int fifo_frames = 2 * std::max(source_frames, destination_frames); + fifo_ = + std::make_unique<media::AudioFifo>(destination_channels, fifo_frames); + } + + DETACH_FROM_SEQUENCE(sequence_checker_); + } + + void Push(const media::AudioBus& source, base::TimeDelta audio_delay) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); +#if DCHECK_IS_ON() + DCHECK_EQ(source.channels(), source_channels_); + DCHECK_EQ(source.frames(), source_frames_); +#endif + const media::AudioBus* source_to_push = &source; + + if (audio_source_intermediate_) { + for (int i = 0; i < destination_->bus()->channels(); ++i) { + audio_source_intermediate_->SetChannelData( + i, const_cast<float*>(source.channel(i))); + } + audio_source_intermediate_->set_frames(source.frames()); + source_to_push = audio_source_intermediate_.get(); + } + + if (fifo_) { + CHECK_LT(fifo_->frames(), destination_->bus()->frames()); + next_audio_delay_ = + audio_delay + fifo_->frames() * base::Seconds(1) / sample_rate_; + fifo_->Push(source_to_push); + } else { + CHECK(!data_available_); + source_to_push->CopyTo(destination_->bus()); + next_audio_delay_ = audio_delay; + data_available_ = true; + } + } + + // Returns true if there are destination_frames() of data available to be + // consumed, and otherwise false. + bool Consume(AudioProcessorCaptureBus** destination, + base::TimeDelta* audio_delay) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + if (fifo_) { + if (fifo_->frames() < destination_->bus()->frames()) + return false; + + fifo_->Consume(destination_->bus(), 0, destination_->bus()->frames()); + *audio_delay = next_audio_delay_; + next_audio_delay_ -= + destination_->bus()->frames() * base::Seconds(1) / sample_rate_; + } else { + if (!data_available_) + return false; + *audio_delay = next_audio_delay_; + // The data was already copied to |destination_| in this case. + data_available_ = false; + } + + *destination = destination_.get(); + return true; + } + + private: + SEQUENCE_CHECKER(sequence_checker_); +#if DCHECK_IS_ON() + const int source_channels_; + const int source_frames_; +#endif + const int sample_rate_; + std::unique_ptr<media::AudioBus> audio_source_intermediate_; + std::unique_ptr<AudioProcessorCaptureBus> destination_; + std::unique_ptr<media::AudioFifo> fifo_; + + // When using |fifo_|, this is the audio delay of the first sample to be + // consumed next from the FIFO. When not using |fifo_|, this is the audio + // delay of the first sample in |destination_|. + base::TimeDelta next_audio_delay_; + + // True when |destination_| contains the data to be returned by the next call + // to Consume(). Only used when the FIFO is disabled. + bool data_available_; +}; + +AudioProcessor::AudioProcessor( + DeliverProcessedAudioCallback deliver_processed_audio_callback, + LogCallback log_callback, + const AudioProcessingSettings& settings) + : settings_(settings), + webrtc_audio_processing_( + MaybeCreateWebRtcAudioProcessingModule(settings)), + log_callback_(std::move(log_callback)), + playout_delay_(base::TimeDelta()), + deliver_processed_audio_callback_( + std::move(deliver_processed_audio_callback)), + audio_delay_stats_reporter_(kBuffersPerSecond) { + DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); + DCHECK(deliver_processed_audio_callback_); + DCHECK(log_callback_); + SendLogMessage(base::StringPrintf( + "%s({multi_channel_capture_processing=%s})", __func__, + settings_.multi_channel_capture_processing ? "true" : "false")); +} + +AudioProcessor::~AudioProcessor() { + DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); + OnStopDump(); +} + +void AudioProcessor::OnCaptureFormatChanged( + const media::AudioParameters& input_format) { + DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); + InitializeCaptureFifo(input_format); +} + +void AudioProcessor::ProcessCapturedAudio(const media::AudioBus& audio_source, + base::TimeTicks audio_capture_time, + int num_preferred_channels, + double volume, + bool key_pressed) { + DCHECK(deliver_processed_audio_callback_); + // Sanity-check the input audio format in debug builds. + DCHECK(input_format_.IsValid()); + DCHECK_EQ(audio_source.channels(), input_format_.channels()); + DCHECK_EQ(audio_source.frames(), input_format_.frames_per_buffer()); + + base::TimeDelta capture_delay = base::TimeTicks::Now() - audio_capture_time; + TRACE_EVENT1("audio", "AudioProcessor::ProcessCapturedAudio", "delay (ms)", + capture_delay.InMillisecondsF()); + + capture_fifo_->Push(audio_source, capture_delay); + + // Process and consume the data in the FIFO until there is not enough + // data to process. + AudioProcessorCaptureBus* process_bus; + while (capture_fifo_->Consume(&process_bus, &capture_delay)) { + // Use the process bus directly if audio processing is disabled. + AudioProcessorCaptureBus* output_bus = process_bus; + absl::optional<double> new_volume; + if (webrtc_audio_processing_) { + output_bus = output_bus_.get(); + new_volume = + ProcessData(process_bus->channel_ptrs(), process_bus->bus()->frames(), + capture_delay, volume, key_pressed, + num_preferred_channels, output_bus->channel_ptrs()); + } + + // Swap channels before interleaving the data. + if (settings_.stereo_mirroring && + output_format_.channel_layout() == media::CHANNEL_LAYOUT_STEREO) { + // Swap the first and second channels. + output_bus->bus()->SwapChannels(0, 1); + } + + deliver_processed_audio_callback_.Run(*output_bus->bus(), + audio_capture_time, new_volume); + } +} + +const media::AudioParameters& AudioProcessor::OutputFormat() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); + return output_format_; +} + +bool AudioProcessor::RequiresPlayoutReference() const { + const bool effects_require_playout_reference = + settings_.echo_cancellation || settings_.automatic_gain_control; + if (effects_require_playout_reference) { + DCHECK(!!webrtc_audio_processing_); + } + return effects_require_playout_reference; +} + +void AudioProcessor::SetOutputWillBeMuted(bool muted) { + DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); + SendLogMessage( + base::StringPrintf("%s({muted=%s})", __func__, muted ? "true" : "false")); + if (webrtc_audio_processing_) { + webrtc_audio_processing_->set_output_will_be_muted(muted); + } +} + +void AudioProcessor::OnStartDump(base::File dump_file) { + DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); + DCHECK(dump_file.IsValid()); + + if (webrtc_audio_processing_) { + if (!worker_queue_) { + worker_queue_ = std::make_unique<rtc::TaskQueue>( + CreateWebRtcTaskQueue(rtc::TaskQueue::Priority::LOW)); + } + // Here tasks will be posted on the |worker_queue_|. It must be + // kept alive until media::StopEchoCancellationDump is called or the + // webrtc::AudioProcessing instance is destroyed. + media::StartEchoCancellationDump(webrtc_audio_processing_.get(), + std::move(dump_file), worker_queue_.get()); + } else { + // Post the file close to avoid blocking the control sequence. + base::ThreadPool::PostTask( + FROM_HERE, {base::TaskPriority::LOWEST, base::MayBlock()}, + base::BindOnce([](base::File) {}, std::move(dump_file))); + } +} + +void AudioProcessor::OnStopDump() { + DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); + if (!worker_queue_) + return; + if (webrtc_audio_processing_) + media::StopEchoCancellationDump(webrtc_audio_processing_.get()); + worker_queue_.reset(nullptr); +} + +void AudioProcessor::OnPlayoutData(media::AudioBus* audio_bus, + int sample_rate, + base::TimeDelta audio_delay) { + DCHECK_GE(audio_bus->channels(), 1); + DCHECK_LE(audio_bus->channels(), media::limits::kMaxChannels); + int frames_per_10_ms = sample_rate / 100; + if (audio_bus->frames() != frames_per_10_ms) { + if (unsupported_buffer_size_log_count_ < 10) { + LOG(ERROR) << "MSAP::OnPlayoutData: Unsupported audio buffer size " + << audio_bus->frames() << ", expected " << frames_per_10_ms; + ++unsupported_buffer_size_log_count_; + } + return; + } + + TRACE_EVENT1("audio", "AudioProcessor::OnPlayoutData", "delay (ms)", + audio_delay.InMillisecondsF()); + playout_delay_ = audio_delay; + + webrtc::StreamConfig input_stream_config(sample_rate, audio_bus->channels()); + // If the input audio appears to contain upmixed mono audio, then APM is only + // given the left channel. This reduces computational complexity and improves + // convergence of audio processing algorithms. + // TODO(crbug.com/1023337): Ensure correct channel count in input audio bus. + assume_upmixed_mono_playout_ = assume_upmixed_mono_playout_ && + LeftAndRightChannelsAreSymmetric(*audio_bus); + if (assume_upmixed_mono_playout_) { + input_stream_config.set_num_channels(1); + } + std::array<const float*, media::limits::kMaxChannels> input_ptrs; + for (int i = 0; i < static_cast<int>(input_stream_config.num_channels()); ++i) + input_ptrs[i] = audio_bus->channel(i); + + // TODO(ajm): Should AnalyzeReverseStream() account for the |audio_delay|? + const int apm_error = webrtc_audio_processing_->AnalyzeReverseStream( + input_ptrs.data(), input_stream_config); + if (apm_error != webrtc::AudioProcessing::kNoError && + apm_playout_error_code_log_count_ < 10) { + LOG(ERROR) << "MSAP::OnPlayoutData: AnalyzeReverseStream error=" + << apm_error; + ++apm_playout_error_code_log_count_; + } +} + +webrtc::AudioProcessingStats AudioProcessor::GetStats() { + DCHECK(webrtc_audio_processing_); + return webrtc_audio_processing_->GetStatistics(); +} + +// Called on the owning sequence. +void AudioProcessor::InitializeCaptureFifo( + const media::AudioParameters& input_format) { + DCHECK(input_format.IsValid()); + SendLogMessage( + base::StringPrintf("%s({input_format=[%s]})", __func__, + input_format.AsHumanReadableString().c_str())); + + input_format_ = input_format; + + // TODO(crbug/881275): For now, we assume fixed parameters for the output when + // audio processing is enabled, to match the previous behavior. We should + // either use the input parameters (in which case, audio processing will + // convert at output) or ideally, have a backchannel from the sink to know + // what format it would prefer. + const int output_sample_rate = + webrtc_audio_processing_ ? +#if BUILDFLAG(IS_CHROMECAST) + std::min(media::kAudioProcessingSampleRateHz, + input_format.sample_rate()) +#else + media::kAudioProcessingSampleRateHz +#endif // BUILDFLAG(IS_CHROMECAST) + : input_format.sample_rate(); + + // The output channels from the fifo is normally the same as input. + int fifo_output_channels = input_format.channels(); + + media::ChannelLayout output_channel_layout; + if (!webrtc_audio_processing_) { + if (input_format.channel_layout() == + media::CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC) { + // Special case for if we have a keyboard mic channel on the input and no + // audio processing is used. We will then have the fifo strip away that + // channel. So we use stereo as output layout, and also change the output + // channels for the fifo. + output_channel_layout = media::CHANNEL_LAYOUT_STEREO; + fifo_output_channels = ChannelLayoutToChannelCount(output_channel_layout); + } else { + output_channel_layout = input_format.channel_layout(); + } + } else if (settings_.multi_channel_capture_processing) { + // The number of output channels is equal to the number of input channels. + // If the media stream audio processor receives stereo input it will output + // stereo. To reduce computational complexity, APM will not perform full + // multichannel processing unless any sink requests more than one channel. + // If the input is multichannel but the sinks are not interested in more + // than one channel, APM will internally downmix the signal to mono and + // process it. The processed mono signal will then be upmixed to same number + // of channels as the input before leaving the media stream audio processor. + // If a sink later requests stereo, APM will start performing true stereo + // processing. There will be no need to change the output format. + + // The keyboard mic channel shall not be part of the output. + if (input_format.channel_layout() == + media::CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC) { + output_channel_layout = media::CHANNEL_LAYOUT_STEREO; + } else { + output_channel_layout = input_format.channel_layout(); + } + } else { + output_channel_layout = media::CHANNEL_LAYOUT_MONO; + } + + // webrtc::AudioProcessing requires a 10 ms chunk size. We use this native + // size when processing is enabled. When disabled we use the same size as + // the source if less than 10 ms. + // + // TODO(ajm): This conditional buffer size appears to be assuming knowledge of + // the sink based on the source parameters. PeerConnection sinks seem to want + // 10 ms chunks regardless, while WebAudio sinks want less, and we're assuming + // we can identify WebAudio sinks by the input chunk size. Less fragile would + // be to have the sink actually tell us how much it wants (as in the above + // todo). + int processing_frames = input_format.sample_rate() / 100; + int output_frames = output_sample_rate / 100; + if (!webrtc_audio_processing_ && + input_format.frames_per_buffer() < output_frames) { + processing_frames = input_format.frames_per_buffer(); + output_frames = processing_frames; + } + + output_format_ = media::AudioParameters( + media::AudioParameters::AUDIO_PCM_LOW_LATENCY, output_channel_layout, + output_sample_rate, output_frames); + if (output_channel_layout == media::CHANNEL_LAYOUT_DISCRETE) { + // Explicitly set number of channels for discrete channel layouts. + output_format_.set_channels_for_discrete(input_format.channels()); + } + SendLogMessage( + base::StringPrintf("%s => (output_format=[%s])", __func__, + output_format_.AsHumanReadableString().c_str())); + SendLogMessage(base::StringPrintf( + "%s => (FIFO: processing_frames=%d, output_channels=%d)", __func__, + processing_frames, fifo_output_channels)); + + capture_fifo_ = std::make_unique<AudioProcessorCaptureFifo>( + input_format.channels(), fifo_output_channels, + input_format.frames_per_buffer(), processing_frames, + input_format.sample_rate()); + + if (webrtc_audio_processing_) { + output_bus_ = std::make_unique<AudioProcessorCaptureBus>( + output_format_.channels(), output_frames); + } +} + +absl::optional<double> AudioProcessor::ProcessData( + const float* const* process_ptrs, + int process_frames, + base::TimeDelta capture_delay, + double volume, + bool key_pressed, + int num_preferred_channels, + float* const* output_ptrs) { + DCHECK(webrtc_audio_processing_); + + const base::TimeDelta playout_delay = playout_delay_; + + TRACE_EVENT2("audio", "AudioProcessor::ProcessData", "capture_delay (ms)", + capture_delay.InMillisecondsF(), "playout_delay (ms)", + playout_delay.InMillisecondsF()); + + const int64_t total_delay_ms = + (capture_delay + playout_delay).InMilliseconds(); + + if (total_delay_ms > 300 && large_delay_log_count_ < 10) { + LOG(WARNING) << "Large audio delay, capture delay: " + << capture_delay.InMillisecondsF() + << "ms; playout delay: " << playout_delay.InMillisecondsF() + << "ms"; + ++large_delay_log_count_; + } + + audio_delay_stats_reporter_.ReportDelay(capture_delay, playout_delay); + + webrtc::AudioProcessing* ap = webrtc_audio_processing_.get(); + DCHECK_LE(total_delay_ms, std::numeric_limits<int>::max()); + ap->set_stream_delay_ms(base::saturated_cast<int>(total_delay_ms)); + + // Keep track of the maximum number of preferred channels. The number of + // output channels of APM can increase if preferred by the sinks, but + // never decrease. + max_num_preferred_output_channels_ = + std::max(max_num_preferred_output_channels_, num_preferred_channels); + + // Upscale the volume to the range expected by the WebRTC automatic gain + // controller. +#if defined(OS_WIN) || defined(OS_MAC) + DCHECK_LE(volume, 1.0); +#elif defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || defined(OS_OPENBSD) + // We have a special situation on Linux where the microphone volume can be + // "higher than maximum". The input volume slider in the sound preference + // allows the user to set a scaling that is higher than 100%. It means that + // even if the reported maximum levels is N, the actual microphone level can + // go up to 1.5x*N and that corresponds to a normalized |volume| of 1.5x. + DCHECK_LE(volume, 1.6); +#endif + // Map incoming volume range of [0.0, 1.0] to [0, 255] used by AGC. + // The volume can be higher than 255 on Linux, and it will be cropped to + // 255 since AGC does not allow values out of range. + const int max_analog_gain_level = media::MaxWebRtcAnalogGainLevel(); + int current_analog_gain_level = + static_cast<int>((volume * max_analog_gain_level) + 0.5); + current_analog_gain_level = + std::min(current_analog_gain_level, max_analog_gain_level); + DCHECK_LE(current_analog_gain_level, max_analog_gain_level); + + ap->set_stream_analog_level(current_analog_gain_level); + ap->set_stream_key_pressed(key_pressed); + + // Depending on how many channels the sinks prefer, the number of APM output + // channels is allowed to vary between 1 and the number of channels of the + // output format. The output format in turn depends on the input format. + // Example: With a stereo mic the output format will have 2 channels, and APM + // will produce 1 or 2 output channels depending on the sinks. + int num_apm_output_channels = + std::min(max_num_preferred_output_channels_, output_format_.channels()); + + // Limit number of apm output channels to 2 to avoid potential problems with + // discrete channel mapping. + num_apm_output_channels = std::min(num_apm_output_channels, 2); + + CHECK_GE(num_apm_output_channels, 1); + const webrtc::StreamConfig apm_output_config = webrtc::StreamConfig( + output_format_.sample_rate(), num_apm_output_channels, false); + + int err = ap->ProcessStream(process_ptrs, CreateStreamConfig(input_format_), + apm_output_config, output_ptrs); + DCHECK_EQ(err, 0) << "ProcessStream() error: " << err; + + // Upmix if the number of channels processed by APM is less than the number + // specified in the output format. Channels above stereo will be set to zero. + if (num_apm_output_channels < output_format_.channels()) { + if (num_apm_output_channels == 1) { + // The right channel is a copy of the left channel. Remaining channels + // have already been set to zero at initialization. + memcpy(&output_ptrs[1][0], &output_ptrs[0][0], + output_format_.frames_per_buffer() * sizeof(output_ptrs[0][0])); + } + } + + // Return a new mic volume, if the volume has been changed. + const int recommended_analog_gain_level = + ap->recommended_stream_analog_level(); + if (recommended_analog_gain_level == current_analog_gain_level) { + return absl::nullopt; + } else { + return static_cast<double>(recommended_analog_gain_level) / + media::MaxWebRtcAnalogGainLevel(); + } +} + +// Called on the owning sequence. +void AudioProcessor::SendLogMessage(const std::string& message) { + log_callback_.Run(base::StringPrintf("MSAP::%s [this=0x%" PRIXPTR "]", + message.c_str(), + reinterpret_cast<uintptr_t>(this))); +} + +} // namespace media
diff --git a/media/webrtc/audio_processor.h b/media/webrtc/audio_processor.h new file mode 100644 index 0000000..22ed873 --- /dev/null +++ b/media/webrtc/audio_processor.h
@@ -0,0 +1,231 @@ +// 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 MEDIA_WEBRTC_AUDIO_PROCESSOR_H_ +#define MEDIA_WEBRTC_AUDIO_PROCESSOR_H_ + +#include <memory> + +#include "base/component_export.h" +#include "base/files/file.h" +#include "base/memory/scoped_refptr.h" +#include "base/sequence_checker.h" +#include "base/thread_annotations.h" +#include "base/time/time.h" +#include "media/base/audio_parameters.h" +#include "media/base/audio_processing.h" +#include "media/webrtc/audio_delay_stats_reporter.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/webrtc/modules/audio_processing/include/audio_processing.h" +#include "third_party/webrtc/modules/audio_processing/include/audio_processing_statistics.h" +#include "third_party/webrtc/rtc_base/task_queue.h" + +namespace media { +class AudioBus; +class AudioProcessorCaptureBus; +class AudioProcessorCaptureFifo; + +// This class applies audio processing effects such as echo cancellation and +// noise suppression to input capture audio (such as a microphone signal). +// Effects are applied based on configuration from AudioProcessingSettings, and +// mainly rely on an instance of the webrtc::AudioProcessing module (APM) owned +// by the AudioProcessor. +// +// The AudioProcessor can handle up to three threads (in practice, sequences): +// - An owning sequence, which performs construction, destruction, diagnostic +// recordings, and similar signals. +// - A capture thread, which calls ProcessCapturedAudio(). +// - A playout thread, which calls OnPlayoutData(). +// +// All member functions must be called on the owning sequence unless +// specifically documented otherwise. +// +// Thread-safe exceptions to this scheme are explicitly documented as such. +class COMPONENT_EXPORT(MEDIA_WEBRTC) AudioProcessor { + public: + // Callback for consuming processed capture audio. + // |audio_bus| contains the most recent processed capture audio. + // |new_volume| specifies a new microphone volume from the AGC. The new + // microphone volume range is [0.0, 1.0], and is only set if the microphone + // volume should be adjusted. + // Called on the capture thread. + using DeliverProcessedAudioCallback = + base::RepeatingCallback<void(const media::AudioBus& audio_bus, + base::TimeTicks audio_capture_time, + absl::optional<double> new_volume)>; + + using LogCallback = base::RepeatingCallback<void(const std::string&)>; + + // |deliver_processed_audio_callback| is used to deliver frames of processed + // capture audio, from ProcessCapturedAudio(), and has to be valid for as long + // as ProcessCapturedAudio() may be called. |log_callback| is used for logging + // messages on the owning sequence. + AudioProcessor(DeliverProcessedAudioCallback deliver_processed_audio_callback, + LogCallback log_callback, + const AudioProcessingSettings& settings); + + ~AudioProcessor(); + + AudioProcessor(const AudioProcessor&) = delete; + AudioProcessor& operator=(const AudioProcessor&) = delete; + + // Called when the format of the capture data has changed. + // The caller is responsible for stopping the capture processing before + // calling this method. + void OnCaptureFormatChanged(const media::AudioParameters& source_params); + + // Processes and delivers capture audio in chunks of <= 10 ms to + // |deliver_processed_audio_callback_|: Each call to ProcessCapturedAudio() + // method triggers zero or more calls to |deliver_processed_audio_callback_|, + // depending on internal FIFO size and content. |num_preferred_channels| is + // the highest number of channels that any sink is interested in. This can be + // different from the number of channels in the output format. A value of -1 + // means an unknown number. If |settings_.multi_channel_capture_processing| is + // true, the number of channels of the output of the Audio Processing Module + // (APM) will be equal to the highest observed value of num_preferred_channels + // as long as it does not exceed the number of channels of the output format. + // |volume| specifies the current microphone volume, in the range [0.0, 1.0]. + // Must be called on the capture thread. + void ProcessCapturedAudio(const media::AudioBus& audio_source, + base::TimeTicks audio_capture_time, + int num_preferred_channels, + double volume, + bool key_pressed); + + // Processes playout audio. |audio_bus| must contain |sample_rate/100| samples + // per channel. + // Must be called on the playout thread. + void OnPlayoutData(media::AudioBus* audio_bus, + int sample_rate, + base::TimeDelta audio_delay); + + // The format of the processed capture output audio from the processor. + // Is constant between calls to OnCaptureFormatChanged(). + const media::AudioParameters& OutputFormat() const; + + // Accessor to check if WebRTC audio processing is enabled or not. + bool has_webrtc_audio_processing() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); + return !!webrtc_audio_processing_; + } + + // Returns true if the audio processing effects require seeing the playout + // audio in order to function properly. + bool RequiresPlayoutReference() const; + + // Instructs the Audio Processing Module (APM) to reduce its complexity when + // |muted| is true. This mode is triggered when all audio tracks are disabled. + // The default APM complexity mode is restored by |muted| set to false. + void SetOutputWillBeMuted(bool muted); + + // Starts a new diagnostic audio recording (aecdump). If an aecdump recording + // is already ongoing, it is stopped before starting the new one. + void OnStartDump(base::File dump_file); + // Stops any ongoing aecdump. + void OnStopDump(); + + // Returns statistics from the WebRTC audio processing module. Requires that + // WebRTC audio processing is enabled. + // May be called on any thread. + webrtc::AudioProcessingStats GetStats(); + + absl::optional<webrtc::AudioProcessing::Config> + GetAudioProcessingModuleConfigForTesting() const { + if (webrtc_audio_processing_) { + return webrtc_audio_processing_->GetConfig(); + } + return absl::nullopt; + } + + // Format of input to ProcessCapturedAudio(). + const media::AudioParameters& GetInputFormatForTesting() const { + return input_format_; + } + + private: + friend class AudioProcessorTest; + + // Helper to initialize the capture converter. + void InitializeCaptureFifo(const media::AudioParameters& input_format) + VALID_CONTEXT_REQUIRED(owning_sequence_); + + // Called by ProcessCapturedAudio(). + // Returns the new microphone volume in the range of |0.0, 1.0], or unset if + // the volume should not be updated. + // |num_preferred_channels| is the highest number of channels that any sink is + // interested in. This can be different from the number of channels in the + // output format. A value of -1 means an unknown number. If + // |settings_.multi_channel_capture_processing| is true, the number of + // channels of the output of the Audio Processing Module (APM) will be equal + // to the highest observed value of num_preferred_channels as long as it does + // not exceed the number of channels of the output format. + // Called on the capture thread. + absl::optional<double> ProcessData(const float* const* process_ptrs, + int process_frames, + base::TimeDelta capture_delay, + double volume, + bool key_pressed, + int num_preferred_channels, + float* const* output_ptrs); + + void SendLogMessage(const std::string& message) + VALID_CONTEXT_REQUIRED(owning_sequence_); + + SEQUENCE_CHECKER(owning_sequence_); + + const AudioProcessingSettings settings_; + + // The WebRTC audio processing module (APM). Performs the bulk of the audio + // processing and resampling algorithms. + const rtc::scoped_refptr<webrtc::AudioProcessing> webrtc_audio_processing_; + + // Members accessed only by the owning sequence. + // Used by SendLogMessage. + const LogCallback log_callback_ GUARDED_BY_CONTEXT(owning_sequence_); + // Low-priority task queue for doing AEC dump recordings. It has to + // created/destroyed on the same sequence and it must outlive + // any aecdump recording in |webrtc_audio_processing_|. + std::unique_ptr<rtc::TaskQueue> worker_queue_ + GUARDED_BY_CONTEXT(owning_sequence_); + + // Cached value for the playout delay latency. Accessed on both capture and + // playout threads. + std::atomic<base::TimeDelta> playout_delay_; + + // These members are configured on the owning sequence while the capture + // thread is not running, and are used on the capture thread. + // FIFO to provide capture audio in chunks of up to 10 ms. + std::unique_ptr<AudioProcessorCaptureFifo> capture_fifo_; + // Receives APM processing output. + std::unique_ptr<AudioProcessorCaptureBus> output_bus_; + // Input and output formats for capture processing. + media::AudioParameters input_format_; + media::AudioParameters output_format_; + + // Members accessed only on the capture thread. + // Consumer of processed capture audio in ProcessCapturedAudio(). + const DeliverProcessedAudioCallback deliver_processed_audio_callback_; + // Observed maximum number of preferred output channels. Used for not + // performing audio processing on more channels than the sinks are interested + // in. The value is a maximum over time and can increase but never decrease. + // If |settings_.multi_channel_capture_processing| is true, Audio Processing + // Module (APM) will output max_num_preferred_output_channels_ channels as + // long as it does not exceed the number of channels of the output format. + int max_num_preferred_output_channels_ = 1; + // For reporting audio delay stats. + media::AudioDelayStatsReporter audio_delay_stats_reporter_; + + // Members accessed only on the playout thread. + // Indicates whether the audio processor playout signal has ever had + // asymmetric left and right channel content. + bool assume_upmixed_mono_playout_ = true; + // Counters to avoid excessively logging errors on a real-time thread. + size_t unsupported_buffer_size_log_count_ = 0; + size_t apm_playout_error_code_log_count_ = 0; + size_t large_delay_log_count_ = 0; +}; + +} // namespace media + +#endif // MEDIA_WEBRTC_AUDIO_PROCESSOR_H_
diff --git a/media/webrtc/audio_processor_test.cc b/media/webrtc/audio_processor_test.cc new file mode 100644 index 0000000..c6065cd8 --- /dev/null +++ b/media/webrtc/audio_processor_test.cc
@@ -0,0 +1,706 @@ +// 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 "media/webrtc/audio_processor.h" + +#include <stddef.h> +#include <stdint.h> + +#include <string> + +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" +#include "base/logging.h" +#include "base/memory/aligned_memory.h" +#include "base/path_service.h" +#include "base/test/mock_callback.h" +#include "base/test/task_environment.h" +#include "base/time/time.h" +#include "build/build_config.h" +#include "build/chromecast_buildflags.h" +#include "media/base/audio_bus.h" +#include "media/base/audio_parameters.h" +#include "media/base/audio_processing.h" +#include "media/webrtc/constants.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +using ::testing::_; +using ::testing::AnyNumber; +using ::testing::AtLeast; +using ::testing::Return; + +namespace media { +namespace { + +using MockProcessedCaptureCallback = + base::MockRepeatingCallback<void(const media::AudioBus& audio_bus, + base::TimeTicks audio_capture_time, + absl::optional<double> new_volume)>; + +AudioProcessor::LogCallback LogCallbackForTesting() { + return base::BindRepeating( + [](const std::string& message) { VLOG(1) << (message); }); +} + +// The number of packets used for testing. +const int kNumberOfPacketsForTest = 100; + +void ReadDataFromSpeechFile(char* data, int length) { + base::FilePath file; + CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &file)); + file = file.Append(FILE_PATH_LITERAL("media")) + .Append(FILE_PATH_LITERAL("test")) + .Append(FILE_PATH_LITERAL("data")) + .Append(FILE_PATH_LITERAL("speech_16b_stereo_48kHz.raw")); + DCHECK(base::PathExists(file)); + int64_t data_file_size64 = 0; + DCHECK(base::GetFileSize(file, &data_file_size64)); + EXPECT_EQ(length, base::ReadFile(file, data, length)); + DCHECK(data_file_size64 > length); +} + +void DisableDefaultSettings(AudioProcessingSettings& settings) { + settings.echo_cancellation = false; + settings.noise_suppression = false; + settings.transient_noise_suppression = false; + settings.automatic_gain_control = false; + settings.experimental_automatic_gain_control = false; + settings.high_pass_filter = false; + settings.multi_channel_capture_processing = false; + settings.stereo_mirroring = false; + settings.force_apm_creation = false; +} + +} // namespace + +class AudioProcessorTest : public ::testing::Test { + public: + AudioProcessorTest() + : params_(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, + media::CHANNEL_LAYOUT_STEREO, + 48000, + 480) {} + + protected: + // Helper method to save duplicated code. + static void ProcessDataAndVerifyFormat( + AudioProcessor& audio_processor, + MockProcessedCaptureCallback& mock_capture_callback, + int expected_output_sample_rate, + int expected_output_channels, + int expected_output_buffer_size) { + // Read the audio data from a file. + const media::AudioParameters& params = + audio_processor.GetInputFormatForTesting(); + const int packet_size = params.frames_per_buffer() * 2 * params.channels(); + const size_t length = packet_size * kNumberOfPacketsForTest; + std::unique_ptr<char[]> capture_data(new char[length]); + ReadDataFromSpeechFile(capture_data.get(), static_cast<int>(length)); + const int16_t* data_ptr = + reinterpret_cast<const int16_t*>(capture_data.get()); + std::unique_ptr<media::AudioBus> data_bus = + media::AudioBus::Create(params.channels(), params.frames_per_buffer()); + + // |data_bus_playout| is used if the capture channels include a keyboard + // channel. |data_bus_playout_to_use| points to the AudioBus to use, either + // |data_bus| or |data_bus_playout|. + std::unique_ptr<media::AudioBus> data_bus_playout; + media::AudioBus* data_bus_playout_to_use = data_bus.get(); + const bool has_keyboard_mic = params.channel_layout() == + media::CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC; + if (has_keyboard_mic) { + data_bus_playout = media::AudioBus::CreateWrapper(2); + data_bus_playout->set_frames(params.frames_per_buffer()); + data_bus_playout_to_use = data_bus_playout.get(); + } + + const base::TimeTicks input_capture_time = base::TimeTicks::Now(); + int num_preferred_channels = -1; + for (int i = 0; i < kNumberOfPacketsForTest; ++i) { + data_bus->FromInterleaved<media::SignedInt16SampleTypeTraits>( + data_ptr, data_bus->frames()); + + // 1. Provide playout audio, if echo cancellation is enabled. + const bool is_aec_enabled = + audio_processor.has_webrtc_audio_processing() && + (*audio_processor.GetAudioProcessingModuleConfigForTesting()) + .echo_canceller.enabled; + if (is_aec_enabled) { + if (has_keyboard_mic) { + for (int channel = 0; channel < data_bus_playout->channels(); + ++channel) { + data_bus_playout->SetChannelData( + channel, const_cast<float*>(data_bus->channel(channel))); + } + } + audio_processor.OnPlayoutData(data_bus_playout_to_use, + params.sample_rate(), + base::Milliseconds(10)); + } + + // 2. Set up expectations and process captured audio. + EXPECT_CALL(mock_capture_callback, Run(_, _, _)) + .WillRepeatedly([&](const media::AudioBus& processed_audio, + base::TimeTicks audio_capture_time, + absl::optional<double> new_volume) { + EXPECT_EQ(audio_capture_time, input_capture_time); + }); + audio_processor.ProcessCapturedAudio(*data_bus, input_capture_time, + num_preferred_channels, 1.0, false); + EXPECT_EQ(expected_output_sample_rate, + audio_processor.OutputFormat().sample_rate()); + EXPECT_EQ(expected_output_channels, + audio_processor.OutputFormat().channels()); + EXPECT_EQ(expected_output_buffer_size, + audio_processor.OutputFormat().frames_per_buffer()); + + data_ptr += params.frames_per_buffer() * params.channels(); + + // Test different values of num_preferred_channels. + if (++num_preferred_channels > 5) { + num_preferred_channels = 0; + } + } + } + + void VerifyDefaultComponents(AudioProcessor& audio_processor) { + EXPECT_TRUE(audio_processor.has_webrtc_audio_processing()); + const webrtc::AudioProcessing::Config config = + *audio_processor.GetAudioProcessingModuleConfigForTesting(); + EXPECT_TRUE(config.echo_canceller.enabled); + EXPECT_TRUE(config.gain_controller1.enabled); + EXPECT_TRUE(config.high_pass_filter.enabled); + EXPECT_TRUE(config.noise_suppression.enabled); + EXPECT_EQ(config.noise_suppression.level, config.noise_suppression.kHigh); + EXPECT_FALSE(config.voice_detection.enabled); + EXPECT_FALSE(config.gain_controller1.analog_gain_controller + .clipping_predictor.enabled); +#if defined(OS_ANDROID) + EXPECT_TRUE(config.echo_canceller.mobile_mode); + EXPECT_EQ(config.gain_controller1.mode, + config.gain_controller1.kFixedDigital); +#else + EXPECT_FALSE(config.echo_canceller.mobile_mode); + EXPECT_EQ(config.gain_controller1.mode, + config.gain_controller1.kAdaptiveAnalog); +#endif + } + + media::AudioParameters params_; + MockProcessedCaptureCallback mock_capture_callback_; + // Necessary for working with WebRTC task queues. + base::test::TaskEnvironment task_environment_; +}; + +class AudioProcessorTestMultichannel + : public AudioProcessorTest, + public ::testing::WithParamInterface<bool> {}; + +// Test crashing with ASAN on Android. crbug.com/468762 +#if defined(OS_ANDROID) && defined(ADDRESS_SANITIZER) +#define MAYBE_WithAudioProcessing DISABLED_WithAudioProcessing +#else +#define MAYBE_WithAudioProcessing WithAudioProcessing +#endif +TEST_P(AudioProcessorTestMultichannel, MAYBE_WithAudioProcessing) { + const bool use_multichannel_processing = GetParam(); + AudioProcessingSettings settings{.multi_channel_capture_processing = + use_multichannel_processing}; + AudioProcessor audio_processor(mock_capture_callback_.Get(), + LogCallbackForTesting(), settings); + EXPECT_TRUE(audio_processor.has_webrtc_audio_processing()); + audio_processor.OnCaptureFormatChanged(params_); + VerifyDefaultComponents(audio_processor); + + const int expected_output_channels = + use_multichannel_processing ? params_.channels() : 1; + ProcessDataAndVerifyFormat(audio_processor, mock_capture_callback_, + media::kAudioProcessingSampleRateHz, + expected_output_channels, + media::kAudioProcessingSampleRateHz / 100); +} + +TEST_F(AudioProcessorTest, TurnOffDefaultConstraints) { + AudioProcessingSettings settings; + // Turn off the default settings and pass it to AudioProcessor. + DisableDefaultSettings(settings); + AudioProcessor audio_processor(mock_capture_callback_.Get(), + LogCallbackForTesting(), settings); + EXPECT_FALSE(audio_processor.has_webrtc_audio_processing()); + audio_processor.OnCaptureFormatChanged(params_); + + ProcessDataAndVerifyFormat(audio_processor, mock_capture_callback_, + params_.sample_rate(), params_.channels(), + params_.sample_rate() / 100); +} + +// Test crashing with ASAN on Android. crbug.com/468762 +#if defined(OS_ANDROID) && defined(ADDRESS_SANITIZER) +#define MAYBE_TestAllSampleRates DISABLED_TestAllSampleRates +#else +#define MAYBE_TestAllSampleRates TestAllSampleRates +#endif +TEST_P(AudioProcessorTestMultichannel, MAYBE_TestAllSampleRates) { + const bool use_multichannel_processing = GetParam(); + AudioProcessingSettings settings{.multi_channel_capture_processing = + use_multichannel_processing}; + AudioProcessor audio_processor(mock_capture_callback_.Get(), + LogCallbackForTesting(), settings); + EXPECT_TRUE(audio_processor.has_webrtc_audio_processing()); + + static const int kSupportedSampleRates[] = { + 8000, + 16000, + 22050, + 32000, + 44100, + 48000 +#if BUILDFLAG(IS_CHROMECAST) + , + 96000 +#endif // BUILDFLAG(IS_CHROMECAST) + }; + for (int sample_rate : kSupportedSampleRates) { + SCOPED_TRACE(testing::Message() << "sample_rate=" << sample_rate); + int buffer_size = sample_rate / 100; + media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, + media::CHANNEL_LAYOUT_STEREO, sample_rate, + buffer_size); + audio_processor.OnCaptureFormatChanged(params); + VerifyDefaultComponents(audio_processor); + + int expected_sample_rate = +#if BUILDFLAG(IS_CHROMECAST) + std::min(sample_rate, media::kAudioProcessingSampleRateHz); +#else + media::kAudioProcessingSampleRateHz; +#endif // BUILDFLAG(IS_CHROMECAST) + const int expected_output_channels = + use_multichannel_processing ? params_.channels() : 1; + ProcessDataAndVerifyFormat(audio_processor, mock_capture_callback_, + expected_sample_rate, expected_output_channels, + expected_sample_rate / 100); + } +} + +TEST_F(AudioProcessorTest, StartStopAecDump) { + AudioProcessingSettings settings; + + base::ScopedTempDir temp_directory; + ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); + base::FilePath temp_file_path; + ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_directory.GetPath(), + &temp_file_path)); + { + AudioProcessor audio_processor(mock_capture_callback_.Get(), + LogCallbackForTesting(), settings); + + // Start and stop recording. + audio_processor.OnStartDump(base::File( + temp_file_path, base::File::FLAG_WRITE | base::File::FLAG_OPEN)); + audio_processor.OnStopDump(); + + // Start and stop a second recording. + audio_processor.OnStartDump(base::File( + temp_file_path, base::File::FLAG_WRITE | base::File::FLAG_OPEN)); + audio_processor.OnStopDump(); + } + + // Check that dump file is non-empty after audio processor has been + // destroyed. Note that this test fails when compiling WebRTC + // without protobuf support, rtc_enable_protobuf=false. + std::string output; + ASSERT_TRUE(base::ReadFileToString(temp_file_path, &output)); + EXPECT_FALSE(output.empty()); + // The temporary file is deleted when temp_directory exits scope. +} + +TEST_F(AudioProcessorTest, StartAecDumpDuringOngoingAecDump) { + AudioProcessingSettings settings; + + base::ScopedTempDir temp_directory; + ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); + base::FilePath temp_file_path_a; + ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_directory.GetPath(), + &temp_file_path_a)); + base::FilePath temp_file_path_b; + ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_directory.GetPath(), + &temp_file_path_b)); + { + AudioProcessor audio_processor(mock_capture_callback_.Get(), + LogCallbackForTesting(), settings); + + // Start a recording. + audio_processor.OnStartDump(base::File( + temp_file_path_a, base::File::FLAG_WRITE | base::File::FLAG_OPEN)); + + // Start another recording without stopping the previous one. + audio_processor.OnStartDump(base::File( + temp_file_path_b, base::File::FLAG_WRITE | base::File::FLAG_OPEN)); + audio_processor.OnStopDump(); + } + + // Check that dump files are non-empty after audio processor has been + // destroyed. Note that this test fails when compiling WebRTC + // without protobuf support, rtc_enable_protobuf=false. + std::string output; + ASSERT_TRUE(base::ReadFileToString(temp_file_path_a, &output)); + EXPECT_FALSE(output.empty()); + ASSERT_TRUE(base::ReadFileToString(temp_file_path_b, &output)); + EXPECT_FALSE(output.empty()); + // The temporary files are deleted when temp_directory exits scope. +} + +TEST_P(AudioProcessorTestMultichannel, TestStereoAudio) { + const bool use_multichannel_processing = GetParam(); + SCOPED_TRACE(testing::Message() << "use_multichannel_processing=" + << use_multichannel_processing); + const media::AudioParameters source_params( + media::AudioParameters::AUDIO_PCM_LOW_LATENCY, + media::CHANNEL_LAYOUT_STEREO, 48000, 480); + + // Construct left and right channels, and populate each channel with + // different values. + const int size = media::AudioBus::CalculateMemorySize(source_params); + std::unique_ptr<float, base::AlignedFreeDeleter> left_channel( + static_cast<float*>(base::AlignedAlloc(size, 32))); + std::unique_ptr<float, base::AlignedFreeDeleter> right_channel( + static_cast<float*>(base::AlignedAlloc(size, 32))); + std::unique_ptr<media::AudioBus> wrapper = + media::AudioBus::CreateWrapper(source_params.channels()); + wrapper->set_frames(source_params.frames_per_buffer()); + wrapper->SetChannelData(0, left_channel.get()); + wrapper->SetChannelData(1, right_channel.get()); + wrapper->Zero(); + wrapper->channel(0)[0] = 1.0f; + + // Test without and with audio processing enabled. + for (bool use_apm : {false, true}) { + // No need to test stereo with APM if disabled. + if (use_apm && !use_multichannel_processing) { + continue; + } + SCOPED_TRACE(testing::Message() << "use_apm=" << use_apm); + + AudioProcessingSettings settings{.multi_channel_capture_processing = + use_multichannel_processing}; + if (!use_apm) { + // Turn off the audio processing. + DisableDefaultSettings(settings); + } + // Turn on the stereo channels mirroring. + settings.stereo_mirroring = true; + AudioProcessor audio_processor(mock_capture_callback_.Get(), + LogCallbackForTesting(), settings); + EXPECT_EQ(audio_processor.has_webrtc_audio_processing(), use_apm); + audio_processor.OnCaptureFormatChanged(source_params); + // There's no sense in continuing if this fails. + ASSERT_EQ(2, audio_processor.OutputFormat().channels()); + + // Run the test consecutively to make sure the stereo channels are not + // flipped back and forth. + static const int kNumberOfPacketsForTest = 100; + const base::TimeTicks pushed_capture_time = base::TimeTicks::Now(); + + for (int num_preferred_channels = 0; num_preferred_channels <= 5; + ++num_preferred_channels) { + SCOPED_TRACE(testing::Message() + << "num_preferred_channels=" << num_preferred_channels); + for (int i = 0; i < kNumberOfPacketsForTest; ++i) { + SCOPED_TRACE(testing::Message() << "packet index i=" << i); + EXPECT_CALL(mock_capture_callback_, Run(_, _, _)).Times(1); + // Pass audio for processing. + audio_processor.ProcessCapturedAudio( + *wrapper, pushed_capture_time, num_preferred_channels, 0.0, false); + } + // At this point, the audio processing algorithms have gotten past any + // initial buffer silence generated from resamplers, FFTs, and whatnot. + // Set up expectations via the mock callback: + EXPECT_CALL(mock_capture_callback_, Run(_, _, _)) + .WillRepeatedly([&](const media::AudioBus& processed_audio, + base::TimeTicks audio_capture_time, + absl::optional<double> new_volume) { + EXPECT_EQ(audio_capture_time, pushed_capture_time); + if (!use_apm) { + EXPECT_FALSE(new_volume.has_value()); + } + if (use_apm && num_preferred_channels <= 1) { + // Mono output. Output channels are averaged. + EXPECT_NE(processed_audio.channel(0)[0], 0); + EXPECT_NE(processed_audio.channel(1)[0], 0); + } else { + // Stereo output. Output channels are independent. + // Note that after stereo mirroring, the _right_ channel is + // non-zero. + EXPECT_EQ(processed_audio.channel(0)[0], 0); + EXPECT_NE(processed_audio.channel(1)[0], 0); + } + }); + // Process one more frame of audio. + audio_processor.ProcessCapturedAudio(*wrapper, pushed_capture_time, + num_preferred_channels, 0.0, false); + } + } +} + +// Disabled on android clang builds due to crbug.com/470499 +#if defined(__clang__) && defined(OS_ANDROID) +#define MAYBE_TestWithKeyboardMicChannel DISABLED_TestWithKeyboardMicChannel +#else +#define MAYBE_TestWithKeyboardMicChannel TestWithKeyboardMicChannel +#endif +TEST_P(AudioProcessorTestMultichannel, MAYBE_TestWithKeyboardMicChannel) { + const bool use_multichannel_processing = GetParam(); + AudioProcessingSettings settings{.multi_channel_capture_processing = + use_multichannel_processing}; + AudioProcessor audio_processor(mock_capture_callback_.Get(), + LogCallbackForTesting(), settings); + EXPECT_TRUE(audio_processor.has_webrtc_audio_processing()); + + media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, + media::CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, + 48000, 480); + audio_processor.OnCaptureFormatChanged(params); + + const int expected_output_channels = + use_multichannel_processing ? params_.channels() : 1; + + ProcessDataAndVerifyFormat(audio_processor, mock_capture_callback_, + media::kAudioProcessingSampleRateHz, + expected_output_channels, + media::kAudioProcessingSampleRateHz / 100); +} + +// Ensure that discrete channel layouts do not crash with audio processing +// enabled. +TEST_F(AudioProcessorTest, DiscreteChannelLayout) { + AudioProcessingSettings settings; + AudioProcessor audio_processor(mock_capture_callback_.Get(), + LogCallbackForTesting(), settings); + EXPECT_TRUE(audio_processor.has_webrtc_audio_processing()); + + media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, + media::CHANNEL_LAYOUT_DISCRETE, 48000, 480); + // Test both 1 and 2 discrete channels. + for (int channels = 1; channels <= 2; ++channels) { + params.set_channels_for_discrete(channels); + audio_processor.OnCaptureFormatChanged(params); + } +} + +INSTANTIATE_TEST_CASE_P(AudioProcessorMultichannelAffectedTests, + AudioProcessorTestMultichannel, + ::testing::Values(false, true)); + +// When audio processing is performed, processed audio should be delivered as +// soon as 10 ms of audio has been received. +TEST(AudioProcessorCallbackTest, + ProcessedAudioIsDeliveredAsSoonAsPossibleWithShortBuffers) { + MockProcessedCaptureCallback mock_capture_callback; + AudioProcessingSettings settings; + AudioProcessor audio_processor(mock_capture_callback.Get(), + LogCallbackForTesting(), settings); + ASSERT_TRUE(audio_processor.has_webrtc_audio_processing()); + + // Set buffer size to 4 ms. + media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, + media::CHANNEL_LAYOUT_STEREO, 48000, + 48000 * 4 / 1000); + audio_processor.OnCaptureFormatChanged(params); + int output_sample_rate = audio_processor.OutputFormat().sample_rate(); + std::unique_ptr<media::AudioBus> data_bus = + media::AudioBus::Create(params.channels(), params.frames_per_buffer()); + data_bus->Zero(); + + auto check_audio_length = [&](const media::AudioBus& processed_audio, + base::TimeTicks, absl::optional<double>) { + EXPECT_EQ(processed_audio.frames(), output_sample_rate * 10 / 1000); + }; + + // 4 ms of data: Not enough to process. + EXPECT_CALL(mock_capture_callback, Run(_, _, _)).Times(0); + audio_processor.ProcessCapturedAudio(*data_bus, base::TimeTicks::Now(), -1, + 1.0, false); + // 8 ms of data: Not enough to process. + EXPECT_CALL(mock_capture_callback, Run(_, _, _)).Times(0); + audio_processor.ProcessCapturedAudio(*data_bus, base::TimeTicks::Now(), -1, + 1.0, false); + // 12 ms of data: Should trigger callback, with 2 ms left in the processor. + EXPECT_CALL(mock_capture_callback, Run(_, _, _)) + .Times(1) + .WillOnce(check_audio_length); + audio_processor.ProcessCapturedAudio(*data_bus, base::TimeTicks::Now(), -1, + 1.0, false); + // 2 + 4 ms of data: Not enough to process. + EXPECT_CALL(mock_capture_callback, Run(_, _, _)).Times(0); + audio_processor.ProcessCapturedAudio(*data_bus, base::TimeTicks::Now(), -1, + 1.0, false); + // 10 ms of data: Should trigger callback. + EXPECT_CALL(mock_capture_callback, Run(_, _, _)) + .Times(1) + .WillOnce(check_audio_length); + audio_processor.ProcessCapturedAudio(*data_bus, base::TimeTicks::Now(), -1, + 1.0, false); +} + +// When audio processing is performed, input containing 10 ms several times over +// should trigger a comparable number of processing callbacks. +TEST(AudioProcessorCallbackTest, + ProcessedAudioIsDeliveredAsSoonAsPossibleWithLongBuffers) { + MockProcessedCaptureCallback mock_capture_callback; + AudioProcessingSettings settings; + AudioProcessor audio_processor(mock_capture_callback.Get(), + LogCallbackForTesting(), settings); + ASSERT_TRUE(audio_processor.has_webrtc_audio_processing()); + + // Set buffer size to 35 ms. + media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, + media::CHANNEL_LAYOUT_STEREO, 48000, + 48000 * 35 / 1000); + audio_processor.OnCaptureFormatChanged(params); + int output_sample_rate = audio_processor.OutputFormat().sample_rate(); + std::unique_ptr<media::AudioBus> data_bus = + media::AudioBus::Create(params.channels(), params.frames_per_buffer()); + data_bus->Zero(); + + auto check_audio_length = [&](const media::AudioBus& processed_audio, + base::TimeTicks, absl::optional<double>) { + EXPECT_EQ(processed_audio.frames(), output_sample_rate * 10 / 1000); + }; + + // 35 ms of audio --> 3 chunks of 10 ms, and 5 ms left in the processor. + EXPECT_CALL(mock_capture_callback, Run(_, _, _)) + .Times(3) + .WillRepeatedly(check_audio_length); + audio_processor.ProcessCapturedAudio(*data_bus, base::TimeTicks::Now(), -1, + 1.0, false); + // 5 + 35 ms of audio --> 4 chunks of 10 ms. + EXPECT_CALL(mock_capture_callback, Run(_, _, _)) + .Times(4) + .WillRepeatedly(check_audio_length); + audio_processor.ProcessCapturedAudio(*data_bus, base::TimeTicks::Now(), -1, + 1.0, false); +} + +// When no audio processing is performed, audio is delivered immediately. Note +// that unlike the other cases, unprocessed audio input of less than 10 ms is +// forwarded directly instead of collecting chunks of 10 ms. +TEST(AudioProcessorCallbackTest, + UnprocessedAudioIsDeliveredImmediatelyWithShortBuffers) { + MockProcessedCaptureCallback mock_capture_callback; + AudioProcessingSettings settings; + DisableDefaultSettings(settings); + AudioProcessor audio_processor(mock_capture_callback.Get(), + LogCallbackForTesting(), settings); + ASSERT_FALSE(audio_processor.has_webrtc_audio_processing()); + + // Set buffer size to 4 ms. + media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, + media::CHANNEL_LAYOUT_STEREO, 48000, + 48000 * 4 / 1000); + audio_processor.OnCaptureFormatChanged(params); + int output_sample_rate = audio_processor.OutputFormat().sample_rate(); + std::unique_ptr<media::AudioBus> data_bus = + media::AudioBus::Create(params.channels(), params.frames_per_buffer()); + data_bus->Zero(); + + auto check_audio_length = [&](const media::AudioBus& processed_audio, + base::TimeTicks, absl::optional<double>) { + EXPECT_EQ(processed_audio.frames(), output_sample_rate * 4 / 1000); + }; + + EXPECT_CALL(mock_capture_callback, Run(_, _, _)) + .Times(1) + .WillOnce(check_audio_length); + audio_processor.ProcessCapturedAudio(*data_bus, base::TimeTicks::Now(), -1, + 1.0, false); + EXPECT_CALL(mock_capture_callback, Run(_, _, _)) + .Times(1) + .WillOnce(check_audio_length); + audio_processor.ProcessCapturedAudio(*data_bus, base::TimeTicks::Now(), -1, + 1.0, false); +} + +// When no audio processing is performed, audio is delivered immediately. Chunks +// greater than 10 ms are delivered in chunks of 10 ms. +TEST(AudioProcessorCallbackTest, + UnprocessedAudioIsDeliveredImmediatelyWithLongBuffers) { + MockProcessedCaptureCallback mock_capture_callback; + AudioProcessingSettings settings; + DisableDefaultSettings(settings); + AudioProcessor audio_processor(mock_capture_callback.Get(), + LogCallbackForTesting(), settings); + ASSERT_FALSE(audio_processor.has_webrtc_audio_processing()); + + // Set buffer size to 35 ms. + media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, + media::CHANNEL_LAYOUT_STEREO, 48000, + 48000 * 35 / 1000); + audio_processor.OnCaptureFormatChanged(params); + int output_sample_rate = audio_processor.OutputFormat().sample_rate(); + std::unique_ptr<media::AudioBus> data_bus = + media::AudioBus::Create(params.channels(), params.frames_per_buffer()); + data_bus->Zero(); + + auto check_audio_length = [&](const media::AudioBus& processed_audio, + base::TimeTicks, absl::optional<double>) { + EXPECT_EQ(processed_audio.frames(), output_sample_rate * 10 / 1000); + }; + + // 35 ms of audio --> 3 chunks of 10 ms, and 5 ms left in the processor. + EXPECT_CALL(mock_capture_callback, Run(_, _, _)) + .Times(3) + .WillRepeatedly(check_audio_length); + audio_processor.ProcessCapturedAudio(*data_bus, base::TimeTicks::Now(), -1, + 1.0, false); + // 5 + 35 ms of audio --> 4 chunks of 10 ms. + EXPECT_CALL(mock_capture_callback, Run(_, _, _)) + .Times(4) + .WillRepeatedly(check_audio_length); + audio_processor.ProcessCapturedAudio(*data_bus, base::TimeTicks::Now(), -1, + 1.0, false); +} + +TEST(AudioProcessorRequiresPlayoutReferenceTest, + TrueWhenEchoCancellationIsEnabled) { + MockProcessedCaptureCallback mock_capture_callback; + AudioProcessingSettings settings; + DisableDefaultSettings(settings); + settings.echo_cancellation = true; + AudioProcessor audio_processor(mock_capture_callback.Get(), + LogCallbackForTesting(), settings); + EXPECT_TRUE(audio_processor.RequiresPlayoutReference()); +} + +TEST(AudioProcessorRequiresPlayoutReferenceTest, TrueWhenGainControlIsEnabled) { + MockProcessedCaptureCallback mock_capture_callback; + AudioProcessingSettings settings; + DisableDefaultSettings(settings); + settings.automatic_gain_control = true; + AudioProcessor audio_processor(mock_capture_callback.Get(), + LogCallbackForTesting(), settings); + EXPECT_TRUE(audio_processor.RequiresPlayoutReference()); +} + +TEST(AudioProcessorRequiresPlayoutReferenceTest, FalseWhenAecAndAgcIsDisabled) { + MockProcessedCaptureCallback mock_capture_callback; + AudioProcessingSettings settings; + // Disable effects that need the playout signal. + settings.echo_cancellation = false; + settings.automatic_gain_control = false; + // Enable all other effects. + settings.experimental_automatic_gain_control = true; + settings.noise_suppression = true; + settings.transient_noise_suppression = true; + settings.high_pass_filter = true; + settings.stereo_mirroring = true; + settings.force_apm_creation = true; + AudioProcessor audio_processor(mock_capture_callback.Get(), + LogCallbackForTesting(), settings); + EXPECT_FALSE(audio_processor.RequiresPlayoutReference()); +} + +} // namespace media
diff --git a/mojo/core/node_controller.cc b/mojo/core/node_controller.cc index 7579258..51f6df2 100644 --- a/mojo/core/node_controller.cc +++ b/mojo/core/node_controller.cc
@@ -907,6 +907,11 @@ return; } + if (!GetConfiguration().is_broker_process) { + DLOG(ERROR) << "Ignoring AddBrokerClient on non-broker node."; + return; + } + if (GetPeerChannel(client_name)) { DLOG(ERROR) << "Ignoring AddBrokerClient for known client."; DropPeer(from_node, nullptr);
diff --git a/mojo/public/cpp/platform/socket_utils_posix.cc b/mojo/public/cpp/platform/socket_utils_posix.cc index 920211d..256c1336 100644 --- a/mojo/public/cpp/platform/socket_utils_posix.cc +++ b/mojo/public/cpp/platform/socket_utils_posix.cc
@@ -8,16 +8,16 @@ #include <sys/socket.h> #include <unistd.h> -#if !defined(OS_NACL) -#include <sys/uio.h> -#endif - #include "base/files/file_util.h" #include "base/logging.h" #include "base/notreached.h" #include "base/posix/eintr_wrapper.h" #include "build/build_config.h" +#if !defined(OS_NACL) +#include <sys/uio.h> +#endif + namespace mojo { namespace { @@ -79,7 +79,7 @@ ssize_t SocketWrite(base::PlatformFile socket, const void* bytes, size_t num_bytes) { -#if defined(OS_APPLE) || defined(OS_NACL_NONSFI) +#if defined(OS_APPLE) return HANDLE_EINTR(write(socket, bytes, num_bytes)); #else return send(socket, bytes, num_bytes, kSendmsgFlags);
diff --git a/native_client_sdk/src/BUILD.gn b/native_client_sdk/src/BUILD.gn index 27b24d1..75550c8b 100644 --- a/native_client_sdk/src/BUILD.gn +++ b/native_client_sdk/src/BUILD.gn
@@ -28,9 +28,6 @@ "//native_client/src/trusted/service_runtime:sel_ldr", "//native_client/src/trusted/validator/driver:ncval_new", ] - if (is_linux || is_chromeos) { - deps += [ "//native_client/src/nonsfi/loader:nonsfi_loader" ] - } } if (nacl_sdk_untrusted) { deps += [
diff --git a/net/android/radio_activity_tracker.cc b/net/android/radio_activity_tracker.cc index 4c23e01..4e886b1 100644 --- a/net/android/radio_activity_tracker.cc +++ b/net/android/radio_activity_tracker.cc
@@ -7,6 +7,7 @@ #include "base/feature_list.h" #include "base/metrics/histogram_functions.h" #include "net/base/features.h" +#include "net/traffic_annotation/network_traffic_annotation.h" namespace net { namespace android { @@ -85,5 +86,27 @@ return should_record; } +void MaybeRecordTCPWriteForWakeupTrigger( + const NetworkTrafficAnnotationTag& traffic_annotation) { + if (!RadioActivityTracker::GetInstance() + .ShouldRecordActivityForWakeupTrigger()) { + return; + } + + base::UmaHistogramSparse(kUmaNamePossibleWakeupTriggerTCPWriteAnnotationId, + traffic_annotation.unique_id_hash_code); +} + +void MaybeRecordUDPWriteForWakeupTrigger( + const NetworkTrafficAnnotationTag& traffic_annotation) { + if (!RadioActivityTracker::GetInstance() + .ShouldRecordActivityForWakeupTrigger()) { + return; + } + + base::UmaHistogramSparse(kUmaNamePossibleWakeupTriggerUDPWriteAnnotationId, + traffic_annotation.unique_id_hash_code); +} + } // namespace android } // namespace net
diff --git a/net/android/radio_activity_tracker.h b/net/android/radio_activity_tracker.h index 21fcae2..268e61ad 100644 --- a/net/android/radio_activity_tracker.h +++ b/net/android/radio_activity_tracker.h
@@ -13,6 +13,8 @@ namespace net { +struct NetworkTrafficAnnotationTag; + namespace android { // Tracks radio states and provides helper methods to record network activities @@ -70,6 +72,19 @@ radio_type_override_for_testing_; }; +constexpr char kUmaNamePossibleWakeupTriggerTCPWriteAnnotationId[] = + "Net.Radio.PossibleWakeupTrigger.TCPWriteAnnotationId"; +constexpr char kUmaNamePossibleWakeupTriggerUDPWriteAnnotationId[] = + "Net.Radio.PossibleWakeupTrigger.UDPWriteAnnotationId"; + +// Records a histogram when writing data to a TCP socket likely wake-ups radio. +NET_EXPORT void MaybeRecordTCPWriteForWakeupTrigger( + const NetworkTrafficAnnotationTag& traffic_annotation); + +// Records a histogram when writing data to a UDP socket likely wake-ups radio. +NET_EXPORT void MaybeRecordUDPWriteForWakeupTrigger( + const NetworkTrafficAnnotationTag& traffic_annotation); + } // namespace android } // namespace net
diff --git a/net/http/http_stream_factory_job.cc b/net/http/http_stream_factory_job.cc index 68ed17f..c5ff3fb 100644 --- a/net/http/http_stream_factory_job.cc +++ b/net/http/http_stream_factory_job.cc
@@ -158,12 +158,9 @@ negotiated_protocol_(kProtoUnknown), num_streams_(0), pushed_stream_id_(kNoPushedStreamFound), - spdy_session_direct_( - !(proxy_info.is_https() && origin_url_.SchemeIs(url::kHttpScheme))), spdy_session_key_( using_quic_ ? SpdySessionKey() - : GetSpdySessionKey(spdy_session_direct_, - proxy_info_.proxy_server(), + : GetSpdySessionKey(proxy_info_.proxy_server(), origin_url_, request_info_.privacy_mode, request_info_.socket_tag, @@ -175,6 +172,12 @@ DCHECK(base::LowerCaseEqualsASCII(destination_.scheme(), url::kHttpScheme) || base::LowerCaseEqualsASCII(destination_.scheme(), url::kHttpsScheme)); + // This class is specific to a single `ProxyServer`, so `proxy_info_` must be + // non-empty. Entries beyond the first are ignored. It should simply take a + // `ProxyServer`, but the full `ProxyInfo` is passed back to + // `HttpNetworkTransaction`, which consumes additional fields. + DCHECK(!proxy_info_.is_empty()); + // QUIC can only be spoken to servers, never to proxies. if (alternative_protocol == kProtoQUIC) DCHECK(proxy_info_.is_direct()); @@ -367,7 +370,6 @@ // static SpdySessionKey HttpStreamFactory::Job::GetSpdySessionKey( - bool spdy_session_direct, const ProxyServer& proxy_server, const GURL& origin_url, PrivacyMode privacy_mode, @@ -375,8 +377,8 @@ const NetworkIsolationKey& network_isolation_key, SecureDnsPolicy secure_dns_policy) { // In the case that we're using an HTTPS proxy for an HTTP url, look for a - // HTTP/2 proxy session *to* the proxy, instead of to the origin server. - if (!spdy_session_direct) { + // HTTP/2 proxy session *to* the proxy, instead of to the origin server. + if (proxy_server.is_https() && origin_url.SchemeIs(url::kHttpScheme)) { return SpdySessionKey(proxy_server.host_port_pair(), ProxyServer::Direct(), PRIVACY_MODE_DISABLED, SpdySessionKey::IsProxySession::kTrue, socket_tag, @@ -850,26 +852,13 @@ GURL url(request_info_.url); if (proxy_info_.is_quic()) { ssl_config = &proxy_ssl_config_; - GURL::Replacements replacements; - replacements.SetSchemeStr(url::kHttpsScheme); const HostPortPair& proxy_endpoint = proxy_info_.proxy_server().host_port_pair(); - // A proxy's certificate is expected to be valid for the proxy hostname. - replacements.SetHostStr(proxy_endpoint.host()); - const std::string new_port = base::NumberToString(proxy_endpoint.port()); - replacements.SetPortStr(new_port); - replacements.ClearUsername(); - replacements.ClearPassword(); - replacements.ClearPath(); - replacements.ClearQuery(); - replacements.ClearRef(); - url = url.ReplaceComponents(replacements); - destination = url::SchemeHostPort(url); + destination = url::SchemeHostPort(url::kHttpsScheme, proxy_endpoint.host(), + proxy_endpoint.port()); + url = destination.GetURL(); } else { DCHECK(using_ssl_); - // The certificate of a QUIC alternative server is expected to be valid - // for the origin of the request (in addition to being valid for the - // server itself). destination = destination_; ssl_config = &server_ssl_config_; }
diff --git a/net/http/http_stream_factory_job.h b/net/http/http_stream_factory_job.h index 5d1c00d..dc94a8d 100644 --- a/net/http/http_stream_factory_job.h +++ b/net/http/http_stream_factory_job.h
@@ -322,7 +322,6 @@ // Called in Job constructor. Use |spdy_session_key_| after construction. static SpdySessionKey GetSpdySessionKey( - bool spdy_session_direct, const ProxyServer& proxy_server, const GURL& origin_url, PrivacyMode privacy_mode, @@ -442,9 +441,8 @@ // (but |existing_spdy_session_| can still be non-null). spdy::SpdyStreamId pushed_stream_id_; - // True if not connecting to an Https proxy for an Http url. - const bool spdy_session_direct_; - + // Which SpdySessions in the pool to use. Note that, if requesting an HTTP URL + // through an HTTPS proxy, this key matches the proxy, not the origin server. const SpdySessionKey spdy_session_key_; // Type of stream that is requested.
diff --git a/net/socket/tcp_socket_posix.cc b/net/socket/tcp_socket_posix.cc index 30a21493..f005898 100644 --- a/net/socket/tcp_socket_posix.cc +++ b/net/socket/tcp_socket_posix.cc
@@ -44,6 +44,10 @@ #include "net/socket/socket_tag.h" #include "net/traffic_annotation/network_traffic_annotation.h" +#if defined(OS_ANDROID) +#include "net/android/radio_activity_tracker.h" +#endif // defined(OS_ANDROID) + // If we don't have a definition for TCPI_OPT_SYN_DATA, create one. #if !defined(TCPI_OPT_SYN_DATA) #define TCPI_OPT_SYN_DATA 32 @@ -308,6 +312,10 @@ DCHECK(socket_); DCHECK(!callback.is_null()); +#if defined(OS_ANDROID) + android::MaybeRecordTCPWriteForWakeupTrigger(traffic_annotation); +#endif // defined(OS_ANDROID) + CompletionOnceCallback write_callback = base::BindOnce( &TCPSocketPosix::WriteCompleted, // Grab a reference to |buf| so that WriteCompleted() can still
diff --git a/net/socket/tcp_socket_unittest.cc b/net/socket/tcp_socket_unittest.cc index 2ed9accc..e1714611 100644 --- a/net/socket/tcp_socket_unittest.cc +++ b/net/socket/tcp_socket_unittest.cc
@@ -36,6 +36,14 @@ #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" +#if defined(OS_ANDROID) +#include "base/android/radio_utils.h" +#include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" +#include "net/android/radio_activity_tracker.h" +#include "net/base/features.h" +#endif // defined(OS_ANDROID) + // For getsockopt() call. #if defined(OS_WIN) #include <winsock2.h> @@ -948,7 +956,63 @@ socket_.Close(); } -#endif + +TEST_F(TCPSocketTest, RecordRadioWakeUpTrigger) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(features::kRecordRadioWakeupTrigger); + + base::HistogramTester histograms; + + // Simulates the radio state is dormant. + android::RadioActivityTracker::GetInstance().OverrideRadioActivityForTesting( + base::android::RadioDataActivity::kDormant); + android::RadioActivityTracker::GetInstance().OverrideRadioTypeForTesting( + base::android::RadioConnectionType::kCell); + + ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); + + // Create a connected socket. + TestCompletionCallback connect_callback; + std::unique_ptr<TCPSocket> connecting_socket = + std::make_unique<TCPSocket>(nullptr, nullptr, NetLogSource()); + int result = connecting_socket->Open(ADDRESS_FAMILY_IPV4); + ASSERT_THAT(result, IsOk()); + int connect_result = + connecting_socket->Connect(local_address_, connect_callback.callback()); + + TestCompletionCallback accept_callback; + std::unique_ptr<TCPSocket> accepted_socket; + IPEndPoint accepted_address; + result = socket_.Accept(&accepted_socket, &accepted_address, + accept_callback.callback()); + ASSERT_THAT(accept_callback.GetResult(result), IsOk()); + ASSERT_TRUE(accepted_socket.get()); + ASSERT_THAT(connect_callback.GetResult(connect_result), IsOk()); + + // Write to the socket once. + base::RunLoop run_loop; + scoped_refptr<IOBufferWithDestructionCallback> write_buffer( + base::MakeRefCounted<IOBufferWithDestructionCallback>( + run_loop.QuitClosure())); + memset(write_buffer->data(), '1', write_buffer->size()); + TestCompletionCallback write_callback; + result = connecting_socket->Write(write_buffer.get(), write_buffer->size(), + write_callback.callback(), + TRAFFIC_ANNOTATION_FOR_TESTS); + ASSERT_LT(0, result); + + // Release the handle to the read buffer and destroy the socket. Make sure the + // write buffer is destroyed. + write_buffer = nullptr; + connecting_socket.reset(); + run_loop.Run(); + + // Check the write is recorded as a possible radio wake-up trigger. + histograms.ExpectTotalCount( + android::kUmaNamePossibleWakeupTriggerTCPWriteAnnotationId, 1); +} + +#endif // defined(OS_ANDROID) } // namespace } // namespace net
diff --git a/net/socket/udp_socket_posix.cc b/net/socket/udp_socket_posix.cc index 89d261e..d2911ade 100644 --- a/net/socket/udp_socket_posix.cc +++ b/net/socket/udp_socket_posix.cc
@@ -55,6 +55,7 @@ #include "base/android/build_info.h" #include "base/native_library.h" #include "base/strings/utf_string_conversions.h" +#include "net/android/radio_activity_tracker.h" #endif // defined(OS_ANDROID) #if defined(OS_MAC) @@ -394,6 +395,9 @@ int buf_len, CompletionOnceCallback callback, const NetworkTrafficAnnotationTag& traffic_annotation) { +#if defined(OS_ANDROID) + android::MaybeRecordUDPWriteForWakeupTrigger(traffic_annotation); +#endif // defined(OS_ANDROID) return SendToOrWrite(buf, buf_len, nullptr, std::move(callback)); }
diff --git a/net/socket/udp_socket_unittest.cc b/net/socket/udp_socket_unittest.cc index d77fcaa1..c255416 100644 --- a/net/socket/udp_socket_unittest.cc +++ b/net/socket/udp_socket_unittest.cc
@@ -45,7 +45,10 @@ #if defined(OS_ANDROID) #include "base/android/build_info.h" +#include "base/android/radio_utils.h" +#include "base/test/metrics/histogram_tester.h" #include "net/android/network_change_notifier_factory_android.h" +#include "net/android/radio_activity_tracker.h" #include "net/base/network_change_notifier.h" #endif @@ -1390,7 +1393,27 @@ EXPECT_EQ(simple_message, str); EXPECT_GT(GetTaggedBytes(tag_val1), old_traffic); } -#endif + +TEST_F(UDPSocketTest, RecordRadioWakeUpTrigger) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(features::kRecordRadioWakeupTrigger); + + base::HistogramTester histograms; + + // Simulates the radio state is dormant. + android::RadioActivityTracker::GetInstance().OverrideRadioActivityForTesting( + base::android::RadioDataActivity::kDormant); + android::RadioActivityTracker::GetInstance().OverrideRadioTypeForTesting( + base::android::RadioConnectionType::kCell); + + ConnectTest(/*use_nonblocking_io=*/false); + + // Check the write is recorded as a possible radio wake-up trigger. + histograms.ExpectTotalCount( + android::kUmaNamePossibleWakeupTriggerUDPWriteAnnotationId, 1); +} + +#endif // defined(OS_ANDROID) // Scoped helper to override the process-wide UDP socket limit. class OverrideUDPSocketLimit {
diff --git a/remoting/protocol/webrtc_transport.cc b/remoting/protocol/webrtc_transport.cc index cc31873..fc72d620 100644 --- a/remoting/protocol/webrtc_transport.cc +++ b/remoting/protocol/webrtc_transport.cc
@@ -146,6 +146,26 @@ } } +// Initializes default parameters for a sender that may be different from +// WebRTC's defaults. +void SetDefaultSenderParameters( + rtc::scoped_refptr<webrtc::RtpSenderInterface> sender) { + if (sender->media_type() == cricket::MEDIA_TYPE_VIDEO) { + webrtc::RtpParameters parameters = sender->GetParameters(); + if (parameters.encodings.empty()) { + LOG(ERROR) << "No encodings found for sender " << sender->id(); + return; + } + + for (auto& encoding : parameters.encodings) { + encoding.max_framerate = kTargetFrameRate; + } + + webrtc::RTCError result = sender->SetParameters(parameters); + DCHECK(result.ok()) << "SetParameters() failed: " << result.message(); + } +} + // A webrtc::CreateSessionDescriptionObserver implementation used to receive the // results of creating descriptions for this end of the PeerConnection. class CreateSessionDescriptionObserver @@ -780,6 +800,11 @@ int min_bitrate_bps, max_bitrate_bps; std::tie(min_bitrate_bps, max_bitrate_bps) = BitratesForConnection(); SetSenderBitrates(min_bitrate_bps, max_bitrate_bps); + + // Sender is always present, regardless of the direction of media + // (see rtp_transceiver_interface.h). + auto sender = transceiver->sender(); + SetDefaultSenderParameters(sender); } void WebrtcTransport::OnLocalSessionDescriptionCreated( @@ -861,6 +886,14 @@ } AddPendingCandidatesIfPossible(); + + // The sender "encodings" parameters are initialized after the local + // description is set. At this point, it is possible to set parameters such as + // maximum framerate. + auto senders = peer_connection()->GetSenders(); + for (const auto& sender : senders) { + SetDefaultSenderParameters(sender); + } } void WebrtcTransport::OnRemoteDescriptionSet(bool send_answer,
diff --git a/sandbox/linux/BUILD.gn b/sandbox/linux/BUILD.gn index c6e707d4..abbcc509 100644 --- a/sandbox/linux/BUILD.gn +++ b/sandbox/linux/BUILD.gn
@@ -386,7 +386,6 @@ "system_headers/linux_stat.h", "system_headers/linux_syscalls.h", "system_headers/linux_time.h", - "system_headers/linux_ucontext.h", "system_headers/mips64_linux_syscalls.h", "system_headers/mips_linux_syscalls.h", "system_headers/x86_32_linux_syscalls.h",
diff --git a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc index 71068a0..1680781 100644 --- a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc +++ b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
@@ -41,9 +41,7 @@ namespace { -#if !defined(OS_NACL_NONSFI) base::debug::CrashKeyString* seccomp_crash_key = nullptr; -#endif inline bool IsArchitectureX86_64() { #if defined(__x86_64__) @@ -151,7 +149,6 @@ // Records the syscall number and first four arguments in a crash key, to help // debug the failure. void SetSeccompCrashKey(const struct arch_seccomp_data& args) { -#if !defined(OS_NACL_NONSFI) NumberToHex<int> nr(args.nr); NumberToHex<uint64_t> arg1(args.args[0]); NumberToHex<uint64_t> arg2(args.args[1]); @@ -196,7 +193,6 @@ } base::debug::SetCrashKeyString(seccomp_crash_key, crash_key); -#endif } } // namespace @@ -413,13 +409,11 @@ } void AllocateCrashKeys() { -#if !defined(OS_NACL_NONSFI) if (seccomp_crash_key) return; seccomp_crash_key = base::debug::AllocateCrashKeyString( "seccomp-sigsys", base::debug::CrashKeySize::Size256); -#endif } const char* GetErrorMessageContentForTests() {
diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc b/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc index b037fe8..36221d2 100644 --- a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc +++ b/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
@@ -10,8 +10,10 @@ #include <sched.h> #include <signal.h> #include <stdint.h> +#include <sys/ioctl.h> #include <sys/mman.h> #include <sys/prctl.h> +#include <sys/ptrace.h> #include <sys/resource.h> #include <sys/stat.h> #include <sys/time.h> @@ -33,10 +35,6 @@ #include "sandbox/linux/system_headers/linux_syscalls.h" #include "sandbox/linux/system_headers/linux_time.h" -// PNaCl toolchain does not provide sys/ioctl.h and sys/ptrace.h headers. -#if !defined(OS_NACL_NONSFI) -#include <sys/ioctl.h> -#include <sys/ptrace.h> #if (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \ !defined(__arm__) && !defined(__aarch64__) && \ !defined(PTRACE_GET_THREAD_AREA) @@ -46,7 +44,6 @@ // defined on aarch64, so don't try to include this on those platforms. #include <asm/ptrace-abi.h> #endif -#endif // !OS_NACL_NONSFI #if defined(OS_ANDROID) @@ -130,7 +127,6 @@ namespace sandbox { -#if !defined(OS_NACL_NONSFI) // Allow Glibc's and Android pthread creation flags, crash on any other // thread creation attempts and EPERM attempts to use neither // CLONE_VM nor CLONE_THREAD (all fork implementations), unless CLONE_VFORK is @@ -380,7 +376,6 @@ return If(AnyOf(who == RUSAGE_SELF, who == RUSAGE_THREAD), Allow()) .Else(CrashSIGSYS()); } -#endif // !defined(OS_NACL_NONSFI) ResultExpr RestrictClockID() { static_assert(4 == sizeof(clockid_t), "clockid_t is not 32bit"); @@ -434,7 +429,6 @@ .Else(Error(EPERM)); } -#if !defined(OS_NACL_NONSFI) ResultExpr RestrictPtrace() { const Arg<int> request(0); #if defined(__aarch64__) @@ -459,7 +453,6 @@ #endif .Default(CrashSIGSYSPtrace()); } -#endif // defined(OS_NACL_NONSFI) ResultExpr RestrictPkeyAllocFlags() { const Arg<int> flags(0);
diff --git a/sandbox/linux/services/namespace_sandbox.cc b/sandbox/linux/services/namespace_sandbox.cc index 2a056af..d46ea080 100644 --- a/sandbox/linux/services/namespace_sandbox.cc +++ b/sandbox/linux/services/namespace_sandbox.cc
@@ -37,7 +37,6 @@ const char kSandboxPIDNSEnvironmentVarName[] = "SBX_PID_NS"; const char kSandboxNETNSEnvironmentVarName[] = "SBX_NET_NS"; -#if !defined(OS_NACL_NONSFI) class WriteUidGidMapDelegate : public base::LaunchOptions::PreExecDelegate { public: WriteUidGidMapDelegate() @@ -71,7 +70,6 @@ // An empty string causes the env var to be unset in the child process. (*environ)[env_var] = value ? "1" : ""; } -#endif // !defined(OS_NACL_NONSFI) // Linux supports up to 64 signals. This should be updated if that ever changes. int g_signal_exit_codes[64]; @@ -136,7 +134,6 @@ } // namespace -#if !defined(OS_NACL_NONSFI) NamespaceSandbox::Options::Options() : ns_types(CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNET), fail_on_unsupported_ns_type(false) {} @@ -211,7 +208,6 @@ return base::LaunchProcess(argv, launch_options_copy); } -#endif // !defined(OS_NACL_NONSFI) // static pid_t NamespaceSandbox::ForkInNewPidNamespace(bool drop_capabilities_in_child) { @@ -255,12 +251,10 @@ struct sigaction old_action; PCHECK(sys_sigaction(sig, nullptr, &old_action) == 0); -#if !defined(OS_NACL_NONSFI) if (old_action.sa_flags & SA_SIGINFO && old_action.sa_sigaction != nullptr) { return false; } -#endif if (old_action.sa_handler != LINUX_SIG_DFL) { return false;
diff --git a/sandbox/linux/services/namespace_sandbox.h b/sandbox/linux/services/namespace_sandbox.h index bcbf469..bdbb95f 100644 --- a/sandbox/linux/services/namespace_sandbox.h +++ b/sandbox/linux/services/namespace_sandbox.h
@@ -36,7 +36,6 @@ // Credentials::DropAllCapabilities(). class SANDBOX_EXPORT NamespaceSandbox { public: -#if !defined(OS_NACL_NONSFI) struct Options { Options(); ~Options(); @@ -75,7 +74,6 @@ const std::vector<std::string>& argv, const base::LaunchOptions& launch_options, const Options& ns_sandbox_options); -#endif // !defined(OS_NACL_NONSFI) // Forks a process in its own PID namespace. The child process is the init // process inside of the PID namespace, so if the child needs to fork further,
diff --git a/sandbox/linux/syscall_broker/broker_simple_message.cc b/sandbox/linux/syscall_broker/broker_simple_message.cc index 4cd6c03..29521d4 100644 --- a/sandbox/linux/syscall_broker/broker_simple_message.cc +++ b/sandbox/linux/syscall_broker/broker_simple_message.cc
@@ -142,15 +142,9 @@ msg.msg_iov = &iov; msg.msg_iovlen = 1; -#if defined(OS_NACL_NONSFI) - const size_t kControlBufferSize = - CMSG_SPACE(sizeof(fd) * base::UnixDomainSocket::kMaxFileDescriptors); -#else const size_t kControlBufferSize = CMSG_SPACE(sizeof(fd) * base::UnixDomainSocket::kMaxFileDescriptors) + - // The PNaCl toolchain for Non-SFI binary build does not support ucred. CMSG_SPACE(sizeof(struct ucred)); -#endif // defined(OS_NACL_NONSFI) char control_buffer[kControlBufferSize]; msg.msg_control = control_buffer; @@ -174,16 +168,12 @@ wire_fds = reinterpret_cast<int*>(CMSG_DATA(cmsg)); wire_fds_len = payload_len / sizeof(fd); } -#if !defined(OS_NACL_NONSFI) - // The PNaCl toolchain for Non-SFI binary build does not support - // SCM_CREDENTIALS. if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_CREDENTIALS) { DCHECK_EQ(payload_len, sizeof(struct ucred)); DCHECK_EQ(pid, -1); pid = reinterpret_cast<struct ucred*>(CMSG_DATA(cmsg))->pid; } -#endif } }
diff --git a/sandbox/linux/system_headers/linux_seccomp.h b/sandbox/linux/system_headers/linux_seccomp.h index 1fa47ed0..7d898d8 100644 --- a/sandbox/linux/system_headers/linux_seccomp.h +++ b/sandbox/linux/system_headers/linux_seccomp.h
@@ -6,13 +6,10 @@ #define SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SECCOMP_H_ #include <stdint.h> +#include <sys/ioctl.h> #include "build/build_config.h" -#if !defined(OS_NACL_NONSFI) -#include <sys/ioctl.h> -#endif - // The Seccomp2 kernel ABI is not part of older versions of glibc. // As we can't break compilation with these versions of the library, // we explicitly define all missing symbols. @@ -184,8 +181,6 @@ uint32_t newfd_flags; }; -// sys/ioctl.h is not available in pnacl toolchain. -#if !defined(OS_NACL_NONSFI) #define SECCOMP_IOC_MAGIC '!' #define SECCOMP_IO(nr) _IO(SECCOMP_IOC_MAGIC, nr) #define SECCOMP_IOR(nr, type) _IOR(SECCOMP_IOC_MAGIC, nr, type) @@ -201,7 +196,6 @@ #define SECCOMP_IOCTL_NOTIF_ID_VALID SECCOMP_IOR(2, uint64_t) // On success, the return value is the remote process's added fd number #define SECCOMP_IOCTL_NOTIF_ADDFD SECCOMP_IOW(3, struct seccomp_notif_addfd) -#endif // !defined(OS_NACL_NONSFI) #ifndef SECCOMP_RET_KILL // Return values supported for BPF filter programs. Please note that the
diff --git a/sandbox/linux/system_headers/linux_ucontext.h b/sandbox/linux/system_headers/linux_ucontext.h deleted file mode 100644 index 22ce780..0000000 --- a/sandbox/linux/system_headers/linux_ucontext.h +++ /dev/null
@@ -1,22 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_UCONTEXT_H_ -#define SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_UCONTEXT_H_ - -#if defined(__native_client_nonsfi__) - -#if defined(__arm__) -#include "sandbox/linux/system_headers/arm_linux_ucontext.h" -#elif defined(__i386__) -#include "sandbox/linux/system_headers/i386_linux_ucontext.h" -#else -#error "No support for your architecture in PNaCl header" -#endif - -#else // defined(__native_client_nonsfi__) -#error "The header file included on non PNaCl." -#endif // defined(__native_client_nonsfi__) - -#endif // SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_UCONTEXT_H_
diff --git a/sandbox/linux/tests/unit_tests.cc b/sandbox/linux/tests/unit_tests.cc index 09ba511f..ff502a9 100644 --- a/sandbox/linux/tests/unit_tests.cc +++ b/sandbox/linux/tests/unit_tests.cc
@@ -79,14 +79,8 @@ static const int kExpectedValue = 1; static const int kIgnoreThisTest = 43; static const int kExitWithAssertionFailure = 1; -#if !defined(OS_NACL_NONSFI) static const int kExitForTimeout = 2; -#endif -// PNaCl toolchain's signal ABIs are incompatible with Linux's. -// So, for simplicity, just drop the "timeout" feature from unittest framework -// with relying on the buildbot's timeout feature. -#if !defined(OS_NACL_NONSFI) static void SigAlrmHandler(int) { const char failure_message[] = "Timeout reached!\n"; // Make sure that we never block here. @@ -118,7 +112,6 @@ SANDBOX_ASSERT(alarm(time_in_seconds) == 0); // There should be no previous // alarm. } -#endif // !defined(OS_NACL_NONSFI) // Runs a test in a sub-process. This is necessary for most of the code // in the BPF sandbox, as it potentially makes global state changes and as @@ -164,9 +157,7 @@ SANDBOX_ASSERT(!close(fds[0])); SANDBOX_ASSERT(!close(fds[1])); -#if !defined(OS_NACL_NONSFI) SetProcessTimeout(GetSubProcessTimeoutTimeInSeconds()); -#endif // Disable core files. They are not very useful for our individual test // cases.
diff --git a/sandbox/policy/linux/sandbox_seccomp_bpf_linux.cc b/sandbox/policy/linux/sandbox_seccomp_bpf_linux.cc index 9784a10..75ffefc 100644 --- a/sandbox/policy/linux/sandbox_seccomp_bpf_linux.cc +++ b/sandbox/policy/linux/sandbox_seccomp_bpf_linux.cc
@@ -36,6 +36,7 @@ #include "sandbox/linux/seccomp-bpf-helpers/syscall_sets.h" #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" #include "sandbox/linux/system_headers/linux_syscalls.h" +#include "sandbox/policy/chromecast_sandbox_allowlist_buildflags.h" #include "sandbox/policy/linux/bpf_audio_policy_linux.h" #include "sandbox/policy/linux/bpf_base_policy_linux.h" #include "sandbox/policy/linux/bpf_cdm_policy_linux.h" @@ -51,10 +52,6 @@ #include "sandbox/policy/linux/bpf_speech_recognition_policy_linux.h" #include "sandbox/policy/linux/bpf_utility_policy_linux.h" -#if !defined(OS_NACL_NONSFI) -#include "sandbox/policy/chromecast_sandbox_allowlist_buildflags.h" -#endif // !defined(OS_NACL_NONSFI) - #if BUILDFLAG(IS_CHROMEOS_ASH) #include "sandbox/policy/features.h" #include "sandbox/policy/linux/bpf_ime_policy_linux.h" @@ -85,8 +82,6 @@ #if BUILDFLAG(USE_SECCOMP_BPF) namespace { -#if !defined(OS_NACL_NONSFI) - // nacl_helper needs to be tiny and includes only part of content/ // in its dependencies. Make sure to not link things that are not needed. #if !defined(IN_NACL_HELPER) @@ -128,7 +123,6 @@ return std::make_unique<GpuProcessPolicy>(); } #endif // !defined(IN_NACL_HELPER) -#endif // !defined(OS_NACL_NONSFI) } // namespace @@ -155,8 +149,6 @@ #endif } -#if !defined(OS_NACL_NONSFI) - bool SandboxSeccompBPF::SupportsSandboxWithTsync() { #if BUILDFLAG(USE_SECCOMP_BPF) return SandboxBPF::SupportsSeccompSandbox( @@ -197,6 +189,11 @@ case sandbox::mojom::Sandbox::kSpeechRecognition: return std::make_unique<SpeechRecognitionProcessPolicy>(); #if BUILDFLAG(IS_CHROMEOS_ASH) + case sandbox::mojom::Sandbox::kHardwareVideoDecoding: + // TODO(b/195769334): we're using the GPU process sandbox policy for now + // as a transition step. However, we should create a policy that's tighter + // just for hardware video decoding. + return GetGpuProcessSandbox(options.use_amd_specific_policies); case sandbox::mojom::Sandbox::kIme: return std::make_unique<ImeProcessPolicy>(); case sandbox::mojom::Sandbox::kTts: @@ -253,6 +250,7 @@ #endif // !defined(NDEBUG) } break; #if BUILDFLAG(IS_CHROMEOS_ASH) + case sandbox::mojom::Sandbox::kHardwareVideoDecoding: case sandbox::mojom::Sandbox::kIme: case sandbox::mojom::Sandbox::kTts: #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) @@ -273,7 +271,6 @@ break; } } -#endif // !defined(OS_NACL_NONSFI) bool SandboxSeccompBPF::StartSandboxWithExternalPolicy( std::unique_ptr<bpf_dsl::Policy> policy, @@ -303,7 +300,6 @@ return false; } -#if !defined(OS_NACL_NONSFI) std::unique_ptr<bpf_dsl::Policy> SandboxSeccompBPF::GetBaselinePolicy() { #if BUILDFLAG(USE_SECCOMP_BPF) return std::make_unique<BaselinePolicy>(); @@ -311,7 +307,6 @@ return nullptr; #endif // BUILDFLAG(USE_SECCOMP_BPF) } -#endif // !defined(OS_NACL_NONSFI) } // namespace policy } // namespace sandbox
diff --git a/sandbox/policy/linux/sandbox_seccomp_bpf_linux.h b/sandbox/policy/linux/sandbox_seccomp_bpf_linux.h index bfb78ee..bd00970 100644 --- a/sandbox/policy/linux/sandbox_seccomp_bpf_linux.h +++ b/sandbox/policy/linux/sandbox_seccomp_bpf_linux.h
@@ -48,7 +48,6 @@ // Check if the kernel supports seccomp-bpf. static bool SupportsSandbox(); -#if !defined(OS_NACL_NONSFI) // Check if the kernel supports TSYNC (thread synchronization) with seccomp. static bool SupportsSandboxWithTsync(); @@ -61,7 +60,6 @@ // the process if the sandbox failed to engage. static void RunSandboxSanityChecks(sandbox::mojom::Sandbox sandbox_type, const SandboxSeccompBPF::Options& options); -#endif // !defined(OS_NACL_NONSFI) // This is the API to enable a seccomp-bpf sandbox by using an // external policy.
diff --git a/sandbox/policy/mojom/sandbox.mojom b/sandbox/policy/mojom/sandbox.mojom index 0ae81e2..6ee006b 100644 --- a/sandbox/policy/mojom/sandbox.mojom +++ b/sandbox/policy/mojom/sandbox.mojom
@@ -95,6 +95,19 @@ [EnableIf=is_win] kWindowsSystemProxyResolver, + // Used to protect processes that perform hardware video decode acceleration. + // Currently uses the same policy as the GPU process sandbox. Warm-up does + // something different depending on the video acceleration API: for VA-API, we + // open the render node and load libva plus associated libraries (like i965 or + // iHD). For V4L2, we set up the broker process to allow opening certain V4L2 + // devices and we load the libv4l2.so library. + // + // TODO(b/195769334): we're using the GPU process sandbox policy for now as a + // transition step. However, we should create a policy that's tighter just for + // hardware video decoding. + [EnableIf=is_chromeos_ash] + kHardwareVideoDecoding, + // Hosts Input Method Editors. [EnableIf=is_chromeos_ash] kIme,
diff --git a/sandbox/policy/sandbox_type.cc b/sandbox/policy/sandbox_type.cc index 1beb71c..2a5385d 100644 --- a/sandbox/policy/sandbox_type.cc +++ b/sandbox/policy/sandbox_type.cc
@@ -62,6 +62,7 @@ case Sandbox::kNaClLoader: #endif #if BUILDFLAG(IS_CHROMEOS_ASH) + case Sandbox::kHardwareVideoDecoding: case Sandbox::kIme: case Sandbox::kTts: #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) @@ -131,6 +132,7 @@ case Sandbox::kWindowsSystemProxyResolver: #endif // defined(OS_WIN) #if BUILDFLAG(IS_CHROMEOS_ASH) + case Sandbox::kHardwareVideoDecoding: case Sandbox::kIme: case Sandbox::kTts: #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) @@ -271,6 +273,8 @@ return switches::kMirroringSandbox; #endif #if BUILDFLAG(IS_CHROMEOS_ASH) + case Sandbox::kHardwareVideoDecoding: + return switches::kHardwareVideoDecodingSandbox; case Sandbox::kIme: return switches::kImeSandbox; case Sandbox::kTts: @@ -353,6 +357,8 @@ return Sandbox::kVideoCapture; #endif #if BUILDFLAG(IS_CHROMEOS_ASH) + if (sandbox_string == switches::kHardwareVideoDecodingSandbox) + return Sandbox::kHardwareVideoDecoding; if (sandbox_string == switches::kImeSandbox) return Sandbox::kIme; if (sandbox_string == switches::kTtsSandbox)
diff --git a/sandbox/policy/switches.cc b/sandbox/policy/switches.cc index 6e77aff..c7fa0112 100644 --- a/sandbox/policy/switches.cc +++ b/sandbox/policy/switches.cc
@@ -51,6 +51,7 @@ #endif // OS_MAC #if BUILDFLAG(IS_CHROMEOS_ASH) +const char kHardwareVideoDecodingSandbox[] = "hardware_video_decoding"; const char kImeSandbox[] = "ime"; const char kTtsSandbox[] = "tts"; #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
diff --git a/sandbox/policy/switches.h b/sandbox/policy/switches.h index 66ae49b..5a4cb0af 100644 --- a/sandbox/policy/switches.h +++ b/sandbox/policy/switches.h
@@ -52,6 +52,7 @@ #endif // OS_MAC #if BUILDFLAG(IS_CHROMEOS_ASH) +SANDBOX_POLICY_EXPORT extern const char kHardwareVideoDecodingSandbox[]; SANDBOX_POLICY_EXPORT extern const char kImeSandbox[]; SANDBOX_POLICY_EXPORT extern const char kTtsSandbox[]; #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
diff --git a/services/device/generic_sensor/platform_sensor.cc b/services/device/generic_sensor/platform_sensor.cc index a72bff7..c1a3604f 100644 --- a/services/device/generic_sensor/platform_sensor.cc +++ b/services/device/generic_sensor/platform_sensor.cc
@@ -24,11 +24,14 @@ : main_task_runner_(base::SequencedTaskRunnerHandle::Get()), reading_buffer_(reading_buffer), type_(type), - provider_(provider) {} + provider_(provider) { + VLOG(1) << "Platform sensor created. Type " << type_ << "."; +} PlatformSensor::~PlatformSensor() { if (provider_) provider_->RemoveSensor(GetType(), this); + VLOG(1) << "Platform sensor released. Type " << type_ << "."; } mojom::SensorType PlatformSensor::GetType() const {
diff --git a/services/device/hid/hid_service_mac.cc b/services/device/hid/hid_service_mac.cc index 3e70fa7a..45bd75d 100644 --- a/services/device/hid/hid_service_mac.cc +++ b/services/device/hid/hid_service_mac.cc
@@ -80,7 +80,8 @@ } int32_t location_id = GetIntProperty(service, CFSTR(kIOHIDLocationIDKey)); - std::string physical_device_id = base::NumberToString(location_id); + std::string physical_device_id = + location_id == 0 ? "" : base::NumberToString(location_id); return new HidDeviceInfo( entry_id, physical_device_id,
diff --git a/services/shape_detection/BUILD.gn b/services/shape_detection/BUILD.gn index 47c5677..b61237b 100644 --- a/services/shape_detection/BUILD.gn +++ b/services/shape_detection/BUILD.gn
@@ -5,6 +5,8 @@ import("//build/config/chromeos/ui_mode.gni") import("//testing/test.gni") +use_barhopper = is_chrome_branded && (is_chromeos_ash || is_chromeos_lacros) + source_set("lib") { sources = [ "shape_detection_service.cc", @@ -12,16 +14,16 @@ "text_detection_impl.h", ] + deps = [ + "//build:branding_buildflags", + "//build:chromeos_buildflags", + "//mojo/public/cpp/bindings", + "//ui/gfx", + "//ui/gfx/geometry", + ] + if (is_mac) { sources += [ - "barcode_detection_impl_mac.h", - "barcode_detection_impl_mac.mm", - "barcode_detection_impl_mac_vision.h", - "barcode_detection_impl_mac_vision.mm", - "barcode_detection_impl_mac_vision_api.h", - "barcode_detection_impl_mac_vision_api.mm", - "barcode_detection_provider_mac.h", - "barcode_detection_provider_mac.mm", "detection_utils_mac.h", "detection_utils_mac.mm", "face_detection_impl_mac.h", @@ -37,8 +39,6 @@ weak_frameworks = [ "Vision.framework" ] } else if (is_win) { sources += [ - "barcode_detection_provider_impl.cc", - "barcode_detection_provider_impl.h", "detection_utils_win.cc", "detection_utils_win.h", "face_detection_impl_win.cc", @@ -48,40 +48,48 @@ "text_detection_impl_win.cc", "text_detection_impl_win.h", ] - } else if (is_chromeos_ash && is_chrome_branded) { + } else if (is_android) { + # No C++ sources needed, face and text detection is provided by Java. + } else { + sources += [ + "face_detection_provider_impl.cc", + "face_detection_provider_impl.h", + "text_detection_impl.cc", + ] + } + + if (is_mac) { + # On macOS there is a barcode detection API available from the platform. + sources += [ + "barcode_detection_impl_mac.h", + "barcode_detection_impl_mac.mm", + "barcode_detection_impl_mac_vision.h", + "barcode_detection_impl_mac_vision.mm", + "barcode_detection_impl_mac_vision_api.h", + "barcode_detection_impl_mac_vision_api.mm", + "barcode_detection_provider_mac.h", + "barcode_detection_provider_mac.mm", + ] + } else if (is_android) { + # No C++ sources needed, barcode detection is provided by Java. + } else if (use_barhopper) { sources += [ "barcode_detection_impl_barhopper.cc", "barcode_detection_impl_barhopper.h", "barcode_detection_provider_barhopper.cc", "barcode_detection_provider_barhopper.h", - "face_detection_provider_impl.cc", - "face_detection_provider_impl.h", - "text_detection_impl.cc", ] + deps += [ "//third_party/barhopper" ] } else { + # Otherwise, use a stub implementation. sources += [ "barcode_detection_provider_impl.cc", "barcode_detection_provider_impl.h", - "face_detection_provider_impl.cc", - "face_detection_provider_impl.h", - "text_detection_impl.cc", ] } configs += [ "//build/config/compiler:wexit_time_destructors" ] - deps = [ - "//build:branding_buildflags", - "//build:chromeos_buildflags", - "//mojo/public/cpp/bindings", - "//ui/gfx", - "//ui/gfx/geometry", - ] - - if (is_chromeos_ash && is_chrome_branded) { - deps += [ "//third_party/barhopper:barhopper" ] - } - public_deps = [ "//base", "//media/capture", @@ -153,7 +161,7 @@ ] } - if (is_chromeos_ash && is_chrome_branded) { + if (use_barhopper) { sources += [ "barcode_detection_impl_barhopper_unittest.cc" ] }
diff --git a/services/shape_detection/public/mojom/BUILD.gn b/services/shape_detection/public/mojom/BUILD.gn index c0a9ffe..2a75d2d1 100644 --- a/services/shape_detection/public/mojom/BUILD.gn +++ b/services/shape_detection/public/mojom/BUILD.gn
@@ -21,8 +21,8 @@ "//ui/gfx/geometry/mojom", ] - # Platforms except ChromeOS Ash host shape detection in the GPU process. - if (is_chromeos_ash && is_chrome_branded) { + # Platforms except Chrome OS host shape detection in the GPU process. + if ((is_chromeos_ash || is_chromeos_lacros) && is_chrome_branded) { enabled_features = [ "has_shape_detection_utility" ] } }
diff --git a/services/shape_detection/shape_detection_service.cc b/services/shape_detection/shape_detection_service.cc index 542c266f..408955b 100644 --- a/services/shape_detection/shape_detection_service.cc +++ b/services/shape_detection/shape_detection_service.cc
@@ -10,19 +10,6 @@ #include "base/bind.h" #include "build/branding_buildflags.h" #include "build/chromeos_buildflags.h" -#if defined(OS_WIN) -#include "services/shape_detection/barcode_detection_provider_impl.h" -#include "services/shape_detection/face_detection_provider_win.h" -#elif defined(OS_MAC) -#include "services/shape_detection/barcode_detection_provider_mac.h" -#include "services/shape_detection/face_detection_provider_mac.h" -#elif BUILDFLAG(GOOGLE_CHROME_BRANDING) && BUILDFLAG(IS_CHROMEOS_ASH) -#include "services/shape_detection/barcode_detection_provider_barhopper.h" -#include "services/shape_detection/face_detection_provider_impl.h" -#else -#include "services/shape_detection/barcode_detection_provider_impl.h" -#include "services/shape_detection/face_detection_provider_impl.h" -#endif #include "services/shape_detection/text_detection_impl.h" #if defined(OS_ANDROID) @@ -30,6 +17,27 @@ #include "services/shape_detection/shape_detection_jni_headers/InterfaceRegistrar_jni.h" #endif +#if defined(OS_MAC) +#include "services/shape_detection/barcode_detection_provider_mac.h" +#elif defined(OS_ANDROID) +// No C++ code, barcode detection comes from Java. +#elif BUILDFLAG(GOOGLE_CHROME_BRANDING) && \ + (BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)) +#include "services/shape_detection/barcode_detection_provider_barhopper.h" +#else +#include "services/shape_detection/barcode_detection_provider_impl.h" +#endif + +#if defined(OS_WIN) +#include "services/shape_detection/face_detection_provider_win.h" +#elif defined(OS_MAC) +#include "services/shape_detection/face_detection_provider_mac.h" +#elif defined(OS_ANDROID) +// No C++ code, face detection comes from Java. +#else +#include "services/shape_detection/face_detection_provider_impl.h" +#endif + namespace shape_detection { ShapeDetectionService::ShapeDetectionService( @@ -47,7 +55,8 @@ receiver.PassPipe().release().value()); #elif defined(OS_MAC) BarcodeDetectionProviderMac::Create(std::move(receiver)); -#elif BUILDFLAG(GOOGLE_CHROME_BRANDING) && BUILDFLAG(IS_CHROMEOS_ASH) +#elif BUILDFLAG(GOOGLE_CHROME_BRANDING) && \ + (BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)) BarcodeDetectionProviderBarhopper::Create(std::move(receiver)); #else BarcodeDetectionProviderImpl::Create(std::move(receiver));
diff --git a/sql/database.cc b/sql/database.cc index abb88f5..9252e4b 100644 --- a/sql/database.cc +++ b/sql/database.cc
@@ -452,6 +452,8 @@ return base::FilePath(); const char* path = sqlite3_db_filename(db_, "main"); + if (!path) + return base::FilePath(); const base::StringPiece db_path(path); #if defined(OS_WIN) return base::FilePath(base::UTF8ToWide(db_path));
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json index 81827af7..496ea16 100644 --- a/testing/buildbot/chrome.json +++ b/testing/buildbot/chrome.json
@@ -1713,7 +1713,7 @@ { "args": [], "cros_board": "atlas", - "cros_img": "atlas-release/R98-14381.0.0", + "cros_img": "atlas-release/R98-14385.0.0", "name": "lacros_all_tast_tests_ATLAS_LKGM", "resultdb": { "enable": true, @@ -1728,7 +1728,7 @@ { "args": [], "cros_board": "atlas", - "cros_img": "atlas-release/R98-14371.0.0", + "cros_img": "atlas-release/R98-14382.0.0", "name": "lacros_all_tast_tests_ATLAS_DEV", "resultdb": { "enable": true, @@ -1743,7 +1743,7 @@ { "args": [], "cros_board": "atlas", - "cros_img": "atlas-release/R97-14324.27.0", + "cros_img": "atlas-release/R97-14324.33.0", "name": "lacros_all_tast_tests_ATLAS_BETA", "resultdb": { "enable": true, @@ -1773,7 +1773,7 @@ { "args": [], "cros_board": "eve", - "cros_img": "eve-release/R98-14381.0.0", + "cros_img": "eve-release/R98-14385.0.0", "name": "lacros_all_tast_tests_EVE_LKGM", "resultdb": { "enable": true, @@ -1788,7 +1788,7 @@ { "args": [], "cros_board": "eve", - "cros_img": "eve-release/R98-14371.0.0", + "cros_img": "eve-release/R98-14382.0.0", "name": "lacros_all_tast_tests_EVE_DEV", "resultdb": { "enable": true, @@ -1803,7 +1803,7 @@ { "args": [], "cros_board": "eve", - "cros_img": "eve-release/R97-14324.19.0", + "cros_img": "eve-release/R97-14324.33.0", "name": "lacros_all_tast_tests_EVE_BETA", "resultdb": { "enable": true, @@ -1878,7 +1878,7 @@ { "args": [], "cros_board": "kevin", - "cros_img": "kevin-release/R98-14381.0.0", + "cros_img": "kevin-release/R98-14385.0.0", "name": "lacros_all_tast_tests_KEVIN_LKGM", "resultdb": { "enable": true, @@ -1893,7 +1893,7 @@ { "args": [], "cros_board": "kevin", - "cros_img": "kevin-release/R98-14381.0.0", + "cros_img": "kevin-release/R98-14385.0.0", "name": "ozone_unittests_KEVIN_LKGM", "resultdb": { "enable": true, @@ -1907,7 +1907,7 @@ { "args": [], "cros_board": "kevin", - "cros_img": "kevin-release/R98-14381.0.0", + "cros_img": "kevin-release/R98-14385.0.0", "name": "viz_unittests_KEVIN_LKGM", "resultdb": { "enable": true,
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index f78888c..73cdf1f 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -5796,7 +5796,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M96", - "revision": "version:96.0.4664.98" + "revision": "version:96.0.4664.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -5884,7 +5884,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.45" + "revision": "version:97.0.4692.48" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -6060,7 +6060,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M96", - "revision": "version:96.0.4664.98" + "revision": "version:96.0.4664.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -6148,7 +6148,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.45" + "revision": "version:97.0.4692.48" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 26365027..ea10cb96 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -43665,7 +43665,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M96", - "revision": "version:96.0.4664.98" + "revision": "version:96.0.4664.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -43753,7 +43753,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.45" + "revision": "version:97.0.4692.48" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -43929,7 +43929,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M96", - "revision": "version:96.0.4664.98" + "revision": "version:96.0.4664.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -44017,7 +44017,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.45" + "revision": "version:97.0.4692.48" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -44268,7 +44268,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M96", - "revision": "version:96.0.4664.98" + "revision": "version:96.0.4664.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -44356,7 +44356,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.45" + "revision": "version:97.0.4692.48" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -44532,7 +44532,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M96", - "revision": "version:96.0.4664.98" + "revision": "version:96.0.4664.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -44620,7 +44620,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.45" + "revision": "version:97.0.4692.48" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -44871,7 +44871,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M96", - "revision": "version:96.0.4664.98" + "revision": "version:96.0.4664.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -44959,7 +44959,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.45" + "revision": "version:97.0.4692.48" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -45135,7 +45135,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M96", - "revision": "version:96.0.4664.98" + "revision": "version:96.0.4664.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -45223,7 +45223,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.45" + "revision": "version:97.0.4692.48" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index f75378b..cfa3940 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -3758,7 +3758,7 @@ "gtest_tests": [ { "args": [ - "--disable-blink-features=LayoutNG" + "--disable-blink-features=LayoutNG,LayoutNGBlockFragmentation" ], "merge": { "args": [],
diff --git a/testing/buildbot/internal.chromeos.fyi.json b/testing/buildbot/internal.chromeos.fyi.json index 2321bca..107ea06 100644 --- a/testing/buildbot/internal.chromeos.fyi.json +++ b/testing/buildbot/internal.chromeos.fyi.json
@@ -1096,7 +1096,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R98-14381.0.0", + "cros_img": "octopus-release/R98-14385.0.0", "name": "lacros_fyi_tast_tests_OCTOPUS_LKGM", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1107,7 +1107,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R98-14371.0.0", + "cros_img": "octopus-release/R98-14382.0.0", "name": "lacros_fyi_tast_tests_OCTOPUS_DEV", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1118,7 +1118,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R97-14324.27.0", + "cros_img": "octopus-release/R97-14324.33.0", "name": "lacros_fyi_tast_tests_OCTOPUS_BETA", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1140,7 +1140,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R98-14381.0.0", + "cros_img": "octopus-release/R98-14385.0.0", "name": "ozone_unittests_OCTOPUS_LKGM", "swarming": {}, "test": "ozone_unittests", @@ -1150,7 +1150,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R98-14371.0.0", + "cros_img": "octopus-release/R98-14382.0.0", "name": "ozone_unittests_OCTOPUS_DEV", "swarming": {}, "test": "ozone_unittests", @@ -1160,7 +1160,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R97-14324.27.0", + "cros_img": "octopus-release/R97-14324.33.0", "name": "ozone_unittests_OCTOPUS_BETA", "swarming": {}, "test": "ozone_unittests", @@ -1188,7 +1188,7 @@ { "args": [], "cros_board": "kevin", - "cros_img": "kevin-release/R98-14381.0.0", + "cros_img": "kevin-release/R98-14385.0.0", "name": "lacros_all_tast_tests_KEVIN_LKGM", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && \"dep:lacros_unstable\")", @@ -1199,7 +1199,7 @@ { "args": [], "cros_board": "kevin", - "cros_img": "kevin-release/R98-14381.0.0", + "cros_img": "kevin-release/R98-14385.0.0", "name": "ozone_unittests_KEVIN_LKGM", "swarming": {}, "test": "ozone_unittests", @@ -1209,7 +1209,7 @@ { "args": [], "cros_board": "kevin", - "cros_img": "kevin-release/R98-14381.0.0", + "cros_img": "kevin-release/R98-14385.0.0", "name": "viz_unittests_KEVIN_LKGM", "swarming": {}, "test": "viz_unittests",
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 4326e28..db86a6e5 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -4337,7 +4337,7 @@ 'layout_ng_gtests': { 'webkit_unit_tests_ng': { 'args': [ - '--disable-blink-features=LayoutNG' + '--disable-blink-features=LayoutNG,LayoutNGBlockFragmentation' ], 'test': 'blink_unittests', },
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index ca41b87..1b39a8a 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -363,7 +363,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M97', - 'revision': 'version:97.0.4692.45', + 'revision': 'version:97.0.4692.48', } ], }, @@ -387,7 +387,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M96', - 'revision': 'version:96.0.4664.98', + 'revision': 'version:96.0.4664.101', } ], }, @@ -435,7 +435,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M97', - 'revision': 'version:97.0.4692.45', + 'revision': 'version:97.0.4692.48', } ], }, @@ -459,7 +459,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M96', - 'revision': 'version:96.0.4664.98', + 'revision': 'version:96.0.4664.101', } ], }, @@ -507,7 +507,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M97', - 'revision': 'version:97.0.4692.45', + 'revision': 'version:97.0.4692.48', } ], }, @@ -531,7 +531,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M96', - 'revision': 'version:96.0.4664.98', + 'revision': 'version:96.0.4664.101', } ], }, @@ -564,7 +564,7 @@ 'skylab': { 'cros_board': 'atlas', 'cros_chrome_version': '98.0.4738.0', - 'cros_img': 'atlas-release/R98-14381.0.0', + 'cros_img': 'atlas-release/R98-14385.0.0', }, 'enabled': True, 'identifier': 'ATLAS_LKGM', @@ -573,7 +573,7 @@ 'skylab': { 'cros_board': 'atlas', 'cros_chrome_version': '98.0.4723.0', - 'cros_img': 'atlas-release/R98-14371.0.0', + 'cros_img': 'atlas-release/R98-14382.0.0', }, 'enabled': True, 'identifier': 'ATLAS_DEV', @@ -582,7 +582,7 @@ 'skylab': { 'cros_board': 'atlas', 'cros_chrome_version': '97.0.4692.27', - 'cros_img': 'atlas-release/R97-14324.27.0', + 'cros_img': 'atlas-release/R97-14324.33.0', }, 'enabled': True, 'identifier': 'ATLAS_BETA', @@ -600,7 +600,7 @@ 'skylab': { 'cros_board': 'eve', 'cros_chrome_version': '98.0.4738.0', - 'cros_img': 'eve-release/R98-14381.0.0', + 'cros_img': 'eve-release/R98-14385.0.0', }, 'enabled': True, 'identifier': 'EVE_LKGM', @@ -609,7 +609,7 @@ 'skylab': { 'cros_board': 'eve', 'cros_chrome_version': '98.0.4723.0', - 'cros_img': 'eve-release/R98-14371.0.0', + 'cros_img': 'eve-release/R98-14382.0.0', }, 'enabled': True, 'identifier': 'EVE_DEV', @@ -618,7 +618,7 @@ 'skylab': { 'cros_board': 'eve', 'cros_chrome_version': '97.0.4692.27', - 'cros_img': 'eve-release/R97-14324.19.0', + 'cros_img': 'eve-release/R97-14324.33.0', }, 'enabled': True, 'identifier': 'EVE_BETA', @@ -636,7 +636,7 @@ 'skylab': { 'cros_board': 'kevin', 'cros_chrome_version': '98.0.4738.0', - 'cros_img': 'kevin-release/R98-14381.0.0', + 'cros_img': 'kevin-release/R98-14385.0.0', }, 'enabled': True, 'identifier': 'KEVIN_LKGM', @@ -645,7 +645,7 @@ 'skylab': { 'cros_board': 'octopus', 'cros_chrome_version': '98.0.4738.0', - 'cros_img': 'octopus-release/R98-14381.0.0', + 'cros_img': 'octopus-release/R98-14385.0.0', }, 'enabled': True, 'identifier': 'OCTOPUS_LKGM', @@ -654,7 +654,7 @@ 'skylab': { 'cros_board': 'octopus', 'cros_chrome_version': '98.0.4723.0', - 'cros_img': 'octopus-release/R98-14371.0.0', + 'cros_img': 'octopus-release/R98-14382.0.0', }, 'enabled': True, 'identifier': 'OCTOPUS_DEV', @@ -663,7 +663,7 @@ 'skylab': { 'cros_board': 'octopus', 'cros_chrome_version': '97.0.4692.27', - 'cros_img': 'octopus-release/R97-14324.27.0', + 'cros_img': 'octopus-release/R97-14324.33.0', }, 'enabled': True, 'identifier': 'OCTOPUS_BETA',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 35706d23..ac0e81c0 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -190,7 +190,7 @@ { "name": "EnabledWithMessages_20210831", "params": { - "max-number": "10", + "max-number": "100", "site-id": "78FakAwAN0tK1KeaPYj0PoiAHrrQ" }, "enable_features": [
diff --git a/third_party/blink/public/common/frame/event_page_show_persisted.h b/third_party/blink/public/common/frame/event_page_show_persisted.h index 742ef67..6b04fdb 100644 --- a/third_party/blink/public/common/frame/event_page_show_persisted.h +++ b/third_party/blink/public/common/frame/event_page_show_persisted.h
@@ -50,14 +50,10 @@ // RenderView was not live when the IPC was being sent. kYesInBrowserRenderViewNotLive = 11, - // We are sending another persisted=true state change before receiving the ACK - // for the previous one. - kYesInBrowserPendingAck = 12, - // There is not kNoInBrowser as we don't have to compare the counts of // pageshow events without persisted between browser and renderer so far. - kMaxValue = kYesInBrowserPendingAck, + kMaxValue = kYesInBrowserRenderViewNotLive, }; BLINK_COMMON_EXPORT void RecordUMAEventPageShowPersisted(
diff --git a/third_party/blink/public/strings/translations/blink_strings_ky.xtb b/third_party/blink/public/strings/translations/blink_strings_ky.xtb index 9d7a22c..7d4af1b 100644 --- a/third_party/blink/public/strings/translations/blink_strings_ky.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_ky.xtb
@@ -223,7 +223,7 @@ <translation id="7994555495914042081">Тандоо белгисинин сүрөтчөсү</translation> <translation id="8097409774376213335">Ылдый караган жебенин сүрөтчөсү</translation> <translation id="8105750478534334542">Ылдый караган баш бармактын сүрөтчөсү, жаккан жок маанисинде колдонулушу мүмкүн</translation> -<translation id="811583516810654505">Сүрөттөмөсү алынууда…</translation> +<translation id="811583516810654505">Учкай маалымат алынууда…</translation> <translation id="8117451130807776954">Ушул аптада</translation> <translation id="8131955114056917397">0,25</translation> <translation id="8147719583347050106">Google сүрөтчөсү</translation>
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/callback_function.py b/third_party/blink/renderer/bindings/scripts/bind_gen/callback_function.py index 7c07e265..cae8eb9 100644 --- a/third_party/blink/renderer/bindings/scripts/bind_gen/callback_function.py +++ b/third_party/blink/renderer/bindings/scripts/bind_gen/callback_function.py
@@ -251,7 +251,7 @@ body=[ T("v8::HandleScope handle_scope(${isolate});"), T("v8::Context::Scope context_scope(" - "CallbackObject()->GetCreationContextChecked());"), + "callback_relevant_script_state->GetContext());"), T("${exception_state}.ThrowException(" "static_cast<ExceptionCode>(ESErrorType::kError), " "\"The provided callback is no longer runnable.\");"),
diff --git a/third_party/blink/renderer/core/animation/compositor_animations_test.cc b/third_party/blink/renderer/core/animation/compositor_animations_test.cc index 12c803fa..805e6e0f 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations_test.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
@@ -2387,20 +2387,10 @@ Element* target = GetDocument().getElementById("target"); const Animation& animation = *target->GetElementAnimations()->Animations().begin()->key; - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled() || - RuntimeEnabledFeatures::LayoutNGBlockFragmentationEnabled()) { - EXPECT_TRUE(target->GetLayoutObject()->FirstFragment().NextFragment()); - EXPECT_EQ(CompositorAnimations::kTargetHasInvalidCompositingState, - animation.CheckCanStartAnimationOnCompositor( - GetDocument().View()->GetPaintArtifactCompositor())); - } else { - // In pre-CAP + legacy block fragmentation we don't fragment composited - // layers. - EXPECT_FALSE(target->GetLayoutObject()->FirstFragment().NextFragment()); - EXPECT_EQ(CompositorAnimations::kNoFailure, - animation.CheckCanStartAnimationOnCompositor( - GetDocument().View()->GetPaintArtifactCompositor())); - } + EXPECT_TRUE(target->GetLayoutObject()->FirstFragment().NextFragment()); + EXPECT_EQ(CompositorAnimations::kTargetHasInvalidCompositingState, + animation.CheckCanStartAnimationOnCompositor( + GetDocument().View()->GetPaintArtifactCompositor())); } } // namespace blink
diff --git a/third_party/blink/renderer/core/clipboard/data_transfer_item.cc b/third_party/blink/renderer/core/clipboard/data_transfer_item.cc index a1f7fed0..3ed2c4e7 100644 --- a/third_party/blink/renderer/core/clipboard/data_transfer_item.cc +++ b/third_party/blink/renderer/core/clipboard/data_transfer_item.cc
@@ -36,7 +36,7 @@ #include "third_party/blink/renderer/core/clipboard/data_object_item.h" #include "third_party/blink/renderer/core/clipboard/data_transfer.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" -#include "third_party/blink/renderer/core/probe/async_task_id.h" +#include "third_party/blink/renderer/core/probe/async_task_context.h" #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/platform/wtf/functional.h" #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h" @@ -73,15 +73,14 @@ return; ExecutionContext* context = ExecutionContext::From(script_state); - auto task_id = std::make_unique<probe::AsyncTaskId>(); - probe::AsyncTaskScheduled(context, "DataTransferItem.getAsString", - task_id.get()); + auto task_context = std::make_unique<probe::AsyncTaskContext>(); + task_context->Schedule(context, "DataTransferItem.getAsString"); context->GetTaskRunner(TaskType::kUserInteraction) ->PostTask( FROM_HERE, WTF::Bind(&DataTransferItem::RunGetAsStringTask, WrapPersistent(this), WrapPersistent(context), WrapPersistent(callback), - item_->GetAsString(), std::move(task_id))); + item_->GetAsString(), std::move(task_context))); } File* DataTransferItem::getAsFile() const { @@ -99,9 +98,9 @@ ExecutionContext* context, V8FunctionStringCallback* callback, const String& data, - std::unique_ptr<probe::AsyncTaskId> task_id) { + std::unique_ptr<probe::AsyncTaskContext> task_context) { DCHECK(callback); - probe::AsyncTask async_task(context, task_id.get()); + probe::AsyncTask async_task(context, task_context.get()); if (context) callback->InvokeAndReportException(nullptr, data); }
diff --git a/third_party/blink/renderer/core/clipboard/data_transfer_item.h b/third_party/blink/renderer/core/clipboard/data_transfer_item.h index e51f88d..394548e79 100644 --- a/third_party/blink/renderer/core/clipboard/data_transfer_item.h +++ b/third_party/blink/renderer/core/clipboard/data_transfer_item.h
@@ -46,7 +46,7 @@ class ScriptState; namespace probe { -class AsyncTaskId; +class AsyncTaskContext; } class CORE_EXPORT DataTransferItem final : public ScriptWrappable { @@ -72,7 +72,7 @@ void RunGetAsStringTask(ExecutionContext*, V8FunctionStringCallback*, const String& data, - std::unique_ptr<probe::AsyncTaskId>); + std::unique_ptr<probe::AsyncTaskContext>); Member<DataTransfer> data_transfer_; Member<DataObjectItem> item_;
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc index 283eb1d..03f8dd08 100644 --- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc +++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -186,6 +186,13 @@ return EDisplay::kBlock; } +inline bool HasFullNGFragmentationSupport() { + return RuntimeEnabledFeatures::LayoutNGPrintingEnabled() && + RuntimeEnabledFeatures::LayoutNGFlexFragmentationEnabled() && + RuntimeEnabledFeatures::LayoutNGGridFragmentationEnabled() && + RuntimeEnabledFeatures::LayoutNGTableFragmentationEnabled(); +} + } // namespace static EDisplay EquivalentBlockDisplay(EDisplay display) { @@ -1006,16 +1013,17 @@ } } - if (RuntimeEnabledFeatures::LayoutNGBlockFragmentationEnabled()) { + if (!HasFullNGFragmentationSupport()) { // When establishing a block fragmentation context for LayoutNG, we require // that everything fragmentable inside can be laid out by NG natively, since // NG and legacy layout cannot cooperate within the same fragmentation - // context. Set a flag, so that we can quickly determine whether we need to - // check that an element is compatible with the NG block fragmentation - // machinery. + // context. And vice versa (everything inside a legacy fragmentation context + // needs to be legacy objects, in order to be fragmentable). Set a flag, so + // that we can quickly determine whether we need to check that an element is + // compatible with the block fragmentation implementation being used. if (style.SpecifiesColumns() || (element && element->GetDocument().Printing())) - style.SetInsideNGFragmentationContext(true); + style.SetInsideFragmentationContextWithNondeterministicEngine(true); } } } // namespace blink
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 f8962dd..d140b2f 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
@@ -51,16 +51,7 @@ } bool ElementIsComposited(const char* id) { - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return !CcLayersByDOMElementId(RootCcLayer(), id).IsEmpty(); - - auto* element = GetDocument().getElementById(id); - if (!element) - return false; - - auto* box = element->GetLayoutBox(); - return box && box->HasSelfPaintingLayer() && - box->Layer()->GetCompositingState() == kPaintsIntoOwnBacking; + return !CcLayersByDOMElementId(RootCcLayer(), id).IsEmpty(); } // Testing the compositor interaction is not in scope for these unittests. So,
diff --git a/third_party/blink/renderer/core/dom/abort_controller.cc b/third_party/blink/renderer/core/dom/abort_controller.cc index 2039602..bb7e7b6 100644 --- a/third_party/blink/renderer/core/dom/abort_controller.cc +++ b/third_party/blink/renderer/core/dom/abort_controller.cc
@@ -21,11 +21,11 @@ AbortController::~AbortController() = default; void AbortController::abort(ScriptState* script_state) { - ScriptValue reason( - script_state->GetIsolate(), - V8ThrowDOMException::CreateOrEmpty(script_state->GetIsolate(), - DOMExceptionCode::kAbortError, - "signal is aborted without reason")); + v8::Local<v8::Value> dom_exception = V8ThrowDOMException::CreateOrEmpty( + script_state->GetIsolate(), DOMExceptionCode::kAbortError, + "signal is aborted without reason"); + CHECK(!dom_exception.IsEmpty()); + ScriptValue reason(script_state->GetIsolate(), dom_exception); abort(script_state, reason); }
diff --git a/third_party/blink/renderer/core/dom/abort_signal.cc b/third_party/blink/renderer/core/dom/abort_signal.cc index 84e807a..30342e0 100644 --- a/third_party/blink/renderer/core/dom/abort_signal.cc +++ b/third_party/blink/renderer/core/dom/abort_signal.cc
@@ -68,11 +68,11 @@ // static AbortSignal* AbortSignal::abort(ScriptState* script_state) { - ScriptValue reason( - script_state->GetIsolate(), - V8ThrowDOMException::CreateOrEmpty(script_state->GetIsolate(), - DOMExceptionCode::kAbortError, - "signal is aborted without reason")); + v8::Local<v8::Value> dom_exception = V8ThrowDOMException::CreateOrEmpty( + script_state->GetIsolate(), DOMExceptionCode::kAbortError, + "signal is aborted without reason"); + CHECK(!dom_exception.IsEmpty()); + ScriptValue reason(script_state->GetIsolate(), dom_exception); return abort(script_state, reason); } @@ -116,11 +116,11 @@ } void AbortSignal::SignalAbort(ScriptState* script_state) { - ScriptValue reason( - script_state->GetIsolate(), - V8ThrowDOMException::CreateOrEmpty(script_state->GetIsolate(), - DOMExceptionCode::kAbortError, - "signal is aborted without reason")); + v8::Local<v8::Value> dom_exception = V8ThrowDOMException::CreateOrEmpty( + script_state->GetIsolate(), DOMExceptionCode::kAbortError, + "signal is aborted without reason"); + CHECK(!dom_exception.IsEmpty()); + ScriptValue reason(script_state->GetIsolate(), dom_exception); SignalAbort(script_state, reason); }
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index f931569..3aef10a 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -355,9 +355,17 @@ return false; } +inline bool WillCreateMulticolContainer(const ComputedStyle& style) { + // Note that we depend on this returning the truth, i.e. no false positives, + // and no false negatives (which is different from the rest of the legacy + // fallback detection machinery, where false positives are generally + // acceptable). This is an honest attempt to achieve that. + return style.SpecifiesColumns() && style.IsDisplayBlockContainer(); +} + inline bool NeedsLegacyBlockFragmentation(const Element& element, const ComputedStyle& style) { - if (!style.InsideNGFragmentationContext()) + if (!style.InsideFragmentationContextWithNondeterministicEngine()) return false; // If we're inside an NG block fragmentation context, all fragmentable boxes @@ -409,7 +417,7 @@ if (!RuntimeEnabledFeatures::LayoutNGBlockFragmentationEnabled()) { // Disable NG for the entire subtree if we're establishing a multicol // container. - if (style.SpecifiesColumns()) { + if (WillCreateMulticolContainer(style)) { UseCounter::Count(document, WebFeature::kLegacyLayoutByMultiCol); return true; } @@ -4736,7 +4744,7 @@ // even if all the reasons for requiring it in the first place disappear // (e.g. if the only reason was a table, and that table is removed, we'll // still be using legacy layout). - if (new_style.InsideNGFragmentationContext()) { + if (new_style.InsideFragmentationContextWithNondeterministicEngine()) { if (ForceLegacyLayoutInFragmentationContext(new_style)) needs_reattach = true; } @@ -4811,7 +4819,8 @@ walker->SetShouldForceLegacyLayoutForChild(true); walker->SetNeedsReattachLayoutTree(); needs_reattach = true; - if (parent && !parent->GetComputedStyle()->InsideNGFragmentationContext()) + if (parent && !parent->GetComputedStyle() + ->InsideFragmentationContextWithNondeterministicEngine()) return needs_reattach; }
diff --git a/third_party/blink/renderer/core/dom/element_test.cc b/third_party/blink/renderer/core/dom/element_test.cc index ffbaac7..bbd4879 100644 --- a/third_party/blink/renderer/core/dom/element_test.cc +++ b/third_party/blink/renderer/core/dom/element_test.cc
@@ -73,11 +73,6 @@ // compositing inputs clean to be run, and the sticky result shouldn't change. bounding_client_rect = sticky->getBoundingClientRect(); EXPECT_EQ(DocumentLifecycle::kLayoutClean, document.Lifecycle().GetState()); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_TRUE(sticky->GetLayoutBoxModelObject() - ->Layer() - ->NeedsCompositingInputsUpdate()); - } EXPECT_EQ(0, bounding_client_rect->top()); EXPECT_EQ(25, bounding_client_rect->left()); } @@ -118,11 +113,6 @@ // clean to be run, and the sticky result shouldn't change. EXPECT_EQ(scroller->scrollTop(), sticky->OffsetTop()); EXPECT_EQ(DocumentLifecycle::kLayoutClean, document.Lifecycle().GetState()); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_TRUE(sticky->GetLayoutBoxModelObject() - ->Layer() - ->NeedsCompositingInputsUpdate()); - } // Dirty layout again, since |OffsetTop| will have cleaned it. writer->setInnerHTML("<div style='height: 100px; width: 700px;'></div>"); @@ -132,11 +122,6 @@ // Again requesting an offset should cause layout and compositing to be clean. EXPECT_EQ(scroller->scrollLeft() + 25, sticky->OffsetLeft()); EXPECT_EQ(DocumentLifecycle::kLayoutClean, document.Lifecycle().GetState()); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_TRUE(sticky->GetLayoutBoxModelObject() - ->Layer() - ->NeedsCompositingInputsUpdate()); - } } TEST_F(ElementTest, BoundsInViewportCorrectForStickyElementsAfterInsertion) { @@ -176,11 +161,6 @@ // inputs clean to be run, and the sticky result shouldn't change. bounds_in_viewport = sticky->BoundsInViewport(); EXPECT_EQ(DocumentLifecycle::kLayoutClean, document.Lifecycle().GetState()); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_TRUE(sticky->GetLayoutBoxModelObject() - ->Layer() - ->NeedsCompositingInputsUpdate()); - } EXPECT_EQ(0, bounds_in_viewport.y()); EXPECT_EQ(25, bounds_in_viewport.x()); }
diff --git a/third_party/blink/renderer/core/fileapi/file_reader.cc b/third_party/blink/renderer/core/fileapi/file_reader.cc index ed351868..efab466 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader.cc +++ b/third_party/blink/renderer/core/fileapi/file_reader.cc
@@ -95,7 +95,7 @@ if (!controller) return; - probe::AsyncTaskScheduled(context, "FileReader", reader->async_task_id()); + reader->async_task_context()->Schedule(context, "FileReader"); controller->PushReader(reader); } @@ -116,7 +116,7 @@ return; controller->FinishReader(reader, next_step); - probe::AsyncTaskCanceled(context, reader->async_task_id()); + reader->async_task_context()->Cancel(); } explicit ThrottlingController(ExecutionContext& context) @@ -464,7 +464,8 @@ } void FileReader::FireEvent(const AtomicString& type) { - probe::AsyncTask async_task(GetExecutionContext(), async_task_id(), "event"); + probe::AsyncTask async_task(GetExecutionContext(), async_task_context(), + "event"); if (!loader_) { DispatchEvent(*ProgressEvent::Create(type, false, 0, 0)); return;
diff --git a/third_party/blink/renderer/core/fileapi/file_reader.h b/third_party/blink/renderer/core/fileapi/file_reader.h index 6b2f64c..37c079e 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader.h +++ b/third_party/blink/renderer/core/fileapi/file_reader.h
@@ -40,7 +40,7 @@ #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h" -#include "third_party/blink/renderer/core/probe/async_task_id.h" +#include "third_party/blink/renderer/core/probe/async_task_context.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/forward.h" @@ -76,7 +76,7 @@ ReadyState getReadyState() const { return state_; } DOMException* error() { return error_; } V8UnionArrayBufferOrString* result() const; - probe::AsyncTaskId* async_task_id() { return &async_task_id_; } + probe::AsyncTaskContext* async_task_context() { return &async_task_context_; } // ExecutionContextLifecycleObserver void ContextDestroyed() override; @@ -131,7 +131,7 @@ scoped_refptr<BlobDataHandle> blob_data_handle_; FileReaderLoader::ReadType read_type_; String encoding_; - probe::AsyncTaskId async_task_id_; + probe::AsyncTaskContext async_task_context_; std::unique_ptr<FileReaderLoader> loader_; Member<DOMException> error_;
diff --git a/third_party/blink/renderer/core/frame/deprecation.cc b/third_party/blink/renderer/core/frame/deprecation.cc index 504d9bf..e0a1fa2 100644 --- a/third_party/blink/renderer/core/frame/deprecation.cc +++ b/third_party/blink/renderer/core/frame/deprecation.cc
@@ -694,11 +694,15 @@ return DeprecationInfo::WithDetails( "WebFeature::kDocumentDomainSettingWithoutOriginAgentClusterHeader", kM101, - "Relaxing the same-origin policy by setting \"document.domain\" is " - "deprecated, and will be disabled by default in M101. " - "To continue use this feature, please opt-out of origin-keyed agent " - "clusters by sending a `Origin-Agent-Cluster: ?0` header along " - "with the HTTP response for the document."); + String::Format( + "Relaxing the same-origin policy by setting \"document.domain\" " + "is deprecated, and will be disabled by default in %s. To " + "continue using this feature, please opt-out of origin-keyed " + "agent clusters by sending an `Origin-Agent-Cluster: ?0` header " + "along with the HTTP response for the document. See " + "https://developer.chrome.com/blog/immutable-document-domain for " + "more details.", + MilestoneString(kM101).Ascii().c_str())); // Features that aren't deprecated don't have a deprecation message. default:
diff --git a/third_party/blink/renderer/core/frame/frame_overlay_test.cc b/third_party/blink/renderer/core/frame/frame_overlay_test.cc index ccaa13b..1dda2cc2 100644 --- a/third_party/blink/renderer/core/frame/frame_overlay_test.cc +++ b/third_party/blink/renderer/core/frame/frame_overlay_test.cc
@@ -98,7 +98,7 @@ // Ideally, we would get results from the compositor that showed that this // page overlay actually winds up getting drawn on top of the rest. - // For now, we just check that the GraphicsLayer will draw the right thing. + // For now, we just check that we drew the right thing. MockFrameOverlayCanvas canvas; EXPECT_CALL(canvas, onDrawRect(SkRect::MakeWH(kViewportWidth, kViewportHeight),
diff --git a/third_party/blink/renderer/core/frame/history.cc b/third_party/blink/renderer/core/frame/history.cc index 9cbeb884..ae6fc0d 100644 --- a/third_party/blink/renderer/core/frame/history.cc +++ b/third_party/blink/renderer/core/frame/history.cc
@@ -61,6 +61,13 @@ "fully active"); return 0; } + + // TODO(crbug.com/1277593): Remove this condition when Fenced Frames + // transition to MPArch completely + if (DomWindow()->GetFrame()->IsInFencedFrameTree()) { + return 1; + } + return DomWindow()->GetFrame()->Client()->BackForwardLength(); }
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index ebce19f..5f2a765 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -326,7 +326,6 @@ visitor->Trace(viewport_scrollable_area_); visitor->Trace(anchoring_adjustment_queue_); visitor->Trace(scroll_event_queue_); - visitor->Trace(pre_composited_layers_); visitor->Trace(layout_shift_tracker_); visitor->Trace(paint_timing_detector_); visitor->Trace(mobile_friendliness_checker_); @@ -1759,13 +1758,8 @@ base_background_color_ = background_color; - if (auto* layout_view = GetLayoutView()) { - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - if (auto* mapping = layout_view->Layer()->GetCompositedLayerMapping()) - mapping->UpdateContentsOpaque(); - } + if (auto* layout_view = GetLayoutView()) layout_view->SetBackgroundNeedsFullPaintInvalidation(); - } if (!ShouldThrottleRendering()) GetPage()->Animator().ScheduleVisualUpdate(frame_.Get()); @@ -2972,108 +2966,55 @@ bool repainted = false; bool needs_clear_repaint_flags = false; - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - // TODO(paint-dev): We should be able to get rid of AddController entirely - // after non-CAP code is removed. The call to EnsurePaintController() will - // need to be moved up the call stack. - EnsurePaintController(); - cycle_scope.AddController(*paint_controller_); + // TODO(paint-dev): We should be able to get rid of AddController entirely + // after non-CAP code is removed. The call to EnsurePaintController() will + // need to be moved up the call stack. + EnsurePaintController(); + cycle_scope.AddController(*paint_controller_); - PaintChunkSubset previous_chunks( - paint_controller_->GetPaintArtifactShared()); + PaintChunkSubset previous_chunks(paint_controller_->GetPaintArtifactShared()); - PaintController::ScopedBenchmarkMode scoped_benchmark(*paint_controller_, - benchmark_mode); + PaintController::ScopedBenchmarkMode scoped_benchmark(*paint_controller_, + benchmark_mode); - if (paint_controller_->ShouldForcePaintForBenchmark() || - GetLayoutView()->Layer()->SelfOrDescendantNeedsRepaint() || - visual_viewport_or_overlay_needs_repaint_) { - GraphicsContext graphics_context(*paint_controller_); - - // Draw the overlay layer (video or WebXR DOM overlay) if present. - if (PaintLayer* full_screen_layer = GetFullScreenOverlayLayer()) { - PaintLayerPainter(*full_screen_layer) - .Paint(graphics_context, CullRect::Infinite(), - kGlobalPaintNormalPhase, 0); - } else { - PaintInternal(graphics_context, kGlobalPaintNormalPhase, - CullRect::Infinite()); - - GetPage()->GetValidationMessageClient().PaintOverlay(graphics_context); - ForAllNonThrottledLocalFrameViews( - [&graphics_context](LocalFrameView& view) { - view.frame_->PaintFrameColorOverlay(graphics_context); - }); - - // Devtools overlays query the inspected page's paint data so this - // update needs to be after other paintings. - if (auto* web_local_frame_impl = WebLocalFrameImpl::FromFrame(frame_)) - web_local_frame_impl->PaintDevToolsOverlays(graphics_context); - - if (frame_->IsMainFrame()) - GetPage()->GetVisualViewport().Paint(graphics_context); - } - - // Link highlights paint after all other paintings. - GetPage()->GetLinkHighlight().Paint(graphics_context); - - paint_controller_->CommitNewDisplayItems(); - - repainted = true; - PaintChunkSubset repainted_chunks = - PaintChunkSubset(paint_controller_->GetPaintArtifactShared()); - if (paint_artifact_compositor_) { - paint_artifact_compositor_->SetNeedsFullUpdateAfterPaintIfNeeded( - previous_chunks, repainted_chunks); - } - - // As if we created a root layer containing all paintings which needs full - // layerization. - pre_composited_layers_ = {{repainted_chunks}}; - } - } else { - // A null graphics layer can occur for painting of SVG images that are not - // parented into the main frame tree, or when the LocalFrameView is the main - // frame view of a page overlay. The page overlay is in the layer tree of - // the host page and will be painted during painting of the host page. - // Note that paint_controller_ is not added to cycle_scope, because it is - // transient and may be deleted before cycle_scope. - paint_controller_ = - std::make_unique<PaintController>(PaintController::kTransient); - pre_composited_layers_.clear(); + if (paint_controller_->ShouldForcePaintForBenchmark() || + GetLayoutView()->Layer()->SelfOrDescendantNeedsRepaint() || + visual_viewport_or_overlay_needs_repaint_) { GraphicsContext graphics_context(*paint_controller_); - if (GraphicsLayer* root = - layout_view->Compositor()->PaintRootGraphicsLayer()) { - { - // We use a separate CycleScope because paint_controller_ will be - // deleted before the cycle_scope argument to PaintTree. - PaintController::CycleScope transient_cycle_scope( - *paint_controller_, PaintDebugInfoEnabled()); - repainted = - root->PaintRecursively(graphics_context, pre_composited_layers_, - cycle_scope, benchmark_mode); - if (visual_viewport_or_overlay_needs_repaint_ && - paint_artifact_compositor_) - paint_artifact_compositor_->SetNeedsUpdate(); - - { - PaintChunkSubsetRecorder subset_recorder(*paint_controller_); - if (root == GetLayoutView()->Compositor()->RootGraphicsLayer() && - frame_->IsMainFrame()) { - GetPage()->GetVisualViewport().Paint(graphics_context); - } - // Link highlights paint after all other layers. - GetPage()->GetLinkHighlight().Paint(graphics_context); - pre_composited_layers_.push_back( - PreCompositedLayerInfo{subset_recorder.Get()}); - } - - paint_controller_->CommitNewDisplayItems(); - } - paint_controller_ = nullptr; + // Draw the overlay layer (video or WebXR DOM overlay) if present. + if (PaintLayer* full_screen_layer = GetFullScreenOverlayLayer()) { + PaintLayerPainter(*full_screen_layer) + .Paint(graphics_context, CullRect::Infinite(), + kGlobalPaintNormalPhase, 0); } else { - needs_clear_repaint_flags = true; + PaintInternal(graphics_context, kGlobalPaintNormalPhase, + CullRect::Infinite()); + + GetPage()->GetValidationMessageClient().PaintOverlay(graphics_context); + ForAllNonThrottledLocalFrameViews( + [&graphics_context](LocalFrameView& view) { + view.frame_->PaintFrameColorOverlay(graphics_context); + }); + + // Devtools overlays query the inspected page's paint data so this + // update needs to be after other paintings. + if (auto* web_local_frame_impl = WebLocalFrameImpl::FromFrame(frame_)) + web_local_frame_impl->PaintDevToolsOverlays(graphics_context); + + if (frame_->IsMainFrame()) + GetPage()->GetVisualViewport().Paint(graphics_context); + } + + // Link highlights paint after all other paintings. + GetPage()->GetLinkHighlight().Paint(graphics_context); + + paint_controller_->CommitNewDisplayItems(); + + repainted = true; + if (paint_artifact_compositor_) { + paint_artifact_compositor_->SetNeedsFullUpdateAfterPaintIfNeeded( + previous_chunks, paint_controller_->GetPaintArtifactShared()); } } @@ -3149,7 +3090,8 @@ // invalidations if possible. if (!paint_artifact_compositor_->NeedsUpdate()) { if (repainted) { - paint_artifact_compositor_->UpdateRepaintedLayers(pre_composited_layers_); + paint_artifact_compositor_->UpdateRepaintedLayers( + paint_controller_->GetPaintArtifactShared()); CreatePaintTimelineEvents(); } // TODO(pdr): Should we clear the property tree state change bits ( @@ -3200,8 +3142,8 @@ AppendDocumentTransitionRequests(document_transition_requests); paint_artifact_compositor_->Update( - pre_composited_layers_, viewport_properties, scroll_translation_nodes, - std::move(document_transition_requests)); + paint_controller_->GetPaintArtifactShared(), viewport_properties, + scroll_translation_nodes, std::move(document_transition_requests)); CreatePaintTimelineEvents(); } @@ -4223,19 +4165,13 @@ AllowThrottlingScope allow_throttling(*this); Lifecycle().AdvanceTo(DocumentLifecycle::kInPaint); OverriddenCullRectScope force_cull_rect(*GetLayoutView()->Layer(), cull_rect); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - PaintController& paint_controller = EnsurePaintController(); - if (GetLayoutView()->Layer()->SelfOrDescendantNeedsRepaint()) { - PaintController::CycleScope cycle_scope(paint_controller); - GraphicsContext graphics_context(paint_controller); - Paint(graphics_context, kGlobalPaintNormalPhase, cull_rect, - gfx::Vector2d()); - paint_controller.CommitNewDisplayItems(); - } - } else { - GraphicsLayer* graphics_layer = - GetLayoutView()->Layer()->GraphicsLayerBacking(); - graphics_layer->PaintForTesting(cull_rect.Rect(), PaintDebugInfoEnabled()); + PaintController& paint_controller = EnsurePaintController(); + if (GetLayoutView()->Layer()->SelfOrDescendantNeedsRepaint()) { + PaintController::CycleScope cycle_scope(paint_controller); + GraphicsContext graphics_context(paint_controller); + Paint(graphics_context, kGlobalPaintNormalPhase, cull_rect, + gfx::Vector2d()); + paint_controller.CommitNewDisplayItems(); } Lifecycle().AdvanceTo(DocumentLifecycle::kPaintClean); }
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h index 0973f55..063f2ba 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -112,7 +112,6 @@ struct MobileFriendliness; struct PhysicalOffset; struct PhysicalRect; -struct PreCompositedLayerInfo; enum class PaintBenchmarkMode; @@ -1148,7 +1147,6 @@ // frame updates and repaints. std::unique_ptr<PaintController> paint_controller_; std::unique_ptr<PaintArtifactCompositor> paint_artifact_compositor_; - HeapVector<PreCompositedLayerInfo> pre_composited_layers_; MainThreadScrollingReasons main_thread_scrolling_reasons_;
diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay.cc b/third_party/blink/renderer/core/frame/window_controls_overlay.cc index 96b8f2b..980fc17 100644 --- a/third_party/blink/renderer/core/frame/window_controls_overlay.cc +++ b/third_party/blink/renderer/core/frame/window_controls_overlay.cc
@@ -60,7 +60,7 @@ ->IsWindowControlsOverlayVisible(); } -DOMRect* WindowControlsOverlay::getBoundingClientRect() const { +DOMRect* WindowControlsOverlay::getTitlebarAreaRect() const { if (!GetSupplementable()->DomWindow()) return DOMRect::Create(0, 0, 0, 0);
diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay.h b/third_party/blink/renderer/core/frame/window_controls_overlay.h index 0a6d722..24d4eaa6 100644 --- a/third_party/blink/renderer/core/frame/window_controls_overlay.h +++ b/third_party/blink/renderer/core/frame/window_controls_overlay.h
@@ -42,7 +42,7 @@ DEFINE_ATTRIBUTE_EVENT_LISTENER(geometrychange, kGeometrychange) bool visible() const; - DOMRect* getBoundingClientRect() const; + DOMRect* getTitlebarAreaRect() const; void WindowControlsOverlayChanged(const gfx::Rect& rect);
diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay.idl b/third_party/blink/renderer/core/frame/window_controls_overlay.idl index 0315cf1c..bcfb857 100644 --- a/third_party/blink/renderer/core/frame/window_controls_overlay.idl +++ b/third_party/blink/renderer/core/frame/window_controls_overlay.idl
@@ -9,6 +9,6 @@ Exposed=Window ] interface WindowControlsOverlay : EventTarget { readonly attribute boolean visible; - DOMRect getBoundingClientRect(); + DOMRect getTitlebarAreaRect(); attribute EventHandler ongeometrychange; };
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element_test.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element_test.cc index ca1a4e9..457ace6 100644 --- a/third_party/blink/renderer/core/html/canvas/html_canvas_element_test.cc +++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element_test.cc
@@ -43,30 +43,18 @@ EXPECT_EQ(CompositingReason::kNone, layer->DirectCompositingReasons()); EXPECT_FALSE(layer->GetLayoutObject().NeedsPaintPropertyUpdate()); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_FALSE(layer->SelfNeedsRepaint()); - } else { - EXPECT_FALSE(layer->NeedsCompositingInputsUpdate()); - } + EXPECT_FALSE(layer->SelfNeedsRepaint()); canvas->CreateLayer(); EXPECT_TRUE(layer->GetLayoutObject().NeedsPaintPropertyUpdate()); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_TRUE(layer->SelfNeedsRepaint()); - } else { - EXPECT_TRUE(layer->NeedsCompositingInputsUpdate()); - } + EXPECT_TRUE(layer->SelfNeedsRepaint()); UpdateAllLifecyclePhasesForTest(); ASSERT_EQ(layer, To<LayoutBoxModelObject>(canvas->GetLayoutObject())->Layer()); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_TRUE(layer->GetLayoutObject() - .FirstFragment() - .PaintProperties() - ->PaintOffsetTranslation() - ->HasDirectCompositingReasons()); - } else { - EXPECT_EQ(CompositingReason::kCanvas, layer->DirectCompositingReasons()); - } + EXPECT_TRUE(layer->GetLayoutObject() + .FirstFragment() + .PaintProperties() + ->PaintOffsetTranslation() + ->HasDirectCompositingReasons()); } TEST_P(HTMLCanvasElementTest, CanvasInvalidation) {
diff --git a/third_party/blink/renderer/core/html/media/html_video_element_test.cc b/third_party/blink/renderer/core/html/media/html_video_element_test.cc index 2b509917..4186a5b 100644 --- a/third_party/blink/renderer/core/html/media/html_video_element_test.cc +++ b/third_party/blink/renderer/core/html/media/html_video_element_test.cc
@@ -163,40 +163,22 @@ ASSERT_TRUE(video()->GetLayoutObject()->HasLayer()); auto* paint_layer = To<LayoutBoxModelObject>(video()->GetLayoutObject())->Layer(); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - EXPECT_TRUE(paint_layer->SelfNeedsRepaint()); - else - EXPECT_TRUE(paint_layer->NeedsCompositingInputsUpdate()); + EXPECT_TRUE(paint_layer->SelfNeedsRepaint()); UpdateAllLifecyclePhasesForTest(); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - EXPECT_FALSE(paint_layer->SelfNeedsRepaint()); - else - EXPECT_FALSE(paint_layer->NeedsCompositingInputsUpdate()); + EXPECT_FALSE(paint_layer->SelfNeedsRepaint()); // Change to another cc layer. auto layer2 = cc::Layer::Create(); SetFakeCcLayer(layer2.get()); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - EXPECT_TRUE(paint_layer->SelfNeedsRepaint()); - else - EXPECT_TRUE(paint_layer->NeedsCompositingInputsUpdate()); + EXPECT_TRUE(paint_layer->SelfNeedsRepaint()); UpdateAllLifecyclePhasesForTest(); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - EXPECT_FALSE(paint_layer->SelfNeedsRepaint()); - else - EXPECT_FALSE(paint_layer->NeedsCompositingInputsUpdate()); + EXPECT_FALSE(paint_layer->SelfNeedsRepaint()); // Remove cc layer. SetFakeCcLayer(nullptr); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - EXPECT_TRUE(paint_layer->SelfNeedsRepaint()); - else - EXPECT_TRUE(paint_layer->NeedsCompositingInputsUpdate()); + EXPECT_TRUE(paint_layer->SelfNeedsRepaint()); UpdateAllLifecyclePhasesForTest(); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - EXPECT_FALSE(paint_layer->SelfNeedsRepaint()); - else - EXPECT_FALSE(paint_layer->NeedsCompositingInputsUpdate()); + EXPECT_FALSE(paint_layer->SelfNeedsRepaint()); } TEST_P(HTMLVideoElementTest, HasAvailableVideoFrameChecksWMP) {
diff --git a/third_party/blink/renderer/core/layout/floating_objects.cc b/third_party/blink/renderer/core/layout/floating_objects.cc index 5b2c9f9..becd391 100644 --- a/third_party/blink/renderer/core/layout/floating_objects.cc +++ b/third_party/blink/renderer/core/layout/floating_objects.cc
@@ -101,16 +101,6 @@ new_obj->SetShouldPaint(!layout_object->HasSelfPaintingLayer()); new_obj->SetIsDescendant(true); - - // We set SelfPaintingStatusChanged in case we get to the next compositing - // update and still haven't decided who should paint the float. If we've - // decided that the current float owner can paint it that step is unnecessary, - // so we can clear it now. - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled() && - new_obj->ShouldPaint() && layout_object->Layer() && - layout_object->Layer()->SelfPaintingStatusChanged()) - layout_object->Layer()->ClearSelfPaintingStatusChanged(); - return new_obj; }
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow_test.cc b/third_party/blink/renderer/core/layout/layout_block_flow_test.cc index ba3e6853..57318092 100644 --- a/third_party/blink/renderer/core/layout/layout_block_flow_test.cc +++ b/third_party/blink/renderer/core/layout/layout_block_flow_test.cc
@@ -24,8 +24,6 @@ LayoutBlockFlow* kbd = To<LayoutBlockFlow>(GetLayoutObjectByElementId("kbd")); // The parent should be NG. ASSERT_TRUE(kbd->Parent()->IsLayoutNGBlockFlow()); - if (!RuntimeEnabledFeatures::LayoutNGBlockFragmentationEnabled()) - ASSERT_FALSE(kbd->IsLayoutNGBlockFlow()); // Should be legacy. ASSERT_TRUE(kbd->CreatesNewFormattingContext()); UpdateAllLifecyclePhasesForTest(); GetElementById("text")->setAttribute("font-size", "100");
diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object_test.cc b/third_party/blink/renderer/core/layout/layout_box_model_object_test.cc index 7d5d4fa..b1c18a6d 100644 --- a/third_party/blink/renderer/core/layout/layout_box_model_object_test.cc +++ b/third_party/blink/renderer/core/layout/layout_box_model_object_test.cc
@@ -1283,39 +1283,4 @@ EXPECT_TRUE(option_layout->StyleRef().HasCurrentOpacityAnimation()); } -// Tests that contain: layout changes cause compositing inputs update. -TEST_P(LayoutBoxModelObjectTest, - LayoutContainmentChangeCausesCompositingInputsUpdate) { - // NearestContainedLayoutLayer() is not used in CompositeAfterPaint. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - - SetBodyInnerHTML(R"HTML( - <style> - /* ensure we retain the paint layer after removing .contained class. */ - div { position: relative; } - .contained { contain: layout; } - </style> - <div id=target class=contained></div> - <div id=unrelated class=contained></div> - )HTML"); - auto* target = GetLayoutBoxModelObjectByElementId("target"); - ASSERT_TRUE(target->Layer()); - - EXPECT_FALSE(target->Layer()->NeedsCompositingInputsUpdate()); - EXPECT_EQ(target->Layer(), target->Layer()->NearestContainedLayoutLayer()); - - To<HTMLElement>(target->GetNode())->classList().Remove("contained"); - GetDocument().View()->UpdateLifecycleToLayoutClean( - DocumentUpdateReason::kTest); - - EXPECT_TRUE(target->Layer()->NeedsCompositingInputsUpdate()); - - // After updating compositing inputs we should have no contained layer - // ancestors. - UpdateAllLifecyclePhasesForTest(); - ASSERT_TRUE(target->Layer()); - EXPECT_FALSE(target->Layer()->NeedsCompositingInputsUpdate()); - EXPECT_EQ(nullptr, target->Layer()->NearestContainedLayoutLayer()); -} } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc index 43b4f5e..2b40dff2 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.cc +++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -544,7 +544,8 @@ LayoutBlockFlow* anonymous_box; if (!before_child) { anonymous_box = DynamicTo<LayoutBlockFlow>(LastChild()); - } else if (before_child->IsInline()) { + } else if (before_child->IsInline() || + before_child->IsFloatingOrOutOfFlowPositioned()) { anonymous_box = DynamicTo<LayoutBlockFlow>(before_child->PreviousSibling()); } else {
diff --git a/third_party/blink/renderer/core/layout/layout_inline_test.cc b/third_party/blink/renderer/core/layout/layout_inline_test.cc index 6e513c4..40f84c2 100644 --- a/third_party/blink/renderer/core/layout/layout_inline_test.cc +++ b/third_party/blink/renderer/core/layout/layout_inline_test.cc
@@ -108,6 +108,54 @@ EXPECT_FALSE(split_inline_part2->Continuation()); } +TEST_F(LayoutInlineTest, BlockInInlineRemove) { + if (!RuntimeEnabledFeatures::LayoutNGEnabled()) + return; + ScopedLayoutNGBlockInInlineForTest ng_block_in_inline(true); + SetBodyInnerHTML(R"HTML( + <div> + <span id="span">before + <div id="block"></div> + after</span> + </div> + )HTML"); + + // Check `#block` is in an anonymous block. + const auto* span = GetLayoutObjectByElementId("span"); + Element* block_element = GetElementById("block"); + const auto* block = block_element->GetLayoutObject(); + EXPECT_FALSE(block->IsInline()); + EXPECT_TRUE(block->Parent()->IsBlockInInline()); + EXPECT_EQ(block->Parent()->Parent(), span); + + // Remove `#block`. All children are now inline. + // Check if the |IsBlockInInline| anonymous block was removed. + Node* after_block = block_element->nextSibling(); + block_element->remove(); + UpdateAllLifecyclePhasesForTest(); + for (const auto* child = span->SlowFirstChild(); child; + child = child->NextSibling()) { + EXPECT_TRUE(child->IsInline()); + EXPECT_FALSE(child->IsBlockInInline()); + } + + // Re-insert `#block`. + after_block->parentNode()->insertBefore(block_element, after_block); + UpdateAllLifecyclePhasesForTest(); + block = block_element->GetLayoutObject(); + EXPECT_FALSE(block->IsInline()); + EXPECT_TRUE(block->Parent()->IsBlockInInline()); + EXPECT_EQ(block->Parent()->Parent(), span); + + // Insert another block before the "after" text node. + // This should be in the existing anonymous block, next to the `#block`. + Document& document = GetDocument(); + Element* block2_element = document.CreateElementForBinding("div"); + after_block->parentNode()->insertBefore(block2_element, after_block); + UpdateAllLifecyclePhasesForTest(); + EXPECT_EQ(block2_element->GetLayoutObject(), block->NextSibling()); +} + TEST_F(LayoutInlineTest, RegionHitTest) { SetBodyInnerHTML(R"HTML( <div><span id='lotsOfBoxes'>
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc index 46144f13..7947f04 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
@@ -3773,19 +3773,22 @@ if (row_has_container_separation && item_row_set_index < breakpoint_row_set_index) { + const auto break_between = row_break_between[item_row_set_index]; + // The row may have a forced break, move it to the next fragmentainer. - if (IsForcedBreakValue(ConstraintSpace(), - row_break_between[item_row_set_index])) { + if (IsForcedBreakValue(ConstraintSpace(), break_between)) { container_builder_.SetHasForcedBreak(); breakpoint_row_set_index = item_row_set_index; continue; } - // TODO(ikilpatrick): Implement a grid specific version of - // |CalculateBreakAppealBefore| to pass into |MovePastBreakpoint|. + container_builder_.SetPreviousBreakAfter(break_between); + const NGBreakAppeal appeal_before = CalculateBreakAppealBefore( + ConstraintSpace(), grid_item.node, *result, container_builder_, + row_has_container_separation); if (!MovePastBreakpoint(ConstraintSpace(), grid_item.node, *result, - fragment_relative_block_offset, - kBreakAppealPerfect, /* builder */ nullptr)) { + fragment_relative_block_offset, appeal_before, + /* builder */ nullptr)) { // TODO(ikilpatrick): We may have break-before:avoid on this row, we // should search upwards (ensuring that we are still in this // fragmentainer), for the first row with the highest break appeal.
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_root_test.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_root_test.cc index c6ba5e4..fb98878f 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_root_test.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_root_test.cc
@@ -142,10 +142,7 @@ "will-change: transform"); UpdateAllLifecyclePhasesForTest(); ASSERT_TRUE(root.Layer()); - // In pre-CAP we force the SVG root to be self-painting layer to ensure - // correct compositing of descendants, which is not needed in CAP. - EXPECT_EQ(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled(), - root.Layer()->IsSelfPaintingLayer()); + EXPECT_FALSE(root.Layer()->IsSelfPaintingLayer()); GetDocument().getElementById("rect")->removeAttribute("style"); UpdateAllLifecyclePhasesForTest(); @@ -153,88 +150,4 @@ EXPECT_FALSE(root.Layer()->IsSelfPaintingLayer()); } -TEST_P(LayoutSVGRootTest, HasDescendantCompositingReasons) { - // The tested code is not used in CompositeAfterPaint. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - - SetBodyInnerHTML(R"HTML( - <svg id="root" style="width: 200px; height: 200px;"> - <rect id="rect" width="100" height="100" fill="green"/> - <text id="text" x="10" y="30"> - text - <tspan id="tspan">tspan</tspan> - </text> - </svg> - )HTML"); - - const auto& root = *To<LayoutSVGRoot>(GetLayoutObjectByElementId("root")); - EXPECT_FALSE(root.HasDescendantCompositingReasons()); - - GetDocument().getElementById("rect")->setAttribute("style", - "will-change: transform"); - UpdateAllLifecyclePhasesForTest(); - EXPECT_TRUE(root.HasDescendantCompositingReasons()); - GetDocument().getElementById("rect")->removeAttribute("style"); - UpdateAllLifecyclePhasesForTest(); - EXPECT_FALSE(root.HasDescendantCompositingReasons()); - - GetDocument().getElementById("rect")->setAttribute( - "style", "backdrop-filter: invert(100%)"); - UpdateAllLifecyclePhasesForTest(); - EXPECT_TRUE(root.HasDescendantCompositingReasons()); - GetDocument().getElementById("rect")->removeAttribute("style"); - UpdateAllLifecyclePhasesForTest(); - EXPECT_FALSE(root.HasDescendantCompositingReasons()); - - GetDocument().getElementById("text")->setAttribute("style", - "will-change: transform"); - UpdateAllLifecyclePhasesForTest(); - EXPECT_TRUE(root.HasDescendantCompositingReasons()); - GetDocument().getElementById("text")->removeAttribute("style"); - UpdateAllLifecyclePhasesForTest(); - EXPECT_FALSE(root.HasDescendantCompositingReasons()); - - GetDocument().getElementById("tspan")->setAttribute("style", - "will-change: transform"); - UpdateAllLifecyclePhasesForTest(); - EXPECT_TRUE(root.HasDescendantCompositingReasons()); - GetDocument().getElementById("tspan")->removeAttribute("style"); - UpdateAllLifecyclePhasesForTest(); - EXPECT_FALSE(root.HasDescendantCompositingReasons()); - - GetDocument().getElementById("tspan")->setAttribute( - "style", "backdrop-filter: invert(100%)"); - UpdateAllLifecyclePhasesForTest(); - EXPECT_TRUE(root.HasDescendantCompositingReasons()); - GetDocument().getElementById("tspan")->removeAttribute("style"); - UpdateAllLifecyclePhasesForTest(); - EXPECT_FALSE(root.HasDescendantCompositingReasons()); -} - -TEST_P(LayoutSVGRootTest, CompositedSVGMetric) { - // The tested code is not used in CompositeAfterPaint. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - - SetBodyInnerHTML(R"HTML( - <style> - .anim { animation: anim 5s infinite; } - @keyframes anim { - from { transform: translateX(0); } - to { transform: translateX(100px); } - } - </style> - <svg style="width: 200px; height: 200px;"> - <rect id="rect" width="100" height="100" fill="green"/> - </svg> - )HTML"); - - EXPECT_FALSE(GetDocument().IsUseCounted(WebFeature::kCompositedSVG)); - auto* rect = GetDocument().getElementById("rect"); - rect->setAttribute(html_names::kClassAttr, "anim"); - UpdateAllLifecyclePhasesForTest(); - EXPECT_TRUE(GetDocument().IsUseCounted(WebFeature::kCompositedSVG)); -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/loader/image_loader.cc b/third_party/blink/renderer/core/loader/image_loader.cc index 7cf8adf3..e3abd40 100644 --- a/third_party/blink/renderer/core/loader/image_loader.cc +++ b/third_party/blink/renderer/core/loader/image_loader.cc
@@ -52,7 +52,7 @@ #include "third_party/blink/renderer/core/loader/importance_attribute.h" #include "third_party/blink/renderer/core/loader/lazy_image_helper.h" #include "third_party/blink/renderer/core/loader/subresource_redirect_util.h" -#include "third_party/blink/renderer/core/probe/async_task_id.h" +#include "third_party/blink/renderer/core/probe/async_task_context.h" #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/core/svg/graphics/svg_image.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" @@ -124,7 +124,7 @@ update_behavior_(update_behavior), referrer_policy_(referrer_policy) { ExecutionContext* context = loader_->GetElement()->GetExecutionContext(); - probe::AsyncTaskScheduled(context, "Image", &async_task_id_); + async_task_context_.Schedule(context, "Image"); world_ = context->GetCurrentWorld(); } @@ -132,7 +132,7 @@ if (!loader_) return; ExecutionContext* context = loader_->GetElement()->GetExecutionContext(); - probe::AsyncTask async_task(context, &async_task_id_); + probe::AsyncTask async_task(context, &async_task_context_); loader_->DoUpdateFromElement(world_, update_behavior_, referrer_policy_); } @@ -149,7 +149,7 @@ scoped_refptr<const DOMWrapperWorld> world_; network::mojom::ReferrerPolicy referrer_policy_; - probe::AsyncTaskId async_task_id_; + probe::AsyncTaskContext async_task_context_; base::WeakPtrFactory<Task> weak_factory_{this}; };
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc index 7b43971..3116b6b 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc
@@ -822,16 +822,10 @@ TouchAction::kPanY); EXPECT_EQ(region.bounds(), gfx::Rect(0, 0, 50, 150)); - const auto* container_layer = - RuntimeEnabledFeatures::CompositeAfterPaintEnabled() - ? MainFrameScrollingContentsLayer() - : LayerByDOMElementId("scrollable"); + const auto* container_layer = MainFrameScrollingContentsLayer(); region = container_layer->touch_action_region().GetRegionForTouchAction( TouchAction::kPanY); - EXPECT_EQ(region.bounds(), - RuntimeEnabledFeatures::CompositeAfterPaintEnabled() - ? gfx::Rect(8, 8, 100, 100) - : gfx::Rect(0, 0, 100, 100)); + EXPECT_EQ(region.bounds(), gfx::Rect(8, 8, 100, 100)); } TEST_P(ScrollingTest, IframeWindowTouchHandler) { @@ -1427,10 +1421,7 @@ std::make_unique<RegionCaptureCropId>(content_id)); ForceFullCompositingUpdate(); - const cc::Layer* container_layer = - RuntimeEnabledFeatures::CompositeAfterPaintEnabled() - ? MainFrameScrollingContentsLayer() - : LayerByDOMElementId("scrollable"); + const cc::Layer* container_layer = MainFrameScrollingContentsLayer(); const cc::Layer* contents_layer = ScrollingContentsLayerByDOMElementId("scrollable"); ASSERT_TRUE(container_layer); @@ -1573,12 +1564,10 @@ scroll_node, cc::ScrollbarOrientation::HORIZONTAL); ASSERT_TRUE(horizontal_scrollbar_layer); // TODO(crbug.com/1029620): CAP needs more accurate contents_opaque. - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_EQ(!frame_view->LayoutViewport() - ->HorizontalScrollbar() - ->IsOverlayScrollbar(), - horizontal_scrollbar_layer->contents_opaque()); - } + // EXPECT_EQ(!frame_view->LayoutViewport() + // ->HorizontalScrollbar() + // ->IsOverlayScrollbar(), + // horizontal_scrollbar_layer->contents_opaque()); EXPECT_FALSE(ScrollbarLayerForScrollNode(scroll_node, cc::ScrollbarOrientation::VERTICAL));
diff --git a/third_party/blink/renderer/core/paint/block_painter_test.cc b/third_party/blink/renderer/core/paint/block_painter_test.cc index c8aa34b..289fe81b 100644 --- a/third_party/blink/renderer/core/paint/block_painter_test.cc +++ b/third_party/blink/renderer/core/paint/block_painter_test.cc
@@ -32,13 +32,8 @@ </div> )HTML"); auto* scroller = To<LayoutBlock>(GetLayoutObjectByElementId("scroller")); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_EQ(PhysicalRect(0, 0, 50, 5000), - BlockPainter(*scroller).OverflowRectForCullRectTesting()); - } else { - EXPECT_EQ(PhysicalRect(0, 0, 50, 50), - BlockPainter(*scroller).OverflowRectForCullRectTesting()); - } + EXPECT_EQ(PhysicalRect(0, 0, 50, 5000), + BlockPainter(*scroller).OverflowRectForCullRectTesting()); } TEST_P(BlockPainterTest, OverflowRectCompositedScrollingForCullRectTesting) { @@ -254,42 +249,21 @@ HitTestData hit_test_data; hit_test_data.wheel_event_rects = {{gfx::Rect(0, 0, 100, 400)}, {gfx::Rect(0, 0, 10, 400)}}; - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_THAT( - ContentDisplayItems(), - ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, - IsSameId(scroller->Id(), kBackgroundType), - IsSameId(scroller_scrolling_client.Id(), kBackgroundType))); - EXPECT_THAT( - ContentPaintChunks(), - ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, - IsPaintChunk(1, 2), // scroller background. - IsPaintChunk(2, 2), // scroller scroll hit test. - IsPaintChunk(2, 3, - PaintChunk::Id(scroller->Id(), - kScrollingBackgroundChunkType), - scroller->FirstFragment().ContentsProperties(), - &hit_test_data))); - - } else { - EXPECT_THAT(ContentDisplayItems(), - ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM)); - EXPECT_THAT(ContentPaintChunks(), - ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON)); - - auto& scroller_paint_controller = scroller->GetScrollableArea() - ->Layer() - ->GraphicsLayerBacking() - ->GetPaintController(); - EXPECT_THAT( - scroller_paint_controller.GetDisplayItemList(), - ElementsAre(IsSameId(scroller_scrolling_client.Id(), kBackgroundType))); - EXPECT_THAT( - scroller_paint_controller.PaintChunks(), - ElementsAre(IsPaintChunk( - 0, 1, PaintChunk::Id(scroller->Id(), kScrollingBackgroundChunkType), - scroller->FirstFragment().ContentsProperties(), &hit_test_data))); - } + EXPECT_THAT( + ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, + IsSameId(scroller->Id(), kBackgroundType), + IsSameId(scroller_scrolling_client.Id(), kBackgroundType))); + EXPECT_THAT( + ContentPaintChunks(), + ElementsAre( + VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + IsPaintChunk(1, 2), // scroller background. + IsPaintChunk(2, 2), // scroller scroll hit test. + IsPaintChunk( + 2, 3, + PaintChunk::Id(scroller->Id(), kScrollingBackgroundChunkType), + scroller->FirstFragment().ContentsProperties(), &hit_test_data))); } TEST_P(BlockPainterTest, WheelEventRectPaintChunkChanges) { @@ -512,43 +486,21 @@ HitTestData hit_test_data; hit_test_data.touch_action_rects = {{gfx::Rect(0, 0, 100, 400)}, {gfx::Rect(0, 0, 10, 400)}}; - - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_THAT( - ContentDisplayItems(), - ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, - IsSameId(scroller->Id(), kBackgroundType), - IsSameId(scroller_scrolling_client.Id(), kBackgroundType))); - EXPECT_THAT( - ContentPaintChunks(), - ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, - IsPaintChunk(1, 2), // scroller background. - IsPaintChunk(2, 2), // scroller scroll hit test. - IsPaintChunk(2, 3, - PaintChunk::Id(scroller->Id(), - kScrollingBackgroundChunkType), - scroller->FirstFragment().ContentsProperties(), - &hit_test_data))); - - } else { - EXPECT_THAT(ContentDisplayItems(), - ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM)); - EXPECT_THAT(ContentPaintChunks(), - ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON)); - - auto& scroller_paint_controller = scroller->GetScrollableArea() - ->Layer() - ->GraphicsLayerBacking() - ->GetPaintController(); - EXPECT_THAT( - scroller_paint_controller.GetDisplayItemList(), - ElementsAre(IsSameId(scroller_scrolling_client.Id(), kBackgroundType))); - EXPECT_THAT( - scroller_paint_controller.PaintChunks(), - ElementsAre(IsPaintChunk( - 0, 1, PaintChunk::Id(scroller->Id(), kScrollingBackgroundChunkType), - scroller->FirstFragment().ContentsProperties(), &hit_test_data))); - } + EXPECT_THAT( + ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, + IsSameId(scroller->Id(), kBackgroundType), + IsSameId(scroller_scrolling_client.Id(), kBackgroundType))); + EXPECT_THAT( + ContentPaintChunks(), + ElementsAre( + VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + IsPaintChunk(1, 2), // scroller background. + IsPaintChunk(2, 2), // scroller scroll hit test. + IsPaintChunk( + 2, 3, + PaintChunk::Id(scroller->Id(), kScrollingBackgroundChunkType), + scroller->FirstFragment().ContentsProperties(), &hit_test_data))); } TEST_P(BlockPainterTest, TouchActionRectPaintChunkChanges) {
diff --git a/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc b/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc index aeffc606..efe3bc8 100644 --- a/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc +++ b/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc
@@ -55,13 +55,8 @@ target.setAttribute( html_names::kStyleAttr, target.getAttribute(html_names::kStyleAttr) + "; width: 200px"); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - GetDocument().View()->UpdateLifecycleToLayoutClean( - DocumentUpdateReason::kTest); - } else { - GetDocument().View()->UpdateLifecycleToCompositingInputsClean( - DocumentUpdateReason::kTest); - } + GetDocument().View()->UpdateLifecycleToLayoutClean( + DocumentUpdateReason::kTest); EXPECT_EQ(PaintInvalidationReason::kGeometry, ComputePaintInvalidationReason(box, paint_offset));
diff --git a/third_party/blink/renderer/core/paint/box_painter_test.cc b/third_party/blink/renderer/core/paint/box_painter_test.cc index 3750040a..9907f29d 100644 --- a/third_party/blink/renderer/core/paint/box_painter_test.cc +++ b/third_party/blink/renderer/core/paint/box_painter_test.cc
@@ -83,47 +83,30 @@ // As a reminder, "background-attachment: scroll" does not move when the // container's scroll offset changes. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - // The scroll hit test should be after the non-scrolling (attachment: - // scroll) container background so that it does not prevent squashing the - // non-scrolling container background into the root layer. - EXPECT_THAT(ContentDisplayItems(), - ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, - IsSameId(container.Id(), kBackgroundType), - IsSameId(child.Id(), kBackgroundType))); - HitTestData scroll_hit_test; - scroll_hit_test.scroll_translation = - container.FirstFragment().PaintProperties()->ScrollTranslation(); - scroll_hit_test.scroll_hit_test_rect = gfx::Rect(0, 0, 200, 200); - EXPECT_THAT( - ContentPaintChunks(), - ElementsAre( - VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, - IsPaintChunk(1, 2, - PaintChunk::Id(container.Layer()->Id(), - DisplayItem::kLayerChunk), - container.FirstFragment().LocalBorderBoxProperties()), - IsPaintChunk( - 2, 2, - PaintChunk::Id(container.Id(), DisplayItem::kScrollHitTest), - container.FirstFragment().LocalBorderBoxProperties(), - &scroll_hit_test, gfx::Rect(0, 0, 200, 200)), - IsPaintChunk(2, 3))); - } else { - // Because the frame composited scrolls, no scroll hit test is needed. - const auto* non_scrolling_layer = To<LayoutBlock>(container) - .Layer() - ->GetCompositedLayerMapping() - ->MainGraphicsLayer(); - EXPECT_THAT(non_scrolling_layer->GetPaintController().GetDisplayItemList(), - ElementsAre(IsSameId(container.Id(), kBackgroundType))); - const auto* scrolling_layer = To<LayoutBlock>(container) - .Layer() - ->GetCompositedLayerMapping() - ->ScrollingContentsLayer(); - EXPECT_THAT(scrolling_layer->GetPaintController().GetDisplayItemList(), - ElementsAre(IsSameId(child.Id(), kBackgroundType))); - } + // The scroll hit test should be after the non-scrolling (attachment: + // scroll) container background so that it does not prevent squashing the + // non-scrolling container background into the root layer. + EXPECT_THAT(ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, + IsSameId(container.Id(), kBackgroundType), + IsSameId(child.Id(), kBackgroundType))); + HitTestData scroll_hit_test; + scroll_hit_test.scroll_translation = + container.FirstFragment().PaintProperties()->ScrollTranslation(); + scroll_hit_test.scroll_hit_test_rect = gfx::Rect(0, 0, 200, 200); + EXPECT_THAT( + ContentPaintChunks(), + ElementsAre( + VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + IsPaintChunk( + 1, 2, + PaintChunk::Id(container.Layer()->Id(), DisplayItem::kLayerChunk), + container.FirstFragment().LocalBorderBoxProperties()), + IsPaintChunk( + 2, 2, PaintChunk::Id(container.Id(), DisplayItem::kScrollHitTest), + container.FirstFragment().LocalBorderBoxProperties(), + &scroll_hit_test, gfx::Rect(0, 0, 200, 200)), + IsPaintChunk(2, 3))); } TEST_P(BoxPainterTest, ScrollHitTestOrderWithLocalBackgroundAttachment) { @@ -154,51 +137,34 @@ // As a reminder, "background-attachment: local" moves when the container's // scroll offset changes. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - // The scroll hit test should be before the scrolling (attachment: local) - // container background so that it does not prevent squashing the scrolling - // background into the scrolling contents. - EXPECT_THAT( - ContentDisplayItems(), - ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, - IsSameId(container_scrolling_client->Id(), kBackgroundType), - IsSameId(child.Id(), kBackgroundType))); - HitTestData scroll_hit_test; - scroll_hit_test.scroll_translation = - container.FirstFragment().PaintProperties()->ScrollTranslation(); - scroll_hit_test.scroll_hit_test_rect = gfx::Rect(0, 0, 200, 200); - EXPECT_THAT( - ContentPaintChunks(), - ElementsAre( - VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, - IsPaintChunk(1, 1, - PaintChunk::Id(container.Layer()->Id(), - DisplayItem::kLayerChunk), - container.FirstFragment().LocalBorderBoxProperties()), - IsPaintChunk( - 1, 1, - PaintChunk::Id(container.Id(), DisplayItem::kScrollHitTest), - container.FirstFragment().LocalBorderBoxProperties(), - &scroll_hit_test, gfx::Rect(0, 0, 200, 200)), - IsPaintChunk( - 1, 3, - PaintChunk::Id(container.Id(), kScrollingBackgroundChunkType), - container.FirstFragment().ContentsProperties()))); - } else { - // Because the frame composited scrolls, no scroll hit test is needed. - const auto* non_scrolling_layer = - container.Layer()->GetCompositedLayerMapping()->MainGraphicsLayer(); - EXPECT_TRUE(non_scrolling_layer->GetPaintController() - .GetDisplayItemList() - .IsEmpty()); - const auto* scrolling_layer = container.Layer() - ->GetCompositedLayerMapping() - ->ScrollingContentsLayer(); - EXPECT_THAT( - scrolling_layer->GetPaintController().GetDisplayItemList(), - ElementsAre(IsSameId(container_scrolling_client->Id(), kBackgroundType), - IsSameId(child.Id(), kBackgroundType))); - } + // The scroll hit test should be before the scrolling (attachment: local) + // container background so that it does not prevent squashing the scrolling + // background into the scrolling contents. + EXPECT_THAT( + ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, + IsSameId(container_scrolling_client->Id(), kBackgroundType), + IsSameId(child.Id(), kBackgroundType))); + HitTestData scroll_hit_test; + scroll_hit_test.scroll_translation = + container.FirstFragment().PaintProperties()->ScrollTranslation(); + scroll_hit_test.scroll_hit_test_rect = gfx::Rect(0, 0, 200, 200); + EXPECT_THAT( + ContentPaintChunks(), + ElementsAre( + VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + IsPaintChunk( + 1, 1, + PaintChunk::Id(container.Layer()->Id(), DisplayItem::kLayerChunk), + container.FirstFragment().LocalBorderBoxProperties()), + IsPaintChunk( + 1, 1, PaintChunk::Id(container.Id(), DisplayItem::kScrollHitTest), + container.FirstFragment().LocalBorderBoxProperties(), + &scroll_hit_test, gfx::Rect(0, 0, 200, 200)), + IsPaintChunk( + 1, 3, + PaintChunk::Id(container.Id(), kScrollingBackgroundChunkType), + container.FirstFragment().ContentsProperties()))); } TEST_P(BoxPainterTest, ScrollHitTestProperties) {
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc index 470d3c0..cb78734 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -237,69 +237,6 @@ graphics_layer_->SetHitTestable(true); } -void CompositedLayerMapping::UpdateGraphicsLayerContentsOpaque( - bool should_check_children) { - if (BackgroundPaintsOntoGraphicsLayer()) { - bool contents_opaque = owning_layer_->BackgroundIsKnownToBeOpaqueInRect( - CompositedBounds(), should_check_children); - graphics_layer_->CcLayer().SetContentsOpaque(contents_opaque); - if (!contents_opaque) { - graphics_layer_->CcLayer().SetContentsOpaqueForText( - GetLayoutObject().TextIsKnownToBeOnOpaqueBackground()); - } - } else { - // If we only paint the background onto the scrolling contents layer we - // are going to leave a hole in the m_graphicsLayer where the background - // is so it is not opaque. - graphics_layer_->CcLayer().SetContentsOpaque(false); - } -} - -void CompositedLayerMapping::UpdateContentsOpaque() { - // If there is a foreground layer, children paint into that layer and - // not graphics_layer_, and so don't contribute to the opaqueness of the - // latter. - bool should_check_children = !foreground_layer_; - if (BackgroundPaintsOntoScrollingContentsLayer()) { - DCHECK(scrolling_contents_layer_); - // Backgrounds painted onto the foreground are clipped by the padding box - // rect. - // TODO(flackr): This should actually check the entire overflow rect - // within the scrolling contents layer but since we currently only trigger - // this for solid color backgrounds the answer will be the same. - bool contents_opaque = owning_layer_->BackgroundIsKnownToBeOpaqueInRect( - To<LayoutBox>(GetLayoutObject()).PhysicalPaddingBoxRect(), - should_check_children); - scrolling_contents_layer_->CcLayer().SetContentsOpaque(contents_opaque); - if (!contents_opaque) { - scrolling_contents_layer_->CcLayer().SetContentsOpaqueForText( - GetLayoutObject().TextIsKnownToBeOnOpaqueBackground()); - } - - UpdateGraphicsLayerContentsOpaque(should_check_children); - } else { - DCHECK(BackgroundPaintsOntoGraphicsLayer()); - if (scrolling_contents_layer_) - scrolling_contents_layer_->CcLayer().SetContentsOpaque(false); - UpdateGraphicsLayerContentsOpaque(should_check_children); - } - - if (non_scrolling_squashing_layer_) { - non_scrolling_squashing_layer_->CcLayer().SetContentsOpaque(false); - bool contents_opaque_for_text = true; - for (const GraphicsLayerPaintInfo* squashed_layer : - non_scrolling_squashed_layers_) { - if (!squashed_layer->paint_layer->GetLayoutObject() - .TextIsKnownToBeOnOpaqueBackground()) { - contents_opaque_for_text = false; - break; - } - } - non_scrolling_squashing_layer_->CcLayer().SetContentsOpaqueForText( - contents_opaque_for_text); - } -} - void CompositedLayerMapping::UpdateCompositedBounds() { DCHECK_EQ(owning_layer_->Compositor()->Lifecycle().GetState(), DocumentLifecycle::kInCompositingAssignmentsUpdate); @@ -686,7 +623,6 @@ UpdateContentsRect(); UpdateDrawsContentAndPaintsHitTest(); UpdateElementId(); - UpdateContentsOpaque(); UpdateCompositingReasons(); }
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h index eff740c..cfcc4f59a 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h
@@ -110,9 +110,6 @@ const PaintLayer* compositing_container, HeapVector<Member<PaintLayer>>& layers_needing_paint_invalidation); - // Update whether layer needs blending. - void UpdateContentsOpaque(); - GraphicsLayer* MainGraphicsLayer() const { return graphics_layer_; } GraphicsLayer* ForegroundLayer() const { return foreground_layer_; } @@ -327,7 +324,6 @@ bool UpdateSquashingLayers(bool needs_squashing_layers); void UpdateDrawsContentAndPaintsHitTest(); void UpdateCompositedBounds(); - void UpdateGraphicsLayerContentsOpaque(bool should_check_children); // Also sets subpixelAccumulation on the layer. void ComputeBoundsOfOwningLayer(
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc b/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc index b74023b..6538bf7 100644 --- a/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc +++ b/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc
@@ -98,8 +98,6 @@ PaintLayer* layer, UpdateType update_type, AncestorInfo info) { - LayoutBoxModelObject& layout_object = layer->GetLayoutObject(); - // UpdateAncestorInfo has been already computed in ApplyAncestorInfo() for // layers from root_layer_ down to compositing_inputs_root_ both included. if (layer != root_layer_ && layer != compositing_inputs_root_) @@ -171,29 +169,7 @@ if (!recursion_blocked_by_display_lock) layer->ClearChildNeedsCompositingInputsUpdate(); - if (layer->SelfPaintingStatusChanged()) { - layer->ClearSelfPaintingStatusChanged(); - // If the floating object becomes non-self-painting, so some ancestor should - // paint it; if it becomes self-painting, it should paint itself and no - // ancestor should paint it. - if (layout_object.IsFloating()) { - LayoutBlockFlow::UpdateAncestorShouldPaintFloatingObject( - *layer->GetLayoutBox()); - } - } - compositor->ClearCompositingInputsRoot(); - - bool previously_needed_paint_offset_translation = - layer->NeedsPaintOffsetTranslationForCompositing(); - - layer->SetNeedsPaintOffsetTranslationForCompositing( - NeedsPaintOffsetTranslationForCompositing(layer)); - - // Invalidate if needed to affect NeedsPaintOffsetTranslation(). - if (previously_needed_paint_offset_translation != - layer->NeedsPaintOffsetTranslationForCompositing()) - layout_object.SetNeedsPaintPropertyUpdate(); } bool CompositingInputsUpdater::NeedsPaintOffsetTranslationForCompositing(
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter_test.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter_test.cc index 94028f1..bb2abb17 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter_test.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter_test.cc
@@ -77,33 +77,20 @@ scroll_hit_test.scroll_translation = scroller.FirstFragment().PaintProperties()->ScrollTranslation(); scroll_hit_test.scroll_hit_test_rect = gfx::Rect(0, 0, 40, 40); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_THAT( - ContentPaintChunks(), - ElementsAre( - VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, - IsPaintChunk(1, 1, - PaintChunk::Id(scroller.Layer()->Id(), - DisplayItem::kLayerChunk), - scroller.FirstFragment().LocalBorderBoxProperties()), - IsPaintChunk( - 1, 1, - PaintChunk::Id(root_fragment.Id(), DisplayItem::kScrollHitTest), - scroller.FirstFragment().LocalBorderBoxProperties(), - &scroll_hit_test, gfx::Rect(0, 0, 40, 40)), - IsPaintChunk(1, 2))); - } else { - EXPECT_THAT( - ContentPaintChunks(), - ElementsAre( - VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, - IsPaintChunk( - 1, 1, - PaintChunk::Id(root_fragment.Id(), DisplayItem::kScrollHitTest), - scroller.FirstFragment().LocalBorderBoxProperties(), - &scroll_hit_test, gfx::Rect(0, 0, 40, 40)), - IsPaintChunk(1, 2))); - } + EXPECT_THAT( + ContentPaintChunks(), + ElementsAre( + VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + IsPaintChunk( + 1, 1, + PaintChunk::Id(scroller.Layer()->Id(), DisplayItem::kLayerChunk), + scroller.FirstFragment().LocalBorderBoxProperties()), + IsPaintChunk( + 1, 1, + PaintChunk::Id(root_fragment.Id(), DisplayItem::kScrollHitTest), + scroller.FirstFragment().LocalBorderBoxProperties(), + &scroll_hit_test, gfx::Rect(0, 0, 40, 40)), + IsPaintChunk(1, 2))); } TEST_P(NGBoxFragmentPainterTest, AddUrlRects) {
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index 1439498..2d0ea00 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -212,7 +212,6 @@ has_sticky_position_descendant_(false), has_non_contained_absolute_position_descendant_(false), has_stacked_descendant_in_current_stacking_context_(false), - self_painting_status_changed_(false), filter_on_effect_node_dirty_(false), backdrop_filter_on_effect_node_dirty_(false), has_filter_that_moves_pixels_(false), @@ -227,7 +226,6 @@ needs_reorder_overlay_overflow_controls_(false), static_inline_edge_(InlineEdge::kInlineStart), static_block_edge_(BlockEdge::kBlockStart), - needs_paint_offset_translation_for_compositing_(false), needs_check_raster_invalidation_(false), #if DCHECK_IS_ON() layer_list_mutation_allowed_(true), @@ -3223,78 +3221,6 @@ return TransformAncestor() || Transform(); } -bool PaintLayer::BackgroundIsKnownToBeOpaqueInRect( - const PhysicalRect& local_rect, - bool should_check_children) const { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - // We can't use hasVisibleContent(), because that will be true if our - // layoutObject is hidden, but some child is visible and that child doesn't - // cover the entire rect. - if (GetLayoutObject().StyleRef().Visibility() != EVisibility::kVisible) - return false; - - if (GetLayoutObject().HasMask() || GetLayoutObject().HasClipPath()) - return false; - - if (PaintsWithFilters() && - GetLayoutObject().StyleRef().Filter().HasFilterThatAffectsOpacity()) - return false; - - // FIXME: Handle simple transforms. - if (Transform() && GetCompositingState() != kPaintsIntoOwnBacking) - return false; - - if (GetLayoutObject().StyleRef().GetPosition() == EPosition::kFixed && - GetCompositingState() != kPaintsIntoOwnBacking) - return false; - - // FIXME: We currently only check the immediate layoutObject, - // which will miss many cases where additional layout objects paint - // into this layer. - if (GetLayoutObject().BackgroundIsKnownToBeOpaqueInRect(local_rect)) - return true; - - if (!should_check_children) - return false; - - // We can't consult child layers if we clip, since they might cover - // parts of the rect that are clipped out. - if (GetLayoutObject().HasClipRelatedProperty()) - return false; - - // TODO(schenney): This could be improved by unioning the opaque regions of - // all the children. That would require a refactoring because currently - // children just check they at least cover the given rect, but a unioning - // method would require children to compute and report their rects. - return ChildBackgroundIsKnownToBeOpaqueInRect(local_rect); -} - -bool PaintLayer::ChildBackgroundIsKnownToBeOpaqueInRect( - const PhysicalRect& local_rect) const { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - PaintLayerPaintOrderReverseIterator reverse_iterator(this, kAllChildren); - while (PaintLayer* child_layer = reverse_iterator.Next()) { - // Stop at composited paint boundaries and non-self-painting layers. - if (child_layer->IsPaintInvalidationContainer()) - continue; - - if (!child_layer->CanUseConvertToLayerCoords()) - continue; - - if (child_layer->PaintsWithTransparency(kGlobalPaintNormalPhase)) - continue; - - PhysicalOffset child_offset; - PhysicalRect child_local_rect(local_rect); - child_layer->ConvertToLayerCoords(this, child_offset); - child_local_rect.Move(-child_offset); - - if (child_layer->BackgroundIsKnownToBeOpaqueInRect(child_local_rect, true)) - return true; - } - return false; -} - bool PaintLayer::ShouldBeSelfPaintingLayer() const { return GetLayoutObject().LayerTypeRequired() == kNormalPaintLayer || (scrollable_area_ && scrollable_area_->HasOverlayOverflowControls()) || @@ -3313,7 +3239,6 @@ // descendants of this layer because of the self painting status change. SetNeedsRepaint(); is_self_painting_layer_ = is_self_painting_layer; - self_painting_status_changed_ = true; // Self-painting change can change the compositing container chain; // invalidate the new chain in addition to the old one. MarkCompositingContainerChainForNeedsRepaint();
diff --git a/third_party/blink/renderer/core/paint/paint_layer.h b/third_party/blink/renderer/core/paint/paint_layer.h index 5c973134..6c62daff 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.h +++ b/third_party/blink/renderer/core/paint/paint_layer.h
@@ -602,11 +602,6 @@ const LayoutBoxModelObject& paint_invalidation_container, PhysicalOffset&); - bool PaintsWithTransparency(GlobalPaintFlags global_paint_flags) const { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - return IsTransparent() && !PaintsIntoOwnBacking(global_paint_flags); - } - // Returns the ScrollingCoordinator associated with this layer, if // any. Otherwise nullptr. ScrollingCoordinator* GetScrollingCoordinator(); @@ -620,13 +615,6 @@ bool SupportsSubsequenceCaching() const; - // Returns true if background phase is painted opaque in the given rect. - // The query rect is given in local coordinates. - // if |should_check_children| is true, checks non-composited stacking children - // recursively to see if they paint opaquely over the rect. - bool BackgroundIsKnownToBeOpaqueInRect(const PhysicalRect&, - bool should_check_children) const; - // If the input CompositorFilterOperation is not empty, it will be populated // only if |filter_on_effect_node_dirty_| is true or the reference box has // changed. Otherwise it will be populated unconditionally. @@ -1081,17 +1069,6 @@ return has3d_transformed_descendant_; } - // Whether the value of isSelfPaintingLayer() changed since the last clearing - // (which happens after the flag is chedked during compositing update). - bool SelfPaintingStatusChanged() const { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - return self_painting_status_changed_; - } - void ClearSelfPaintingStatusChanged() { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - self_painting_status_changed_ = false; - } - // Returns true if this PaintLayer should be fragmented, relative // to the given |compositing_layer| backing. In SPv1 mode, fragmentation // may not cross compositing boundaries, so this wil return false @@ -1132,16 +1109,6 @@ : PhysicalOffset(); } - bool NeedsPaintOffsetTranslationForCompositing() const { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - DCHECK(IsAllowedToQueryCompositingInputs()); - return needs_paint_offset_translation_for_compositing_; - } - - void SetNeedsPaintOffsetTranslationForCompositing(bool b) { - needs_paint_offset_translation_for_compositing_ = b; - } - bool KnownToClipSubtree() const; void Trace(Visitor*) const override; @@ -1243,8 +1210,6 @@ bool HitTestClippedOutByClipPath(const PaintLayer& root_layer, const HitTestLocation&) const; - bool ChildBackgroundIsKnownToBeOpaqueInRect(const PhysicalRect&) const; - bool ShouldBeSelfPaintingLayer() const; void UpdateStackingNode(); @@ -1387,8 +1352,6 @@ unsigned has_non_contained_absolute_position_descendant_ : 1; unsigned has_stacked_descendant_in_current_stacking_context_ : 1; - unsigned self_painting_status_changed_ : 1; - // These are set to true when filter style or filter resource changes, // indicating that we need to update the filter (or backdrop_filter) field of // the effect paint property node. They are cleared when the effect paint @@ -1416,8 +1379,6 @@ unsigned static_inline_edge_ : 2; unsigned static_block_edge_ : 2; - unsigned needs_paint_offset_translation_for_compositing_ : 1; - unsigned needs_check_raster_invalidation_ : 1; #if DCHECK_IS_ON()
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter.cc b/third_party/blink/renderer/core/paint/paint_layer_painter.cc index 9a3ee606..b7b8adc 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_painter.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
@@ -114,17 +114,6 @@ !paint_layer_.HasSelfPaintingLayerDescendant()) return kFullyPainted; - // If this layer is totally invisible then there is nothing to paint. - // In CompositeAfterPaint we simplify this optimization by painting even when - // effectively invisible but skipping the painted content during layerization - // in PaintArtifactCompositor. - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled() && - paint_layer_.PaintsWithTransparency( - painting_info.GetGlobalPaintFlags()) && - PaintedOutputInvisible(layout_object.StyleRef())) { - return kFullyPainted; - } - // If the transform can't be inverted, don't paint anything. We still need // to paint with CompositeAfterPaint if there are animations to ensure the // animation can be setup to run on the compositor.
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter_test.cc b/third_party/blink/renderer/core/paint/paint_layer_painter_test.cc index c61b943c..f25e767 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_painter_test.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_painter_test.cc
@@ -1212,35 +1212,28 @@ EXPECT_EQ(gfx::Size(200, 100), cc_layer->bounds()); auto chunks = ContentPaintChunks(); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_THAT( - chunks, - ElementsAre( - VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, - IsPaintChunk( - 1, 1, - PaintChunk::Id(parent_layer->Id(), DisplayItem::kLayerChunk), - parent->FirstFragment().LocalBorderBoxProperties(), nullptr, - gfx::Rect(0, 0, 10, 10)), - IsPaintChunk( - 1, 1, - PaintChunk::Id(target_layer->Id(), DisplayItem::kLayerChunk), - target->FirstFragment().LocalBorderBoxProperties(), nullptr, - gfx::Rect(0, 0, 100, 100)), - IsPaintChunk( - 1, 1, - PaintChunk::Id(child_layer->Id(), DisplayItem::kLayerChunk), - child->FirstFragment().LocalBorderBoxProperties(), nullptr, - gfx::Rect(0, 0, 200, 50)))); - EXPECT_FALSE((chunks.begin() + 1)->effectively_invisible); - EXPECT_EQ(expected_invisible_, - (chunks.begin() + 2)->effectively_invisible); - EXPECT_EQ(expected_invisible_, - (chunks.begin() + 3)->effectively_invisible); - } else { - EXPECT_EQ(expected_paints_with_transparency_, - target_layer->PaintsWithTransparency(kGlobalPaintNormalPhase)); - } + EXPECT_THAT( + chunks, + ElementsAre( + VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + IsPaintChunk( + 1, 1, + PaintChunk::Id(parent_layer->Id(), DisplayItem::kLayerChunk), + parent->FirstFragment().LocalBorderBoxProperties(), nullptr, + gfx::Rect(0, 0, 10, 10)), + IsPaintChunk( + 1, 1, + PaintChunk::Id(target_layer->Id(), DisplayItem::kLayerChunk), + target->FirstFragment().LocalBorderBoxProperties(), nullptr, + gfx::Rect(0, 0, 100, 100)), + IsPaintChunk( + 1, 1, + PaintChunk::Id(child_layer->Id(), DisplayItem::kLayerChunk), + child->FirstFragment().LocalBorderBoxProperties(), nullptr, + gfx::Rect(0, 0, 200, 50)))); + EXPECT_FALSE((chunks.begin() + 1)->effectively_invisible); + EXPECT_EQ(expected_invisible_, (chunks.begin() + 2)->effectively_invisible); + EXPECT_EQ(expected_invisible_, (chunks.begin() + 3)->effectively_invisible); } String additional_style_;
diff --git a/third_party/blink/renderer/core/paint/paint_layer_test.cc b/third_party/blink/renderer/core/paint/paint_layer_test.cc index 7fc3cce..1a198f9 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_test.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_test.cc
@@ -2533,32 +2533,6 @@ } } -TEST_P(PaintLayerTest, BackgroundIsKnownToBeOpaqueInRectChildren) { - // This test doesn't apply in CompositeAfterPaint. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - - SetBodyInnerHTML(R"HTML( - <style> - div { - width: 100px; - height: 100px; - position: relative; - isolation: isolate; - } - </style> - <div id='target'> - <div style='background: blue'></div> - </div> - )HTML"); - - PaintLayer* target_layer = GetPaintLayerByElementId("target"); - EXPECT_TRUE(target_layer->BackgroundIsKnownToBeOpaqueInRect( - PhysicalRect(0, 0, 100, 100), true)); - EXPECT_FALSE(target_layer->BackgroundIsKnownToBeOpaqueInRect( - PhysicalRect(0, 0, 100, 100), false)); -} - TEST_P(PaintLayerTest, ChangeAlphaNeedsCompositingInputsAndPaintPropertyUpdate) { SetBodyInnerHTML(R"HTML(
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc index 10821bf6..baf740e 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -500,18 +500,14 @@ object.HasLayer()) { PaintLayer* layer = To<LayoutBoxModelObject>(object).Layer(); if (!layer->EnclosingPaginationLayer()) { - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - if (direct_compositing_reasons != CompositingReason::kNone) - return true; - // In CompositeAfterPaint though we don't treat hidden backface as - // a direct compositing reason, it's very likely that the object will - // be composited, so a paint offset translation will be beneficial. - if (box_model.StyleRef().BackfaceVisibility() == - EBackfaceVisibility::kHidden) - return true; - } else { - if (layer->NeedsPaintOffsetTranslationForCompositing()) - return true; + if (direct_compositing_reasons != CompositingReason::kNone) + return true; + // In CompositeAfterPaint though we don't treat hidden backface as a + // direct compositing reason, it's very likely that the object will be + // composited, so a paint offset translation will be beneficial. + if (box_model.StyleRef().BackfaceVisibility() == + EBackfaceVisibility::kHidden) { + return true; } } }
diff --git a/third_party/blink/renderer/core/paint/svg_container_painter_test.cc b/third_party/blink/renderer/core/paint/svg_container_painter_test.cc index 46dc6531..1cec2b68 100644 --- a/third_party/blink/renderer/core/paint/svg_container_painter_test.cc +++ b/third_party/blink/renderer/core/paint/svg_container_painter_test.cc
@@ -36,8 +36,6 @@ </svg> )HTML"); - const auto* root = GetLayoutObjectByElementId("svg"); - const DisplayItem::Type kSVGEffectPaintPhaseForeground = static_cast<DisplayItem::Type>(DisplayItem::kSVGEffectPaintPhaseFirst + 5); @@ -57,22 +55,11 @@ PaintChunk::Id after_id(after->Id(), kSVGEffectPaintPhaseForeground); const auto& after_properties = after->FirstFragment().ContentsProperties(); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_THAT(ContentPaintChunks(), - ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, - IsPaintChunk(1, 2, before_id, before_properties), - IsPaintChunk(2, 3, rect_id, container_properties), - IsPaintChunk(3, 4, after_id, after_properties))); - } else { - const auto* svg_paint_layer = To<LayoutSVGRoot>(root)->Layer(); - const auto* svg_graphics_layer = - svg_paint_layer->GetCompositedLayerMapping()->MainGraphicsLayer(); - - EXPECT_THAT(svg_graphics_layer->GetPaintController().PaintChunks(), - ElementsAre(IsPaintChunk(0, 1, before_id, before_properties), - IsPaintChunk(1, 2, rect_id, container_properties), - IsPaintChunk(2, 3, after_id, after_properties))); - } + EXPECT_THAT(ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + IsPaintChunk(1, 2, before_id, before_properties), + IsPaintChunk(2, 3, rect_id, container_properties), + IsPaintChunk(3, 4, after_id, after_properties))); } } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/view_painter_test.cc b/third_party/blink/renderer/core/paint/view_painter_test.cc index 521de663..1590b7f 100644 --- a/third_party/blink/renderer/core/paint/view_painter_test.cc +++ b/third_party/blink/renderer/core/paint/view_painter_test.cc
@@ -49,37 +49,14 @@ mojom::blink::ScrollType::kUser); frame_view->UpdateAllLifecyclePhasesForTest(); - const DisplayItem* background_display_item = nullptr; - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - const auto& display_items = RootPaintController().GetDisplayItemList(); - const auto& background_client = prefer_compositing_to_lcd_text - ? GetLayoutView() - : ViewScrollingBackgroundClient(); - background_display_item = &display_items[0]; - EXPECT_THAT( - *background_display_item, - IsSameId(background_client.Id(), DisplayItem::kDocumentBackground)); - } else { - // If we prefer compositing to LCD text, the fixed background should go in a - // different layer from the scrolling content; otherwise, it should go in - // the same layer (i.e., the scrolling contents layer). - if (prefer_compositing_to_lcd_text) { - const auto& display_items = GetLayoutView() - .Layer() - ->GraphicsLayerBacking(&GetLayoutView()) - ->GetPaintController() - .GetDisplayItemList(); - EXPECT_THAT(display_items, - ElementsAre(IsSameId(GetLayoutView().Id(), - DisplayItem::kDocumentBackground))); - background_display_item = &display_items[0]; - } else { - const auto& display_items = RootPaintController().GetDisplayItemList(); - EXPECT_THAT(display_items, - ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM)); - background_display_item = &display_items[0]; - } - } + const auto& display_items = RootPaintController().GetDisplayItemList(); + const auto& background_client = prefer_compositing_to_lcd_text + ? GetLayoutView() + : ViewScrollingBackgroundClient(); + const DisplayItem* background_display_item = &display_items[0]; + EXPECT_THAT( + *background_display_item, + IsSameId(background_client.Id(), DisplayItem::kDocumentBackground)); sk_sp<const PaintRecord> record = To<DrawingDisplayItem>(background_display_item)->GetPaintRecord(); @@ -116,22 +93,20 @@ <div style='height: 5000px'></div> )HTML"); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - HitTestData scroll_hit_test_data; - scroll_hit_test_data.scroll_translation = - GetLayoutView().FirstFragment().PaintProperties()->ScrollTranslation(); - scroll_hit_test_data.scroll_hit_test_rect = gfx::Rect(0, 0, 800, 600); - // The scroll hit test should be before the scrolled contents to ensure the - // hit test does not prevent the background squashing with the scrolling - // contents. - EXPECT_THAT( - RootPaintController().PaintChunks()[0], - IsPaintChunk( - 0, 0, - PaintChunk::Id(GetLayoutView().Id(), DisplayItem::kScrollHitTest), - GetLayoutView().FirstFragment().LocalBorderBoxProperties(), - &scroll_hit_test_data, gfx::Rect(0, 0, 800, 600))); - } + HitTestData scroll_hit_test_data; + scroll_hit_test_data.scroll_translation = + GetLayoutView().FirstFragment().PaintProperties()->ScrollTranslation(); + scroll_hit_test_data.scroll_hit_test_rect = gfx::Rect(0, 0, 800, 600); + // The scroll hit test should be before the scrolled contents to ensure the + // hit test does not prevent the background squashing with the scrolling + // contents. + EXPECT_THAT( + RootPaintController().PaintChunks()[0], + IsPaintChunk( + 0, 0, + PaintChunk::Id(GetLayoutView().Id(), DisplayItem::kScrollHitTest), + GetLayoutView().FirstFragment().LocalBorderBoxProperties(), + &scroll_hit_test_data, gfx::Rect(0, 0, 800, 600))); EXPECT_THAT(ContentDisplayItems(), ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM)); EXPECT_THAT(ContentPaintChunks(), @@ -139,10 +114,6 @@ } TEST_P(ViewPainterTest, FrameScrollHitTestProperties) { - // This test depends on the CompositeAfterPaint behavior of painting solid - // color backgrounds into both the non-scrolled and scrolled spaces. - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; SetBodyInnerHTML(R"HTML( <style> ::-webkit-scrollbar { display: none; } @@ -235,29 +206,28 @@ {gfx::Rect(0, 0, 800, 3000)}, {gfx::Rect(0, 0, 800, 3000)}}; - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - HitTestData non_scrolling_hit_test_data; - non_scrolling_hit_test_data.touch_action_rects = { - {gfx::Rect(0, 0, 800, 600)}}; - HitTestData scroll_hit_test_data; - scroll_hit_test_data.scroll_translation = - GetLayoutView().FirstFragment().PaintProperties()->ScrollTranslation(); - scroll_hit_test_data.scroll_hit_test_rect = gfx::Rect(0, 0, 800, 600); - EXPECT_THAT( - RootPaintController().PaintChunks()[0], - IsPaintChunk(0, 0, - PaintChunk::Id(GetLayoutView().Layer()->Id(), - DisplayItem::kLayerChunk), - GetLayoutView().FirstFragment().LocalBorderBoxProperties(), - &non_scrolling_hit_test_data, gfx::Rect(0, 0, 800, 600))); - EXPECT_THAT( - RootPaintController().PaintChunks()[1], - IsPaintChunk( - 0, 0, - PaintChunk::Id(GetLayoutView().Id(), DisplayItem::kScrollHitTest), - GetLayoutView().FirstFragment().LocalBorderBoxProperties(), - &scroll_hit_test_data, gfx::Rect(0, 0, 800, 600))); - } + HitTestData non_scrolling_hit_test_data; + non_scrolling_hit_test_data.touch_action_rects = { + {gfx::Rect(0, 0, 800, 600)}}; + HitTestData scroll_hit_test_data; + scroll_hit_test_data.scroll_translation = + GetLayoutView().FirstFragment().PaintProperties()->ScrollTranslation(); + scroll_hit_test_data.scroll_hit_test_rect = gfx::Rect(0, 0, 800, 600); + EXPECT_THAT( + RootPaintController().PaintChunks()[0], + IsPaintChunk(0, 0, + PaintChunk::Id(GetLayoutView().Layer()->Id(), + DisplayItem::kLayerChunk), + GetLayoutView().FirstFragment().LocalBorderBoxProperties(), + &non_scrolling_hit_test_data, gfx::Rect(0, 0, 800, 600))); + EXPECT_THAT( + RootPaintController().PaintChunks()[1], + IsPaintChunk( + 0, 0, + PaintChunk::Id(GetLayoutView().Id(), DisplayItem::kScrollHitTest), + GetLayoutView().FirstFragment().LocalBorderBoxProperties(), + &scroll_hit_test_data, gfx::Rect(0, 0, 800, 600))); + EXPECT_THAT(ContentPaintChunks(), ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK( 1, &view_hit_test_data, gfx::Rect(0, 0, 800, 3000)))); @@ -292,45 +262,28 @@ HitTestData scrolling_hit_test_data; scrolling_hit_test_data.touch_action_rects = {{gfx::Rect(0, 0, 800, 3000)}, {gfx::Rect(0, 0, 800, 3000)}}; - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - HitTestData scroll_hit_test_data; - scroll_hit_test_data.scroll_translation = - GetLayoutView().FirstFragment().PaintProperties()->ScrollTranslation(); - scroll_hit_test_data.scroll_hit_test_rect = gfx::Rect(0, 0, 800, 600); - EXPECT_THAT( - RootPaintController().PaintChunks()[0], - IsPaintChunk( - 0, 1, PaintChunk::Id(view->Layer()->Id(), DisplayItem::kLayerChunk), - non_scrolling_properties, &view_hit_test_data, - gfx::Rect(0, 0, 800, 600))); - EXPECT_THAT( - RootPaintController().PaintChunks()[1], - IsPaintChunk(1, 1, - PaintChunk::Id(view->Id(), DisplayItem::kScrollHitTest), - non_scrolling_properties, &scroll_hit_test_data, - gfx::Rect(0, 0, 800, 600))); - EXPECT_THAT( - ContentPaintChunks(), - ElementsAre(IsPaintChunk( - 1, 1, PaintChunk::Id(html->Layer()->Id(), DisplayItem::kLayerChunk), - scrolling_properties, &scrolling_hit_test_data, - gfx::Rect(0, 0, 800, 3000)))); - } else { - auto& non_scrolling_paint_controller = - view->Layer()->GraphicsLayerBacking(view)->GetPaintController(); - EXPECT_THAT( - non_scrolling_paint_controller.PaintChunks(), - ElementsAre(IsPaintChunk( - 0, 1, PaintChunk::Id(view->Layer()->Id(), DisplayItem::kLayerChunk), - non_scrolling_properties, &view_hit_test_data, - gfx::Rect(0, 0, 800, 600)))); - EXPECT_THAT( - ContentPaintChunks(), - ElementsAre(IsPaintChunk( - 0, 0, PaintChunk::Id(html->Layer()->Id(), DisplayItem::kLayerChunk), - scrolling_properties, &scrolling_hit_test_data, - gfx::Rect(0, 0, 800, 3000)))); - } + + HitTestData scroll_hit_test_data; + scroll_hit_test_data.scroll_translation = + GetLayoutView().FirstFragment().PaintProperties()->ScrollTranslation(); + scroll_hit_test_data.scroll_hit_test_rect = gfx::Rect(0, 0, 800, 600); + EXPECT_THAT( + RootPaintController().PaintChunks()[0], + IsPaintChunk( + 0, 1, PaintChunk::Id(view->Layer()->Id(), DisplayItem::kLayerChunk), + non_scrolling_properties, &view_hit_test_data, + gfx::Rect(0, 0, 800, 600))); + EXPECT_THAT(RootPaintController().PaintChunks()[1], + IsPaintChunk( + 1, 1, PaintChunk::Id(view->Id(), DisplayItem::kScrollHitTest), + non_scrolling_properties, &scroll_hit_test_data, + gfx::Rect(0, 0, 800, 600))); + EXPECT_THAT( + ContentPaintChunks(), + ElementsAre(IsPaintChunk( + 1, 1, PaintChunk::Id(html->Layer()->Id(), DisplayItem::kLayerChunk), + scrolling_properties, &scrolling_hit_test_data, + gfx::Rect(0, 0, 800, 3000)))); } } // namespace blink
diff --git a/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc b/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc index 3f94851..807a61f3 100644 --- a/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc +++ b/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc
@@ -218,22 +218,12 @@ LayoutView* inner_view = inner_frame_document->View()->GetLayoutView(); inner_view->SetNeedsLayout("test"); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - inner_view->Compositor()->SetNeedsCompositingUpdate( - kCompositingUpdateRebuildTree); - } inner_view->SetShouldDoFullPaintInvalidation( PaintInvalidationReason::kForTesting); inner_view->Layer()->SetNeedsRepaint(); EXPECT_TRUE(inner_frame_document->View() ->GetLayoutView() ->ShouldDoFullPaintInvalidation()); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - inner_view->Compositor()->SetNeedsCompositingUpdate( - kCompositingUpdateRebuildTree); - EXPECT_EQ(kCompositingUpdateRebuildTree, - inner_view->Compositor()->pending_update_type_); - } EXPECT_TRUE(inner_view->Layer()->SelfNeedsRepaint()); CompositeFrame(); @@ -243,12 +233,6 @@ EXPECT_FALSE(inner_view->NeedsLayout()); EXPECT_LT(inner_frame_document->Lifecycle().GetState(), DocumentLifecycle::kPaintClean); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - // If IntersectionObserver is required to run, lifecycle will be updated - // through pre-paint, but not compositing assignment. - EXPECT_EQ(kCompositingUpdateRebuildTree, - inner_view->Compositor()->pending_update_type_); - } EXPECT_TRUE(inner_view->Layer()->SelfNeedsRepaint()); } @@ -484,25 +468,13 @@ frame_element->setAttribute(html_names::kWidthAttr, "50"); CompositeFrame(); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_EQ(DocumentLifecycle::kPaintClean, - frame_document->Lifecycle().GetState()); + EXPECT_EQ(DocumentLifecycle::kPaintClean, + frame_document->Lifecycle().GetState()); - // A hit test will not force a complete lifecycle update. - WebView().MainFrameWidget()->HitTestResultAt(gfx::PointF()); - EXPECT_EQ(DocumentLifecycle::kPaintClean, - frame_document->Lifecycle().GetState()); - } else { - // TODO(chrishtr): fix this test by manually resetting to - // kVisualUpdatePending before call to CompositeFrame. - EXPECT_EQ(DocumentLifecycle::kPaintClean, - frame_document->Lifecycle().GetState()); - - // A hit test will not force a complete lifecycle update. - WebView().MainFrameWidget()->HitTestResultAt(gfx::PointF()); - EXPECT_EQ(DocumentLifecycle::kPaintClean, - frame_document->Lifecycle().GetState()); - } + // A hit test will not force a complete lifecycle update. + WebView().MainFrameWidget()->HitTestResultAt(gfx::PointF()); + EXPECT_EQ(DocumentLifecycle::kPaintClean, + frame_document->Lifecycle().GetState()); } TEST_P(FrameThrottlingTest, UnthrottlingFrameSchedulesAnimation) { @@ -530,49 +502,40 @@ } TEST_P(FrameThrottlingTest, ThrottledFrameCompositing) { - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - SimRequest main_resource("https://example.com/", "text/html"); + SimRequest frame_resource("https://example.com/iframe.html", "text/html"); LoadURL("https://example.com/"); main_resource.Complete(R"HTML( <div id="container"> - <iframe sandbox id="frame"></iframe> + <iframe id=frame sandbox src=iframe.html></iframe> </div> )HTML"); + frame_resource.Complete(R"HTML( + <html id="inner_frame"></html> + )HTML"); CompositeFrame(); - auto* container_element = GetDocument().getElementById("container"); - auto* container = container_element->GetLayoutBox(); - EXPECT_EQ(container->GetCompositingState(), kNotComposited); auto* frame_element = To<HTMLIFrameElement>(GetDocument().getElementById("frame")); auto* frame_view = frame_element->contentDocument()->View(); EXPECT_FALSE(frame_view->CanThrottleRendering()); auto* frame_layout_view = frame_view->GetLayoutView(); EXPECT_TRUE(frame_layout_view->Layer()->CanBeComposited()); - auto* frame_graphics_layer = - frame_layout_view->Layer()->GraphicsLayerBacking(frame_layout_view); - EXPECT_TRUE(frame_graphics_layer); - auto* main_graphics_layer = - GetDocument().View()->GetLayoutView()->Layer()->GraphicsLayerBacking(); - EXPECT_EQ(main_graphics_layer, frame_graphics_layer->Parent()); + auto* root_layer = WebView().MainFrameImpl()->GetFrameView()->RootCcLayer(); + EXPECT_EQ(0u, CcLayersByDOMElementId(root_layer, "container").size()); + EXPECT_EQ(1u, CcLayersByDOMElementId(root_layer, "inner_frame").size()); // First make the child hidden to enable throttling, and composite // the container. + auto* container_element = GetDocument().getElementById("container"); container_element->setAttribute( kStyleAttr, "will-change: transform; transform: translateY(480px)"); CompositeFrame(); EXPECT_TRUE(frame_view->CanThrottleRendering()); - auto* container_graphics_layer = container->Layer()->GraphicsLayerBacking(); - ASSERT_TRUE(container_graphics_layer); - EXPECT_EQ( - frame_graphics_layer, - frame_layout_view->Layer()->GraphicsLayerBacking(frame_layout_view)); - EXPECT_EQ(container_graphics_layer, frame_graphics_layer->Parent()); - EXPECT_FALSE(Compositor().NeedsBeginFrame()); + EXPECT_EQ(1u, CcLayersByDOMElementId(root_layer, "container").size()); + EXPECT_EQ(1u, CcLayersByDOMElementId(root_layer, "inner_frame").size()); // Then bring it back on-screen, and decomposite container. container_element->setAttribute(kStyleAttr, ""); @@ -580,13 +543,9 @@ ASSERT_TRUE(Compositor().NeedsBeginFrame()); CompositeFrame(); EXPECT_FALSE(frame_view->CanThrottleRendering()); - ASSERT_EQ(frame_layout_view, frame_view->GetLayoutView()); EXPECT_TRUE(frame_layout_view->Layer()->CanBeComposited()); - EXPECT_EQ(container->GetCompositingState(), kNotComposited); - EXPECT_EQ( - frame_graphics_layer, - frame_layout_view->Layer()->GraphicsLayerBacking(frame_layout_view)); - EXPECT_EQ(main_graphics_layer, frame_graphics_layer->Parent()); + EXPECT_EQ(0u, CcLayersByDOMElementId(root_layer, "container").size()); + EXPECT_EQ(1u, CcLayersByDOMElementId(root_layer, "inner_frame").size()); } TEST_P(FrameThrottlingTest, MutatingThrottledFrameDoesNotCauseAnimation) { @@ -1093,51 +1052,6 @@ EXPECT_EQ(std::string::npos, result.Utf8().find("throttled")); } -TEST_P(FrameThrottlingTest, PaintingViaGraphicsLayerIsThrottled) { - // GraphicsLayers are not created with CompositeAfterPaint. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - - // TODO(wangxianzhu): See the TODO in CullRectUpdater::SetFragmentCullRects(). - if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) - return; - - WebView().GetSettings()->SetPreferCompositingToLCDTextEnabled(true); - - // Create a hidden frame which is throttled. - SimRequest main_resource("https://example.com/", "text/html"); - SimRequest frame_resource("https://example.com/iframe.html", "text/html"); - - LoadURL("https://example.com/"); - main_resource.Complete("<iframe id=frame sandbox src=iframe.html></iframe>"); - frame_resource.Complete("throttled"); - - // Before the iframe is throttled, we should create all drawing items. - auto commands_not_throttled = CompositeFrame(); - EXPECT_EQ(6u, commands_not_throttled.DrawCount()); - - // Move the frame offscreen to throttle it and make sure it is backed by a - // graphics layer. - auto* frame_element = - To<HTMLIFrameElement>(GetDocument().getElementById("frame")); - frame_element->setAttribute(kStyleAttr, - "transform: translateY(480px) translateZ(0px)"); - EXPECT_FALSE( - frame_element->contentDocument()->View()->CanThrottleRendering()); - CompositeFrame(); - EXPECT_TRUE(frame_element->contentDocument()->View()->CanThrottleRendering()); - - // If painting of the iframe is throttled, we should only receive drawing - // commands for the main frame. We have to explicitly schedule a frame here - // because the iframe becoming throttled will affect the painted output; - // but it will not by itself schedule an animation frame, because it doesn't - // need display. - GetDocument().View()->ScheduleAnimation(); - auto commands_throttled = CompositeFrame(); - EXPECT_EQ(5u, commands_throttled.DrawCount()); - EXPECT_FALSE(Compositor().NeedsBeginFrame()); -} - TEST_P(FrameThrottlingTest, ThrottleInnerCompositedLayer) { WebView().GetSettings()->SetPreferCompositingToLCDTextEnabled(true); @@ -1501,75 +1415,6 @@ } } -TEST_P(FrameThrottlingTest, RebuildCompositedLayerTreeOnLayerRemoval) { - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - - // This test verifies removal of PaintLayer due to style change will force - // unthrottling a frame. This is because destructing PaintLayer would cause - // CompositedLayerMapping and composited layers to be destructed and detach - // from layer tree immediately. Layers could have dangling scroll/clip - // parent if compositing update were omitted. - WebView().GetSettings()->SetPreferCompositingToLCDTextEnabled(true); - - SimRequest main_resource("https://example.com/", "text/html"); - SimRequest frame_resource("https://example.com/iframe.html", "text/html"); - LoadURL("https://example.com/"); - main_resource.Complete( - "<iframe sandbox id='frame' src='iframe.html' style='position:relative; " - "top:1000px;'></iframe>"); - frame_resource.Complete(R"HTML( - <div id='scroller' style='overflow:scroll; width:300px; height:200px;'> - <div style='height:1000px;'></div> - <div id='sibling' style='transform:translateZ(0);'>Foo</div> - </div> - )HTML"); - - CompositeFrame(); - auto* frame_element = - To<HTMLIFrameElement>(GetDocument().getElementById("frame")); - EXPECT_TRUE(frame_element->contentDocument() - ->View() - ->ShouldThrottleRenderingForTest()); - - auto* scroller_element = - frame_element->contentDocument()->getElementById("scroller"); - ASSERT_TRUE(scroller_element->GetLayoutObject()->HasLayer()); - auto* scroller_layer = - To<LayoutBoxModelObject>(scroller_element->GetLayoutObject())->Layer(); - EXPECT_TRUE(scroller_layer->NeedsCompositedScrolling()); - - auto* sibling_element = - frame_element->contentDocument()->getElementById("sibling"); - ASSERT_TRUE(sibling_element->GetLayoutObject()->HasLayer()); - auto* sibling_layer = - To<LayoutBoxModelObject>(sibling_element->GetLayoutObject())->Layer(); - auto* sibling_clm = sibling_layer->GetCompositedLayerMapping(); - ASSERT_TRUE(sibling_clm); - - scroller_element->setAttribute(kStyleAttr, "overflow:visible;"); - EXPECT_EQ(DocumentLifecycle::kVisualUpdatePending, - frame_element->contentDocument()->Lifecycle().GetState()); - - // This simulates a javascript query to layout results, e.g. - // document.body.offsetTop, which will force style & layout to be computed, - // whether the frame is throttled or not. - frame_element->contentDocument()->UpdateStyleAndLayout( - DocumentUpdateReason::kTest); - EXPECT_EQ(DocumentLifecycle::kLayoutClean, - frame_element->contentDocument()->Lifecycle().GetState()); - EXPECT_FALSE(frame_element->contentDocument() - ->View() - ->ShouldThrottleRenderingForTest()); - - CompositeFrame(); - EXPECT_TRUE(frame_element->contentDocument() - ->View() - ->ShouldThrottleRenderingForTest()); - EXPECT_EQ(DocumentLifecycle::kCompositingAssignmentsClean, - frame_element->contentDocument()->Lifecycle().GetState()); -} - TEST_P(FrameThrottlingTest, LifecycleUpdateAfterUnthrottledCompositingUpdate) { SimRequest main_resource("https://example.com/", "text/html"); SimRequest frame_resource("https://example.com/iframe.html", "text/html"); @@ -1599,65 +1444,6 @@ UpdateAllLifecyclePhases(); } -TEST_P(FrameThrottlingTest, GraphicsLayerCollection) { - // GraphicsLayers are not created with CompositeAfterPaint. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - - SimRequest main_resource("https://example.com/", "text/html"); - SimRequest frame_resource("https://example.com/iframe.html", "text/html"); - - LoadURL("https://example.com/"); - // The frame is initially throttled. - main_resource.Complete( - "<iframe id='frame' sandbox src='iframe.html'></iframe>"); - frame_resource.Complete( - "<div id='div' style='will-change: transform'>Foo</div>"); - - CompositeFrame(); - - auto* frame_element = - To<HTMLIFrameElement>(GetDocument().getElementById("frame")); - auto* frame_document = frame_element->contentDocument(); - EXPECT_FALSE(frame_document->View()->ShouldThrottleRenderingForTest()); - auto layer_count = GetDocument().View()->RootCcLayer()->children().size(); - - // Moving the child fully outside the parent makes it invisible. - frame_element->setAttribute(kStyleAttr, "transform: translateY(480px)"); - CompositeFrame(); - EXPECT_TRUE(frame_document->View()->ShouldThrottleRenderingForTest()); - // Change of throttling will force PaintArtifactCompositor update in the next - // frame. - EXPECT_TRUE( - GetDocument().View()->GetPaintArtifactCompositor()->NeedsUpdate()); - - // Force a frame update. We should re-collect the graphics layers. - GetDocument().GetPage()->Animator().ScheduleVisualUpdate( - GetDocument().GetFrame()); - CompositeFrame(); - EXPECT_TRUE(frame_document->View()->ShouldThrottleRenderingForTest()); - // We no longer collect the graphics layers of the iframe and the composited - // content. - EXPECT_GT(layer_count, - GetDocument().View()->RootCcLayer()->children().size()); - - // Move the child back to the visible viewport. - frame_element->setAttribute(kStyleAttr, - "transform: translate(-50px, 0px, 0px)"); - // Update throttling, which will schedule visual update on unthrottling of the - // frame. - CompositeFrame(); - EXPECT_FALSE(frame_document->View()->ShouldThrottleRenderingForTest()); - EXPECT_TRUE( - GetDocument().View()->GetPaintArtifactCompositor()->NeedsUpdate()); - - CompositeFrame(); - EXPECT_FALSE(frame_document->View()->ShouldThrottleRenderingForTest()); - // Now we should collect all graphics layers again. - EXPECT_EQ(layer_count, - GetDocument().View()->RootCcLayer()->children().size()); -} - TEST_P(FrameThrottlingTest, NestedFramesInRemoteFrameHiddenAndShown) { InitializeRemote(); @@ -2145,18 +1931,9 @@ CompositeFrame(); LocalFrameView* view = LocalFrameRoot().GetFrame()->View(); Element* div = view->GetFrame().GetDocument()->QuerySelector("div"); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_FALSE( - view->GetPaintControllerForTesting().GetPaintArtifact().IsEmpty()); - } else { - EXPECT_FALSE(div->GetLayoutObject() - ->PaintingLayer() - ->EnclosingLayerWithCompositedLayerMapping(kIncludeSelf) - ->GraphicsLayerBacking() - ->GetPaintController() - .GetPaintArtifact() - .IsEmpty()); - } + EXPECT_FALSE( + view->GetPaintControllerForTesting().GetPaintArtifact().IsEmpty()); + // This emulates javascript. div->setAttribute("style", "", ASSERT_NO_EXCEPTION); div->getBoundingClientRect(); @@ -2164,84 +1941,8 @@ view->UpdateRenderThrottlingStatus(true, false, false, true); // UpdateRenderThrottlingStatus should have cleared out previous paint // results. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - EXPECT_TRUE( - view->GetPaintControllerForTesting().GetPaintArtifact().IsEmpty()); - } else { - EXPECT_TRUE(div->GetLayoutObject() - ->PaintingLayer() - ->EnclosingLayerWithCompositedLayerMapping(kIncludeSelf) - ->GraphicsLayerBacking() - ->GetPaintController() - .GetPaintArtifact() - .IsEmpty()); - } -} - -TEST_P(FrameThrottlingTest, ForceCompositingUpdateOnVisibilityChange) { - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - - SimRequest main_resource("https://example.com/", "text/html"); - SimRequest child_resource("https://example.com/child.html", "text/html"); - SimRequest grandchild_resource("https://example.com/grandchild.html", - "text/html"); - - LoadURL("https://example.com/"); - main_resource.Complete(R"HTML( - <iframe src="child.html"></iframe> - )HTML"); - child_resource.Complete(R"HTML( - <iframe sandbox src="grandchild.html" style="margin-top: 1000px"></iframe> - )HTML"); - grandchild_resource.Complete(R"HTML( - <div style="width:100px;height:100px;will-change:transform"></div> - )HTML"); - CompositeFrame(); - - LocalFrame* child_frame = - To<LocalFrame>(MainFrame().GetFrame()->FirstChild()); - LocalFrame* grandchild_frame = To<LocalFrame>(child_frame->FirstChild()); - Element* composited_div = - grandchild_frame->GetDocument()->QuerySelector("div"); - - EXPECT_TRUE(grandchild_frame->View()->ShouldThrottleRenderingForTest()); EXPECT_TRUE( - child_frame->ContentLayoutObject()->Compositor()->InCompositingMode()); - EXPECT_TRUE(grandchild_frame->ContentLayoutObject() - ->Compositor() - ->InCompositingMode()); - EXPECT_TRUE(To<LayoutBoxModelObject>(composited_div->GetLayoutObject()) - ->Layer() - ->HasCompositedLayerMapping()); - - // Remove the compositing trigger. Because the grandchild is throttled, it - // will not update its compositing state. - composited_div->RemoveInlineStyleProperty(CSSPropertyID::kWillChange); - MainFrame().GetFrame()->View()->ScheduleAnimation(); - CompositeFrame(); - EXPECT_TRUE(grandchild_frame->View()->ShouldThrottleRenderingForTest()); - EXPECT_TRUE( - child_frame->ContentLayoutObject()->Compositor()->InCompositingMode()); - EXPECT_TRUE(grandchild_frame->ContentLayoutObject() - ->Compositor() - ->InCompositingMode()); - EXPECT_TRUE(To<LayoutBoxModelObject>(composited_div->GetLayoutObject()) - ->Layer() - ->HasCompositedLayerMapping()); - - // Hide the child frame. This will force a compositing update of the throttled - // grandchild on the next lifecycle update, which should decomposite the div. - child_frame->DeprecatedLocalOwner()->SetInlineStyleProperty( - CSSPropertyID::kVisibility, CSSValueID::kHidden); - CompositeFrame(); - EXPECT_TRUE(grandchild_frame->View()->ShouldThrottleRenderingForTest()); - EXPECT_FALSE( - child_frame->ContentLayoutObject()->Compositor()->InCompositingMode()); - EXPECT_FALSE(grandchild_frame->ContentLayoutObject() - ->Compositor() - ->InCompositingMode()); - EXPECT_FALSE(composited_div->GetLayoutObject()->HasLayer()); + view->GetPaintControllerForTesting().GetPaintArtifact().IsEmpty()); } } // namespace blink
diff --git a/third_party/blink/renderer/core/scroll/scrollable_area_test.cc b/third_party/blink/renderer/core/scroll/scrollable_area_test.cc index 83f9705c..f23d62c 100644 --- a/third_party/blink/renderer/core/scroll/scrollable_area_test.cc +++ b/third_party/blink/renderer/core/scroll/scrollable_area_test.cc
@@ -111,37 +111,6 @@ ThreadState::Current()->CollectAllGarbageForTesting(); } -TEST_P(ScrollableAreaTest, ScrollbarLayerInvalidation) { - // In CompositeAfterPaint, the functionality is not testable with just - // ScrollableArea. TODO(wangxianzhu): We can test this after we refactor - // ScrollbarDisplayItem. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - - ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler> - platform; - - ScopedMockOverlayScrollbars mock_overlay_scrollbars; - - MockScrollableArea* scrollable_area = - MockScrollableArea::Create(ScrollOffset(0, 100)); - scoped_refptr<cc::Layer> layer = cc::Layer::Create(); - layer->SetIsDrawable(true); - layer->SetBounds(gfx::Size(111, 222)); - - EXPECT_CALL(*scrollable_area, LayerForHorizontalScrollbar()) - .WillRepeatedly(Return(layer.get())); - - auto* scrollbar = MakeGarbageCollected<Scrollbar>( - scrollable_area, kHorizontalScrollbar, nullptr, nullptr); - EXPECT_TRUE(layer->update_rect().IsEmpty()); - scrollbar->SetNeedsPaintInvalidation(kNoPart); - EXPECT_FALSE(layer->update_rect().IsEmpty()); - - // Forced GC in order to finalize objects depending on the mock object. - ThreadState::Current()->CollectAllGarbageForTesting(); -} - TEST_P(ScrollableAreaTest, InvalidatesNonCompositedScrollbarsWhenThumbMoves) { ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler> platform; @@ -187,97 +156,6 @@ ThreadState::Current()->CollectAllGarbageForTesting(); } -TEST_P(ScrollableAreaTest, InvalidatesCompositedScrollbarsIfPartsNeedRepaint) { - // In CompositeAfterPaint, the functionality is not testable with just - // ScrollableArea. TODO(wangxianzhu): We can test this after we refactor - // ScrollbarDisplayItem. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - - ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler> - platform; - - ScrollbarThemeWithMockInvalidation theme; - MockScrollableArea* scrollable_area = - MockScrollableArea::Create(ScrollOffset(100, 100)); - Scrollbar* horizontal_scrollbar = Scrollbar::CreateForTesting( - scrollable_area, kHorizontalScrollbar, &theme); - horizontal_scrollbar->ClearTrackNeedsRepaint(); - horizontal_scrollbar->ClearThumbNeedsRepaint(); - Scrollbar* vertical_scrollbar = - Scrollbar::CreateForTesting(scrollable_area, kVerticalScrollbar, &theme); - vertical_scrollbar->ClearTrackNeedsRepaint(); - vertical_scrollbar->ClearThumbNeedsRepaint(); - EXPECT_CALL(*scrollable_area, HorizontalScrollbar()) - .WillRepeatedly(Return(horizontal_scrollbar)); - EXPECT_CALL(*scrollable_area, VerticalScrollbar()) - .WillRepeatedly(Return(vertical_scrollbar)); - - // Composited scrollbars only need repainting when parts become invalid - // (e.g. if the track changes appearance when the thumb reaches the end). - scoped_refptr<cc::Layer> layer_for_horizontal_scrollbar = cc::Layer::Create(); - layer_for_horizontal_scrollbar->SetIsDrawable(true); - layer_for_horizontal_scrollbar->SetBounds(gfx::Size(10, 10)); - scoped_refptr<cc::Layer> layer_for_vertical_scrollbar = cc::Layer::Create(); - layer_for_vertical_scrollbar->SetIsDrawable(true); - layer_for_vertical_scrollbar->SetBounds(gfx::Size(10, 10)); - EXPECT_CALL(*scrollable_area, LayerForHorizontalScrollbar()) - .WillRepeatedly(Return(layer_for_horizontal_scrollbar.get())); - EXPECT_CALL(*scrollable_area, LayerForVerticalScrollbar()) - .WillRepeatedly(Return(layer_for_vertical_scrollbar.get())); - ASSERT_TRUE(scrollable_area->HasLayerForHorizontalScrollbar()); - ASSERT_TRUE(scrollable_area->HasLayerForVerticalScrollbar()); - EXPECT_CALL(theme, ShouldRepaintAllPartsOnInvalidation()) - .WillRepeatedly(Return(false)); - - EXPECT_TRUE(layer_for_horizontal_scrollbar->update_rect().IsEmpty()); - EXPECT_TRUE(layer_for_vertical_scrollbar->update_rect().IsEmpty()); - - // First, we'll scroll horizontally, and the theme will require repainting - // the back button (i.e. the track). - EXPECT_CALL(theme, PartsToInvalidateOnThumbPositionChange(_, _, _)) - .WillOnce(Return(kBackButtonStartPart)); - scrollable_area->SetScrollOffset(ScrollOffset(50, 0), - mojom::blink::ScrollType::kProgrammatic); - EXPECT_FALSE(layer_for_horizontal_scrollbar->update_rect().IsEmpty()); - EXPECT_TRUE(layer_for_vertical_scrollbar->update_rect().IsEmpty()); - EXPECT_TRUE(horizontal_scrollbar->TrackNeedsRepaint()); - EXPECT_FALSE(horizontal_scrollbar->ThumbNeedsRepaint()); - layer_for_horizontal_scrollbar->ResetUpdateRectForTesting(); - horizontal_scrollbar->ClearTrackNeedsRepaint(); - - // Next, we'll scroll vertically, but invalidate the thumb. - EXPECT_CALL(theme, PartsToInvalidateOnThumbPositionChange(_, _, _)) - .WillOnce(Return(kThumbPart)); - scrollable_area->SetScrollOffset(ScrollOffset(50, 50), - mojom::blink::ScrollType::kProgrammatic); - EXPECT_TRUE(layer_for_horizontal_scrollbar->update_rect().IsEmpty()); - EXPECT_FALSE(layer_for_vertical_scrollbar->update_rect().IsEmpty()); - EXPECT_FALSE(vertical_scrollbar->TrackNeedsRepaint()); - EXPECT_TRUE(vertical_scrollbar->ThumbNeedsRepaint()); - layer_for_vertical_scrollbar->ResetUpdateRectForTesting(); - vertical_scrollbar->ClearThumbNeedsRepaint(); - - // Next we'll scroll in both, but the thumb position moving requires no - // invalidations. Nonetheless the GraphicsLayer should be invalidated, - // because we still need to update the underlying layer (though no - // rasterization will be required). - EXPECT_CALL(theme, PartsToInvalidateOnThumbPositionChange(_, _, _)) - .Times(2) - .WillRepeatedly(Return(kNoPart)); - scrollable_area->SetScrollOffset(ScrollOffset(70, 70), - mojom::blink::ScrollType::kProgrammatic); - EXPECT_FALSE(layer_for_horizontal_scrollbar->update_rect().IsEmpty()); - EXPECT_FALSE(layer_for_vertical_scrollbar->update_rect().IsEmpty()); - EXPECT_FALSE(horizontal_scrollbar->TrackNeedsRepaint()); - EXPECT_FALSE(horizontal_scrollbar->ThumbNeedsRepaint()); - EXPECT_FALSE(vertical_scrollbar->TrackNeedsRepaint()); - EXPECT_FALSE(vertical_scrollbar->ThumbNeedsRepaint()); - - // Forced GC in order to finalize objects depending on the mock object. - ThreadState::Current()->CollectAllGarbageForTesting(); -} - TEST_P(ScrollableAreaTest, RecalculatesScrollbarOverlayIfBackgroundChanges) { ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler> platform;
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h index 6705e71..c38925b 100644 --- a/third_party/blink/renderer/core/style/computed_style.h +++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -2079,7 +2079,8 @@ CORE_EXPORT bool ShouldApplyAnyContainment(const Element& element) const; bool IsContainerForContainerQueries() const { - return StyleType() == kPseudoIdNone && IsInlineOrBlockSizeContainer(); + return IsInlineOrBlockSizeContainer() && StyleType() == kPseudoIdNone && + !InsideFragmentationContextWithNondeterministicEngine(); } // Display utility functions.
diff --git a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 index 03408f9..f8038ec6 100644 --- a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 +++ b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
@@ -93,9 +93,12 @@ type_name: "bool", inherited: true, }, - // Whether we're inside an NG block fragmentation context. + // Whether we're inside (or at) a block fragmentation context that may + // switch between legacy and NG layout, depending on the contents. + // This can be removed when we have got rid of the legacy engine. + // See crbug.com/1229581 { - name: "InsideNGFragmentationContext", + name: "InsideFragmentationContextWithNondeterministicEngine", field_template: "primitive", default_value: "false", type_name: "bool",
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc index ffa04e63..5a25263a 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -2841,36 +2841,26 @@ // Allow the browser side ax tree to access "visibility: [hidden|collapse]" // and "display: none" nodes. This is useful for APIs that return the node // referenced by aria-labeledby and aria-describedby. - // The conditions are oversimplified, we will include more nodes than - // strictly necessary for aria-labelledby and aria-describedby but we - // avoid performing very complicated checks that could impact performance. - - // We identify nodes in display none subtrees, or nodes that are display - // locked, because they lack a layout object. - if (!GetLayoutObject()) { - // Datalists and options inside them will never a layout object. They - // match the condition above, but we don't need them for accessible - // naming nor have any other use in the accessibility tree, so we exclude - // them specifically. What's more, including them breaks the browser test - // SelectToSpeakKeystrokeSelectionTest.textFieldWithComboBoxSimple. - // Selection and position code takes into account ignored nodes, and it - // looks like including ignored nodes for datalists and options is totally - // unexpected, making selections misbehave. - if (!IsA<HTMLDataListElement>(node) && !IsA<HTMLOptionElement>(node)) - return true; - - } else { // GetLayoutObject() != null - // We identify hidden or collapsed nodes by their associated style values. + // An element must have an id attribute or it cannot be referenced by + // aria-labelledby or aria-describedby. + if (RuntimeEnabledFeatures::AccessibilityExposeDisplayNoneEnabled()) { + if (Element* element = GetElement()) { + if (element->FastHasAttribute(html_names::kIdAttr) && + IsHiddenViaStyle()) { + return true; + } + } + } else if (GetLayoutObject()) { if (GetLayoutObject()->Style()->Visibility() != EVisibility::kVisible) return true; - - // Allow the browser side ax tree to access "aria-hidden" nodes. - // This is useful for APIs that return the node referenced by - // aria-labeledby and aria-describedby. - if (IsAriaHidden()) - return true; } + // Allow the browser side ax tree to access "aria-hidden" nodes. + // This is useful for APIs that return the node referenced by + // aria-labeledby and aria-describedby. + if (GetLayoutObject() && IsAriaHidden()) + return true; + // Labels are sometimes marked ignored, to prevent duplication when the AT // reads the label and the control it labels (see // AXNodeObject::IsRedundantLabel), but we will need them to calculate the @@ -3473,15 +3463,6 @@ name_from, nullptr, nullptr); } -// There are 4 ways to use CSS to hide something: -// * "display: none" is "destroy rendering state and don't do anything in the -// subtree" -// * "visibility: [hidden|collapse]" are "don't visually show things, but still -// keep all of the rendering up to date" -// * "content-visibility: hidden" is "don't show anything, skip all of the -// work, but don't destroy the work that was already there" -// * "content-visibility: auto" is "paint when it's scrolled into the viewport, -// but its layout information is not updated when it isn't" bool AXObject::ComputeIsHiddenViaStyle() const { Node* node = GetNode(); if (!node)
diff --git a/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc b/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc index 5312d9f..f9fb65a 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc
@@ -434,11 +434,6 @@ ASSERT_EQ(ax::mojom::Role::kParagraph, ax_hidden1->RoleValue()); ASSERT_TRUE(ax_hidden1->AccessibilityIsIgnored()); ASSERT_TRUE(ax_hidden1->AccessibilityIsIncludedInTree()); - const AXObject* ax_hidden1_text = ax_hidden1->FirstChildIncludingIgnored(); - ASSERT_NE(nullptr, ax_hidden1_text); - ASSERT_EQ(ax::mojom::Role::kStaticText, ax_hidden1_text->RoleValue()); - ASSERT_TRUE(ax_hidden1_text->AccessibilityIsIgnored()); - ASSERT_TRUE(ax_hidden1_text->AccessibilityIsIncludedInTree()); const AXObject* ax_between = GetAXObjectByElementId("betweenHidden"); ASSERT_NE(nullptr, ax_between); ASSERT_EQ(ax::mojom::Role::kParagraph, ax_between->RoleValue()); @@ -447,11 +442,6 @@ ASSERT_EQ(ax::mojom::Role::kParagraph, ax_hidden2->RoleValue()); ASSERT_TRUE(ax_hidden2->AccessibilityIsIgnored()); ASSERT_TRUE(ax_hidden2->AccessibilityIsIncludedInTree()); - const AXObject* ax_hidden2_text = ax_hidden2->FirstChildIncludingIgnored(); - ASSERT_NE(nullptr, ax_hidden2_text); - ASSERT_EQ(ax::mojom::Role::kStaticText, ax_hidden2_text->RoleValue()); - ASSERT_TRUE(ax_hidden2_text->AccessibilityIsIgnored()); - ASSERT_TRUE(ax_hidden2_text->AccessibilityIsIncludedInTree()); const AXObject* ax_after = GetAXObjectByElementId("afterHidden"); ASSERT_NE(nullptr, ax_after); ASSERT_EQ(ax::mojom::Role::kParagraph, ax_after->RoleValue()); @@ -468,27 +458,26 @@ selection, AXSelectionBehavior::kExtendToValidRange); // The "display: none" content is included in the AXTree as an ignored node, - // so shrunk selection should include those AXObjects. The tree in the browser - // process also includes those ignored nodes, and the position will be - // adjusted according to AXPosition rules; in particular, a position anchored - // before a text node is explicitly moved to before the first character of the - // text object. - ASSERT_TRUE(ax_selection_shrink.Base().IsTextPosition()); - EXPECT_EQ(ax_hidden1_text, ax_selection_shrink.Base().ContainerObject()); - EXPECT_EQ(0, ax_selection_shrink.Base().TextOffset()); - ASSERT_TRUE(ax_selection_shrink.Extent().IsTextPosition()); - EXPECT_EQ(ax_hidden2_text, ax_selection_shrink.Extent().ContainerObject()); - EXPECT_EQ(0, ax_selection_shrink.Extent().TextOffset()); + // so shrunk selection should include those AXObjects. Note that the browser + // process will adjust the position to only encompass the |AXObject| between + // the two "display: none" elements, since they are ignored nodes. + ASSERT_FALSE(ax_selection_shrink.Base().IsTextPosition()); + EXPECT_EQ(ax_hidden1, ax_selection_shrink.Base().ContainerObject()); + EXPECT_EQ(0, ax_selection_shrink.Base().ChildIndex()); + ASSERT_FALSE(ax_selection_shrink.Extent().IsTextPosition()); + EXPECT_EQ(ax_hidden2, ax_selection_shrink.Extent().ContainerObject()); + EXPECT_EQ(0, ax_selection_shrink.Extent().ChildIndex()); // The extended selection should start in the "display: none" content because - // they are included in the AXTree. Similarly to above, the position will be - // adjusted to point to the first character of the text object. - ASSERT_TRUE(ax_selection_extend.Base().IsTextPosition()); - EXPECT_EQ(ax_hidden1_text, ax_selection_extend.Base().ContainerObject()); - EXPECT_EQ(0, ax_selection_extend.Base().TextOffset()); - ASSERT_TRUE(ax_selection_extend.Extent().IsTextPosition()); - EXPECT_EQ(ax_hidden2_text, ax_selection_extend.Extent().ContainerObject()); - EXPECT_EQ(0, ax_selection_extend.Extent().TextOffset()); + // they are included in the AXTree. The browser process will adjust ignored + // positions so that in this case it would only encompass the paragraph + // between the "display: none" nodes. + ASSERT_FALSE(ax_selection_extend.Base().IsTextPosition()); + EXPECT_EQ(ax_hidden1, ax_selection_extend.Base().ContainerObject()); + EXPECT_EQ(0, ax_selection_extend.Base().ChildIndex()); + ASSERT_FALSE(ax_selection_extend.Extent().IsTextPosition()); + EXPECT_EQ(ax_hidden2, ax_selection_extend.Extent().ContainerObject()); + EXPECT_EQ(0, ax_selection_extend.Extent().ChildIndex()); // Even though the two AX selections have different anchors and foci, the text // selected in the accessibility tree should not differ, because any @@ -502,12 +491,10 @@ "++++++++<Paragraph>\n" "++++++++++<StaticText: Before display:none.>\n" "++++++++<Paragraph>\n" - "^++++++++++<StaticText: ^Display:none 1.>\n" - "++++++++<Paragraph>\n" + "^++++++++<Paragraph>\n" "++++++++++<StaticText: In between two display:none elements.>\n" "++++++++<Paragraph>\n" - "|++++++++++<StaticText: |Display:none 2.>\n" - "++++++++<Paragraph>\n" + "|++++++++<Paragraph>\n" "++++++++++<StaticText: After display:none.>\n"); EXPECT_EQ(selection_text, GetSelectionText(ax_selection_shrink)); EXPECT_EQ(selection_text, GetSelectionText(ax_selection_extend));
diff --git a/third_party/blink/renderer/modules/mediastream/BUILD.gn b/third_party/blink/renderer/modules/mediastream/BUILD.gn index 5b24736..736cecf 100644 --- a/third_party/blink/renderer/modules/mediastream/BUILD.gn +++ b/third_party/blink/renderer/modules/mediastream/BUILD.gn
@@ -107,6 +107,7 @@ deps = [ "//build:chromecast_buildflags", "//build:chromeos_buildflags", + "//build:os_buildflags", "//media/capture/mojom:image_capture_blink", "//media/webrtc", "//services/viz/public/cpp/gpu:gpu",
diff --git a/third_party/blink/renderer/modules/mediastream/DEPS b/third_party/blink/renderer/modules/mediastream/DEPS index 6483a11..a9375a8 100644 --- a/third_party/blink/renderer/modules/mediastream/DEPS +++ b/third_party/blink/renderer/modules/mediastream/DEPS
@@ -38,9 +38,9 @@ "+media/capture", "+media/mojo/mojom", "+media/webrtc/audio_delay_stats_reporter.h", + "+media/webrtc/audio_processor.h", "+media/webrtc/audio_processor_controls.h", "+media/webrtc/constants.h", - "+media/webrtc/helpers.h", "+media/webrtc/webrtc_features.h", "-third_party/blink/renderer/modules", "+third_party/blink/renderer/modules/event_modules.h",
diff --git a/third_party/blink/renderer/modules/mediastream/local_media_stream_audio_source.cc b/third_party/blink/renderer/modules/mediastream/local_media_stream_audio_source.cc index d284b26..291dab9 100644 --- a/third_party/blink/renderer/modules/mediastream/local_media_stream_audio_source.cc +++ b/third_party/blink/renderer/modules/mediastream/local_media_stream_audio_source.cc
@@ -124,7 +124,7 @@ const std::string& why) { WebRtcLogMessage( base::StringPrintf("LocalMediaStreamAudioSource::OnCaptureError: %d, %s", - code, why.c_str())); + static_cast<int>(code), why.c_str())); StopSourceOnError(code, why); }
diff --git a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc index e7dacc2..d56667d 100644 --- a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc +++ b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc
@@ -30,6 +30,7 @@ #include "third_party/blink/renderer/modules/mediastream/media_constraints_impl.h" +#include "build/os_buildflags.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/renderer/bindings/core/v8/array_value.h" #include "third_party/blink/renderer/bindings/core/v8/dictionary.h" @@ -376,7 +377,11 @@ Deprecation::CountDeprecation( context, WebFeature::kRTCConstraintEnableDtlsSrtpFalse); } +#if BUILDFLAG(IS_FUCHSIA) + // Special dispensation for Fuchsia to run SDES in 2002 + // TODO(crbug.com/804275): Delete when Fuchsia no longer depends on it. result.enable_dtls_srtp.SetExact(ToBoolean(constraint.value_)); +#endif } else if (constraint.name_.Equals(kEnableRtpDataChannels)) { // This constraint does not turn on RTP data channels, but we do not // want it to cause an error, so we parse it and ignore it.
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.cc b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.cc index 58bc7fef..724a74e 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.cc
@@ -4,251 +4,45 @@ #include "third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.h" -#include <stddef.h> -#include <stdint.h> - -#include <algorithm> -#include <array> -#include <limits> #include <memory> -#include <utility> #include "base/feature_list.h" -#include "base/metrics/field_trial.h" -#include "base/metrics/field_trial_params.h" -#include "base/metrics/histogram_macros.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/trace_event/trace_event.h" #include "build/build_config.h" -#include "build/chromecast_buildflags.h" -#include "build/chromeos_buildflags.h" -#include "media/base/audio_fifo.h" #include "media/base/audio_parameters.h" -#include "media/base/channel_layout.h" -#include "media/base/limits.h" -#include "media/webrtc/constants.h" -#include "media/webrtc/helpers.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h" -#include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/modules/webrtc/webrtc_audio_device_impl.h" #include "third_party/blink/renderer/platform/mediastream/aec_dump_agent_impl.h" -#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h" -#include "third_party/blink/renderer/platform/scheduler/public/worker_pool.h" #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h" -#include "third_party/webrtc/modules/audio_processing/include/audio_processing.h" -#include "third_party/webrtc/modules/audio_processing/include/audio_processing_statistics.h" -#include "third_party/webrtc_overrides/task_queue_factory.h" - -namespace WTF { - -template <typename T> -struct CrossThreadCopier<rtc::scoped_refptr<T>> { - STATIC_ONLY(CrossThreadCopier); - using Type = rtc::scoped_refptr<T>; - static Type Copy(Type pointer) { return pointer; } -}; - -} // namespace WTF namespace blink { -using EchoCancellationType = AudioProcessingProperties::EchoCancellationType; - -namespace { - -constexpr int kBuffersPerSecond = 100; // 10 ms per buffer. - -} // namespace - -// Wraps AudioBus to provide access to the array of channel pointers, since this -// is the type webrtc::AudioProcessing deals in. The array is refreshed on every -// channel_ptrs() call, and will be valid until the underlying AudioBus pointers -// are changed, e.g. through calls to SetChannelData() or SwapChannels(). -// -// All methods are called on one of the capture or render audio threads -// exclusively. -class MediaStreamAudioBus { - public: - MediaStreamAudioBus(int channels, int frames) - : bus_(media::AudioBus::Create(channels, frames)), - channel_ptrs_(new float*[channels]) { - bus_->Zero(); - // May be created in the main render thread and used in the audio threads. - DETACH_FROM_THREAD(thread_checker_); - } - - void ReattachThreadChecker() { - DETACH_FROM_THREAD(thread_checker_); - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - } - - media::AudioBus* bus() { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - return bus_.get(); - } - - float* const* channel_ptrs() { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - for (int i = 0; i < bus_->channels(); ++i) { - channel_ptrs_[i] = bus_->channel(i); - } - return channel_ptrs_.get(); - } - - private: - THREAD_CHECKER(thread_checker_); - std::unique_ptr<media::AudioBus> bus_; - std::unique_ptr<float*[]> channel_ptrs_; -}; - -// Wraps AudioFifo to provide a cleaner interface to MediaStreamAudioProcessor. -// It avoids the FIFO when the source and destination frames match. All methods -// are called on one of the capture or render audio threads exclusively. If -// |source_channels| is larger than |destination_channels|, only the first -// |destination_channels| are kept from the source. -class MediaStreamAudioFifo { - public: - MediaStreamAudioFifo(int source_channels, - int destination_channels, - int source_frames, - int destination_frames, - int sample_rate) - : source_channels_(source_channels), - source_frames_(source_frames), - sample_rate_(sample_rate), - destination_( - new MediaStreamAudioBus(destination_channels, destination_frames)), - data_available_(false) { - DCHECK_GE(source_channels, destination_channels); - - if (source_channels > destination_channels) { - audio_source_intermediate_ = - media::AudioBus::CreateWrapper(destination_channels); - } - - if (source_frames != destination_frames) { - // Since we require every Push to be followed by as many Consumes as - // possible, twice the larger of the two is a (probably) loose upper bound - // on the FIFO size. - const int fifo_frames = 2 * std::max(source_frames, destination_frames); - fifo_ = - std::make_unique<media::AudioFifo>(destination_channels, fifo_frames); - } - - // May be created in the main render thread and used in the audio threads. - DETACH_FROM_THREAD(thread_checker_); - } - - void ReattachThreadChecker() { - DETACH_FROM_THREAD(thread_checker_); - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - destination_->ReattachThreadChecker(); - } - - void Push(const media::AudioBus& source, base::TimeDelta audio_delay) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK_EQ(source.channels(), source_channels_); - DCHECK_EQ(source.frames(), source_frames_); - - const media::AudioBus* source_to_push = &source; - - if (audio_source_intermediate_) { - for (int i = 0; i < destination_->bus()->channels(); ++i) { - audio_source_intermediate_->SetChannelData( - i, const_cast<float*>(source.channel(i))); - } - audio_source_intermediate_->set_frames(source.frames()); - source_to_push = audio_source_intermediate_.get(); - } - - if (fifo_) { - CHECK_LT(fifo_->frames(), destination_->bus()->frames()); - next_audio_delay_ = - audio_delay + fifo_->frames() * base::Seconds(1) / sample_rate_; - fifo_->Push(source_to_push); - } else { - CHECK(!data_available_); - source_to_push->CopyTo(destination_->bus()); - next_audio_delay_ = audio_delay; - data_available_ = true; - } - } - - // Returns true if there are destination_frames() of data available to be - // consumed, and otherwise false. - bool Consume(MediaStreamAudioBus** destination, - base::TimeDelta* audio_delay) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - - if (fifo_) { - if (fifo_->frames() < destination_->bus()->frames()) - return false; - - fifo_->Consume(destination_->bus(), 0, destination_->bus()->frames()); - *audio_delay = next_audio_delay_; - next_audio_delay_ -= - destination_->bus()->frames() * base::Seconds(1) / sample_rate_; - } else { - if (!data_available_) - return false; - *audio_delay = next_audio_delay_; - // The data was already copied to |destination_| in this case. - data_available_ = false; - } - - *destination = destination_.get(); - return true; - } - - private: - THREAD_CHECKER(thread_checker_); - const int source_channels_; // For a DCHECK. - const int source_frames_; // For a DCHECK. - const int sample_rate_; - std::unique_ptr<media::AudioBus> audio_source_intermediate_; - std::unique_ptr<MediaStreamAudioBus> destination_; - std::unique_ptr<media::AudioFifo> fifo_; - - // When using |fifo_|, this is the audio delay of the first sample to be - // consumed next from the FIFO. When not using |fifo_|, this is the audio - // delay of the first sample in |destination_|. - base::TimeDelta next_audio_delay_; - - // True when |destination_| contains the data to be returned by the next call - // to Consume(). Only used when the FIFO is disabled. - bool data_available_; -}; - MediaStreamAudioProcessor::MediaStreamAudioProcessor( DeliverProcessedAudioCallback deliver_processed_audio_callback, - LogCallback log_callback, const AudioProcessingProperties& properties, bool use_capture_multi_channel_processing, scoped_refptr<WebRtcAudioDeviceImpl> playout_data_source) - : deliver_processed_audio_callback_(deliver_processed_audio_callback), - log_callback_(log_callback), - render_delay_(base::TimeDelta()), - audio_delay_stats_reporter_(kBuffersPerSecond), + : audio_processor_(std::move(deliver_processed_audio_callback), + /*log_callback=*/ + ConvertToBaseRepeatingCallback( + CrossThreadBindRepeating(&WebRtcLogMessage)), + properties.ToAudioProcessingSettings( + use_capture_multi_channel_processing)), playout_data_source_(std::move(playout_data_source)), main_thread_runner_(base::ThreadTaskRunnerHandle::Get()), - audio_mirroring_(false), aec_dump_agent_impl_(AecDumpAgentImpl::Create(this)), - stopped_(false), - use_capture_multi_channel_processing_( - use_capture_multi_channel_processing) { - DCHECK(deliver_processed_audio_callback_); - DCHECK(log_callback_); + stopped_(false) { DCHECK(main_thread_runner_); + // Register as a listener for the playout reference signal. Used for echo + // cancellation and gain control. + if (audio_processor_.RequiresPlayoutReference() && playout_data_source_) { + playout_data_source_->AddPlayoutSink(this); + } DETACH_FROM_THREAD(capture_thread_checker_); DETACH_FROM_THREAD(render_thread_checker_); - SendLogMessage(base::StringPrintf( - "%s({use_capture_multi_channel_processing=%s})", __func__, - use_capture_multi_channel_processing ? "true" : "false")); - - InitializeAudioProcessingModule(properties); } MediaStreamAudioProcessor::~MediaStreamAudioProcessor() { @@ -263,7 +57,7 @@ const media::AudioParameters& input_format) { DCHECK(main_thread_runner_->BelongsToCurrentThread()); - InitializeCaptureFifo(input_format); + audio_processor_.OnCaptureFormatChanged(input_format); // Reset the |capture_thread_checker_| since the capture data will come from // a new capture thread. @@ -277,125 +71,58 @@ double volume, bool key_pressed) { DCHECK_CALLED_ON_VALID_THREAD(capture_thread_checker_); - DCHECK(deliver_processed_audio_callback_); - // Sanity-check the input audio format in debug builds. - DCHECK(input_format_.IsValid()); - DCHECK_EQ(audio_source.channels(), input_format_.channels()); - DCHECK_EQ(audio_source.frames(), input_format_.frames_per_buffer()); - - base::TimeDelta capture_delay = base::TimeTicks::Now() - audio_capture_time; - TRACE_EVENT1("audio", "MediaStreamAudioProcessor::ProcessCapturedAudio", - "delay (ms)", capture_delay.InMillisecondsF()); - - capture_fifo_->Push(audio_source, capture_delay); - - // Process and consume the data in the FIFO until there is not enough - // data to process. - MediaStreamAudioBus* process_bus; - while (capture_fifo_->Consume(&process_bus, &capture_delay)) { - // Use the process bus directly if audio processing is disabled. - MediaStreamAudioBus* output_bus = process_bus; - absl::optional<double> new_volume; - if (audio_processing_) { - output_bus = output_bus_.get(); - new_volume = - ProcessData(process_bus->channel_ptrs(), process_bus->bus()->frames(), - capture_delay, volume, key_pressed, - num_preferred_channels, output_bus->channel_ptrs()); - } - - // Swap channels before interleaving the data. - if (audio_mirroring_ && - output_format_.channel_layout() == media::CHANNEL_LAYOUT_STEREO) { - // Swap the first and second channels. - output_bus->bus()->SwapChannels(0, 1); - } - - deliver_processed_audio_callback_.Run(*output_bus->bus(), - audio_capture_time, new_volume); - } + audio_processor_.ProcessCapturedAudio(audio_source, audio_capture_time, + num_preferred_channels, volume, + key_pressed); } void MediaStreamAudioProcessor::Stop() { DCHECK(main_thread_runner_->BelongsToCurrentThread()); - if (stopped_) return; - stopped_ = true; - deliver_processed_audio_callback_.Reset(); aec_dump_agent_impl_.reset(); - - if (!audio_processing_.get()) - return; - - media::StopEchoCancellationDump(audio_processing_.get()); - worker_queue_.reset(nullptr); - - if (playout_data_source_) { + audio_processor_.OnStopDump(); + if (audio_processor_.RequiresPlayoutReference() && playout_data_source_) { playout_data_source_->RemovePlayoutSink(this); playout_data_source_ = nullptr; } } -const media::AudioParameters& MediaStreamAudioProcessor::InputFormat() const { - return input_format_; +const media::AudioParameters& +MediaStreamAudioProcessor::GetInputFormatForTesting() const { + return audio_processor_.GetInputFormatForTesting(); } const media::AudioParameters& MediaStreamAudioProcessor::OutputFormat() const { - return output_format_; + return audio_processor_.OutputFormat(); } void MediaStreamAudioProcessor::SetOutputWillBeMuted(bool muted) { DCHECK(main_thread_runner_->BelongsToCurrentThread()); DCHECK(base::FeatureList::IsEnabled( features::kMinimizeAudioProcessingForUnusedOutput)); - SendLogMessage( - base::StringPrintf("%s({muted=%s})", __func__, muted ? "true" : "false")); - if (audio_processing_) { - audio_processing_->set_output_will_be_muted(muted); - } + audio_processor_.SetOutputWillBeMuted(muted); } void MediaStreamAudioProcessor::OnStartDump(base::File dump_file) { DCHECK(main_thread_runner_->BelongsToCurrentThread()); - - DCHECK(dump_file.IsValid()); - - if (audio_processing_) { - if (!worker_queue_) { - worker_queue_ = std::make_unique<rtc::TaskQueue>( - CreateWebRtcTaskQueue(rtc::TaskQueue::Priority::LOW)); - } - // Here tasks will be posted on the |worker_queue_|. It must be - // kept alive until media::StopEchoCancellationDump is called or the - // webrtc::AudioProcessing instance is destroyed. - media::StartEchoCancellationDump(audio_processing_.get(), - std::move(dump_file), worker_queue_.get()); - } else { - // Post the file close to avoid blocking the main thread. - worker_pool::PostTask( - FROM_HERE, {base::TaskPriority::LOWEST, base::MayBlock()}, - CrossThreadBindOnce([](base::File) {}, std::move(dump_file))); - } + audio_processor_.OnStartDump(std::move(dump_file)); } void MediaStreamAudioProcessor::OnStopDump() { DCHECK(main_thread_runner_->BelongsToCurrentThread()); - if (audio_processing_) - media::StopEchoCancellationDump(audio_processing_.get()); - - // Note that deleting an rtc::TaskQueue has to be done from the - // thread that created it. - worker_queue_.reset(nullptr); + audio_processor_.OnStopDump(); } // static bool MediaStreamAudioProcessor::WouldModifyAudio( const AudioProcessingProperties& properties) { - // Note: This method should by kept in-sync with any changes to the logic in - // MediaStreamAudioProcessor::InitializeAudioProcessingModule(). + // Note: This method should be kept in-sync with any changes to the logic in + // AudioProcessor::InitializeAudioProcessingModule(). + // TODO(https://crbug.com/1269364): Share this logic with + // AudioProcessor::InitializeAudioProcessingModule(). if (properties.goog_audio_mirroring) return true; @@ -426,45 +153,7 @@ int sample_rate, base::TimeDelta audio_delay) { DCHECK_CALLED_ON_VALID_THREAD(render_thread_checker_); - DCHECK_GE(audio_bus->channels(), 1); - DCHECK_LE(audio_bus->channels(), media::limits::kMaxChannels); - int frames_per_10_ms = sample_rate / 100; - if (audio_bus->frames() != frames_per_10_ms) { - if (unsupported_buffer_size_log_count_ < 10) { - LOG(ERROR) << "MSAP::OnPlayoutData: Unsupported audio buffer size " - << audio_bus->frames() << ", expected " << frames_per_10_ms; - ++unsupported_buffer_size_log_count_; - } - return; - } - - TRACE_EVENT1("audio", "MediaStreamAudioProcessor::OnPlayoutData", - "delay (ms)", audio_delay.InMillisecondsF()); - render_delay_ = audio_delay; - - webrtc::StreamConfig input_stream_config(sample_rate, audio_bus->channels()); - // If the input audio appears to contain upmixed mono audio, then APM is only - // given the left channel. This reduces computational complexity and improves - // convergence of audio processing algorithms. - // TODO(crbug.com/1023337): Ensure correct channel count in input audio bus. - assume_upmixed_mono_playout_ = assume_upmixed_mono_playout_ && - LeftAndRightChannelsAreSymmetric(*audio_bus); - if (assume_upmixed_mono_playout_) { - input_stream_config.set_num_channels(1); - } - std::array<const float*, media::limits::kMaxChannels> input_ptrs; - for (int i = 0; i < static_cast<int>(input_stream_config.num_channels()); ++i) - input_ptrs[i] = audio_bus->channel(i); - - // TODO(ajm): Should AnalyzeReverseStream() account for the |audio_delay|? - const int apm_error = audio_processing_->AnalyzeReverseStream( - input_ptrs.data(), input_stream_config); - if (apm_error != webrtc::AudioProcessing::kNoError && - apm_playout_error_code_log_count_ < 10) { - LOG(ERROR) << "MSAP::OnPlayoutData: AnalyzeReverseStream error=" - << apm_error; - ++apm_playout_error_code_log_count_; - } + audio_processor_.OnPlayoutData(audio_bus, sample_rate, audio_delay); } void MediaStreamAudioProcessor::OnPlayoutDataSourceChanged() { @@ -480,280 +169,8 @@ webrtc::AudioProcessorInterface::AudioProcessorStatistics MediaStreamAudioProcessor::GetStats(bool has_remote_tracks) { AudioProcessorStatistics stats; - stats.apm_statistics = audio_processing_->GetStatistics(has_remote_tracks); + stats.apm_statistics = audio_processor_.GetStats(); return stats; } -void MediaStreamAudioProcessor::InitializeAudioProcessingModule( - const AudioProcessingProperties& properties) { - DCHECK(main_thread_runner_->BelongsToCurrentThread()); - DCHECK(!audio_processing_); - SendLogMessage(base::StringPrintf("%s()", __func__)); - - // Note: The audio mirroring constraint (i.e., swap left and right channels) - // is handled within this MediaStreamAudioProcessor and does not, by itself, - // require webrtc::AudioProcessing. - audio_mirroring_ = properties.goog_audio_mirroring; - -#if defined(OS_ANDROID) - const bool goog_experimental_aec = false; -#else - const bool goog_experimental_aec = - properties.goog_experimental_echo_cancellation; -#endif - - // Return immediately if none of the goog constraints requiring - // webrtc::AudioProcessing are enabled. - if (!properties.EchoCancellationIsWebRtcProvided() && - !goog_experimental_aec && !properties.goog_noise_suppression && - !properties.goog_highpass_filter && !properties.goog_auto_gain_control && - !properties.goog_experimental_noise_suppression) { - // Sanity-check: WouldModifyAudio() should return true iff - // |audio_mirroring_| is true. - DCHECK_EQ(audio_mirroring_, WouldModifyAudio(properties)); - return; - } - - // Sanity-check: WouldModifyAudio() should return true because the above logic - // has determined webrtc::AudioProcessing will be used. - DCHECK(WouldModifyAudio(properties)); - - audio_processing_ = media::CreateWebRtcAudioProcessingModule( - properties.ToAudioProcessingSettings( - use_capture_multi_channel_processing_)); - - // Register as a listener for the echo cancellation playout reference signal. - if (playout_data_source_) { - playout_data_source_->AddPlayoutSink(this); - } -} - -void MediaStreamAudioProcessor::InitializeCaptureFifo( - const media::AudioParameters& input_format) { - DCHECK(main_thread_runner_->BelongsToCurrentThread()); - DCHECK(input_format.IsValid()); - SendLogMessage( - base::StringPrintf("%s({input_format=[%s]})", __func__, - input_format.AsHumanReadableString().c_str())); - - input_format_ = input_format; - - // TODO(crbug/881275): For now, we assume fixed parameters for the output when - // audio processing is enabled, to match the previous behavior. We should - // either use the input parameters (in which case, audio processing will - // convert at output) or ideally, have a backchannel from the sink to know - // what format it would prefer. - const int output_sample_rate = - audio_processing_ ? -#if BUILDFLAG(IS_CHROMECAST) - std::min(media::kAudioProcessingSampleRateHz, - input_format.sample_rate()) -#else - media::kAudioProcessingSampleRateHz -#endif // BUILDFLAG(IS_CHROMECAST) - : input_format.sample_rate(); - - // The output channels from the fifo is normally the same as input. - int fifo_output_channels = input_format.channels(); - - media::ChannelLayout output_channel_layout; - if (!audio_processing_) { - if (input_format.channel_layout() == - media::CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC) { - // Special case for if we have a keyboard mic channel on the input and no - // audio processing is used. We will then have the fifo strip away that - // channel. So we use stereo as output layout, and also change the output - // channels for the fifo. - output_channel_layout = media::CHANNEL_LAYOUT_STEREO; - fifo_output_channels = ChannelLayoutToChannelCount(output_channel_layout); - } else { - output_channel_layout = input_format.channel_layout(); - } - } else if (use_capture_multi_channel_processing_) { - // The number of output channels is equal to the number of input channels. - // If the media stream audio processor receives stereo input it will output - // stereo. To reduce computational complexity, APM will not perform full - // multichannel processing unless any sink requests more than one channel. - // If the input is multichannel but the sinks are not interested in more - // than one channel, APM will internally downmix the signal to mono and - // process it. The processed mono signal will then be upmixed to same number - // of channels as the input before leaving the media stream audio processor. - // If a sink later requests stereo, APM will start performing true stereo - // processing. There will be no need to change the output format. - - // The keyboard mic channel shall not be part of the output. - if (input_format.channel_layout() == - media::CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC) { - output_channel_layout = media::CHANNEL_LAYOUT_STEREO; - } else { - output_channel_layout = input_format.channel_layout(); - } - } else { - output_channel_layout = media::CHANNEL_LAYOUT_MONO; - } - - // webrtc::AudioProcessing requires a 10 ms chunk size. We use this native - // size when processing is enabled. When disabled we use the same size as - // the source if less than 10 ms. - // - // TODO(ajm): This conditional buffer size appears to be assuming knowledge of - // the sink based on the source parameters. PeerConnection sinks seem to want - // 10 ms chunks regardless, while WebAudio sinks want less, and we're assuming - // we can identify WebAudio sinks by the input chunk size. Less fragile would - // be to have the sink actually tell us how much it wants (as in the above - // todo). - int processing_frames = input_format.sample_rate() / 100; - int output_frames = output_sample_rate / 100; - if (!audio_processing_ && input_format.frames_per_buffer() < output_frames) { - processing_frames = input_format.frames_per_buffer(); - output_frames = processing_frames; - } - - output_format_ = media::AudioParameters( - media::AudioParameters::AUDIO_PCM_LOW_LATENCY, output_channel_layout, - output_sample_rate, output_frames); - if (output_channel_layout == media::CHANNEL_LAYOUT_DISCRETE) { - // Explicitly set number of channels for discrete channel layouts. - output_format_.set_channels_for_discrete(input_format.channels()); - } - SendLogMessage( - base::StringPrintf("%s => (output_format=[%s])", __func__, - output_format_.AsHumanReadableString().c_str())); - SendLogMessage(base::StringPrintf( - "%s => (FIFO: processing_frames=%d, output_channels=%d)", __func__, - processing_frames, fifo_output_channels)); - - capture_fifo_ = std::make_unique<MediaStreamAudioFifo>( - input_format.channels(), fifo_output_channels, - input_format.frames_per_buffer(), processing_frames, - input_format.sample_rate()); - - if (audio_processing_) { - output_bus_ = std::make_unique<MediaStreamAudioBus>( - output_format_.channels(), output_frames); - } -} - -absl::optional<double> MediaStreamAudioProcessor::ProcessData( - const float* const* process_ptrs, - int process_frames, - base::TimeDelta capture_delay, - double volume, - bool key_pressed, - int num_preferred_channels, - float* const* output_ptrs) { - DCHECK(audio_processing_); - DCHECK_CALLED_ON_VALID_THREAD(capture_thread_checker_); - - const base::TimeDelta render_delay = render_delay_; - - TRACE_EVENT2("audio", "MediaStreamAudioProcessor::ProcessData", - "capture_delay (ms)", capture_delay.InMillisecondsF(), - "render_delay (ms)", render_delay.InMillisecondsF()); - - const int64_t total_delay_ms = - (capture_delay + render_delay).InMilliseconds(); - - if (total_delay_ms > 300 && large_delay_log_count_ < 10) { - LOG(WARNING) << "Large audio delay, capture delay: " - << capture_delay.InMillisecondsF() - << "ms; render delay: " << render_delay.InMillisecondsF() - << "ms"; - ++large_delay_log_count_; - } - - audio_delay_stats_reporter_.ReportDelay(capture_delay, render_delay); - - webrtc::AudioProcessing* ap = audio_processing_.get(); - DCHECK_LE(total_delay_ms, std::numeric_limits<int>::max()); - ap->set_stream_delay_ms(base::saturated_cast<int>(total_delay_ms)); - - // Keep track of the maximum number of preferred channels. The number of - // output channels of APM can increase if preferred by the sinks, but - // never decrease. - max_num_preferred_output_channels_ = - std::max(max_num_preferred_output_channels_, num_preferred_channels); - - // Upscale the volume to the range expected by the WebRTC automatic gain - // controller. -#if defined(OS_WIN) || defined(OS_MAC) - DCHECK_LE(volume, 1.0); -#elif defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || defined(OS_OPENBSD) - // We have a special situation on Linux where the microphone volume can be - // "higher than maximum". The input volume slider in the sound preference - // allows the user to set a scaling that is higher than 100%. It means that - // even if the reported maximum levels is N, the actual microphone level can - // go up to 1.5x*N and that corresponds to a normalized |volume| of 1.5x. - DCHECK_LE(volume, 1.6); -#endif - // Map incoming volume range of [0.0, 1.0] to [0, 255] used by AGC. - // The volume can be higher than 255 on Linux, and it will be cropped to - // 255 since AGC does not allow values out of range. - const int max_analog_gain_level = media::MaxWebRtcAnalogGainLevel(); - int current_analog_gain_level = - static_cast<int>((volume * max_analog_gain_level) + 0.5); - current_analog_gain_level = - std::min(current_analog_gain_level, max_analog_gain_level); - DCHECK_LE(current_analog_gain_level, max_analog_gain_level); - - ap->set_stream_analog_level(current_analog_gain_level); - ap->set_stream_key_pressed(key_pressed); - - // Depending on how many channels the sinks prefer, the number of APM output - // channels is allowed to vary between 1 and the number of channels of the - // output format. The output format in turn depends on the input format. - // Example: With a stereo mic the output format will have 2 channels, and APM - // will produce 1 or 2 output channels depending on the sinks. - int num_apm_output_channels = - std::min(max_num_preferred_output_channels_, output_format_.channels()); - - // Limit number of apm output channels to 2 to avoid potential problems with - // discrete channel mapping. - num_apm_output_channels = std::min(num_apm_output_channels, 2); - - CHECK_GE(num_apm_output_channels, 1); - const webrtc::StreamConfig apm_output_config = webrtc::StreamConfig( - output_format_.sample_rate(), num_apm_output_channels, false); - - int err = ap->ProcessStream(process_ptrs, CreateStreamConfig(input_format_), - apm_output_config, output_ptrs); - DCHECK_EQ(err, 0) << "ProcessStream() error: " << err; - - // Upmix if the number of channels processed by APM is less than the number - // specified in the output format. Channels above stereo will be set to zero. - if (num_apm_output_channels < output_format_.channels()) { - if (num_apm_output_channels == 1) { - // The right channel is a copy of the left channel. Remaining channels - // have already been set to zero at initialization. - memcpy(&output_ptrs[1][0], &output_ptrs[0][0], - output_format_.frames_per_buffer() * sizeof(output_ptrs[0][0])); - } - } - - PostCrossThreadTask( - *main_thread_runner_, FROM_HERE, - CrossThreadBindOnce(&MediaStreamAudioProcessor::UpdateAecStats, - rtc::scoped_refptr<MediaStreamAudioProcessor>(this))); - - // Return a new mic volume, if the volume has been changed. - const int recommended_analog_gain_level = - ap->recommended_stream_analog_level(); - if (recommended_analog_gain_level == current_analog_gain_level) { - return absl::nullopt; - } else { - return static_cast<double>(recommended_analog_gain_level) / - media::MaxWebRtcAnalogGainLevel(); - } -} - -void MediaStreamAudioProcessor::UpdateAecStats() { - DCHECK(main_thread_runner_->BelongsToCurrentThread()); -} - -void MediaStreamAudioProcessor::SendLogMessage(const std::string& message) { - log_callback_.Run(base::StringPrintf("MSAP::%s [this=0x%" PRIXPTR "]", - message.c_str(), - reinterpret_cast<uintptr_t>(this))); -} - } // namespace blink
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.h b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.h index 1234555..5855ca37 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.h +++ b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.h
@@ -8,21 +8,18 @@ #include <memory> #include "base/files/file.h" -#include "base/gtest_prod_util.h" #include "base/memory/scoped_refptr.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" #include "media/base/audio_parameters.h" -#include "media/webrtc/audio_delay_stats_reporter.h" +#include "media/webrtc/audio_processor.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/mediastream/aec_dump_agent_impl.h" #include "third_party/blink/renderer/platform/mediastream/media_stream_audio_processor_options.h" #include "third_party/blink/renderer/platform/webrtc/webrtc_source.h" -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/webrtc/api/media_stream_interface.h" #include "third_party/webrtc/modules/audio_processing/include/audio_processing.h" -#include "third_party/webrtc/rtc_base/task_queue.h" namespace media { class AudioBus; @@ -31,49 +28,34 @@ namespace blink { class AecDumpAgentImpl; -class MediaStreamAudioBus; -class MediaStreamAudioFifo; class WebRtcAudioDeviceImpl; using webrtc::AudioProcessorInterface; -// This class owns an object of webrtc::AudioProcessing which contains signal -// processing components like AGC, AEC and NS. It enables the components based -// on the getUserMedia constraints, processes the data and outputs it in a unit -// of up to 10 ms data chunk. +// This class owns a media::AudioProcessor which processes captured audio. +// MediaStreamAudioProcessor manages subscriptions for echo cancellation +// playout reference audio, diagnostic recording communication with the browser, +// and renderer-specific threading requirements. All processing functionality is +// delegated to the media::AudioProcessor. class MODULES_EXPORT MediaStreamAudioProcessor : public WebRtcPlayoutDataSource::Sink, public AudioProcessorInterface, public AecDumpAgentImpl::Delegate { public: // Callback for consuming processed capture audio. - // |audio_bus| contains the most recent processed capture audio. - // |new_volume| specifies a new microphone volume from the AGC. The new - // microphone volume range is [0.0, 1.0], and is only set if the microphone - // volume should be adjusted. using DeliverProcessedAudioCallback = - base::RepeatingCallback<void(const media::AudioBus& audio_bus, - base::TimeTicks audio_capture_time, - absl::optional<double> new_volume)>; - - using LogCallback = base::RepeatingCallback<void(const std::string&)>; + media::AudioProcessor::DeliverProcessedAudioCallback; // |deliver_processed_audio_callback| is used to deliver frames of processed // capture audio, from ProcessCapturedAudio(), and has to be valid until - // Stop() is called. |log_callback| is used for logging messages. - // |playout_data_source| is used to register this class as a sink to the - // WebRtc playout data for processing AEC. If clients do not enable AEC, - // |playout_data_source| won't be used. - - // |playout_data_source| is used to register this class as a sink to the - // WebRtc playout data for processing AEC. If clients do not enable AEC, - // |playout_data_source| won't be used. + // Stop() is called. |playout_data_source| is used to register this class as a + // sink to the WebRtc playout data for processing AEC. If clients do not + // enable AEC, |playout_data_source| won't be used. // // Threading note: The constructor assumes it is being run on the main render // thread. MediaStreamAudioProcessor( DeliverProcessedAudioCallback deliver_processed_audio_callback, - LogCallback log_callback, const AudioProcessingProperties& properties, bool use_capture_multi_channel_processing, scoped_refptr<WebRtcAudioDeviceImpl> playout_data_source); @@ -89,18 +71,9 @@ // thread. void OnCaptureFormatChanged(const media::AudioParameters& source_params); - // Processes and delivers capture audio in chunks of <= 10 ms to - // |deliver_processed_audio_callback_|: Each call to ProcessCapturedAudio() - // method triggers zero or more calls to |deliver_processed_audio_callback_|, - // depending on internal FIFO size and content. |num_preferred_channels| is - // the highest number of channels that any sink is interested in. This can be - // different from the number of channels in the output format. A value of -1 - // means an unknown number. If |use_capture_multi_channel_processing_| is - // true, the number of channels of the output of the Audio Processing Module - // (APM) will be equal to the highest observed value of num_preferred_channels - // as long as it does not exceed the number of channels of the output format. - // |volume| specifies the current microphone volume, in the range [0.0, 1.0]. - // Called on the capture audio thread. + // Processes and delivers capture audio, + // See media::AudioProcessor::ProcessCapturedAudio for API details. + // Must be called on the capture audio thread. void ProcessCapturedAudio(const media::AudioBus& audio_source, base::TimeTicks audio_capture_time, int num_preferred_channels, @@ -112,13 +85,15 @@ // recordings and playout audio analysis. void Stop(); - // The audio formats of the capture input to and output from the processor. - // Must only be called on the main render or audio capture threads. - const media::AudioParameters& InputFormat() const; + // The format of the processed capture output audio from the processor. + // Is constant between calls to OnCaptureFormatChanged(). + // Must only be called on the main render thread. const media::AudioParameters& OutputFormat() const; - // Accessor to check if the audio processing is enabled or not. - bool has_audio_processing() const { return !!audio_processing_; } + // Accessor to check if WebRTC audio processing is enabled or not. + bool has_webrtc_audio_processing() const { + return audio_processor_.has_webrtc_audio_processing(); + } // Instructs the Audio Processing Module (APM) to reduce its complexity when // |muted| is true. This mode is triggered when all audio tracks are disabled. @@ -142,20 +117,8 @@ private: friend class MediaStreamAudioProcessorTest; - FRIEND_TEST_ALL_PREFIXES(MediaStreamAudioProcessorTest, - TestAgcEnableDefaultAgc1); - FRIEND_TEST_ALL_PREFIXES(MediaStreamAudioProcessorTest, - TestAgcEnableExperimentalAgc1); - FRIEND_TEST_ALL_PREFIXES(MediaStreamAudioProcessorTest, - TestAgcEnableHybridAgc); - FRIEND_TEST_ALL_PREFIXES(MediaStreamAudioProcessorTest, - TestAgcEnableHybridAgcDryRun); - FRIEND_TEST_ALL_PREFIXES(MediaStreamAudioProcessorTest, - TestAgcEnableHybridAgcSimdNotAllowed); - FRIEND_TEST_ALL_PREFIXES(MediaStreamAudioProcessorTest, - TestAgcEnableClippingControl); - FRIEND_TEST_ALL_PREFIXES(MediaStreamAudioProcessorTest, - TestAgcEnableClippingControlDefaultParams); + // Format of input to ProcessCapturedAudio(). + const media::AudioParameters& GetInputFormatForTesting() const; // WebRtcPlayoutDataSource::Sink implementation. void OnPlayoutData(media::AudioBus* audio_bus, @@ -165,81 +128,18 @@ void OnRenderThreadChanged() override; absl::optional<webrtc::AudioProcessing::Config> - GetAudioProcessingModuleConfig() const { - if (audio_processing_) { - return audio_processing_->GetConfig(); - } - return absl::nullopt; + GetAudioProcessingModuleConfigForTesting() const { + return audio_processor_.GetAudioProcessingModuleConfigForTesting(); } // This method is called on the libjingle thread. + // TODO(webrtc:5298): |has_remote_tracks| is no longer used, remove it. AudioProcessorStatistics GetStats(bool has_remote_tracks) override; - // Helper to initialize the WebRtc AudioProcessing. - void InitializeAudioProcessingModule( - const AudioProcessingProperties& properties); - - // Helper to initialize the capture converter. - void InitializeCaptureFifo(const media::AudioParameters& input_format); - - // Called by ProcessCapturedAudio(). - // Returns the new microphone volume in the range of |0.0, 1.0], or unset if - // the volume should not be updated. - // |num_preferred_channels| is the highest number of channels that any sink is - // interested in. This can be different from the number of channels in the - // output format. A value of -1 means an unknown number. If - // |use_capture_multi_channel_processing_| is true, the number of channels of - // the output of the Audio Processing Module (APM) will be equal to the - // highest observed value of num_preferred_channels as long as it does not - // exceed the number of channels of the output format. - absl::optional<double> ProcessData(const float* const* process_ptrs, - int process_frames, - base::TimeDelta capture_delay, - double volume, - bool key_pressed, - int num_preferred_channels, - float* const* output_ptrs); - - // Update AEC stats. Called on the main render thread. - void UpdateAecStats(); - void SendLogMessage(const std::string& message); - // Consumer of processed capture audio in ProcessCapturedAudio(). - DeliverProcessedAudioCallback deliver_processed_audio_callback_; - - // Used by SendLogMessage. - LogCallback log_callback_; - - // Cached value for the render delay latency. This member is accessed by - // both the capture audio thread and the render audio thread. - std::atomic<base::TimeDelta> render_delay_; - - // For reporting audio delay stats. - media::AudioDelayStatsReporter audio_delay_stats_reporter_; - - // Low-priority task queue for doing AEC dump recordings. It has to - // out-live audio_processing_ and be created/destroyed from the same - // thread. - std::unique_ptr<rtc::TaskQueue> worker_queue_; - - // Module to handle processing and format conversion. - rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing_; - - // FIFO to provide 10 ms capture chunks. - std::unique_ptr<MediaStreamAudioFifo> capture_fifo_; - // Receives processing output. - std::unique_ptr<MediaStreamAudioBus> output_bus_; - - // Indicates whether the audio processor playout signal has ever had - // asymmetric left and right channel content. - bool assume_upmixed_mono_playout_ = true; - - // These are mutated on the main render thread in OnCaptureFormatChanged(). - // The caller guarantees this does not run concurrently with accesses on the - // capture audio thread. - media::AudioParameters input_format_; - media::AudioParameters output_format_; + // Handles audio processing, rebuffering, and input/output formatting. + media::AudioProcessor audio_processor_; // TODO(crbug.com/704136): Replace with Member at some point. scoped_refptr<WebRtcAudioDeviceImpl> playout_data_source_; @@ -252,30 +152,11 @@ // Used to DCHECK that some methods are called on the render audio thread. THREAD_CHECKER(render_thread_checker_); - // Flag to enable stereo channel mirroring. - bool audio_mirroring_; - // Communication with browser for AEC dump. std::unique_ptr<AecDumpAgentImpl> aec_dump_agent_impl_; // Flag to avoid executing Stop() more than once. bool stopped_; - - // Counters to avoid excessively logging errors in OnPlayoutData. - size_t unsupported_buffer_size_log_count_ = 0; - size_t apm_playout_error_code_log_count_ = 0; - size_t large_delay_log_count_ = 0; - - // Flag indicating whether capture multi channel processing should be active. - const bool use_capture_multi_channel_processing_; - - // Observed maximum number of preferred output channels. Used for not - // performing audio processing on more channels than the sinks are interested - // in. The value is a maximum over time and can increase but never decrease. - // If |use_capture_multi_channel_processing_| is true, Audio Processing Module - // (APM) will output max_num_preferred_output_channels_ channels as long as it - // does not exceed the number of channels of the output format. - int max_num_preferred_output_channels_ = 1; }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor_test.cc index 8e90d952..9aa3e5c 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor_test.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor_test.cc
@@ -2,13 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.h" + #include <stddef.h> #include <stdint.h> #include <string> #include <vector> -#include "base/cxx17_backports.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" @@ -25,12 +26,8 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/blink/public/common/mediastream/media_stream_request.h" -#include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h" -#include "third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.h" -#include "third_party/blink/renderer/modules/mediastream/mock_constraint_factory.h" +#include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h" #include "third_party/blink/renderer/modules/webrtc/webrtc_audio_device_impl.h" -#include "third_party/blink/renderer/platform/mediastream/media_constraints.h" #include "third_party/blink/renderer/platform/mediastream/media_stream_audio_processor_options.h" #include "third_party/webrtc/api/media_stream_interface.h" #include "third_party/webrtc/rtc_base/ref_counted_object.h" @@ -70,11 +67,6 @@ DCHECK(data_file_size64 > length); } -MediaStreamAudioProcessor::LogCallback LogCallbackForTest() { - return base::BindRepeating( - [](const std::string& message) { VLOG(1) << message; }); -} - } // namespace class MediaStreamAudioProcessorTest : public ::testing::Test { @@ -94,7 +86,8 @@ int expected_output_channels, int expected_output_buffer_size) { // Read the audio data from a file. - const media::AudioParameters& params = audio_processor.InputFormat(); + const media::AudioParameters& params = + audio_processor.GetInputFormatForTesting(); const int packet_size = params.frames_per_buffer() * 2 * params.channels(); const size_t length = packet_size * kNumberOfPacketsForTest; std::unique_ptr<char[]> capture_data(new char[length]); @@ -124,8 +117,10 @@ data_ptr, data_bus->frames()); // 1. Provide playout audio, if echo cancellation is enabled. - webrtc::AudioProcessing* ap = audio_processor.audio_processing_.get(); - const bool is_aec_enabled = ap && ap->GetConfig().echo_canceller.enabled; + const bool is_aec_enabled = + audio_processor.has_webrtc_audio_processing() && + (*audio_processor.GetAudioProcessingModuleConfigForTesting()) + .echo_canceller.enabled; if (is_aec_enabled) { if (has_keyboard_mic) { for (int channel = 0; channel < data_bus_playout->channels(); @@ -146,8 +141,6 @@ absl::optional<double> new_volume) { EXPECT_EQ(audio_capture_time, input_capture_time); }); - data_bus->FromInterleaved<media::SignedInt16SampleTypeTraits>( - data_ptr, data_bus->frames()); audio_processor.ProcessCapturedAudio(*data_bus, input_capture_time, num_preferred_channels, 1.0, false); EXPECT_EQ(expected_output_sample_rate, @@ -167,10 +160,9 @@ } void VerifyDefaultComponents(MediaStreamAudioProcessor& audio_processor) { - webrtc::AudioProcessing* audio_processing = - audio_processor.audio_processing_.get(); + EXPECT_TRUE(audio_processor.has_webrtc_audio_processing()); const webrtc::AudioProcessing::Config config = - audio_processing->GetConfig(); + *audio_processor.GetAudioProcessingModuleConfigForTesting(); EXPECT_TRUE(config.echo_canceller.enabled); EXPECT_TRUE(config.gain_controller1.enabled); EXPECT_TRUE(config.high_pass_filter.enabled); @@ -211,9 +203,9 @@ blink::AudioProcessingProperties properties; scoped_refptr<MediaStreamAudioProcessor> audio_processor( new rtc::RefCountedObject<MediaStreamAudioProcessor>( - mock_capture_callback_.Get(), LogCallbackForTest(), properties, - use_multichannel_processing, webrtc_audio_device)); - EXPECT_TRUE(audio_processor->has_audio_processing()); + mock_capture_callback_.Get(), properties, use_multichannel_processing, + webrtc_audio_device)); + EXPECT_TRUE(audio_processor->has_webrtc_audio_processing()); audio_processor->OnCaptureFormatChanged(params_); VerifyDefaultComponents(*audio_processor); @@ -237,9 +229,9 @@ new rtc::RefCountedObject<WebRtcAudioDeviceImpl>()); scoped_refptr<MediaStreamAudioProcessor> audio_processor( new rtc::RefCountedObject<MediaStreamAudioProcessor>( - mock_capture_callback_.Get(), LogCallbackForTest(), properties, + mock_capture_callback_.Get(), properties, /*use_capture_multi_channel_processing=*/true, webrtc_audio_device)); - EXPECT_FALSE(audio_processor->has_audio_processing()); + EXPECT_FALSE(audio_processor->has_webrtc_audio_processing()); audio_processor->OnCaptureFormatChanged(params_); ProcessDataAndVerifyFormat(*audio_processor, mock_capture_callback_, @@ -264,9 +256,9 @@ blink::AudioProcessingProperties properties; scoped_refptr<MediaStreamAudioProcessor> audio_processor( new rtc::RefCountedObject<MediaStreamAudioProcessor>( - mock_capture_callback_.Get(), LogCallbackForTest(), properties, - use_multichannel_processing, webrtc_audio_device)); - EXPECT_TRUE(audio_processor->has_audio_processing()); + mock_capture_callback_.Get(), properties, use_multichannel_processing, + webrtc_audio_device)); + EXPECT_TRUE(audio_processor->has_webrtc_audio_processing()); static const int kSupportedSampleRates[] = { 8000, @@ -280,17 +272,18 @@ 96000 #endif // BUILDFLAG(IS_CHROMECAST) }; - for (size_t i = 0; i < base::size(kSupportedSampleRates); ++i) { - int buffer_size = kSupportedSampleRates[i] / 100; + for (int sample_rate : kSupportedSampleRates) { + SCOPED_TRACE(testing::Message() << "sample_rate=" << sample_rate); + int buffer_size = sample_rate / 100; media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, - media::CHANNEL_LAYOUT_STEREO, - kSupportedSampleRates[i], buffer_size); + media::CHANNEL_LAYOUT_STEREO, sample_rate, + buffer_size); audio_processor->OnCaptureFormatChanged(params); VerifyDefaultComponents(*audio_processor); int expected_sample_rate = #if BUILDFLAG(IS_CHROMECAST) - std::min(kSupportedSampleRates[i], media::kAudioProcessingSampleRateHz); + std::min(sample_rate, media::kAudioProcessingSampleRateHz); #else media::kAudioProcessingSampleRateHz; #endif // BUILDFLAG(IS_CHROMECAST) @@ -319,7 +312,7 @@ { scoped_refptr<MediaStreamAudioProcessor> audio_processor( new rtc::RefCountedObject<MediaStreamAudioProcessor>( - mock_capture_callback_.Get(), LogCallbackForTest(), properties, + mock_capture_callback_.Get(), properties, /*use_capture_multi_channel_processing=*/true, webrtc_audio_device)); @@ -384,9 +377,9 @@ properties.goog_audio_mirroring = true; scoped_refptr<MediaStreamAudioProcessor> audio_processor( new rtc::RefCountedObject<MediaStreamAudioProcessor>( - mock_capture_callback_.Get(), LogCallbackForTest(), properties, + mock_capture_callback_.Get(), properties, use_multichannel_processing, webrtc_audio_device)); - EXPECT_EQ(audio_processor->has_audio_processing(), use_apm); + EXPECT_EQ(audio_processor->has_webrtc_audio_processing(), use_apm); audio_processor->OnCaptureFormatChanged(source_params); // There's no sense in continuing if this fails. ASSERT_EQ(2, audio_processor->OutputFormat().channels()); @@ -455,9 +448,9 @@ blink::AudioProcessingProperties properties; scoped_refptr<MediaStreamAudioProcessor> audio_processor( new rtc::RefCountedObject<MediaStreamAudioProcessor>( - mock_capture_callback_.Get(), LogCallbackForTest(), properties, - use_multichannel_processing, webrtc_audio_device)); - EXPECT_TRUE(audio_processor->has_audio_processing()); + mock_capture_callback_.Get(), properties, use_multichannel_processing, + webrtc_audio_device)); + EXPECT_TRUE(audio_processor->has_webrtc_audio_processing()); media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, media::CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, @@ -485,9 +478,9 @@ new rtc::RefCountedObject<WebRtcAudioDeviceImpl>()); scoped_refptr<MediaStreamAudioProcessor> audio_processor( new rtc::RefCountedObject<MediaStreamAudioProcessor>( - mock_capture_callback_.Get(), LogCallbackForTest(), properties, + mock_capture_callback_.Get(), properties, /*use_capture_multi_channel_processing=*/true, webrtc_audio_device)); - EXPECT_TRUE(audio_processor->has_audio_processing()); + EXPECT_TRUE(audio_processor->has_webrtc_audio_processing()); media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, media::CHANNEL_LAYOUT_DISCRETE, 48000, 480); @@ -514,9 +507,9 @@ new rtc::RefCountedObject<WebRtcAudioDeviceImpl>()); scoped_refptr<MediaStreamAudioProcessor> audio_processor( new rtc::RefCountedObject<MediaStreamAudioProcessor>( - mock_capture_callback.Get(), LogCallbackForTest(), properties, + mock_capture_callback.Get(), properties, /*use_capture_multi_channel_processing=*/true, webrtc_audio_device)); - ASSERT_TRUE(audio_processor->has_audio_processing()); + ASSERT_TRUE(audio_processor->has_webrtc_audio_processing()); // Set buffer size to 4 ms. media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, @@ -571,9 +564,9 @@ new rtc::RefCountedObject<WebRtcAudioDeviceImpl>()); scoped_refptr<MediaStreamAudioProcessor> audio_processor( new rtc::RefCountedObject<MediaStreamAudioProcessor>( - mock_capture_callback.Get(), LogCallbackForTest(), properties, + mock_capture_callback.Get(), properties, /*use_capture_multi_channel_processing=*/true, webrtc_audio_device)); - ASSERT_TRUE(audio_processor->has_audio_processing()); + ASSERT_TRUE(audio_processor->has_webrtc_audio_processing()); // Set buffer size to 35 ms. media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, @@ -618,9 +611,9 @@ new rtc::RefCountedObject<WebRtcAudioDeviceImpl>()); scoped_refptr<MediaStreamAudioProcessor> audio_processor( new rtc::RefCountedObject<MediaStreamAudioProcessor>( - mock_capture_callback.Get(), LogCallbackForTest(), properties, + mock_capture_callback.Get(), properties, /*use_capture_multi_channel_processing=*/true, webrtc_audio_device)); - ASSERT_FALSE(audio_processor->has_audio_processing()); + ASSERT_FALSE(audio_processor->has_webrtc_audio_processing()); // Set buffer size to 4 ms. media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, @@ -662,9 +655,9 @@ new rtc::RefCountedObject<WebRtcAudioDeviceImpl>()); scoped_refptr<MediaStreamAudioProcessor> audio_processor( new rtc::RefCountedObject<MediaStreamAudioProcessor>( - mock_capture_callback.Get(), LogCallbackForTest(), properties, + mock_capture_callback.Get(), properties, /*use_capture_multi_channel_processing=*/true, webrtc_audio_device)); - ASSERT_FALSE(audio_processor->has_audio_processing()); + ASSERT_FALSE(audio_processor->has_webrtc_audio_processing()); // Set buffer size to 35 ms. media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, @@ -697,4 +690,169 @@ audio_processor->Stop(); } +namespace { +scoped_refptr<MediaStreamAudioProcessor> CreateAudioProcessorWithProperties( + AudioProcessingProperties properties) { + MockProcessedCaptureCallback mock_capture_callback; + scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device( + new rtc::RefCountedObject<WebRtcAudioDeviceImpl>()); + scoped_refptr<MediaStreamAudioProcessor> audio_processor( + new rtc::RefCountedObject<MediaStreamAudioProcessor>( + mock_capture_callback.Get(), properties, + /*use_capture_multi_channel_processing=*/true, webrtc_audio_device)); + return audio_processor; +} +} // namespace + +TEST(MediaStreamAudioProcessorWouldModifyAudioTest, TrueByDefault) { + blink::AudioProcessingProperties properties; + EXPECT_TRUE(MediaStreamAudioProcessor::WouldModifyAudio(properties)); + + scoped_refptr<MediaStreamAudioProcessor> audio_processor = + CreateAudioProcessorWithProperties(properties); + EXPECT_TRUE(audio_processor->has_webrtc_audio_processing()); +} + +TEST(MediaStreamAudioProcessorWouldModifyAudioTest, + FalseWhenEverythingIsDisabled) { + blink::AudioProcessingProperties properties; + properties.DisableDefaultProperties(); + EXPECT_FALSE(MediaStreamAudioProcessor::WouldModifyAudio(properties)); + + scoped_refptr<MediaStreamAudioProcessor> audio_processor = + CreateAudioProcessorWithProperties(properties); + EXPECT_FALSE(audio_processor->has_webrtc_audio_processing()); +} + +TEST(MediaStreamAudioProcessorWouldModifyAudioTest, + FalseWhenOnlyHardwareEffectsAreUsed) { + blink::AudioProcessingProperties properties; + properties.DisableDefaultProperties(); + properties.echo_cancellation_type = + AudioProcessingProperties::EchoCancellationType::kEchoCancellationSystem; + properties.system_gain_control_activated = true; + properties.system_noise_suppression_activated = true; + EXPECT_FALSE(MediaStreamAudioProcessor::WouldModifyAudio(properties)); + + scoped_refptr<MediaStreamAudioProcessor> audio_processor = + CreateAudioProcessorWithProperties(properties); + EXPECT_FALSE(audio_processor->has_webrtc_audio_processing()); +} + +TEST(MediaStreamAudioProcessorWouldModifyAudioTest, + TrueWhenSoftwareEchoCancellationIsEnabled) { + blink::AudioProcessingProperties properties; + properties.DisableDefaultProperties(); + properties.echo_cancellation_type = + AudioProcessingProperties::EchoCancellationType::kEchoCancellationAec3; + // WouldModifyAudio overrides this effect on iOS, but not the audio processor. + // TODO(https://crbug.com/1269364): Make these functions behave consistently. +#if !defined(OS_IOS) + EXPECT_TRUE(MediaStreamAudioProcessor::WouldModifyAudio(properties)); +#else + EXPECT_FALSE(MediaStreamAudioProcessor::WouldModifyAudio(properties)); +#endif + + scoped_refptr<MediaStreamAudioProcessor> audio_processor = + CreateAudioProcessorWithProperties(properties); + EXPECT_TRUE(audio_processor->has_webrtc_audio_processing()); +} + +TEST(MediaStreamAudioProcessorWouldModifyAudioTest, + TrueWhenStereoMirroringIsEnabled) { + blink::AudioProcessingProperties properties; + properties.DisableDefaultProperties(); + properties.goog_audio_mirroring = true; + EXPECT_TRUE(MediaStreamAudioProcessor::WouldModifyAudio(properties)); + + // Unlike other settings, audio mirroring is not a WebRTC effect. + // This is really an implementation detail of the audio processor, not part of + // the API, but it is necessary to have test coverage to avoid inconsistencies + // between the static MSAP::WouldModifyAudio and the internals of the audio + // processor. + scoped_refptr<MediaStreamAudioProcessor> audio_processor = + CreateAudioProcessorWithProperties(properties); + EXPECT_FALSE(audio_processor->has_webrtc_audio_processing()); +} + +TEST(MediaStreamAudioProcessorWouldModifyAudioTest, + TrueWhenGainControlIsEnabled) { + blink::AudioProcessingProperties properties; + properties.DisableDefaultProperties(); + properties.goog_auto_gain_control = true; + // WouldModifyAudio overrides this effect on iOS, but not the audio processor. + // TODO(https://crbug.com/1269364): Make these functions behave consistently. +#if !defined(OS_IOS) + EXPECT_TRUE(MediaStreamAudioProcessor::WouldModifyAudio(properties)); +#else + EXPECT_FALSE(MediaStreamAudioProcessor::WouldModifyAudio(properties)); +#endif + + scoped_refptr<MediaStreamAudioProcessor> audio_processor = + CreateAudioProcessorWithProperties(properties); + EXPECT_TRUE(audio_processor->has_webrtc_audio_processing()); +} + +// "Experimental echo cancellation" does not map to any real effect, but still +// enables audio processing. +// TODO(https://crbug.com/1269723): Remove the experimental AEC option. This +// test documents *current* behavior, not *desired* behavior. +TEST(MediaStreamAudioProcessorWouldModifyAudioTest, + TrueWhenExperimentalEchoCancellationIsEnabled) { + blink::AudioProcessingProperties properties; + properties.DisableDefaultProperties(); + properties.goog_experimental_echo_cancellation = true; + // WouldModifyAudio overrides this effect on iOS and Android. +#if !defined(OS_IOS) && !defined(OS_ANDROID) + EXPECT_TRUE(MediaStreamAudioProcessor::WouldModifyAudio(properties)); +#else + EXPECT_FALSE(MediaStreamAudioProcessor::WouldModifyAudio(properties)); +#endif + + scoped_refptr<MediaStreamAudioProcessor> audio_processor = + CreateAudioProcessorWithProperties(properties); + // WouldModifyAudio overrides this effect on iOS and Android. +#if !defined(OS_IOS) && !defined(OS_ANDROID) + EXPECT_TRUE(audio_processor->has_webrtc_audio_processing()); +#else + EXPECT_FALSE(audio_processor->has_webrtc_audio_processing()); +#endif +} + +TEST(MediaStreamAudioProcessorWouldModifyAudioTest, + TrueWhenNoiseSuppressionIsEnabled) { + blink::AudioProcessingProperties properties; + properties.DisableDefaultProperties(); + properties.goog_noise_suppression = true; + EXPECT_TRUE(MediaStreamAudioProcessor::WouldModifyAudio(properties)); + + scoped_refptr<MediaStreamAudioProcessor> audio_processor = + CreateAudioProcessorWithProperties(properties); + EXPECT_TRUE(audio_processor->has_webrtc_audio_processing()); +} + +TEST(MediaStreamAudioProcessorWouldModifyAudioTest, + TrueWhenExperimentalNoiseSuppression) { + blink::AudioProcessingProperties properties; + properties.DisableDefaultProperties(); + properties.goog_experimental_noise_suppression = true; + EXPECT_TRUE(MediaStreamAudioProcessor::WouldModifyAudio(properties)); + + scoped_refptr<MediaStreamAudioProcessor> audio_processor = + CreateAudioProcessorWithProperties(properties); + EXPECT_TRUE(audio_processor->has_webrtc_audio_processing()); +} + +TEST(MediaStreamAudioProcessorWouldModifyAudioTest, + TrueWhenHighpassFilterIsEnabled) { + blink::AudioProcessingProperties properties; + properties.DisableDefaultProperties(); + properties.goog_highpass_filter = true; + EXPECT_TRUE(MediaStreamAudioProcessor::WouldModifyAudio(properties)); + + scoped_refptr<MediaStreamAudioProcessor> audio_processor = + CreateAudioProcessorWithProperties(properties); + EXPECT_TRUE(audio_processor->has_webrtc_audio_processing()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc index 81d6e34..173499f3e 100644 --- a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc +++ b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc
@@ -338,8 +338,8 @@ } // Determine the audio format required of the AudioCapturerSource. Then, - // pass that to the |audio_processor_| and set the output format of this - // ProcessedLocalAudioSource to the processor's output format. + // pass that to the |media_stream_audio_processor_| and set the output format + // of this ProcessedLocalAudioSource to the processor's output format. media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, device().input.sample_rate(), device().input.sample_rate() / 100); @@ -380,16 +380,13 @@ ConvertToBaseRepeatingCallback(CrossThreadBindRepeating( &ProcessedLocalAudioSource::DeliverProcessedAudio, CrossThreadUnretained(this))); - MediaStreamAudioProcessor::LogCallback log_callback = - ConvertToBaseRepeatingCallback( - CrossThreadBindRepeating(&WebRtcLogMessage)); - audio_processor_ = new rtc::RefCountedObject<MediaStreamAudioProcessor>( - std::move(processing_callback), std::move(log_callback), - audio_processing_properties_, use_multichannel_processing, - rtc_audio_device); + media_stream_audio_processor_ = + new rtc::RefCountedObject<MediaStreamAudioProcessor>( + std::move(processing_callback), audio_processing_properties_, + use_multichannel_processing, rtc_audio_device); params.set_frames_per_buffer(GetBufferSize(device().input.sample_rate())); - audio_processor_->OnCaptureFormatChanged(params); - SetFormat(audio_processor_->OutputFormat()); + media_stream_audio_processor_->OnCaptureFormatChanged(params); + SetFormat(media_stream_audio_processor_->OutputFormat()); // Start the source. SendLogMessageWithSessionId(base::StringPrintf( @@ -428,28 +425,29 @@ source_to_stop->Stop(); // Stop the audio processor to avoid feeding render data into the processor. - if (audio_processor_) - audio_processor_->Stop(); + if (media_stream_audio_processor_) + media_stream_audio_processor_->Stop(); DVLOG(1) << "Stopped WebRTC audio pipeline for consumption."; } scoped_refptr<webrtc::AudioProcessorInterface> ProcessedLocalAudioSource::GetAudioProcessor() const { - DCHECK(audio_processor_); + DCHECK(media_stream_audio_processor_); return static_cast<scoped_refptr<webrtc::AudioProcessorInterface>>( - audio_processor_); + media_stream_audio_processor_); } -bool ProcessedLocalAudioSource::HasAudioProcessing() const { - return audio_processor_ && audio_processor_->has_audio_processing(); +bool ProcessedLocalAudioSource::HasWebRtcAudioProcessing() const { + return media_stream_audio_processor_ && + media_stream_audio_processor_->has_webrtc_audio_processing(); } void ProcessedLocalAudioSource::SetOutputWillBeMuted(bool muted) { if (base::FeatureList::IsEnabled( features::kMinimizeAudioProcessingForUnusedOutput) && - HasAudioProcessing()) { - audio_processor_->SetOutputWillBeMuted(muted); + HasWebRtcAudioProcessing()) { + media_stream_audio_processor_->SetOutputWillBeMuted(muted); } } @@ -472,7 +470,7 @@ bool key_pressed) { TRACE_EVENT1("audio", "ProcessedLocalAudioSource::Capture", "capture-time", audio_capture_time); - if (audio_processor_) { + if (media_stream_audio_processor_) { // Figure out if the pre-processed data has any energy or not. This // information will be passed to the level calculator to force it to report // energy in case the post-processed data is zeroed by the audio processing. @@ -484,9 +482,9 @@ // Passing audio to the audio processor is sufficient, the processor will // return it to DeliverProcessedAudio() via the registered callback. - audio_processor_->ProcessCapturedAudio(*audio_bus, audio_capture_time, - num_preferred_channels, volume, - key_pressed); + media_stream_audio_processor_->ProcessCapturedAudio( + *audio_bus, audio_capture_time, num_preferred_channels, volume, + key_pressed); } else { // The audio is already processed in the audio service, just send it // along. @@ -499,8 +497,9 @@ void ProcessedLocalAudioSource::OnCaptureError( media::AudioCapturerSource::ErrorCode code, const std::string& message) { - SendLogMessageWithSessionId(base::StringPrintf( - "OnCaptureError({code=%d, message=%s})", code, message.c_str())); + SendLogMessageWithSessionId( + base::StringPrintf("OnCaptureError({code=%d, message=%s})", + static_cast<int>(code), message.c_str())); StopSourceOnError(code, message); } @@ -549,7 +548,7 @@ return (2 * sample_rate / 100); #else // If audio processing is turned on, require 10ms buffers. - if (audio_processor_->has_audio_processing()) + if (media_stream_audio_processor_->has_webrtc_audio_processing()) return (sample_rate / 100); // If audio processing is off and the native hardware buffer size was
diff --git a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h index 32d7289..91d8eea 100644 --- a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h +++ b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h
@@ -79,7 +79,7 @@ // first track is connected). scoped_refptr<webrtc::AudioProcessorInterface> GetAudioProcessor() const; - bool HasAudioProcessing() const; + bool HasWebRtcAudioProcessing() const; // Instructs the Audio Processing Module (APM) to reduce its complexity when // |muted| is true. This mode is triggered when all audio tracks are disabled. @@ -145,9 +145,9 @@ // Callback that's called when the audio source has been initialized. ConstraintsOnceCallback started_callback_; - // Audio processor doing processing like FIFO, AGC, AEC and NS. Its output - // data is in a unit of 10 ms data chunk. - scoped_refptr<MediaStreamAudioProcessor> audio_processor_; + // Audio processor doing software processing like FIFO, AGC, AEC and NS. Its + // output data is in a unit of up to 10 ms data chunk. + scoped_refptr<MediaStreamAudioProcessor> media_stream_audio_processor_; // The device created by the AudioDeviceFactory in EnsureSourceIsStarted(). scoped_refptr<media::AudioCapturerSource> source_;
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter.cc index 0b1a5508..f2281e9 100644 --- a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter.cc +++ b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter.cc
@@ -187,9 +187,10 @@ blink::MediaStreamAudioSource::From(component_->Source()))) { local_track_audio_sink_->SetLevel(media_stream_source->audio_level()); // The sink only grabs stats from the audio processor. Stats are only - // available if audio processing is turned on. Therefore, only provide the - // sink a reference to the processor if audio processing is turned on. - if (media_stream_source->HasAudioProcessing()) { + // available if WebRtc audio processing is turned on. Therefore, only + // provide the sink a reference to the processor if audio processing is + // turned on. + if (media_stream_source->HasWebRtcAudioProcessing()) { local_track_audio_sink_->SetAudioProcessor( media_stream_source->GetAudioProcessor()); }
diff --git a/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc b/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc index 4ac9ddb..12057fde 100644 --- a/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc +++ b/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc
@@ -18,7 +18,7 @@ #include "third_party/blink/renderer/core/html/media/html_video_element.h" #include "third_party/blink/renderer/core/html/media/remote_playback_observer.h" #include "third_party/blink/renderer/core/html_names.h" -#include "third_party/blink/renderer/core/probe/async_task_id.h" +#include "third_party/blink/renderer/core/probe/async_task_context.h" #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/modules/event_target_modules.h" #include "third_party/blink/renderer/modules/presentation/presentation_availability_state.h" @@ -54,10 +54,11 @@ } } -void RunRemotePlaybackTask(ExecutionContext* context, - base::OnceClosure task, - std::unique_ptr<probe::AsyncTaskId> task_id) { - probe::AsyncTask async_task(context, task_id.get()); +void RunRemotePlaybackTask( + ExecutionContext* context, + base::OnceClosure task, + std::unique_ptr<probe::AsyncTaskContext> task_context) { + probe::AsyncTask async_task(context, task_context.get()); std::move(task).Run(); } @@ -276,15 +277,15 @@ base::OnceClosure task = WTF::Bind(&RemotePlayback::PromptCancelled, WrapPersistent(this)); - std::unique_ptr<probe::AsyncTaskId> task_id = - std::make_unique<probe::AsyncTaskId>(); - probe::AsyncTaskScheduled(GetExecutionContext(), "promptCancelled", - task_id.get()); + std::unique_ptr<probe::AsyncTaskContext> task_context = + std::make_unique<probe::AsyncTaskContext>(); + task_context->Schedule(GetExecutionContext(), "promptCancelled"); GetExecutionContext() ->GetTaskRunner(TaskType::kMediaElementEvent) - ->PostTask(FROM_HERE, WTF::Bind(RunRemotePlaybackTask, - WrapPersistent(GetExecutionContext()), - std::move(task), std::move(task_id))); + ->PostTask(FROM_HERE, + WTF::Bind(RunRemotePlaybackTask, + WrapPersistent(GetExecutionContext()), + std::move(task), std::move(task_context))); } } @@ -309,15 +310,15 @@ // We can remove the wrapper if InspectorInstrumentation returns a task id. base::OnceClosure task = WTF::Bind(&RemotePlayback::NotifyInitialAvailability, WrapPersistent(this), id); - std::unique_ptr<probe::AsyncTaskId> task_id = - std::make_unique<probe::AsyncTaskId>(); - probe::AsyncTaskScheduled(GetExecutionContext(), "watchAvailabilityCallback", - task_id.get()); + std::unique_ptr<probe::AsyncTaskContext> task_context = + std::make_unique<probe::AsyncTaskContext>(); + task_context->Schedule(GetExecutionContext(), "watchAvailabilityCallback"); GetExecutionContext() ->GetTaskRunner(TaskType::kMediaElementEvent) - ->PostTask(FROM_HERE, WTF::Bind(RunRemotePlaybackTask, - WrapPersistent(GetExecutionContext()), - std::move(task), std::move(task_id))); + ->PostTask(FROM_HERE, + WTF::Bind(RunRemotePlaybackTask, + WrapPersistent(GetExecutionContext()), + std::move(task), std::move(task_context))); MaybeStartListeningForAvailability(); return id;
diff --git a/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc b/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc index d2188e1..9919e78 100644 --- a/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc +++ b/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc
@@ -6,7 +6,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_xr_frame_request_callback.h" #include "third_party/blink/renderer/core/inspector/inspector_trace_events.h" -#include "third_party/blink/renderer/core/probe/async_task_id.h" +#include "third_party/blink/renderer/core/probe/async_task_context.h" #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/modules/xr/xr_frame.h" #include "third_party/blink/renderer/modules/xr/xr_session.h" @@ -23,15 +23,15 @@ V8XRFrameRequestCallback* callback) { CallbackId id = ++next_callback_id_; auto add_result_frame_request = callback_frame_requests_.Set(id, callback); - auto add_result_async_task = - callback_async_tasks_.Set(id, std::make_unique<probe::AsyncTaskId>()); + auto add_result_async_task = callback_async_tasks_.Set( + id, std::make_unique<probe::AsyncTaskContext>()); DCHECK_EQ(add_result_frame_request.is_new_entry, add_result_async_task.is_new_entry); pending_callbacks_.push_back(id); - probe::AsyncTaskScheduledBreakable( - context_, "XRRequestFrame", - add_result_async_task.stored_value->value.get()); + add_result_async_task.stored_value->value->Schedule(context_, + "XRRequestFrame"); + probe::BreakableLocation(context_, "XRRequestFrame"); return id; }
diff --git a/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.h b/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.h index 12b4b07..c76deb2 100644 --- a/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.h +++ b/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.h
@@ -18,7 +18,7 @@ class XRSession; namespace probe { -class AsyncTaskId; +class AsyncTaskContext; } class XRFrameRequestCallbackCollection final @@ -53,7 +53,7 @@ using CallbackFrameRequestMap = HeapHashMap<CallbackId, Member<V8XRFrameRequestCallback>>; using CallbackAsyncTaskMap = - HashMap<CallbackId, std::unique_ptr<probe::AsyncTaskId>>; + HashMap<CallbackId, std::unique_ptr<probe::AsyncTaskContext>>; CallbackFrameRequestMap callback_frame_requests_; CallbackAsyncTaskMap callback_async_tasks_;
diff --git a/third_party/blink/renderer/modules/xr/xr_session.cc b/third_party/blink/renderer/modules/xr/xr_session.cc index 0e1f29f6..6f2b2a9 100644 --- a/third_party/blink/renderer/modules/xr/xr_session.cc +++ b/third_party/blink/renderer/modules/xr/xr_session.cc
@@ -27,6 +27,7 @@ #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/inspector/console_message.h" +#include "third_party/blink/renderer/core/probe/async_task_context.h" #include "third_party/blink/renderer/core/resize_observer/resize_observer.h" #include "third_party/blink/renderer/core/resize_observer/resize_observer_entry.h" #include "third_party/blink/renderer/modules/event_target_modules.h"
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc index 26906aa..22cfea1 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
@@ -19,7 +19,6 @@ #include "third_party/blink/renderer/platform/graphics/compositing/content_layer_client_impl.h" #include "third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.h" #include "third_party/blink/renderer/platform/graphics/graphics_context.h" -#include "third_party/blink/renderer/platform/graphics/graphics_layer.h" #include "third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.h" #include "third_party/blink/renderer/platform/graphics/paint/display_item.h" #include "third_party/blink/renderer/platform/graphics/paint/foreign_layer_display_item.h" @@ -100,18 +99,6 @@ break; } } - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled() && !json_client) { - // The cc::Layer may come from a GraphicsLayer. - for (const auto& pending_layer : pending_layers_) { - if (pending_layer.GetCompositingType() == - PendingLayer::kPreCompositedLayer) { - if (&pending_layer.GetGraphicsLayer()->CcLayer() == layer.get()) { - json_client = pending_layer.GetGraphicsLayer(); - break; - } - } - } - } if (!transform) { for (const auto& pending_layer : pending_layers_) { if (pending_layer.GetPropertyTreeState().Transform().CcNodeId( @@ -130,31 +117,20 @@ scoped_refptr<cc::Layer> PaintArtifactCompositor::WrappedCcLayerForPendingLayer( const PendingLayer& pending_layer) { - if (pending_layer.GetCompositingType() != PendingLayer::kForeignLayer && - pending_layer.GetCompositingType() != PendingLayer::kPreCompositedLayer) + if (pending_layer.GetCompositingType() != PendingLayer::kForeignLayer) return nullptr; - cc::Layer* layer = nullptr; - gfx::Vector2dF layer_offset; - if (pending_layer.GetCompositingType() == PendingLayer::kPreCompositedLayer) { - DCHECK(pending_layer.GetGraphicsLayer()); - DCHECK(!pending_layer.GetGraphicsLayer()->ShouldCreateLayersAfterPaint()); - layer = &pending_layer.GetGraphicsLayer()->CcLayer(); - layer_offset = gfx::Vector2dF( - pending_layer.GetGraphicsLayer()->GetOffsetFromTransformNode()); - } else { - DCHECK_EQ(pending_layer.GetCompositingType(), PendingLayer::kForeignLayer); - // UpdateTouchActionRects() depends on the layer's offset, but when the - // layer's offset changes, we do not call SetNeedsUpdate() (this is an - // optimization because the update would only cause an extra commit) - // This is only OK if the ForeignLayer doesn't have hit test data. - DCHECK(!pending_layer.FirstPaintChunk().hit_test_data); - const auto& foreign_layer_display_item = - To<ForeignLayerDisplayItem>(pending_layer.FirstDisplayItem()); - layer = foreign_layer_display_item.GetLayer(); - layer_offset = gfx::Vector2dF( - foreign_layer_display_item.VisualRect().OffsetFromOrigin()); - } + // UpdateTouchActionRects() depends on the layer's offset, but when the + // layer's offset changes, we do not call SetNeedsUpdate() (this is an + // optimization because the update would only cause an extra commit) This is + // only OK if the ForeignLayer doesn't have hit test data. + DCHECK(!pending_layer.FirstPaintChunk().hit_test_data); + const auto& foreign_layer_display_item = + To<ForeignLayerDisplayItem>(pending_layer.FirstDisplayItem()); + + gfx::Vector2dF layer_offset = gfx::Vector2dF( + foreign_layer_display_item.VisualRect().OffsetFromOrigin()); + cc::Layer* layer = foreign_layer_display_item.GetLayer(); layer->SetOffsetToTransformParent( layer_offset + pending_layer.OffsetOfDecompositedTransforms()); return layer; @@ -591,19 +567,13 @@ } void PaintArtifactCompositor::CollectPendingLayers( - const HeapVector<PreCompositedLayerInfo>& pre_composited_layers) { + scoped_refptr<const PaintArtifact> artifact) { // Shrink, but do not release the backing. Re-use it from the last frame. pending_layers_.Shrink(0); - for (auto& layer : pre_composited_layers) { - if (layer.graphics_layer && - !layer.graphics_layer->ShouldCreateLayersAfterPaint()) { - pending_layers_.emplace_back(layer); - continue; - } - auto cursor = layer.chunks.begin(); - LayerizeGroup(layer.chunks, EffectPaintPropertyNode::Root(), cursor); - DCHECK(cursor == layer.chunks.end()); - } + PaintChunkSubset subset(artifact); + auto cursor = subset.begin(); + LayerizeGroup(subset, EffectPaintPropertyNode::Root(), cursor); + DCHECK(cursor == subset.end()); pending_layers_.ShrinkToReasonableCapacity(); } @@ -762,7 +732,7 @@ } void PaintArtifactCompositor::Update( - const HeapVector<PreCompositedLayerInfo>& pre_composited_layers, + scoped_refptr<const PaintArtifact> artifact, const ViewportProperties& viewport_properties, const Vector<const TransformPaintPropertyNode*>& scroll_translation_nodes, Vector<std::unique_ptr<cc::DocumentTransitionRequest>> @@ -789,7 +759,7 @@ g_s_property_tree_sequence_number); // Make compositing decisions, storing the result in |pending_layers_|. - CollectPendingLayers(pre_composited_layers); + CollectPendingLayers(artifact); PendingLayer::DecompositeTransforms(pending_layers_); LayerListBuilder layer_list_builder; @@ -939,18 +909,8 @@ // Properties of foreign layers are managed by their owners. if (pending_layer.GetCompositingType() == PendingLayer::kForeignLayer) return; - - if (pending_layer.GetGraphicsLayer() && - pending_layer.GetGraphicsLayer()->PaintsContentOrHitTest()) { - PaintChunkSubset chunks(pending_layer.GetGraphicsLayer() - ->GetPaintController() - .GetPaintArtifactShared()); - PaintChunksToCcLayer::UpdateLayerProperties( - layer, pending_layer.GetPropertyTreeState(), chunks); - } else { - PaintChunksToCcLayer::UpdateLayerProperties( - layer, pending_layer.GetPropertyTreeState(), pending_layer.Chunks()); - } + PaintChunksToCcLayer::UpdateLayerProperties( + layer, pending_layer.GetPropertyTreeState(), pending_layer.Chunks()); } void PaintArtifactCompositor::UpdateLayerSelection( @@ -960,19 +920,9 @@ // Foreign layers cannot contain selection. if (pending_layer.GetCompositingType() == PendingLayer::kForeignLayer) return; - - if (pending_layer.GetGraphicsLayer() && - pending_layer.GetGraphicsLayer()->PaintsContentOrHitTest()) { - PaintChunkSubset chunks(pending_layer.GetGraphicsLayer() - ->GetPaintController() - .GetPaintArtifactShared()); - PaintChunksToCcLayer::UpdateLayerSelection( - layer, pending_layer.GetPropertyTreeState(), chunks, layer_selection); - } else { - PaintChunksToCcLayer::UpdateLayerSelection( - layer, pending_layer.GetPropertyTreeState(), pending_layer.Chunks(), - layer_selection); - } + PaintChunksToCcLayer::UpdateLayerSelection( + layer, pending_layer.GetPropertyTreeState(), pending_layer.Chunks(), + layer_selection); } void PaintArtifactCompositor::UpdateRepaintedContentLayerClient( @@ -993,171 +943,96 @@ } } -namespace { - -// This class iterates forward over the PaintChunks in a vector of -// |PreCompositedLayerInfo|s. -class PreCompositedLayerPaintChunkFinder { - STACK_ALLOCATED(); - - public: - explicit PreCompositedLayerPaintChunkFinder( - HeapVector<PreCompositedLayerInfo>& pre_composited_layers) - : pre_composited_layers_(pre_composited_layers), - pre_composited_layer_it_(pre_composited_layers_.begin()), - subset_iterator_(pre_composited_layer_it_->chunks.begin()) {} - - const PaintChunk& current_chunk() { - CHECK(pre_composited_layer_it_ != pre_composited_layers_.end()); - CHECK(subset_iterator_ != pre_composited_layer_it_->chunks.end()); - return *subset_iterator_; - } - - const PaintArtifact& current_artifact() { - CHECK(pre_composited_layer_it_ != pre_composited_layers_.end()); - return pre_composited_layer_it_->chunks.GetPaintArtifact(); - } - - bool AdvanceToMatching(const PaintChunk& chunk) { - while (pre_composited_layer_it_ != pre_composited_layers_.end()) { - while (subset_iterator_ != pre_composited_layer_it_->chunks.end()) { - if (subset_iterator_->Matches(chunk)) - return true; - ++subset_iterator_; - } - pre_composited_layer_it_++; - if (pre_composited_layer_it_ == pre_composited_layers_.end()) - break; - subset_iterator_ = pre_composited_layer_it_->chunks.begin(); - } - // Unable to find a matching paint chunk. - return false; - } - - private: - HeapVector<PreCompositedLayerInfo>& pre_composited_layers_; - HeapVector<PreCompositedLayerInfo>::iterator pre_composited_layer_it_; - PaintChunkSubset::Iterator subset_iterator_; -}; - -} // namespace - void PaintArtifactCompositor::UpdateRepaintedLayers( - HeapVector<PreCompositedLayerInfo>& pre_composited_layers) { + scoped_refptr<const PaintArtifact> repainted_artifact) { // |Update| should be used for full updates. DCHECK(!needs_update_); + const auto& repainted_chunks = repainted_artifact->PaintChunks(); #if DCHECK_IS_ON() // Any property tree state change should have caused a full update. - for (const auto& pre_composited_layer : pre_composited_layers) { - if (pre_composited_layer.graphics_layer) { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - continue; - } - for (const auto& chunk : pre_composited_layer.chunks) { - // If this fires, a property tree value has changed but we are missing a - // call to |PaintArtifactCompositor::SetNeedsUpdate|. - DCHECK(!chunk.properties.GetPropertyTreeState().Unalias().ChangedToRoot( - PaintPropertyChangeType::kChangedOnlyNonRerasterValues)); - } + for (const auto& chunk : repainted_chunks) { + // If this fires, a property tree value has changed but we are missing a + // call to |PaintArtifactCompositor::SetNeedsUpdate|. + DCHECK(!chunk.properties.GetPropertyTreeState().Unalias().ChangedToRoot( + PaintPropertyChangeType::kChangedOnlyNonRerasterValues)); } #endif cc::LayerSelection layer_selection; // The loop below iterates over the existing PendingLayers and issues updates. - PreCompositedLayerPaintChunkFinder repainted_chunk_finder( - pre_composited_layers); + auto* repainted_chunk_iterator = repainted_chunks.begin(); auto* content_layer_client_it = content_layer_clients_.begin(); auto* scroll_hit_test_layer_it = scroll_hit_test_layers_.begin(); auto* scrollbar_layer_it = scrollbar_layers_.begin(); for (auto* pending_layer_it = pending_layers_.begin(); pending_layer_it != pending_layers_.end(); pending_layer_it++) { - auto compositing_type = pending_layer_it->GetCompositingType(); - if (compositing_type == PendingLayer::kForeignLayer && - !RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - // These layers are fully managed externally and do not need an update. - } else if (compositing_type == PendingLayer::kPreCompositedLayer) { - // These are Pre-CompositeAfterPaint layers where raster invalidation has - // already occurred and we just need to update layer properties&selection. - DCHECK(pending_layer_it->GetGraphicsLayer()); - if (pending_layer_it->GetGraphicsLayer()->Repainted()) { - UpdateLayerProperties(pending_layer_it->GetGraphicsLayer()->CcLayer(), - *pending_layer_it); - UpdateLayerSelection(pending_layer_it->GetGraphicsLayer()->CcLayer(), - *pending_layer_it, layer_selection); - } - } else { - // These are CompositeAfterPaint (or CompositeSVG) layers and we need to - // both copy the repainted paint chunks and update the cc::Layer. To do - // this, we need the previous PaintChunks (from the PendingLayer) and the - // matching repainted PaintChunks (from |pre_composited_layers|). Because - // repaint-only updates cannot add, remove, or re-order PaintChunks, - // |repainted_chunk_finder| searches forward in |pre_composited_layers| - // for the matching paint chunk, ensuring this function is O(chunks). - const PaintChunk& first = *pending_layer_it->Chunks().begin(); - bool did_advance = repainted_chunk_finder.AdvanceToMatching(first); - - // If we do not find a matching PaintChunk, PaintChunks must have been - // added, removed, or re-ordered, and we should be doing a full update - // instead of a repaint update. - CHECK(did_advance); - - // Essentially replace the paint chunks of the pending layer with the - // repainted chunks in |repainted_artifact|. The pending layer's paint - // chunks (a |PaintChunkSubset|) actually store indices to |PaintChunk|s - // in a |PaintArtifact|. In repaint updates, chunks are not added, - // removed, or re-ordered, so we can simply swap in a repainted - // |PaintArtifact| instead of copying |PaintChunk|s individually. - const PaintArtifact& previous_artifact = - pending_layer_it->Chunks().GetPaintArtifact(); - const PaintArtifact& repainted_artifact = - repainted_chunk_finder.current_artifact(); - DCHECK_EQ(previous_artifact.PaintChunks().size(), - repainted_artifact.PaintChunks().size()); - pending_layer_it->SetPaintArtifact(&repainted_artifact); - - bool pending_layer_chunks_unchanged = true; - for (const auto& chunk : pending_layer_it->Chunks()) { - if (!chunk.is_moved_from_cached_subsequence) { - pending_layer_chunks_unchanged = false; - break; - } - } - - cc::Layer* cc_layer = nullptr; - switch (pending_layer_it->GetCompositingType()) { - case PendingLayer::kPreCompositedLayer: - NOTREACHED(); - break; - case PendingLayer::kForeignLayer: - continue; - case PendingLayer::kScrollbarLayer: - cc_layer = scrollbar_layer_it->get(); - ++scrollbar_layer_it; - break; - case PendingLayer::kScrollHitTestLayer: - cc_layer = scroll_hit_test_layer_it->get(); - ++scroll_hit_test_layer_it; - break; - default: - UpdateRepaintedContentLayerClient(*pending_layer_it, - pending_layer_chunks_unchanged, - **content_layer_client_it); - cc_layer = &(*content_layer_client_it)->Layer(); - ++content_layer_client_it; - break; - } - DCHECK(cc_layer); - - if (!pending_layer_chunks_unchanged) - UpdateLayerProperties(*cc_layer, *pending_layer_it); - UpdateLayerSelection(*cc_layer, *pending_layer_it, layer_selection); + // We need to both copy the repainted paint chunks and update the cc::Layer. + // To do this, we need the previous PaintChunks (from the PendingLayer) and + // the matching repainted PaintChunks (from |repainted_chunks|). Because + // repaint-only updates cannot add, remove, or re-order PaintChunks, + // |repainted_chunk_iterator| searches forward in |repainted_chunks| for + // the matching paint chunk, ensuring this function is O(chunks). + const PaintChunk& first = *pending_layer_it->Chunks().begin(); + while (repainted_chunk_iterator != repainted_chunks.end()) { + if (repainted_chunk_iterator->Matches(first)) + break; + ++repainted_chunk_iterator; } + // If we do not find a matching PaintChunk, PaintChunks must have been + // added, removed, or re-ordered, and we should be doing a full update + // instead of a repaint update. + CHECK(repainted_chunk_iterator != repainted_chunks.end()); + + // Essentially replace the paint chunks of the pending layer with the + // repainted chunks in |repainted_artifact|. The pending layer's paint + // chunks (a |PaintChunkSubset|) actually store indices to |PaintChunk|s + // in a |PaintArtifact|. In repaint updates, chunks are not added, + // removed, or re-ordered, so we can simply swap in a repainted + // |PaintArtifact| instead of copying |PaintChunk|s individually. + const PaintArtifact& previous_artifact = + pending_layer_it->Chunks().GetPaintArtifact(); + DCHECK_EQ(previous_artifact.PaintChunks().size(), + repainted_artifact->PaintChunks().size()); + pending_layer_it->SetPaintArtifact(repainted_artifact); + + bool pending_layer_chunks_unchanged = true; + for (const auto& chunk : pending_layer_it->Chunks()) { + if (!chunk.is_moved_from_cached_subsequence) { + pending_layer_chunks_unchanged = false; + break; + } + } + + cc::Layer* cc_layer = nullptr; + switch (pending_layer_it->GetCompositingType()) { + case PendingLayer::kForeignLayer: + continue; + case PendingLayer::kScrollbarLayer: + cc_layer = scrollbar_layer_it->get(); + ++scrollbar_layer_it; + break; + case PendingLayer::kScrollHitTestLayer: + cc_layer = scroll_hit_test_layer_it->get(); + ++scroll_hit_test_layer_it; + break; + default: + UpdateRepaintedContentLayerClient(*pending_layer_it, + pending_layer_chunks_unchanged, + **content_layer_client_it); + cc_layer = &(*content_layer_client_it)->Layer(); + ++content_layer_client_it; + break; + } + DCHECK(cc_layer); + + if (!pending_layer_chunks_unchanged) + UpdateLayerProperties(*cc_layer, *pending_layer_it); + UpdateLayerSelection(*cc_layer, *pending_layer_it, layer_selection); } - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - root_layer_->layer_tree_host()->RegisterSelection(layer_selection); + root_layer_->layer_tree_host()->RegisterSelection(layer_selection); UpdateDebugInfo(); @@ -1389,11 +1264,6 @@ cc::Layer* layer; RasterInvalidationTracking* tracking = nullptr; switch (pending_layer.GetCompositingType()) { - case PendingLayer::kPreCompositedLayer: - tracking = - pending_layer.GetGraphicsLayer()->GetRasterInvalidationTracking(); - layer = &pending_layer.GetGraphicsLayer()->CcLayer(); - break; case PendingLayer::kForeignLayer: layer = To<ForeignLayerDisplayItem>(pending_layer.FirstDisplayItem()) .GetLayer(); @@ -1413,22 +1283,10 @@ ++content_layer_client_it; break; } - if (pending_layer.GetGraphicsLayer()) { - UpdateLayerDebugInfo( - *layer, - PaintChunk::Id(pending_layer.GetGraphicsLayer()->Id(), - DisplayItem::kUninitializedType), - pending_layer.GetGraphicsLayer()->DebugName(), - pending_layer.GetGraphicsLayer()->OwnerNodeId(), - GetCompositingReasons(pending_layer, previous_pending_layer), - tracking); - } else { - UpdateLayerDebugInfo( - *layer, pending_layer.FirstPaintChunk().id, - pending_layer.Chunks().GetPaintArtifact(), - GetCompositingReasons(pending_layer, previous_pending_layer), - tracking); - } + UpdateLayerDebugInfo( + *layer, pending_layer.FirstPaintChunk().id, + pending_layer.Chunks().GetPaintArtifact(), + GetCompositingReasons(pending_layer, previous_pending_layer), tracking); previous_pending_layer = &pending_layer; } } @@ -1438,9 +1296,6 @@ const PendingLayer* previous_layer) const { DCHECK(layer_debug_info_enabled_); - if (layer.GetGraphicsLayer()) - return layer.GetGraphicsLayer()->GetCompositingReasons(); - if (layer.RequiresOwnLayer()) { if (layer.GetCompositingType() == PendingLayer::kScrollHitTestLayer) return CompositingReason::kOverflowScrolling; @@ -1525,15 +1380,7 @@ } layer.GetPropertyTreeState().ClearChangedTo(PropertyTreeState::Root()); - - PaintChunkSubset chunks = - layer.GetGraphicsLayer() && - layer.GetGraphicsLayer()->PaintsContentOrHitTest() - ? PaintChunkSubset(layer.GetGraphicsLayer() - ->GetPaintController() - .GetPaintArtifactShared()) - : layer.Chunks(); - for (auto& chunk : chunks) { + for (auto& chunk : layer.Chunks()) { // Calling |ClearChangedTo| for every chunk could be O(|property nodes|^2) // in the worst case and could be optimized by caching which nodes that // have already been cleared.
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h index fdf3d1c..4cabef1e 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h
@@ -37,7 +37,6 @@ namespace blink { class ContentLayerClientImpl; -class GraphicsLayer; class JSONObject; class SynthesizedClip; @@ -135,18 +134,15 @@ const TransformPaintPropertyNode* outer_scroll_translation = nullptr; }; - // Updates the layer tree to match the provided |pre_composited_layers|. - // In pre-CompositeAfterPaint, |pre_composited_layers| contains information - // from the GraphicsLayer tree. Some of the pre-composited layers may need - // additional layerization. In CompositeAfterPaint, |pre_composited_layers| - // should contain just one entry, and we will do a full layerization. + // Updates the cc layer list and property trees to match those provided in + // |paint_chunks|. // // |scroll_translation_nodes| is the complete set of scroll nodes, including // noncomposited nodes, and is used for Scroll Unification to generate scroll // nodes for noncomposited scrollers to complete the compositor's scroll // property tree. void Update( - const HeapVector<PreCompositedLayerInfo>& updated, + scoped_refptr<const PaintArtifact> artifact, const ViewportProperties& viewport_properties, const Vector<const TransformPaintPropertyNode*>& scroll_translation_nodes, Vector<std::unique_ptr<cc::DocumentTransitionRequest>> requests); @@ -168,7 +164,7 @@ // This copies over the newly-painted PaintChunks to existing // |pending_layers_|, issues raster invalidations, and updates the existing // cc::Layer properties such as background color. - void UpdateRepaintedLayers(HeapVector<PreCompositedLayerInfo>& updated); + void UpdateRepaintedLayers(scoped_refptr<const PaintArtifact>); bool DirectlyUpdateCompositedOpacityValue(const EffectPaintPropertyNode&); bool DirectlyUpdateScrollOffsetTransform(const TransformPaintPropertyNode&); @@ -256,7 +252,7 @@ // Collects the PaintChunks into groups which will end up in the same // cc layer. This is the entry point of the layerization algorithm. - void CollectPendingLayers(const HeapVector<PreCompositedLayerInfo>&); + void CollectPendingLayers(scoped_refptr<const PaintArtifact>); // This is the internal recursion of collectPendingLayers. This function // loops over the list of paint chunks, scoped by an isolated group
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc index 36caac3..7c3688ac 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
@@ -25,7 +25,6 @@ #include "cc/trees/transform_node.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/renderer/platform/graphics/graphics_layer.h" #include "third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h" #include "third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h" #include "third_party/blink/renderer/platform/graphics/paint/paint_artifact.h" @@ -145,10 +144,7 @@ const WTF::Vector<const TransformPaintPropertyNode*>& scroll_translation_nodes = {}) { paint_artifact_compositor_->SetNeedsUpdate(); - HeapVector<PreCompositedLayerInfo> pre_composited_layers = { - {PaintChunkSubset(artifact)}}; - paint_artifact_compositor_->Update(pre_composited_layers, - viewport_properties, + paint_artifact_compositor_->Update(artifact, viewport_properties, scroll_translation_nodes, {}); layer_tree_->layer_tree_host()->LayoutAndUpdateLayers(); } @@ -4579,9 +4575,7 @@ Update(artifact); scroll_translation->ClearChangedToRoot(); - HeapVector<PreCompositedLayerInfo> pre_composited_layers = { - {PaintChunkSubset(artifact)}}; - GetPaintArtifactCompositor().UpdateRepaintedLayers(pre_composited_layers); + GetPaintArtifactCompositor().UpdateRepaintedLayers(artifact); // This test passes if no CHECK occurs. }
diff --git a/third_party/blink/renderer/platform/graphics/compositing/pending_layer.cc b/third_party/blink/renderer/platform/graphics/compositing/pending_layer.cc index c51e3fd..a1fd35b 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/pending_layer.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/pending_layer.cc
@@ -5,9 +5,10 @@ #include "third_party/blink/renderer/platform/graphics/compositing/pending_layer.h" #include "third_party/blink/renderer/platform/geometry/geometry_as_json.h" -#include "third_party/blink/renderer/platform/graphics/graphics_layer.h" #include "third_party/blink/renderer/platform/graphics/paint/drawing_display_item.h" #include "third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h" +#include "third_party/blink/renderer/platform/wtf/hash_set.h" +#include "third_party/blink/renderer/platform/wtf/text/string_builder.h" #include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/geometry/size_conversions.h" #include "ui/gfx/geometry/vector2d_conversions.h" @@ -70,10 +71,6 @@ } // anonymous namespace -void PreCompositedLayerInfo::Trace(Visitor* visitor) const { - visitor->Trace(graphics_layer); -} - PendingLayer::PendingLayer(const PaintChunkSubset& chunks, const PaintChunkIterator& first_chunk) : PendingLayer(chunks, *first_chunk, first_chunk.IndexInPaintArtifact()) {} @@ -111,17 +108,6 @@ } } -PendingLayer::PendingLayer(const PreCompositedLayerInfo& pre_composited_layer) - : chunks_(pre_composited_layer.chunks), - property_tree_state_( - pre_composited_layer.graphics_layer->GetPropertyTreeState() - .Unalias()), - graphics_layer_(pre_composited_layer.graphics_layer), - compositing_type_(kPreCompositedLayer) { - DCHECK(graphics_layer_); - DCHECK(!graphics_layer_->ShouldCreateLayersAfterPaint()); -} - gfx::Vector2dF PendingLayer::LayerOffset() const { // The solid color layer optimization is important for performance. Snapping // the location could make the solid color drawings not cover the entire
diff --git a/third_party/blink/renderer/platform/graphics/compositing/pending_layer.h b/third_party/blink/renderer/platform/graphics/compositing/pending_layer.h index f1b86be..b3fe83774 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/pending_layer.h +++ b/third_party/blink/renderer/platform/graphics/compositing/pending_layer.h
@@ -7,39 +7,17 @@ #include "third_party/blink/renderer/platform/graphics/paint/paint_chunk_subset.h" #include "third_party/blink/renderer/platform/graphics/paint/property_tree_state.h" -#include "third_party/blink/renderer/platform/heap/member.h" -#include "third_party/blink/renderer/platform/heap/persistent.h" #include "ui/gfx/geometry/rect_f.h" #include "ui/gfx/geometry/vector2d_f.h" namespace blink { -class GraphicsLayer; - -// Information of a composited layer that is created during compositing update -// in pre-CompositeAfterPaint. In CompositeAfterPaint, this is expected to -// contain all paint chunks, as if we created one root layer that needs to be -// future layerized. -struct PLATFORM_EXPORT PreCompositedLayerInfo { - DISALLOW_NEW(); - // For now this is used only when graphics_layer == nullptr. This will also - // contain the paint chunks for the graphics layer when we unify - // PaintController for pre-CAP and CAP. - PaintChunkSubset chunks; - // If this is not nullptr, we should use the composited layer created by the - // GraphicsLayer. Otherwise we should layerize |chunks|. A GraphicsLayer with - // ShouldCreateLayersAfterPaint() == true should set this field to nullptr. - Member<GraphicsLayer> graphics_layer = nullptr; - void Trace(Visitor* visitor) const; -}; - // A pending layer is a collection of paint chunks that will end up in the same // cc::Layer. class PLATFORM_EXPORT PendingLayer { public: enum CompositingType { kScrollHitTestLayer, - kPreCompositedLayer, kForeignLayer, kScrollbarLayer, kOverlap, @@ -47,7 +25,6 @@ }; PendingLayer(const PaintChunkSubset&, const PaintChunkIterator&); - explicit PendingLayer(const PreCompositedLayerInfo&); // Returns the offset/bounds for the final cc::Layer, rounded if needed. gfx::Vector2dF LayerOffset() const; @@ -71,7 +48,6 @@ PaintPropertyChangeType ChangeOfDecompositedTransforms() const { return change_of_decomposited_transforms_; } - const GraphicsLayer* GetGraphicsLayer() const { return graphics_layer_; } CompositingType GetCompositingType() const { return compositing_type_; } void SetCompositingType(CompositingType new_type) { @@ -154,11 +130,8 @@ gfx::Vector2dF offset_of_decomposited_transforms_; PaintPropertyChangeType change_of_decomposited_transforms_ = PaintPropertyChangeType::kUnchanged; - const WeakPersistent<GraphicsLayer> graphics_layer_ = nullptr; CompositingType compositing_type_; }; } // namespace blink -WTF_ALLOW_CLEAR_UNUSED_SLOTS_WITH_MEM_FUNCTIONS(blink::PreCompositedLayerInfo) - #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_COMPOSITING_PENDING_LAYER_H_
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.cc b/third_party/blink/renderer/platform/graphics/graphics_layer.cc index 648571f..15fbbfb2 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_layer.cc +++ b/third_party/blink/renderer/platform/graphics/graphics_layer.cc
@@ -267,155 +267,6 @@ [](GraphicsLayer&, const cc::Layer&) {}); } -bool GraphicsLayer::PaintRecursively( - GraphicsContext& context, - HeapVector<PreCompositedLayerInfo>& pre_composited_layers, - PaintController::CycleScope& cycle_scope, - PaintBenchmarkMode benchmark_mode) { - bool repainted = false; - ForAllGraphicsLayers( - *this, - [&](GraphicsLayer& layer) -> bool { - layer.Paint(pre_composited_layers, benchmark_mode, &cycle_scope); - repainted |= layer.repainted_; - return true; - }, - [&](const GraphicsLayer& layer, cc::Layer& contents_layer) { - PaintChunkSubsetRecorder subset_recorder(context.GetPaintController()); - auto contents_state = layer.GetContentsPropertyTreeState(); - RecordForeignLayer(context, layer, - DisplayItem::kForeignLayerContentsWrapper, - &contents_layer, - gfx::PointAtOffsetFromOrigin( - layer.GetContentsOffsetFromTransformNode()), - &contents_state); - pre_composited_layers.push_back( - PreCompositedLayerInfo{subset_recorder.Get()}); - }); -#if DCHECK_IS_ON() - if (repainted) { - VLOG(2) << "GraphicsLayer tree:\n" - << GraphicsLayerTreeAsTextForTesting( - this, VLOG_IS_ON(3) ? 0xffffffff : kOutputAsLayerTree) - .Utf8(); - } -#endif - return repainted; -} - -void GraphicsLayer::PaintForTesting(const gfx::Rect& interest_rect, - bool record_debug_info) { - HeapVector<PreCompositedLayerInfo> pre_composited_layers; - PaintController::CycleScope cycle_scope(record_debug_info); - Paint(pre_composited_layers, PaintBenchmarkMode::kNormal, &cycle_scope, - &interest_rect); -} - -void GraphicsLayer::Paint( - HeapVector<PreCompositedLayerInfo>& pre_composited_layers, - PaintBenchmarkMode benchmark_mode, - PaintController::CycleScope* cycle_scope, - const gfx::Rect* interest_rect) { - repainted_ = false; - - if (!PaintsContentOrHitTest()) { - if (IsHitTestable()) { - pre_composited_layers.push_back( - PreCompositedLayerInfo{PaintChunkSubset(), this}); - } - return; - } - -#if !DCHECK_IS_ON() - // TODO(crbug.com/853096): Investigate why we can ever reach here without - // a valid layer state. Seems to only happen on Android builds. - // TODO(chrishtr): I think this might have been due to iframe throttling. - // The comment above and the code here was written before the early - // out if client_->ShouldThrottleRendering() was true was added. Throttled - // layers can of course have a stale or missing layer_state_. - if (!layer_state_) - return; -#endif - DCHECK(layer_state_) << "No layer state for GraphicsLayer: " << DebugName(); - - gfx::Rect new_interest_rect; - auto& paint_controller = GetPaintController(); - if (cycle_scope) - cycle_scope->AddController(paint_controller); - paint_controller.RecordDebugInfo(*this); - - absl::optional<PaintChunkSubset> previous_chunks; - if (ShouldCreateLayersAfterPaint()) - previous_chunks.emplace(paint_controller.GetPaintArtifactShared()); - - PaintController::ScopedBenchmarkMode scoped_benchmark_mode(paint_controller, - benchmark_mode); - bool cached = !paint_controller.ShouldForcePaintForBenchmark() && - // TODO(wangxianzhu): This will be replaced by subsequence - // caching when unifying PaintController. - paint_controller.ClientCacheIsValid(*this) && - previous_interest_rect_ == new_interest_rect; - if (!cached) { - paint_controller.MarkClientForValidation(*this); - GraphicsContext context(paint_controller); - DCHECK(layer_state_) << "No layer state for GraphicsLayer: " << DebugName(); - paint_controller.UpdateCurrentPaintChunkProperties( - layer_state_->state.GetPropertyTreeState()); - // If this uses pre-CAP compositing, contents_opaque will be calculated by - // CompositedLayerMapping; otherwise, it is calculated by PaintChunker. - paint_controller.SetShouldComputeContentsOpaque( - ShouldCreateLayersAfterPaint()); - previous_interest_rect_ = new_interest_rect; - paint_controller.CommitNewDisplayItems(); - DVLOG(2) << "Painted GraphicsLayer: " << DebugName() - << " paintable region: " << PaintableRegion().ToString(); - } - - PaintChunkSubset chunks(paint_controller.GetPaintArtifactShared()); - pre_composited_layers.push_back(PreCompositedLayerInfo{chunks, this}); - - if (cached && !needs_check_raster_invalidation_ && - paint_controller.GetBenchmarkMode() != - PaintBenchmarkMode::kForceRasterInvalidationAndConvert) { - return; - } - - if (!ShouldCreateLayersAfterPaint()) { - auto& raster_invalidator = EnsureRasterInvalidator(); - gfx::Size old_layer_size(raster_invalidator.LayerBounds()); - PropertyTreeState property_tree_state = GetPropertyTreeState().Unalias(); - EnsureRasterInvalidator().Generate( - raster_invalidation_function_, chunks, - gfx::Vector2dF(layer_state_->offset.x(), layer_state_->offset.y()), - Size(), property_tree_state, this->Id()); - - absl::optional<RasterUnderInvalidationCheckingParams> - raster_under_invalidation_params; - if (RuntimeEnabledFeatures::PaintUnderInvalidationCheckingEnabled() && - PaintsContentOrHitTest()) { - raster_under_invalidation_params.emplace( - EnsureRasterInvalidator().EnsureTracking(), PaintableRegion(), - DebugName()); - } - - // If nothing changed in the layer, keep the original display item list. - // Here check layer_bounds because RasterInvalidator doesn't issue raster - // invalidation when only layer_bounds change. - if (raster_invalidated_ || !cc_display_item_list_ || - old_layer_size != Size() || raster_under_invalidation_params) { - cc_display_item_list_ = PaintChunksToCcLayer::Convert( - chunks, property_tree_state, - gfx::Vector2dF(layer_state_->offset.x(), layer_state_->offset.y()), - cc::DisplayItemList::kTopLevelDisplayItemList, - base::OptionalOrNullptr(raster_under_invalidation_params)); - raster_invalidated_ = false; - } - } - - needs_check_raster_invalidation_ = false; - repainted_ = true; -} - void GraphicsLayer::SetShouldCreateLayersAfterPaint( bool should_create_layers_after_paint) { if (should_create_layers_after_paint != should_create_layers_after_paint_) {
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.h b/third_party/blink/renderer/platform/graphics/graphics_layer.h index ffd62aed..4b16f26e 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_layer.h +++ b/third_party/blink/renderer/platform/graphics/graphics_layer.h
@@ -67,7 +67,6 @@ class PaintController; class RasterInvalidationTracking; class RasterInvalidator; -struct PreCompositedLayerInfo; typedef HeapVector<Member<GraphicsLayer>, 64> GraphicsLayerVector; @@ -174,12 +173,6 @@ const gfx::Rect&, PaintInvalidationReason); - // Returns true if any layer is repainted. - bool PaintRecursively(GraphicsContext&, - HeapVector<PreCompositedLayerInfo>&, - PaintController::CycleScope& cycle_scope, - PaintBenchmarkMode = PaintBenchmarkMode::kNormal); - PaintController& GetPaintController() const; void SetElementId(const CompositorElementId&); @@ -219,8 +212,6 @@ needs_check_raster_invalidation_ = true; } - void PaintForTesting(const gfx::Rect& interest_rect, bool record_debug_info); - void SetShouldCreateLayersAfterPaint(bool); bool ShouldCreateLayersAfterPaint() const { return should_create_layers_after_paint_; @@ -246,10 +237,6 @@ bool FillsBoundsCompletely() const final { return false; } void ClearPaintStateRecursively(); - void Paint(HeapVector<PreCompositedLayerInfo>&, - PaintBenchmarkMode, - PaintController::CycleScope*, - const gfx::Rect* interest_rect = nullptr); // Adds a child without calling NotifyChildListChange(), so that adding // children can be batched before updating.
diff --git a/third_party/blink/renderer/platform/mediastream/media_stream_audio_processor_options.h b/third_party/blink/renderer/platform/mediastream/media_stream_audio_processor_options.h index 3596bc5..97e4edd 100644 --- a/third_party/blink/renderer/platform/mediastream/media_stream_audio_processor_options.h +++ b/third_party/blink/renderer/platform/mediastream/media_stream_audio_processor_options.h
@@ -61,7 +61,7 @@ bool goog_audio_mirroring = false; bool goog_auto_gain_control = true; - // TODO(https://crbug.com/1215061): Deprecate this constraint. The flag no + // TODO(https://crbug.com/1269723): Deprecate this constraint. The flag no // longer toggles meaningful processing effects, but it still forces the audio // processing module to be created and used. bool goog_experimental_echo_cancellation =
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index fa594931..f2d44a9 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -286,6 +286,7 @@ // platforms. See //services/shape_detection. "Android": "stable", "ChromeOS": "stable", + "Lacros": "stable", "Mac": "stable", "default": "test", }, @@ -1281,6 +1282,7 @@ { name: "LayoutNGBlockFragmentation", implied_by: ["LayoutNGFlexFragmentation", "LayoutNGGridFragmentation", "LayoutNGPrinting", "LayoutNGTableFragmentation"], + status: "test", }, { name: "LayoutNGBlockInInline",
diff --git a/third_party/blink/renderer/platform/wtf/allocator/partitions.cc b/third_party/blink/renderer/platform/wtf/allocator/partitions.cc index e7d46e3..1389e76 100644 --- a/third_party/blink/renderer/platform/wtf/allocator/partitions.cc +++ b/third_party/blink/renderer/platform/wtf/allocator/partitions.cc
@@ -109,8 +109,6 @@ #endif // !BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) static base::NoDestructor<base::PartitionAllocator> buffer_allocator{}; - static base::NoDestructor<base::ThreadUnsafePartitionAllocator> - layout_allocator{}; base::PartitionAllocGlobalInit(&Partitions::HandleOutOfMemory); @@ -122,15 +120,6 @@ (enable_brp ? base::PartitionOptions::BackupRefPtr::kEnabled : base::PartitionOptions::BackupRefPtr::kDisabled), base::PartitionOptions::UseConfigurablePool::kNo, lazy_commit}); - // RefCount disallowed because layout code will be excluded from raw_ptr<T> - // rewrite due to performance. - layout_allocator->init({base::PartitionOptions::AlignedAlloc::kDisallowed, - base::PartitionOptions::ThreadCache::kDisabled, - base::PartitionOptions::Quarantine::kAllowed, - base::PartitionOptions::Cookie::kAllowed, - base::PartitionOptions::BackupRefPtr::kDisabled, - base::PartitionOptions::UseConfigurablePool::kNo, - lazy_commit}); buffer_root_ = buffer_allocator->root();
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng index d9afa09..46b59ed 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng +++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -73,6 +73,88 @@ ### external/wpt/css/css-backgrounds/ crbug.com/1194738 external/wpt/css/css-backgrounds/linear-gradient-currentcolor-first-line.html [ Failure ] +### external/wpt/css/css-break/ +crbug.com/829028 external/wpt/css/css-break/abspos-in-opacity-001.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/avoid-border-break.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/borders-000.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/borders-001.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/borders-002.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/borders-003.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/borders-004.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/borders-005.html [ Failure ] +crbug.com/269061 external/wpt/css/css-break/box-shadow.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/break-at-end-container-edge-000.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/break-at-end-container-edge-001.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/break-at-end-container-edge-002.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/break-at-end-container-edge-004.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/break-between-avoid-000.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/break-between-avoid-001.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/break-between-avoid-003.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/break-between-avoid-004.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/break-between-avoid-007.html [ Failure ] +crbug.com/1277976 external/wpt/css/css-break/change-inline-color.html [ Failure Pass ] +crbug.com/829028 external/wpt/css/css-break/fieldset-003.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/fieldset-004.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/fieldset-005.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/fieldset-006.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/forced-break-at-fragmentainer-start-000.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/monolithic-with-overflow-lr.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/monolithic-with-overflow-rl.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/monolithic-with-overflow.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-012.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-029.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-030.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-032.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-034.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-035.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-036.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-038.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-039.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-040.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-041.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-042.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-043.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-044.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-045.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-046.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-047.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-052.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-054.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-057.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-058.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-059.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-060.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-061.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-062.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-063.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-065.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-066.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-071.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-073.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/overflow-clip-000.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/overflow-clip-001.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/overflow-clip-010.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/overflowed-block-with-no-room-after-001.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/overflowed-block-with-no-room-after-000.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/relpos-inline-hit-testing.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/relpos-inline.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/ruby-003.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/tall-content-inside-constrained-block-000.tentative.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/tall-content-inside-constrained-block-001.tentative.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/tall-content-inside-constrained-block-002.tentative.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/tall-content-inside-constrained-block-003.tentative.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/tall-content-inside-constrained-block-004.tentative.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/tall-line-in-short-fragmentainer-000.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/tall-line-in-short-fragmentainer-001.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/tall-line-in-short-fragmentainer-002.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/trailing-child-margin-000.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/trailing-child-margin-002.html [ Failure ] +crbug.com/1058792 external/wpt/css/css-break/transform-003.html [ Failure ] +crbug.com/1058792 external/wpt/css/css-break/transform-004.html [ Failure ] +crbug.com/1058792 external/wpt/css/css-break/transform-005.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/transform-006.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/transform-008.html [ Failure ] + ### external/wpt/css/css-flexbox/ crbug.com/591099 external/wpt/css/css-flexbox/aspect-ratio-intrinsic-size-001.html [ Failure ] crbug.com/591099 external/wpt/css/css-flexbox/aspect-ratio-intrinsic-size-002.html [ Failure ] @@ -245,8 +327,65 @@ crbug.com/591099 external/wpt/css/css-layout-api/* [ Skip ] ### external/wpt/css/css-multicol/ -crbug.com/1221181 external/wpt/css/css-multicol/multicol-overflow-transform-001.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/abspos-containing-block-outside-spanner.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/balance-break-avoidance-001.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/balance-orphans-widows-000.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/baseline-001.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/baseline-007.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/baseline-008.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/fixed-in-multicol-with-transform-container.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/hit-test-transformed-child.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-008.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-009.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-010.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-011.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-012.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-013.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-014.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-007.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-008.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-009.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-010.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-011.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-012.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-013.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-015.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-016.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-017.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-018.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-022.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-023.html [ Failure ] +crbug.com/1246602 external/wpt/css/css-multicol/multicol-oof-inline-cb-001.html [ Failure ] +crbug.com/1246602 external/wpt/css/css-multicol/multicol-oof-inline-cb-002.html [ Failure ] +crbug.com/1277976 external/wpt/css/css-multicol/multicol-overflow-positioned-transform-001.html [ Failure Pass ] +crbug.com/1277976 external/wpt/css/css-multicol/multicol-overflow-transform-001.html [ Failure Pass ] +crbug.com/990240 external/wpt/css/css-multicol/multicol-rule-nested-balancing-004.html [ Failure ] +crbug.com/874051 external/wpt/css/css-multicol/multicol-span-all-fieldset-001.html [ Failure ] +crbug.com/874051 external/wpt/css/css-multicol/multicol-span-all-fieldset-002.html [ Failure ] +crbug.com/874051 external/wpt/css/css-multicol/multicol-span-all-fieldset-003.html [ Failure ] +crbug.com/915204 external/wpt/css/css-multicol/multicol-span-all-006.html [ Failure ] +crbug.com/915204 external/wpt/css/css-multicol/multicol-span-all-007.html [ Failure ] +crbug.com/915204 external/wpt/css/css-multicol/multicol-span-all-009.html [ Failure ] +crbug.com/915204 external/wpt/css/css-multicol/multicol-span-all-008.html [ Failure ] +crbug.com/915204 external/wpt/css/css-multicol/multicol-span-all-011.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-span-all-014.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/multicol-span-all-015.html [ Failure ] crbug.com/591099 external/wpt/css/css-multicol/multicol-span-all-list-item-002.html [ Failure ] +crbug.com/892817 external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001.xht [ Failure ] +crbug.com/792446 external/wpt/css/css-multicol/multicol-span-float-001.xht [ Failure ] +crbug.com/792446 external/wpt/css/css-multicol/multicol-span-float-002.html [ Failure ] +crbug.com/792446 external/wpt/css/css-multicol/multicol-span-float-003.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/nested-at-outer-boundary-as-fieldset.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/nested-with-too-tall-line.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/non-adjacent-spanners-000.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/orthogonal-writing-mode-spanner.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/overflow-unsplittable-001.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/overflow-unsplittable-002.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/overflow-unsplittable-003.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/spanner-fragmentation-001.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/spanner-fragmentation-009.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/spanner-fragmentation-010.html [ Failure ] +crbug.com/829028 external/wpt/css/css-multicol/spanner-fragmentation-011.html [ Failure ] crbug.com/998423 external/wpt/css/css-multicol/with-custom-layout-on-same-element-crash.https.html [ Skip ] crbug.com/998423 external/wpt/css/css-multicol/with-custom-layout-on-same-element.https.html [ Skip ] @@ -634,6 +773,9 @@ ### fast/forms/color-scheme/href/ crbug.com/591099 fast/forms/color-scheme/href/href-appearance-basic.html [ Failure ] +### fast/multicol/ +crbug.com/467477 fast/multicol/vertical-rl/nested-columns.html [ Failure ] + ### fast/replaced/ crbug.com/591099 fast/replaced/border-radius-clip-content-edge.html [ Failure ] crbug.com/591099 fast/replaced/outline-replaced-elements.html [ Failure ] @@ -701,6 +843,7 @@ ### Container Queries tests require enabled LayoutNG crbug.com/1145970 external/wpt/css/css-contain/container-queries/* [ Skip ] crbug.com/1145970 external/wpt/css/css-contain/contain-inline-size-* [ Skip ] +crbug.com/1154574 external/wpt/css/css-contain/contain-size-monolithic-002.html [ Failure ] crbug.com/1145970 inspector-protocol/css/css-get-styles-for-node.js [ Skip ] crbug.com/1145970 inspector-protocol/css/container-queries/* [ Skip ] crbug.com/1145970 inspector-protocol/dom/container-queries/* [ Skip ] @@ -724,9 +867,6 @@ crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-filter-all.html [ Failure Slow ] crbug.com/591099 virtual/gpu-rasterization/images/favicon-as-image.html [ Failure ] -### virtual/layout_ng_block_frag/ -virtual/layout_ng_block_frag/* [ Skip ] - ### virtual/layout_ng_flex_frag/ virtual/layout_ng_flex_frag/* [ Skip ] @@ -1058,6 +1198,20 @@ crbug.com/417223 external/wpt/css/css-position/position-relative-table-tr-top-absolute-child.html [ Failure ] crbug.com/417223 external/wpt/css/css-position/position-relative-table-tr-top.html [ Failure ] +### external/wpt/css/css-position/multicol/ +crbug.com/829028 external/wpt/css/css-position/multicol/static-position/vlr-ltr-rtl-in-multicol.tentative.html [ Failure ] +crbug.com/829028 external/wpt/css/css-position/multicol/static-position/vlr-rtl-ltr-in-multicol.tentative.html [ Failure ] +crbug.com/829028 external/wpt/css/css-position/multicol/static-position/vlr-rtl-rtl-in-multicol.html [ Failure ] +crbug.com/829028 external/wpt/css/css-position/multicol/static-position/vrl-ltr-rtl-in-multicol.tentative.html [ Failure ] +crbug.com/829028 external/wpt/css/css-position/multicol/static-position/vrl-rtl-ltr-in-multicol.tentative.html [ Failure ] +crbug.com/829028 external/wpt/css/css-position/multicol/static-position/vrl-rtl-rtl-in-multicol.html [ Failure ] +crbug.com/829028 external/wpt/css/css-position/multicol/vlr-ltr-rtl-in-multicols.tentative.html [ Failure ] +crbug.com/829028 external/wpt/css/css-position/multicol/vlr-rtl-ltr-in-multicols.tentative.html [ Failure ] +crbug.com/829028 external/wpt/css/css-position/multicol/vlr-rtl-rtl-in-multicols.html [ Failure ] +crbug.com/829028 external/wpt/css/css-position/multicol/vrl-ltr-rtl-in-multicols.tentative.html [ Failure ] +crbug.com/829028 external/wpt/css/css-position/multicol/vrl-rtl-ltr-in-multicols.tentative.html [ Failure ] +crbug.com/829028 external/wpt/css/css-position/multicol/vrl-rtl-rtl-in-multicols.html [ Failure ] + ### external/wpt/css/css-position/sticky/ crbug.com/702927 external/wpt/css/css-position/sticky/position-sticky-parsing.html [ Failure ] crbug.com/702927 external/wpt/css/css-position/sticky/position-sticky-table-tfoot-bottom.html [ Failure ]
diff --git a/third_party/blink/web_tests/FlagExpectations/highdpi b/third_party/blink/web_tests/FlagExpectations/highdpi index b0ca19e6f..0c63020 100644 --- a/third_party/blink/web_tests/FlagExpectations/highdpi +++ b/third_party/blink/web_tests/FlagExpectations/highdpi
@@ -24,7 +24,6 @@ virtual/exotic-color-space/* [ Skip ] virtual/gpu/* [ Skip ] virtual/gpu-rasterization/* [ Skip ] -virtual/layout_ng_block_frag/* [ Skip ] virtual/prefer_compositing_to_lcd_text/* [ Skip ] virtual/system-color-compute/* [ Skip ] virtual/threaded/* [ Skip ]
diff --git a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item index a35d6967..07ea1d34 100644 --- a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item +++ b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
@@ -6,5 +6,4 @@ crbug.com/1061102 media/picture-in-picture/v2/detached-iframe.html [ Skip ] crbug.com/1061102 media/picture-in-picture/v2/request-picture-in-picture-twice.html [ Skip ] crbug.com/1061102 media/picture-in-picture/v2/request-picture-in-picture.html [ Skip ] -crbug.com/829028 virtual/layout_ng_block_frag/* [ Skip ] crbug.com/982194 virtual/webrtc-wpt-plan-b/external/wpt/webrtc/protocol/video-codecs.https.html [ Failure ]
diff --git a/third_party/blink/web_tests/FlagSpecificConfig b/third_party/blink/web_tests/FlagSpecificConfig index 99f4072..5cf6cbd 100644 --- a/third_party/blink/web_tests/FlagSpecificConfig +++ b/third_party/blink/web_tests/FlagSpecificConfig
@@ -5,7 +5,7 @@ }, { "name": "disable-layout-ng", - "args": ["--disable-blink-features=LayoutNG"] + "args": ["--disable-blink-features=LayoutNG,LayoutNGBlockFragmentation"] }, { "name": "disable-site-isolation-trials",
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 92bbb4e..df754db 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -277,7 +277,11 @@ # or upstream this to WPT. crbug.com/1185506 svg/text/textpath-pattern.svg [ Failure Pass ] +crbug.com/1225630 fast/multicol/infinite-height-causing-fractional-row-height-crash.html [ Skip ] +crbug.com/1225630 fast/multicol/infinitely-tall-content-in-outer-crash.html [ Skip ] +crbug.com/1225630 fast/multicol/insane-column-count-and-padding-nested-crash.html [ Skip ] crbug.com/807395 fast/multicol/mixed-opacity-test.html [ Failure ] +crbug.com/1225630 fast/multicol/nested-very-tall-inside-short-crash.html [ Skip ] ########## Ref tests can't be rebaselined ########## crbug.com/504613 crbug.com/524248 [ Mac ] paint/images/image-backgrounds-not-antialiased.html [ Failure ] @@ -925,7 +929,6 @@ crbug.com/880802 external/wpt/css/css-contain/contain-paint-021.html [ Failure ] crbug.com/882367 external/wpt/css/css-contain/contain-paint-clip-015.html [ Failure ] crbug.com/882367 external/wpt/css/css-contain/contain-paint-clip-016.html [ Failure ] -crbug.com/1154574 external/wpt/css/css-contain/contain-size-monolithic-002.html [ Failure ] crbug.com/882385 external/wpt/css/css-contain/quote-scoping-001.html [ Failure ] crbug.com/882385 external/wpt/css/css-contain/quote-scoping-002.html [ Failure ] crbug.com/882385 external/wpt/css/css-contain/quote-scoping-003.html [ Failure ] @@ -1185,30 +1188,6 @@ crbug.com/1219041 external/wpt/css/css-text/white-space/text-space-trim-trim-inner-001.xht [ Failure ] # LayoutNG ref-tests that need to be updated (cannot be rebaselined). -crbug.com/591099 [ Linux ] fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure ] -crbug.com/591099 [ Win ] fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure ] -crbug.com/591099 [ Linux ] fast/multicol/span/vertical-lr.html [ Failure ] -crbug.com/591099 [ Win ] fast/multicol/span/vertical-lr.html [ Failure ] -crbug.com/591099 [ Linux ] fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Failure ] -crbug.com/591099 [ Win ] fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Failure ] -crbug.com/591099 [ Linux ] fast/multicol/vertical-lr/column-break-with-balancing.html [ Failure ] -crbug.com/591099 [ Win ] fast/multicol/vertical-lr/column-break-with-balancing.html [ Failure ] -crbug.com/591099 fast/multicol/vertical-lr/column-count-with-rules.html [ Failure ] -crbug.com/591099 [ Linux ] fast/multicol/vertical-lr/column-rules.html [ Failure ] -crbug.com/591099 [ Win ] fast/multicol/vertical-lr/column-rules.html [ Failure ] -crbug.com/591099 [ Linux ] fast/multicol/vertical-lr/float-avoidance.html [ Failure ] -crbug.com/591099 [ Win ] fast/multicol/vertical-lr/float-avoidance.html [ Failure ] -crbug.com/591099 fast/multicol/vertical-lr/float-big-line.html [ Failure ] -crbug.com/591099 [ Linux ] fast/multicol/vertical-lr/float-break.html [ Failure ] -crbug.com/591099 [ Win ] fast/multicol/vertical-lr/float-break.html [ Failure ] -crbug.com/591099 fast/multicol/vertical-lr/float-content-break.html [ Failure ] -crbug.com/591099 fast/multicol/vertical-lr/float-edge.html [ Failure ] -crbug.com/591099 [ Linux ] fast/multicol/vertical-lr/float-paginate.html [ Failure ] -crbug.com/591099 [ Win ] fast/multicol/vertical-lr/float-paginate.html [ Failure ] -crbug.com/591099 [ Linux ] fast/multicol/vertical-lr/nested-columns.html [ Failure ] -crbug.com/591099 [ Win ] fast/multicol/vertical-lr/nested-columns.html [ Failure ] -crbug.com/591099 [ Linux ] fast/multicol/vertical-lr/unsplittable-inline-block.html [ Failure ] -crbug.com/591099 [ Win ] fast/multicol/vertical-lr/unsplittable-inline-block.html [ Failure ] crbug.com/591099 [ Win ] virtual/text-antialias/ellipsis-with-self-painting-layer.html [ Failure ] crbug.com/591099 [ Mac ] fast/multicol/file-upload-as-multicol.html [ Failure ] crbug.com/1098801 virtual/text-antialias/whitespace/whitespace-in-pre.html [ Failure ] @@ -1278,192 +1257,6 @@ crbug.com/982194 [ Win7 ] external/wpt/css/css-text/white-space/seg-break-transformation-018.tentative.html [ Failure ] crbug.com/982194 [ Win10.20h2 ] fast/writing-mode/border-image-vertical-lr.html [ Failure Pass ] -### Tests passing with LayoutNGBlockFragmentation enabled: -virtual/layout_ng_block_frag/external/wpt/css/css-break/abspos-in-opacity-001.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/avoid-border-break.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/borders-000.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/borders-001.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/borders-002.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/borders-003.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/borders-004.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/borders-005.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/box-shadow.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/break-at-end-container-edge-000.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/break-at-end-container-edge-001.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/break-at-end-container-edge-002.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/break-at-end-container-edge-004.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/break-between-avoid-000.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/break-between-avoid-001.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/break-between-avoid-003.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/break-between-avoid-004.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/break-between-avoid-007.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/fieldset-003.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/fieldset-004.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/fieldset-005.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/fieldset-006.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/forced-break-at-fragmentainer-start-000.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/monolithic-with-overflow-lr.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/monolithic-with-overflow-rl.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/monolithic-with-overflow.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-012.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-029.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-030.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-032.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-034.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-035.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-036.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-038.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-039.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-040.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-041.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-042.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-043.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-044.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-045.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-046.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-047.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-052.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-054.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-057.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-058.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-059.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-060.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-061.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-062.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-063.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-065.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-066.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-071.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/out-of-flow-in-multicolumn-073.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/overflow-clip-000.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/overflow-clip-001.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/overflow-clip-010.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/overflowed-block-with-no-room-after-000.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/overflowed-block-with-no-room-after-001.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/relpos-inline-hit-testing.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/relpos-inline.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/ruby-003.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/tall-content-inside-constrained-block-000.tentative.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/tall-content-inside-constrained-block-001.tentative.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/tall-content-inside-constrained-block-002.tentative.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/tall-content-inside-constrained-block-003.tentative.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/tall-content-inside-constrained-block-004.tentative.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/tall-line-in-short-fragmentainer-000.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/tall-line-in-short-fragmentainer-001.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/tall-line-in-short-fragmentainer-002.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/trailing-child-margin-000.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/trailing-child-margin-002.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/transform-003.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/transform-004.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/transform-005.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/transform-006.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-break/transform-008.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-inline-size-multicol.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-size-monolithic-002.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/static-position/vlr-ltr-rtl-in-multicol.tentative.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/static-position/vlr-rtl-ltr-in-multicol.tentative.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/static-position/vlr-rtl-rtl-in-multicol.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/static-position/vrl-ltr-rtl-in-multicol.tentative.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/static-position/vrl-rtl-ltr-in-multicol.tentative.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/static-position/vrl-rtl-rtl-in-multicol.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/vlr-ltr-rtl-in-multicols.tentative.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/vlr-rtl-ltr-in-multicols.tentative.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/vlr-rtl-rtl-in-multicols.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/vrl-ltr-rtl-in-multicols.tentative.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/vrl-rtl-ltr-in-multicols.tentative.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/vrl-rtl-rtl-in-multicols.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/abspos-containing-block-outside-spanner.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/balance-break-avoidance-001.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/balance-orphans-widows-000.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/baseline-001.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/baseline-007.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/baseline-008.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/fixed-in-multicol-with-transform-container.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/hit-test-transformed-child.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-balance-008.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-balance-009.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-balance-010.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-balance-011.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-balance-012.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-balance-013.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-balance-014.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-balance-017.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-list-item-004.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-list-item-006.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-007.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-008.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-009.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-010.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-011.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-012.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-013.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-015.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-016.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-017.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-018.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-022.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-023.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-oof-inline-cb-001.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-oof-inline-cb-002.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-nested-balancing-004.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-scroll-content.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-006.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-007.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-008.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-009.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-011.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-014.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-015.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-017.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-fieldset-001.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-fieldset-002.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-fieldset-003.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001.xht [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-float-001.xht [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-float-002.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-float-003.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/nested-at-outer-boundary-as-fieldset.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/nested-with-too-tall-line.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/non-adjacent-spanners-000.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/orthogonal-writing-mode-spanner.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/overflow-unsplittable-001.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/overflow-unsplittable-002.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/overflow-unsplittable-003.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/spanner-fragmentation-001.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/spanner-fragmentation-009.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/spanner-fragmentation-010.html [ Pass ] -virtual/layout_ng_block_frag/external/wpt/css/css-multicol/spanner-fragmentation-011.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/file-upload-as-multicol.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/newmulticol/hide-box-vertical-lr.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/span/vertical-lr.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-break-with-balancing.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-count-with-rules.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-rules.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-avoidance.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-big-line.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-break.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-content-break.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-edge.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-paginate.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-lr/nested-columns.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-lr/unsplittable-inline-block.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-rl/column-count-with-rules.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-big-line.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-content-break.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-edge.html [ Pass ] -virtual/layout_ng_block_frag/fast/multicol/vertical-rl/nested-columns.html [ Pass ] - -### Tests failing with LayoutNGBlockFragmentation enabled: -crbug.com/1225630 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/large-actual-column-count.html [ Skip ] -crbug.com/1225630 virtual/layout_ng_block_frag/fast/multicol/infinite-height-causing-fractional-row-height-crash.html [ Skip ] -crbug.com/1225630 virtual/layout_ng_block_frag/fast/multicol/infinitely-tall-content-in-outer-crash.html [ Skip ] -crbug.com/1225630 virtual/layout_ng_block_frag/fast/multicol/insane-column-count-and-padding-nested-crash.html [ Skip ] -crbug.com/1225630 virtual/layout_ng_block_frag/fast/multicol/nested-very-tall-inside-short-crash.html [ Skip ] - -# Just skip this for Mac11-arm64. It's super-flaky. Not block fragmentation-related. -crbug.com/1262048 [ Mac11-arm64 ] virtual/layout_ng_block_frag/* [ Skip ] - ### Tests passing with LayoutNGFlexFragmentation enabled: [ Fuchsia ] virtual/layout_ng_flex_frag/external/wpt/css/css-break/flexbox/flex-container-fragmentation-003.html [ Pass ] [ Linux ] virtual/layout_ng_flex_frag/external/wpt/css/css-break/flexbox/flex-container-fragmentation-003.html [ Pass ] @@ -1724,7 +1517,6 @@ # @container crbug.com/829028 external/wpt/css/css-contain/container-queries/inline-multicol-inside-container-crash.html [ Crash ] crbug.com/1273913 external/wpt/css/css-contain/container-queries/pseudo-elements-002.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-contain/contain-inline-size-multicol.html [ Failure ] # CSS Scrollbars crbug.com/891944 external/wpt/css/css-scrollbars/textarea-scrollbar-width-none.html [ Failure ] @@ -2138,9 +1930,6 @@ # codecs, so no benefit to running them again with gpu acceleration enabled. crbug.com/555703 virtual/media-gpu-accelerated/* [ Skip ] -crbug.com/467477 fast/multicol/vertical-rl/nested-columns.html [ Failure ] -crbug.com/1262980 fast/multicol/infinitely-tall-content-in-outer-crash.html [ Pass Timeout ] - crbug.com/400841 media/video-canvas-draw.html [ Failure ] # switching to apache-win32: needs triaging. @@ -2986,6 +2775,9 @@ crbug.com/626703 external/wpt/preload/preload-resource-match.https.html [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 [ Win10.20h2 ] external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html [ Failure Timeout ] +crbug.com/626703 [ Win10.20h2 ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html [ Failure Timeout ] +crbug.com/626703 [ Mac10.15 ] wpt_internal/webcodecs/basic_video_encoding.https.any.worker.html [ Crash Timeout ] crbug.com/626703 [ Mac10.14 ] virtual/threaded/external/wpt/scroll-animations/css/at-scroll-timeline-default-descriptors-iframe.html [ Failure ] crbug.com/626703 [ Mac10.15 ] virtual/threaded/external/wpt/scroll-animations/css/at-scroll-timeline-default-descriptors-iframe.html [ Failure ] crbug.com/626703 [ Mac11 ] virtual/threaded/external/wpt/scroll-animations/css/at-scroll-timeline-default-descriptors-iframe.html [ Failure ] @@ -3959,28 +3751,6 @@ crbug.com/1250666 virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/invalid-image-pending-script.https.html [ Pass Timeout ] -crbug.com/829028 external/wpt/css/css-break/abspos-in-opacity-001.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/avoid-border-break.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/borders-000.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/borders-001.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/borders-002.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/borders-003.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/borders-004.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/borders-005.html [ Failure ] -crbug.com/269061 external/wpt/css/css-break/box-shadow.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/break-at-end-container-edge-000.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/break-at-end-container-edge-001.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/break-at-end-container-edge-002.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/break-at-end-container-edge-004.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/break-between-avoid-000.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/break-between-avoid-001.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/break-between-avoid-003.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/break-between-avoid-004.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/break-between-avoid-007.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/fieldset-003.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/fieldset-004.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/fieldset-005.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/fieldset-006.html [ Failure ] crbug.com/660611 external/wpt/css/css-break/flexbox/flex-container-fragmentation-003.html [ Failure ] crbug.com/660611 external/wpt/css/css-break/flexbox/flex-container-fragmentation-004.html [ Failure ] crbug.com/660611 external/wpt/css/css-break/flexbox/flex-container-fragmentation-007.tentative.html [ Failure ] @@ -3994,7 +3764,6 @@ crbug.com/660611 external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-020.html [ Failure ] crbug.com/660611 external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-022.html [ Failure ] crbug.com/660611 external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-023.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/forced-break-at-fragmentainer-start-000.html [ Failure ] crbug.com/614667 external/wpt/css/css-break/grid/grid-item-fragmentation-020.html [ Failure ] crbug.com/614667 external/wpt/css/css-break/grid/grid-item-fragmentation-027.tentative.html [ Failure ] crbug.com/614667 external/wpt/css/css-break/grid/grid-item-fragmentation-028.html [ Failure ] @@ -4005,87 +3774,12 @@ crbug.com/614667 external/wpt/css/css-break/grid/grid-item-fragmentation-033.html [ Failure ] crbug.com/614667 external/wpt/css/css-break/grid/grid-item-fragmentation-034.html [ Failure ] crbug.com/1066629 external/wpt/css/css-break/hit-test-transformed.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/monolithic-with-overflow-lr.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/monolithic-with-overflow-rl.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/monolithic-with-overflow.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-012.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-029.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-030.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-032.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-034.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-035.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-036.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-038.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-039.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-040.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-041.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-042.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-043.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-044.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-045.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-046.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-047.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-052.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-054.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-057.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-058.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-059.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-060.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-061.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-062.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-063.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-065.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-066.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-071.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-073.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/overflow-clip-000.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/overflow-clip-001.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/overflow-clip-010.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/overflowed-block-with-no-room-after-001.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/overflowed-block-with-no-room-after-000.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/relpos-inline-hit-testing.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/relpos-inline.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/ruby-003.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/tall-content-inside-constrained-block-000.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/tall-content-inside-constrained-block-001.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/tall-content-inside-constrained-block-002.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/tall-content-inside-constrained-block-003.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/tall-content-inside-constrained-block-004.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/tall-line-in-short-fragmentainer-000.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/tall-line-in-short-fragmentainer-001.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/tall-line-in-short-fragmentainer-002.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/trailing-child-margin-000.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/trailing-child-margin-002.html [ Failure ] -crbug.com/1058792 external/wpt/css/css-break/transform-003.html [ Failure ] -crbug.com/1058792 external/wpt/css/css-break/transform-004.html [ Failure ] -crbug.com/1058792 external/wpt/css/css-break/transform-005.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/transform-006.html [ Failure ] crbug.com/1058792 external/wpt/css/css-break/transform-007.html [ Failure ] -crbug.com/829028 external/wpt/css/css-break/transform-008.html [ Failure ] crbug.com/1224888 external/wpt/css/css-break/transform-009.html [ Failure ] crbug.com/1156312 external/wpt/css/css-break/widows-orphans-017.html [ Failure ] -crbug.com/829028 external/wpt/css/css-position/multicol/static-position/vlr-ltr-rtl-in-multicol.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-position/multicol/static-position/vlr-rtl-ltr-in-multicol.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-position/multicol/static-position/vlr-rtl-rtl-in-multicol.html [ Failure ] -crbug.com/829028 external/wpt/css/css-position/multicol/static-position/vrl-ltr-rtl-in-multicol.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-position/multicol/static-position/vrl-rtl-ltr-in-multicol.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-position/multicol/static-position/vrl-rtl-rtl-in-multicol.html [ Failure ] -crbug.com/829028 external/wpt/css/css-position/multicol/vlr-ltr-rtl-in-multicols.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-position/multicol/vlr-rtl-ltr-in-multicols.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-position/multicol/vlr-rtl-rtl-in-multicols.html [ Failure ] -crbug.com/829028 external/wpt/css/css-position/multicol/vrl-ltr-rtl-in-multicols.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-position/multicol/vrl-rtl-ltr-in-multicols.tentative.html [ Failure ] -crbug.com/829028 external/wpt/css/css-position/multicol/vrl-rtl-rtl-in-multicols.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/abspos-containing-block-outside-spanner.html [ Failure ] crbug.com/967329 external/wpt/css/css-multicol/columnfill-auto-max-height-001.html [ Failure ] crbug.com/967329 external/wpt/css/css-multicol/columnfill-auto-max-height-002.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/balance-break-avoidance-001.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/balance-orphans-widows-000.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/baseline-001.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/baseline-007.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/baseline-008.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/fixed-in-multicol-with-transform-container.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/hit-test-transformed-child.html [ Failure ] +crbug.com/1225630 external/wpt/css/css-multicol/large-actual-column-count.html [ Skip ] crbug.com/990240 external/wpt/css/css-multicol/multicol-breaking-000.html [ Failure ] crbug.com/990240 external/wpt/css/css-multicol/multicol-breaking-001.html [ Failure ] crbug.com/481431 external/wpt/css/css-multicol/multicol-breaking-004.html [ Failure ] @@ -4093,74 +3787,26 @@ crbug.com/990240 external/wpt/css/css-multicol/multicol-breaking-nobackground-000.html [ Failure ] crbug.com/990240 external/wpt/css/css-multicol/multicol-breaking-nobackground-001.html [ Failure ] crbug.com/481431 external/wpt/css/css-multicol/multicol-breaking-nobackground-004.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-008.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-009.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-010.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-011.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-012.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-013.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-014.html [ Failure ] crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-017.html [ Failure ] crbug.com/829028 [ Mac ] external/wpt/css/css-multicol/multicol-list-item-004.html [ Failure ] crbug.com/829028 [ Mac ] external/wpt/css/css-multicol/multicol-list-item-005.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-007.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-008.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-009.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-010.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-011.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-012.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-013.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-015.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-016.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-017.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-018.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-022.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-023.html [ Failure ] -crbug.com/1246602 external/wpt/css/css-multicol/multicol-oof-inline-cb-001.html [ Failure ] -crbug.com/1246602 external/wpt/css/css-multicol/multicol-oof-inline-cb-002.html [ Failure ] crbug.com/792435 external/wpt/css/css-multicol/multicol-rule-004.xht [ Failure ] crbug.com/792437 external/wpt/css/css-multicol/multicol-rule-inset-000.xht [ Failure ] crbug.com/990240 external/wpt/css/css-multicol/multicol-rule-nested-balancing-001.html [ Failure ] crbug.com/990240 external/wpt/css/css-multicol/multicol-rule-nested-balancing-002.html [ Failure ] crbug.com/990240 external/wpt/css/css-multicol/multicol-rule-nested-balancing-003.html [ Failure ] -crbug.com/990240 external/wpt/css/css-multicol/multicol-rule-nested-balancing-004.html [ Failure ] crbug.com/792437 external/wpt/css/css-multicol/multicol-rule-outset-000.xht [ Failure ] crbug.com/963109 external/wpt/css/css-multicol/multicol-span-all-button-001.html [ Failure ] crbug.com/963109 external/wpt/css/css-multicol/multicol-span-all-button-002.html [ Failure ] crbug.com/963109 external/wpt/css/css-multicol/multicol-span-all-button-003.html [ Failure ] -crbug.com/874051 external/wpt/css/css-multicol/multicol-span-all-fieldset-001.html [ Failure ] -crbug.com/874051 external/wpt/css/css-multicol/multicol-span-all-fieldset-002.html [ Failure ] -crbug.com/874051 external/wpt/css/css-multicol/multicol-span-all-fieldset-003.html [ Failure ] crbug.com/915204 external/wpt/css/css-multicol/multicol-span-all-005.html [ Failure ] -crbug.com/915204 external/wpt/css/css-multicol/multicol-span-all-006.html [ Failure ] -crbug.com/915204 external/wpt/css/css-multicol/multicol-span-all-007.html [ Failure ] -crbug.com/915204 external/wpt/css/css-multicol/multicol-span-all-009.html [ Failure ] -crbug.com/915204 external/wpt/css/css-multicol/multicol-span-all-008.html [ Failure ] crbug.com/1267847 external/wpt/css/css-multicol/multicol-span-all-010.html [ Failure ] -crbug.com/915204 external/wpt/css/css-multicol/multicol-span-all-011.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-span-all-014.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/multicol-span-all-015.html [ Failure ] crbug.com/829028 external/wpt/css/css-multicol/multicol-span-all-017.html [ Failure ] -crbug.com/892817 external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001.xht [ Failure ] crbug.com/636055 external/wpt/css/css-multicol/multicol-span-all-margin-nested-002.xht [ Failure ] crbug.com/990240 external/wpt/css/css-multicol/multicol-span-all-rule-001.html [ Failure ] -crbug.com/792446 external/wpt/css/css-multicol/multicol-span-float-001.xht [ Failure ] crbug.com/964183 external/wpt/css/css-multicol/multicol-width-005.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/nested-at-outer-boundary-as-fieldset.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/nested-with-too-tall-line.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/non-adjacent-spanners-000.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/orthogonal-writing-mode-spanner.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/overflow-unsplittable-001.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/overflow-unsplittable-002.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/overflow-unsplittable-003.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/spanner-fragmentation-001.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/spanner-fragmentation-009.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/spanner-fragmentation-010.html [ Failure ] -crbug.com/829028 external/wpt/css/css-multicol/spanner-fragmentation-011.html [ Failure ] crbug.com/1191124 external/wpt/css/css-multicol/spanner-fragmentation-012.html [ Failure ] crbug.com/1224888 external/wpt/css/css-multicol/spanner-in-opacity.html [ Failure ] -crbug.com/792446 external/wpt/css/css-multicol/multicol-span-float-002.html [ Failure ] -crbug.com/792446 external/wpt/css/css-multicol/multicol-span-float-003.html [ Failure ] crbug.com/1031667 external/wpt/css/css-pseudo/marker-content-007.tentative.html [ Failure ] crbug.com/1031667 external/wpt/css/css-pseudo/marker-content-009.tentative.html [ Failure ] @@ -6120,7 +5766,6 @@ # Sheriff 2021-02-18 crbug.com/1179772 [ Win7 ] http/tests/devtools/console/console-preserve-log-x-process-navigation.js [ Failure Pass ] crbug.com/1179857 [ Linux ] http/tests/inspector-protocol/dom/dom-getFrameOwner.js [ Failure Pass ] -crbug.com/1179905 [ Linux ] fast/multicol/nested-very-tall-inside-short-crash.html [ Failure Pass ] # Sheriff 2021-02-19 crbug.com/1180227 [ Mac ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaStream-default-feature-policy.https.html [ Crash Failure Pass ] @@ -7291,5 +6936,9 @@ crbug.com/1276290 [ Mac ] wpt_internal/mediastream/mediastreamtrackprocessor-transfer-to-worker.html [ Skip ] crbug.com/1276044 virtual/gpu-rasterization/images/color-profile-background-image-repeat.html [ Failure Pass ] +# Tests for absence of SDES that will fail because Fuchsia is allowed to use SDES +crbug.com/804275 [ Fuchsia ] fast/peerconnection/RTCPeerConnection-sdes-constraint.html [ Failure ] +crbug.com/804275 [ Fuchsia ] external/wpt/webrtc/protocol/sdes-dont-dont-dont.html [ Failure ] + # Sheriff 2021-12-03 crbug.com/1198781 [ Linux ] virtual/scroll-unification-layout_ng_block_frag/fast/forms/fieldset/fieldset-custom-scrollbar.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index 377fa8f..eb67b983 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -274,18 +274,6 @@ "args": ["--disable-features=SchemefulSameSite"] }, { - "prefix": "layout_ng_block_frag", - "bases": ["external/wpt/css/css-break", - "external/wpt/css/css-contain", - "external/wpt/css/css-position/multicol", - "external/wpt/css/css-multicol", - "external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements", - "fast/forms/fieldset", - "fast/multicol", - "fragmentation"], - "args": ["--enable-blink-features=LayoutNGBlockFragmentation"] - }, - { "prefix": "layout_ng_flex_frag", "bases": ["external/wpt/css/css-break/flexbox", "fast/multicol/flexbox"],
diff --git a/third_party/blink/web_tests/accessibility/element-role-mapping-normal-expected.txt b/third_party/blink/web_tests/accessibility/element-role-mapping-normal-expected.txt index 9ec8a063..3982ca950 100644 --- a/third_party/blink/web_tests/accessibility/element-role-mapping-normal-expected.txt +++ b/third_party/blink/web_tests/accessibility/element-role-mapping-normal-expected.txt
@@ -73,11 +73,7 @@ AXRole: AXRuby AXRole: AXStaticText "韓國" AXRole: AXInlineTextBox "韓國" - AXRole: AXRubyAnnotation - AXRole: AXStaticText "(" AXRole: AXRubyAnnotation "한국" - AXRole: AXRubyAnnotation - AXRole: AXStaticText ")" AXRole: AXDescriptionList AXRole: AXDescriptionListTerm AXRole: AXStaticText "Coffee"
diff --git a/third_party/blink/web_tests/accessibility/parent-is-included-in-tree.html b/third_party/blink/web_tests/accessibility/parent-is-included-in-tree.html index 7c9905a..b2612151 100644 --- a/third_party/blink/web_tests/accessibility/parent-is-included-in-tree.html +++ b/third_party/blink/web_tests/accessibility/parent-is-included-in-tree.html
@@ -23,11 +23,11 @@ }, "An object with display:none and @id is included in tree"); test(function(t) { - assert_equals(parentObj.childAtIndex(0).childAtIndex(0), childObj); + assert_equals(parentObj.childAtIndex(0), childObj); }, "A child is included in tree"); test(function(t) { - assert_equals(childObj.parentElement().parentElement(), parentObj); + assert_equals(childObj.parentElement(), parentObj); }, "A parent is included in tree"); </script>
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 809b340c..2649d0b 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -354,6 +354,34 @@ ] ], "container-queries": { + "flex-in-columns-000-crash.html": [ + "65d5aafe4fde7bafcffdb44aa645baa45c6352c8", + [ + null, + {} + ] + ], + "flex-in-columns-001-crash.html": [ + "b974c7daeae86bc0171a3207753861a555f32184", + [ + null, + {} + ] + ], + "flex-in-columns-002-crash.html": [ + "a1a66ef3b2578b4fc0e6a815bad1648d0c30b783", + [ + null, + {} + ] + ], + "flex-in-columns-003-crash.html": [ + "885110a3d0e701dbb381d5ef398031aaf314f6ee", + [ + null, + {} + ] + ], "focus-inside-content-visibility-crash.html": [ "ef2eb979bec14e762ccd347ac47114b8f035f9b1", [ @@ -361,6 +389,55 @@ {} ] ], + "grid-in-columns-000-crash.html": [ + "95ea340ba7eb585a0324f41096d0fc4afc167994", + [ + null, + {} + ] + ], + "grid-in-columns-001-crash.html": [ + "752312f2f22474baeb5a9c07caf1739961d3d1c2", + [ + null, + {} + ] + ], + "grid-in-columns-002-crash.html": [ + "8208ca34b98165a6fce917db642221318482368c", + [ + null, + {} + ] + ], + "grid-in-columns-003-crash.html": [ + "f189fd5ddd6e7cdeee393fe37beed8fd7b343c5d", + [ + null, + {} + ] + ], + "inline-multicol-inside-container-crash.html": [ + "d8ec414e596fb9c83c881206f31311ad1b56a19a", + [ + null, + {} + ] + ], + "inline-with-columns-000-crash.html": [ + "6bb178af8503c8661ae3f28e56b453f5bc8be3e4", + [ + null, + {} + ] + ], + "inline-with-columns-001-crash.html": [ + "c813375184cfc7890e0168ab2f326e8d5355c0b0", + [ + null, + {} + ] + ], "pseudo-container-crash.html": [ "f998c3a4464ca3eb3ce07687cf24d9dcdc9a16af", [ @@ -374,6 +451,34 @@ null, {} ] + ], + "table-in-columns-000-crash.html": [ + "7961617a3cac0cc93c67d258806dd0bb78feaa51", + [ + null, + {} + ] + ], + "table-in-columns-001-crash.html": [ + "5756b34d23efdc5605a1294ae4a71e452258df8b", + [ + null, + {} + ] + ], + "table-in-columns-002-crash.html": [ + "4ae02080e3b6a49c1da47e5f529d916f430bc822", + [ + null, + {} + ] + ], + "table-in-columns-003-crash.html": [ + "0385ac7b53e41e4e28cc6cd722d5fe96d85bf83f", + [ + null, + {} + ] ] }, "content-visibility": { @@ -3084,7 +3189,7 @@ ] ], "display-override-member-css-environment-variables-window-controls-overlay-manual.tentative.html": [ - "2f06c5d6c7cbe7a8552f7b42315fa349de8f169f", + "a49b4f6f9853c3f824347e64b9d2e6b318b4a39e", [ null, {} @@ -79616,6 +79721,32 @@ ], {} ] + ], + "grid-item-fragmentation-035.html": [ + "15a544ea229ca1ad6c357f7851f09bfd989c2d3e", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "grid-item-fragmentation-036.html": [ + "ba44745e9a02d5afffa3f424f68435633c8f571c", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] ] }, "ink-overflow-002.html": [ @@ -89357,6 +89488,19 @@ {} ] ], + "multicol-inside-container.html": [ + "0c00734a4ae82e0cdf0e6d230a7e2eabae35932b", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "pseudo-elements-002.tentative.html": [ "e46d25cf8754bd1ec277dda727fc88018af65126", [ @@ -251232,14 +251376,6 @@ "c061a1d6114572c307d058f545e4828e4910250a", [] ], - "multicol-overflow-positioned-transform-001-expected.txt": [ - "1ea3f7d7f64353e17bd16351e44a357c45788e90", - [] - ], - "multicol-overflow-transform-001-expected.txt": [ - "1ea3f7d7f64353e17bd16351e44a357c45788e90", - [] - ], "multicol-overflowing-001-ref.xht": [ "d3a6c6e03c58c17f0dfa4f2e6d9b945e352216af", [] @@ -269299,6 +269435,16 @@ "6fd5b12664da091fd9ee773b821ad72ee704ee8f", [] ], + "abort": { + "event.any-expected.txt": [ + "4d7cd785dcd39836212986a8dad09d878597431f", + [] + ], + "event.any.worker-expected.txt": [ + "4d7cd785dcd39836212986a8dad09d878597431f", + [] + ] + }, "collections": { "HTMLCollection-as-prototype-expected.txt": [ "f36f3bf1426c59572dc577805db9d9a3503ffd29", @@ -295555,6 +295701,14 @@ "a86e0a077851a84f704e2aa4df1d526ecd9a55b2", [] ], + "MediaDevices-enumerateDevices-persistent-permission.https-expected.txt": [ + "91119ce94ad223d9054eadcf0c62cd742563dd24", + [] + ], + "MediaDevices-enumerateDevices-returned-objects.https-expected.txt": [ + "d7fe4a5aa6e7cf953f39c36d01c58996c5874877", + [] + ], "MediaDevices-enumerateDevices.https-expected.txt": [ "973e380f7808eec4d031e62130107ec97297c6f5", [] @@ -295587,8 +295741,24 @@ "35a2f4c8c4e26a49ef72cdefc7e9f826f4dbe7fc", [] ], + "iframe-enumerate-cleared.html": [ + "27dd046ac599add88682e29f61034f6cc09317ca", + [] + ], + "iframe-enumerate-cleared.html.headers": [ + "ac4ddd8aba2b0a684a8a2cf984b274a1f4ae42ca", + [] + ], + "iframe-enumerate.html": [ + "27dd046ac599add88682e29f61034f6cc09317ca", + [] + ], + "message-enumerateddevices.js": [ + "4541636b4b1e579694129d11bd48e814bbe47d58", + [] + ], "permission-helper.js": [ - "29d1c9a35a75dc8a86a2326e1aafbfb7ea23f555", + "769f3ee24247b4c5231e6cc3b63340bf4659104b", [] ] }, @@ -306919,7 +307089,7 @@ [] ], "urlpatterntestdata.json": [ - "f097edba08da1d2e68a70e26e459890a0956dd45", + "93ef6d199e063886c5646393b349ac5b9a90509d", [] ], "urlpatterntests.js": [ @@ -376146,7 +376316,7 @@ ] ], "event.any.js": [ - "cb85250b3be1efc64bc48f10aad932642796858b", + "21c901c9fe9bcde84898754de33d62acb164a8b1", [ "dom/abort/event.any.html", {} @@ -452557,7 +452727,7 @@ ] ], "navigator-window-controls-overlay.html": [ - "0f7230e09db8a8bcf12bae546b5505721c01c17f", + "9cff8d316340cdb29edb48405bf5441ab72a4cf1", [ null, {} @@ -459205,8 +459375,26 @@ {} ] ], + "MediaDevices-enumerateDevices-per-origin-ids.sub.https.html": [ + "f2b627a349843b68d11990820c3453e7933e87ca", + [ + null, + { + "testdriver": true + } + ] + ], + "MediaDevices-enumerateDevices-persistent-permission.https.html": [ + "c53309ca1a97831fc0301a8da3ceac5b92598711", + [ + null, + { + "testdriver": true + } + ] + ], "MediaDevices-enumerateDevices-returned-objects.https.html": [ - "91982cb5b2ba1b2a0584843a991a29043580d625", + "12b858ff09e40cccde4bfe5f6831c553ec5d35e8", [ null, {
diff --git a/third_party/blink/web_tests/external/wpt/appmanifest/display-override-member/display-override-member-css-environment-variables-window-controls-overlay-manual.tentative.html b/third_party/blink/web_tests/external/wpt/appmanifest/display-override-member/display-override-member-css-environment-variables-window-controls-overlay-manual.tentative.html index 2f06c5d..a49b4f6 100644 --- a/third_party/blink/web_tests/external/wpt/appmanifest/display-override-member/display-override-member-css-environment-variables-window-controls-overlay-manual.tentative.html +++ b/third_party/blink/web_tests/external/wpt/appmanifest/display-override-member/display-override-member-css-environment-variables-window-controls-overlay-manual.tentative.html
@@ -34,12 +34,12 @@ const w = getComputedStyle(windowControlsOverlayElementStyle).getPropertyValue('padding-right'); const y = getComputedStyle(windowControlsOverlayElementStyle).getPropertyValue('padding-top'); const h = getComputedStyle(windowControlsOverlayElementStyle).getPropertyValue('padding-bottom'); - const boundingClientRect = navigator.windowControlsOverlay.getBoundingClientRect(); + const boundingClientRect = navigator.windowControlsOverlay.getTitlebarAreaRect(); manual_test.step(() => { - assert_equals(x, boundingClientRect.x + 'px', 'CSS environment "titlebar-area-x" does not equal navigator.windowControlsOverlay.getBoundingClientRect().x'); - assert_equals(y, boundingClientRect.y + 'px', 'CSS environment "titlebar-area-x" does not equal navigator.windowControlsOverlay.getBoundingClientRect().y'); - assert_equals(w, boundingClientRect.width + 'px', 'CSS environment "titlebar-area-x" does not equal navigator.windowControlsOverlay.getBoundingClientRect().width'); - assert_equals(h, boundingClientRect.height + 'px', 'CSS environment "titlebar-area-x" does not equal navigator.windowControlsOverlay.getBoundingClientRect().height'); + assert_equals(x, boundingClientRect.x + 'px', 'CSS environment "titlebar-area-x" does not equal navigator.windowControlsOverlay.getTitlebarAreaRect().x'); + assert_equals(y, boundingClientRect.y + 'px', 'CSS environment "titlebar-area-x" does not equal navigator.windowControlsOverlay.getTitlebarAreaRect().y'); + assert_equals(w, boundingClientRect.width + 'px', 'CSS environment "titlebar-area-x" does not equal navigator.windowControlsOverlay.getTitlebarAreaRect().width'); + assert_equals(h, boundingClientRect.height + 'px', 'CSS environment "titlebar-area-x" does not equal navigator.windowControlsOverlay.getTitlebarAreaRect().height'); }); manual_test.done(); } @@ -51,7 +51,7 @@ <body> <h1>Description</h1> <p>This test validates that when in "window-controls-overlay" mode, the 'titlebar-area-*' CSS environment variables - match the values returned by navigator.windowControlsOverlay.getBoundingClientRect().</p> + match the values returned by navigator.windowControlsOverlay.getTitlebarAreaRect().</p> <h1>Manual Test Steps:</h1> <p> <ol>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-035.html b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-035.html new file mode 100644 index 0000000..15a544e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-035.html
@@ -0,0 +1,15 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#pagination"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<title>Tests that break voilation precedence.</title> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="position: relative; columns: 2; column-fill: auto; gap: 0; width: 100px; height: 100px; background: red;"> + <div style="display:grid; orphans: 2; widows: 2; line-height: 0;"> + <div style="background: green; height: 70px;"></div> + <div style="break-before: avoid;"> <!-- Prefer avoiding the row break rather and violate orphans/widows constraint. --> + <span style="display: inline-block; height: 30px; width: 50px; background: green;"></span> + <span style="display: inline-block; height: 70px; width: 50px; background: green;"></span> + </div> + </div> + <div style="position: absolute; width: 50px; height: 30px; bottom: 0; right: 0; background: green;"></div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-036.html b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-036.html new file mode 100644 index 0000000..ba44745 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-036.html
@@ -0,0 +1,16 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#pagination"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<title>Tests that break voilation precedence.</title> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="position: relative; columns: 2; column-fill: auto; gap: 0; width: 100px; height: 100px; background: red;"> + <div style="display:grid; orphans: 2; widows: 2; line-height: 0; grid-template-columns: 0% 100%;"> + <div style="background: green; height: 70px; grid-column: 1 / span 2;"></div> + <div style="break-before: avoid;"></div> <!-- Prefer avoiding the row break rather and violate orphans/widows constraint. --> + <div> + <span style="display: inline-block; height: 30px; width: 50px; background: green;"></span> + <span style="display: inline-block; height: 70px; width: 50px; background: green;"></span> + </div> + </div> + <div style="position: absolute; width: 50px; height: 30px; bottom: 0; right: 0; background: green;"></div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-000-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-000-crash.html new file mode 100644 index 0000000..65d5aaf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-000-crash.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 500px) { + #target { + display: flex; + } + } +</style> +<div id="container" style="columns:2; container-type:inline-size; width:600px;"> + <div id="target"></div> +</div> +<script> + document.body.offsetTop; + container.style.width = "400px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-001-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-001-crash.html new file mode 100644 index 0000000..b974c7d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-001-crash.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 500px) { + #target { + display: flex; + } + } +</style> +<div id="container" style="columns:2; container-type:inline-size; width:400px;"> + <div id="target"></div> +</div> +<script> + document.body.offsetTop; + container.style.width = "600px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-002-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-002-crash.html new file mode 100644 index 0000000..a1a66ef --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-002-crash.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 250px) { + #target { + display: flex; + } + } +</style> +<div id="ancestor" style="columns:2; column-gap:0; width:600px;"> + <div style="container-type:inline-size;"> + <div id="target"></div> + </div> +</div> +<script> + document.body.offsetTop; + ancestor.style.width = "400px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-003-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-003-crash.html new file mode 100644 index 0000000..885110a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-003-crash.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 250px) { + #target { + display: flex; + } + } +</style> +<div id="ancestor" style="columns:2; column-gap:0; width:400px;"> + <div style="container-type:inline-size;"> + <div id="target"></div> + </div> +</div> +<script> + document.body.offsetTop; + ancestor.style.width = "600px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-000-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-000-crash.html new file mode 100644 index 0000000..95ea340 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-000-crash.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 500px) { + #target { + display: grid; + } + } +</style> +<div id="container" style="columns:2; container-type:inline-size; width:600px;"> + <div id="target"></div> +</div> +<script> + document.body.offsetTop; + container.style.width = "400px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-001-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-001-crash.html new file mode 100644 index 0000000..752312f2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-001-crash.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 500px) { + #target { + display: grid; + } + } +</style> +<div id="container" style="columns:2; container-type:inline-size; width:400px;"> + <div id="target"></div> +</div> +<script> + document.body.offsetTop; + container.style.width = "600px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-002-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-002-crash.html new file mode 100644 index 0000000..8208ca34 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-002-crash.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 250px) { + #target { + display: grid; + } + } +</style> +<div id="ancestor" style="columns:2; column-gap:0; width:600px;"> + <div style="container-type:inline-size;"> + <div id="target"></div> + </div> +</div> +<script> + document.body.offsetTop; + ancestor.style.width = "400px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-003-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-003-crash.html new file mode 100644 index 0000000..f189fd5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-003-crash.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 250px) { + #target { + display: grid; + } + } +</style> +<div id="ancestor" style="columns:2; column-gap:0; width:400px;"> + <div style="container-type:inline-size;"> + <div id="target"></div> + </div> +</div> +<script> + document.body.offsetTop; + ancestor.style.width = "600px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-with-columns-000-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-with-columns-000-crash.html new file mode 100644 index 0000000..6bb178af8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-with-columns-000-crash.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 500px) { + #target { + columns: 2; + } + } +</style> +<div id="container" style="container-type:inline-size; width:600px;"> + <span id="target"></span> +</div> +<script> + document.body.offsetTop; + container.style.width = "400px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-with-columns-001-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-with-columns-001-crash.html new file mode 100644 index 0000000..c813375 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-with-columns-001-crash.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 500px) { + #target { + columns: 2; + } + } +</style> +<div id="container" style="container-type:inline-size; width:400px;"> + <span id="target"></span> +</div> +<script> + document.body.offsetTop; + container.style.width = "600px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-000-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-000-crash.html new file mode 100644 index 0000000..7961617a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-000-crash.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 500px) { + #target { + display: table; + } + } +</style> +<div id="container" style="columns:2; container-type:inline-size; width:600px;"> + <div id="target"></div> +</div> +<script> + document.body.offsetTop; + container.style.width = "400px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-001-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-001-crash.html new file mode 100644 index 0000000..5756b34d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-001-crash.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 500px) { + #target { + display: table; + } + } +</style> +<div id="container" style="columns:2; container-type:inline-size; width:400px;"> + <div id="target"></div> +</div> +<script> + document.body.offsetTop; + container.style.width = "600px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-002-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-002-crash.html new file mode 100644 index 0000000..4ae02080 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-002-crash.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 250px) { + #target { + display: table; + } + } +</style> +<div id="ancestor" style="columns:2; column-gap:0; width:600px;"> + <div style="container-type:inline-size;"> + <div id="target"></div> + </div> +</div> +<script> + document.body.offsetTop; + ancestor.style.width = "400px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-003-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-003-crash.html new file mode 100644 index 0000000..0385ac7b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-003-crash.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1276898"> +<style> + @container size(max-width: 250px) { + #target { + display: table; + } + } +</style> +<div id="ancestor" style="columns:2; column-gap:0; width:400px;"> + <div style="container-type:inline-size;"> + <div id="target"></div> + </div> +</div> +<script> + document.body.offsetTop; + ancestor.style.width = "600px"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/multicol-overflow-positioned-transform-001-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-multicol/multicol-overflow-positioned-transform-001-expected.txt deleted file mode 100644 index 1ea3f7d..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-multicol/multicol-overflow-positioned-transform-001-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -FAIL Check scrollWidth before and after transform chage assert_equals: expected 250 but got 100 -FAIL Check scrollHeight before and after transform chage assert_equals: expected 350 but got 100 -FAIL Check scrollWidth and scrollHeight before and after transform chage assert_equals: expected 250 but got 100 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/multicol-overflow-transform-001-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-multicol/multicol-overflow-transform-001-expected.txt deleted file mode 100644 index 1ea3f7d..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-multicol/multicol-overflow-transform-001-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -FAIL Check scrollWidth before and after transform chage assert_equals: expected 250 but got 100 -FAIL Check scrollHeight before and after transform chage assert_equals: expected 350 but got 100 -FAIL Check scrollWidth and scrollHeight before and after transform chage assert_equals: expected 250 but got 100 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/dom/abort/event.any-expected.txt b/third_party/blink/web_tests/external/wpt/dom/abort/event.any-expected.txt new file mode 100644 index 0000000..4d7cd78 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/dom/abort/event.any-expected.txt
@@ -0,0 +1,17 @@ +This is a testharness.js-based test. +PASS AbortController abort() should fire event synchronously +PASS controller.signal should always return the same object +PASS controller.abort() should do nothing the second time it is called +PASS event handler should not be called if added after controller.abort() +PASS the abort event should have the right properties +PASS AbortController abort(reason) should set signal.reason +PASS aborting AbortController without reason creates an "AbortError" DOMException +PASS AbortController abort(undefined) creates an "AbortError" DOMException +PASS AbortController abort(null) should set signal.reason +PASS static aborting signal should have right properties +PASS static aborting signal with reason should set signal.reason +FAIL throwIfAborted() should throw abort.reason if signal aborted assert_throws_exactly: function "() => signal.throwIfAborted()" threw object "TypeError: signal.throwIfAborted is not a function" but we expected it to throw object "Error: boom" +FAIL throwIfAborted() should throw primitive abort.reason if signal aborted assert_throws_exactly: function "() => signal.throwIfAborted()" threw object "TypeError: signal.throwIfAborted is not a function" but we expected it to throw "hello" +FAIL throwIfAborted() should not throw if signal not aborted controller.signal.throwIfAborted is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/dom/abort/event.any.js b/third_party/blink/web_tests/external/wpt/dom/abort/event.any.js index cb85250..21c901c 100644 --- a/third_party/blink/web_tests/external/wpt/dom/abort/event.any.js +++ b/third_party/blink/web_tests/external/wpt/dom/abort/event.any.js
@@ -139,4 +139,23 @@ assert_equals(signal.reason, reason, "signal.reason"); }, "static aborting signal with reason should set signal.reason"); +test(t => { + const reason = new Error('boom'); + const signal = AbortSignal.abort(reason); + assert_true(signal.aborted); + assert_throws_exactly(reason, () => signal.throwIfAborted()); +}, "throwIfAborted() should throw abort.reason if signal aborted"); + +test(t => { + const signal = AbortSignal.abort('hello'); + assert_true(signal.aborted); + assert_throws_exactly('hello', () => signal.throwIfAborted()); +}, "throwIfAborted() should throw primitive abort.reason if signal aborted"); + +test(t => { + const controller = new AbortController(); + assert_false(controller.signal.aborted); + controller.signal.throwIfAborted(); +}, "throwIfAborted() should not throw if signal not aborted"); + done();
diff --git a/third_party/blink/web_tests/external/wpt/dom/abort/event.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/dom/abort/event.any.worker-expected.txt new file mode 100644 index 0000000..4d7cd78 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/dom/abort/event.any.worker-expected.txt
@@ -0,0 +1,17 @@ +This is a testharness.js-based test. +PASS AbortController abort() should fire event synchronously +PASS controller.signal should always return the same object +PASS controller.abort() should do nothing the second time it is called +PASS event handler should not be called if added after controller.abort() +PASS the abort event should have the right properties +PASS AbortController abort(reason) should set signal.reason +PASS aborting AbortController without reason creates an "AbortError" DOMException +PASS AbortController abort(undefined) creates an "AbortError" DOMException +PASS AbortController abort(null) should set signal.reason +PASS static aborting signal should have right properties +PASS static aborting signal with reason should set signal.reason +FAIL throwIfAborted() should throw abort.reason if signal aborted assert_throws_exactly: function "() => signal.throwIfAborted()" threw object "TypeError: signal.throwIfAborted is not a function" but we expected it to throw object "Error: boom" +FAIL throwIfAborted() should throw primitive abort.reason if signal aborted assert_throws_exactly: function "() => signal.throwIfAborted()" threw object "TypeError: signal.throwIfAborted is not a function" but we expected it to throw "hello" +FAIL throwIfAborted() should not throw if signal not aborted controller.signal.throwIfAborted is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay.html b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay.html index 0f7230e..9cff8d3 100644 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay.html +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay.html
@@ -19,21 +19,21 @@ }, 'visible should be false'); test(function(){ - assert_idl_attribute(navigator.windowControlsOverlay, 'getBoundingClientRect'); - }, 'getBoundingClientRect should be a method of the windowControlsOverlay object'); + assert_idl_attribute(navigator.windowControlsOverlay, 'getTitlebarAreaRect'); + }, 'getTitlebarAreaRect should be a method of the windowControlsOverlay object'); test(function(){ - var rect = navigator.windowControlsOverlay.getBoundingClientRect(); + var rect = navigator.windowControlsOverlay.getTitlebarAreaRect(); assert_true(rect instanceof DOMRect); - }, 'getBoundingClientRect return type should be DOMRect'); + }, 'getTitlebarAreaRect return type should be DOMRect'); test(function(){ - var rect = navigator.windowControlsOverlay.getBoundingClientRect(); + var rect = navigator.windowControlsOverlay.getTitlebarAreaRect(); assert_equals(rect.x, 0); assert_equals(rect.y, 0); assert_equals(rect.width, 0); assert_equals(rect.height, 0); - }, 'getBoundingClientRect should return a empty DOMRect'); + }, 'getTitlebarAreaRect should return a empty DOMRect'); test(function(){ assert_idl_attribute(navigator.windowControlsOverlay, 'ongeometrychange');
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html new file mode 100644 index 0000000..f2b627a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html
@@ -0,0 +1,84 @@ +<!doctype html> +<html> +<head> +<title>enumerateDevices rotates deviceId across origins and after cookies get cleared</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/testdriver.js></script> +<script src=/resources/testdriver-vendor.js></script> +<script src=permission-helper.js></script> +</head> +<body> + <iframe allow="camera 'src';microphone 'src'" id=same src="/mediacapture-streams/iframe-enumerate.html"></iframe> +<iframe allow="camera 'src';microphone 'src'" id=cross src="https://{{hosts[][www1]}}:{{ports[https][0]}}/mediacapture-streams/iframe-enumerate.html"></iframe> +<script> + + let deviceList; + + promise_test(async t => { + await setMediaPermission(); + const stream = await navigator.mediaDevices.getUserMedia({audio : true, video: true}); + stream.getTracks().forEach(t => t.stop()); + deviceList = await navigator.mediaDevices.enumerateDevices(); + const msgWatcher = new EventWatcher(t, window, ['message']); + frames[0].postMessage('run', '*') + const e = await msgWatcher.wait_for('message'); + const iframeDevices = e.data.devices; + assert_equals(deviceList.length, iframeDevices.length, "Same number of devices detected same-origin"); + for (const device of deviceList) { + const sameDevice = iframeDevices.find(d => d.deviceId === device.deviceId); + assert_true(!!sameDevice, "deviceIds stay the same when loaded in same origin"); + assert_equals(sameDevice.label, device.label, "labels matches when deviceId matches"); + assert_equals(sameDevice.kind, device.kind, "kind matches when deviceId matches"); + // The group identifier MUST be uniquely generated for each document. + assert_not_equals(sameDevice.groupId, device.groupId, "groupId is specific to a document"); + } + // setting a cookie as a way to detect if cookie clearing gets done + document.cookie = "test=true"; + window.localStorage.touched = true; + }, "enumerateDevices has stable deviceIds across same-origin iframe"); + + promise_test(async t => { + const msgWatcher = new EventWatcher(t, window, ['message']); + frames[1].postMessage('run', '*') + const e = await msgWatcher.wait_for('message'); + const iframeDevices = e.data.devices; + assert_equals(deviceList.length, iframeDevices.length, "Same number of devices detected cross-origin"); + for (const device of deviceList) { + // An identifier can be reused across origins as long as + // it is not tied to the user and can be guessed by other means + // In practice, "default" is what is used today, so we hardcode it + // to be able to detect the general case of non-shared deviceIds + if (device.deviceId !== "default") { + const sameDevice = iframeDevices.find(d => d.deviceId === device.deviceId); + assert_false(!!sameDevice, "deviceIds are not shared across origin"); + } + assert_false(!!iframeDevices.find(d => d.groupId === device.groupId), "groupId is specific to a document"); + } + }, "enumerateDevices rotates deviceId across different-origin iframe"); + + promise_test(async t => { + const iframe = document.createElement("iframe"); + iframe.setAttribute("allow", "camera 'src';microphone 'src'"); + iframe.src = "/mediacapture-streams/iframe-enumerate-cleared.html"; + document.body.appendChild(iframe); + const loadWatcher = new EventWatcher(t, iframe, ['load']); + await loadWatcher.wait_for('load'); + assert_implements_optional(document.cookie === "", "Clear-Site-Data not enabled, can't test clearing deviceId"); + + const msgWatcher = new EventWatcher(t, window, ['message']); + frames[2].postMessage('run', '*') + const e = await msgWatcher.wait_for('message'); + const iframeDevices = e.data.devices; + assert_equals(deviceList.length, iframeDevices.length, "Same number of devices detected after clearing cookies"); + for (const device of deviceList) { + const sameDevice = iframeDevices.find(d => d.deviceId === device.deviceId); + assert_false(!!sameDevice, "deviceIds are not kept after clearing site data"); + assert_false(!!iframeDevices.find(d => d.groupId === device.groupId), "groupId is specific to a document"); + } + + }, "enumerateDevices rotates deviceId after clearing site data"); + +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-persistent-permission.https-expected.txt b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-persistent-permission.https-expected.txt new file mode 100644 index 0000000..91119ce9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-persistent-permission.https-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL enumerateDevices depends only on capture state, not permission state assert_equals: expected (string) "At most one of a kind prior to capture" but got (boolean) false +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-persistent-permission.https.html b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-persistent-permission.https.html new file mode 100644 index 0000000..c53309c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-persistent-permission.https.html
@@ -0,0 +1,38 @@ +<!doctype html> +<html> +<head> +<title>enumerateDevices depends only on capture state, not permission state</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/testdriver.js></script> +<script src=/resources/testdriver-vendor.js></script> +<script src=permission-helper.js></script> +</head> +<body> + +<script> + promise_test(async t => { + await setMediaPermission(); + const stream = await navigator.mediaDevices.getUserMedia({audio : true, video: true}); + stream.getTracks().forEach(t => t.stop()); + // the page loaded below hasn't had capture enabled + // so enumerateDevices should not list detailed info yet + const iframe = document.createElement("iframe"); + iframe.setAttribute("allow", "camera 'src';microphone 'src'"); + iframe.src = "/mediacapture-streams/iframe-enumerate.html"; + document.body.appendChild(iframe); + const loadWatcher = new EventWatcher(t, iframe, ['load']); + await loadWatcher.wait_for('load'); + const msgWatcher = new EventWatcher(t, window, ['message']); + frames[0].postMessage('run', '*') + const e = await msgWatcher.wait_for('message'); + const iframeDevices = e.data.devices; + const kinds = iframeDevices.map(({kind}) => kind); + assert_equals(kinds.length == new Set(kinds).size, "At most one of a kind prior to capture"); + for (const device of iframeDevices) { + assert_equals(device.deviceId, "", "deviceId pre-capture is empty"); + assert_equals(device.label, "", "label pre-capture is empty"); + assert_equals(device.groupId, "", "groupId pre-capture is empty"); + } + }); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-returned-objects.https-expected.txt b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-returned-objects.https-expected.txt new file mode 100644 index 0000000..d7fe4a5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-returned-objects.https-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +FAIL enumerateDevices returns expected mostly empty objects in case device-info permission is not granted assert_equals: deviceId is empty before capture expected "" but got "default" +PASS enumerateDevices returns expected objects in case device-info permission is granted +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-returned-objects.https.html b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-returned-objects.https.html index 91982cb..12b858f 100644 --- a/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-returned-objects.https.html +++ b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-returned-objects.https.html
@@ -28,12 +28,32 @@ assert_not_equals(device1, device2); assert_equals(device1.deviceId, device2.deviceId, "deviceId"); assert_equals(device1.kind, device2.kind, "kind"); + if (!callGetUserMedia) { + /* For camera and microphone devices, + if the browsing context did not capture (i.e. getUserMedia() was not called or never resolved successfully), + the MediaDeviceInfo object will contain a valid value for kind + but empty strings for deviceId, label, and groupId. */ + assert_equals(device1.deviceId, "", "deviceId is empty before capture"); + assert_equals(device1.groupId, "", "groupId is empty before capture"); + assert_equals(device1.label, "", "label is empty before capture"); + assert_in_array(device.kind, ["audioinput", "audiooutput", "videoinput", "kind is set to a valid value before capture"]); + } + } + /* Additionally, at most one device of each kind + will be listed in enumerateDevices() result. */ + // FIXME: ensure browsers are tested as if they had multiple devices of at least one kind - + // this probably needs https://w3c.github.io/mediacapture-automation/ support + if (!callGetUserMedia) { + const deviceKinds = deviceList1.map(d => d.kind); + for (let kind of deviceKinds) { + assert_equals(deviceKinds.filter(x => x===kind).length, 1, "At most 1 " + kind + " prior to capture"); + } } }, testName); } -doTest(false, "enumerateDevices returns new objects in case device-info permission is not granted"); -doTest(true, "enumerateDevices returns new objects in case device-info permission is granted"); +doTest(false, "enumerateDevices returns expected mostly empty objects in case device-info permission is not granted"); +doTest(true, "enumerateDevices returns expected objects in case device-info permission is granted"); </script> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-streams/iframe-enumerate-cleared.html b/third_party/blink/web_tests/external/wpt/mediacapture-streams/iframe-enumerate-cleared.html new file mode 100644 index 0000000..27dd046 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/mediacapture-streams/iframe-enumerate-cleared.html
@@ -0,0 +1,2 @@ +<!DOCTYPE html> +<script src="message-enumerateddevices.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-streams/iframe-enumerate-cleared.html.headers b/third_party/blink/web_tests/external/wpt/mediacapture-streams/iframe-enumerate-cleared.html.headers new file mode 100644 index 0000000..ac4ddd8a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/mediacapture-streams/iframe-enumerate-cleared.html.headers
@@ -0,0 +1 @@ +Clear-Site-Data: "cookies"
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-streams/iframe-enumerate.html b/third_party/blink/web_tests/external/wpt/mediacapture-streams/iframe-enumerate.html new file mode 100644 index 0000000..27dd046 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/mediacapture-streams/iframe-enumerate.html
@@ -0,0 +1,2 @@ +<!DOCTYPE html> +<script src="message-enumerateddevices.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-streams/message-enumerateddevices.js b/third_party/blink/web_tests/external/wpt/mediacapture-streams/message-enumerateddevices.js new file mode 100644 index 0000000..4541636 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/mediacapture-streams/message-enumerateddevices.js
@@ -0,0 +1,8 @@ +onmessage = async e => { + const stream = await navigator.mediaDevices.getUserMedia({audio: true, video: true}); + stream.getTracks().forEach(t => t.stop()); + const devices = await navigator.mediaDevices.enumerateDevices(); + e.source.postMessage({ + devices: devices.map(d => d.toJSON()) + }, '*'); +}
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-streams/permission-helper.js b/third_party/blink/web_tests/external/wpt/mediacapture-streams/permission-helper.js index 29d1c9a..769f3ee 100644 --- a/third_party/blink/web_tests/external/wpt/mediacapture-streams/permission-helper.js +++ b/third_party/blink/web_tests/external/wpt/mediacapture-streams/permission-helper.js
@@ -7,10 +7,18 @@ await test_driver.set_permission({ name: s }, status, true); } } catch (e) { - if (!(typeof e === "string" && e.match(/set_permission not implemented/))) { - throw e + const noSetPermissionSupport = typeof e === "string" && e.match(/set_permission not implemented/); + if (!(noSetPermissionSupport || + (e instanceof Error && e.message.match("unimplemented")) )) { + throw e; } // Web Driver not implemented action - // will default to granted state for FF and Safari + // FF: https://bugzilla.mozilla.org/show_bug.cgi?id=1524074 + + // with current WPT runners, will default to granted state for FF and Safari + // throw if status!="granted" to invalidate test results + if (status === "denied") { + assert_implements_optional(!noSetPermissionSupport, "Unable to set permission to denied for this test"); + } } }
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/protocol/sdes-dont-dont-dont-expected.txt b/third_party/blink/web_tests/external/wpt/webrtc/protocol/sdes-dont-dont-dont-expected.txt deleted file mode 100644 index efdc199b..0000000 --- a/third_party/blink/web_tests/external/wpt/webrtc/protocol/sdes-dont-dont-dont-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL does not create offers with SDES assert_false: expected false got true -PASS rejects a remote offer that only includes SDES and no DTLS fingerprint -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/fast/dom/HTMLObjectElement/fallback-content-behaviour.html b/third_party/blink/web_tests/fast/dom/HTMLObjectElement/fallback-content-behaviour.html index 88794fb..4a74370 100644 --- a/third_party/blink/web_tests/fast/dom/HTMLObjectElement/fallback-content-behaviour.html +++ b/third_party/blink/web_tests/fast/dom/HTMLObjectElement/fallback-content-behaviour.html
@@ -11,7 +11,7 @@ </style> <script src="../../../resources/check-layout.js"></script> </head> - <body onload="checkLayout('.object')"> + <body onload="checkLayout('.object')" style="width: 500px"> <p>crbug.com/2210 - Rendering of fallback content is very inconsistent among browsers. This captures Blink's current rendering of each test case.</p> <object class="object" data-expected-width="300" data-expected-height="150"></object> <object class="object" data-expected-width="300" data-expected-height="150"> </object> @@ -20,10 +20,21 @@ <object class="object" type="application/x-no-such-plugin" data-expected-width="300" data-expected-height="150"></object> <object class="object" width="100" height="100" data-expected-width="100" data-expected-height="100"></object> <br> - <object class="object" data-expected-width="0" data-expected-height="0"><div style="height:100px; width:100px; background-color:green;"></div></object> - <object class="object" width="100" height="100" data-expected-width="0" data-expected-height="0"><div style="height:100px; width:100px; background-color:green;"></div></object> + <object id="bi1" class="object" data-expected-width="0" data-expected-height="0"><div style="height:100px; width:100px; background-color:green;"></div></object> + <object id="bi2" class="object" width="100" height="100" data-expected-width="0" data-expected-height="0"><div style="height:100px; width:100px; background-color:green;"></div></object> <applet class="object" type="application/x-no-such-plugin" width="100" height="100" data-expected-width="0" data-expected-height="0"></applet> <applet class="object" width="100" height="100" data-expected-width="0" data-expected-height="0"></applet> <applet class="object" data-expected-width="0" data-expected-height="0"></applet> +<script> +if (window.internals && internals.runtimeFlags.layoutNGBlockInInlineEnabled) { + // TODO(crbug.com/716930): offsetWidth and offsetHeight differ when + // LayoutNGBlockInInline is enabled. + // https://docs.google.com/document/d/15kgdIHhb9EVNup6Ir5NWwJxpzY5GH0ED7Ld3iMW3HlA/edit?pli=1#bookmark=id.kssozto3r8eu + bi1.dataset.expectedWidth = 500; + bi1.dataset.expectedHeight = 100; + bi2.dataset.expectedWidth = 500; + bi2.dataset.expectedHeight = 100; +} +</script> </body> </html>
diff --git a/third_party/blink/web_tests/fast/multicol/caret-range-outside-columns-mac-expected.txt b/third_party/blink/web_tests/fast/multicol/caret-range-outside-columns-mac-expected.txt index bf65ac3..1fe9206 100644 --- a/third_party/blink/web_tests/fast/multicol/caret-range-outside-columns-mac-expected.txt +++ b/third_party/blink/web_tests/fast/multicol/caret-range-outside-columns-mac-expected.txt
@@ -15,13 +15,13 @@ PASS document.caretRangeFromPoint(350,0).startOffset is 24 PASS document.caretRangeFromPoint(450,0).startOffset is 24 Below first column: -FAIL document.caretRangeFromPoint(50,100).startOffset should be 11. Was 12. -FAIL document.caretRangeFromPoint(150,100).startOffset should be 11. Was 12. -FAIL document.caretRangeFromPoint(189,100).startOffset should be 11. Was 12. +PASS document.caretRangeFromPoint(50,100).startOffset is 11 +PASS document.caretRangeFromPoint(150,100).startOffset is 11 +PASS document.caretRangeFromPoint(189,100).startOffset is 11 Below second column: -FAIL document.caretRangeFromPoint(190,100).startOffset should be 23. Was 24. -FAIL document.caretRangeFromPoint(250,100).startOffset should be 23. Was 24. -FAIL document.caretRangeFromPoint(289,100).startOffset should be 23. Was 24. +PASS document.caretRangeFromPoint(190,100).startOffset is 23 +PASS document.caretRangeFromPoint(250,100).startOffset is 23 +PASS document.caretRangeFromPoint(289,100).startOffset is 23 Below third column: PASS document.caretRangeFromPoint(290,100).startOffset is 35 PASS document.caretRangeFromPoint(350,100).startOffset is 35 @@ -31,7 +31,7 @@ PASS document.caretRangeFromPoint(0,30).startOffset is 0 PASS document.caretRangeFromPoint(0,50).startOffset is 4 PASS document.caretRangeFromPoint(0,70).startOffset is 8 -FAIL document.caretRangeFromPoint(0,90).startOffset should be 11. Was 12. +PASS document.caretRangeFromPoint(0,90).startOffset is 11 To the right of the third column: PASS document.caretRangeFromPoint(400,10).startOffset is 24 PASS document.caretRangeFromPoint(400,30).startOffset is 27
diff --git a/third_party/blink/web_tests/fast/multicol/caret-range-outside-columns-rtl-expected.txt b/third_party/blink/web_tests/fast/multicol/caret-range-outside-columns-rtl-expected.txt index 72b77cb..91ffe636 100644 --- a/third_party/blink/web_tests/fast/multicol/caret-range-outside-columns-rtl-expected.txt +++ b/third_party/blink/web_tests/fast/multicol/caret-range-outside-columns-rtl-expected.txt
@@ -4,53 +4,53 @@ Above first column: PASS document.caretRangeFromPoint(450,0).startOffset is 0 -FAIL document.caretRangeFromPoint(350,0).startOffset should be 2. Was 0. -FAIL document.caretRangeFromPoint(291,0).startOffset should be 3. Was 0. -FAIL document.caretRangeFromPoint(290,0).startOffset should be 3. Was 12. +PASS document.caretRangeFromPoint(350,0).startOffset is 2 +PASS document.caretRangeFromPoint(291,0).startOffset is 3 +PASS document.caretRangeFromPoint(290,0).startOffset is 3 Above second column: PASS document.caretRangeFromPoint(289,0).startOffset is 12 -FAIL document.caretRangeFromPoint(250,0).startOffset should be 14. Was 12. -FAIL document.caretRangeFromPoint(191,0).startOffset should be 15. Was 12. -FAIL document.caretRangeFromPoint(190,0).startOffset should be 15. Was 24. +PASS document.caretRangeFromPoint(250,0).startOffset is 14 +PASS document.caretRangeFromPoint(191,0).startOffset is 15 +PASS document.caretRangeFromPoint(190,0).startOffset is 15 Above third column: PASS document.caretRangeFromPoint(189,0).startOffset is 24 -FAIL document.caretRangeFromPoint(150,0).startOffset should be 26. Was 24. -FAIL document.caretRangeFromPoint(50,0).startOffset should be 27. Was 24. +PASS document.caretRangeFromPoint(150,0).startOffset is 26 +PASS document.caretRangeFromPoint(50,0).startOffset is 27 Below first column: -FAIL document.caretRangeFromPoint(450,100).startOffset should be 8. Was 12. -FAIL document.caretRangeFromPoint(350,100).startOffset should be 10. Was 12. -FAIL document.caretRangeFromPoint(291,100).startOffset should be 11. Was 12. -FAIL document.caretRangeFromPoint(290,100).startOffset should be 11. Was 24. +PASS document.caretRangeFromPoint(450,100).startOffset is 8 +PASS document.caretRangeFromPoint(350,100).startOffset is 10 +PASS document.caretRangeFromPoint(291,100).startOffset is 11 +PASS document.caretRangeFromPoint(290,100).startOffset is 11 Below second column: -FAIL document.caretRangeFromPoint(289,100).startOffset should be 20. Was 24. -FAIL document.caretRangeFromPoint(250,100).startOffset should be 22. Was 24. -FAIL document.caretRangeFromPoint(191,100).startOffset should be 23. Was 24. -FAIL document.caretRangeFromPoint(190,100).startOffset should be 23. Was 32. +PASS document.caretRangeFromPoint(289,100).startOffset is 20 +PASS document.caretRangeFromPoint(250,100).startOffset is 22 +PASS document.caretRangeFromPoint(191,100).startOffset is 23 +PASS document.caretRangeFromPoint(190,100).startOffset is 23 Below third column: PASS document.caretRangeFromPoint(189,100).startOffset is 32 -FAIL document.caretRangeFromPoint(150,100).startOffset should be 34. Was 32. -FAIL document.caretRangeFromPoint(50,100).startOffset should be 35. Was 32. +PASS document.caretRangeFromPoint(150,100).startOffset is 34 +PASS document.caretRangeFromPoint(50,100).startOffset is 35 To the right of the first column: PASS document.caretRangeFromPoint(400,10).startOffset is 0 PASS document.caretRangeFromPoint(400,30).startOffset is 0 PASS document.caretRangeFromPoint(400,50).startOffset is 4 PASS document.caretRangeFromPoint(400,70).startOffset is 8 -FAIL document.caretRangeFromPoint(400,90).startOffset should be 8. Was 12. +PASS document.caretRangeFromPoint(400,90).startOffset is 8 To the left of the third column: -FAIL document.caretRangeFromPoint(0,10).startOffset should be 27. Was 24. +PASS document.caretRangeFromPoint(0,10).startOffset is 27 PASS document.caretRangeFromPoint(0,30).startOffset is 27 PASS document.caretRangeFromPoint(0,50).startOffset is 31 PASS document.caretRangeFromPoint(0,70).startOffset is 35 -FAIL document.caretRangeFromPoint(0,90).startOffset should be 35. Was 32. +PASS document.caretRangeFromPoint(0,90).startOffset is 35 In the gap between the first and second columns: PASS document.caretRangeFromPoint(291,20).startOffset is 3 PASS document.caretRangeFromPoint(291,40).startOffset is 7 PASS document.caretRangeFromPoint(291,60).startOffset is 11 PASS document.caretRangeFromPoint(291,69).startOffset is 11 -FAIL document.caretRangeFromPoint(290,20).startOffset should be 3. Was 12. -FAIL document.caretRangeFromPoint(290,40).startOffset should be 7. Was 16. -FAIL document.caretRangeFromPoint(290,60).startOffset should be 11. Was 20. -FAIL document.caretRangeFromPoint(290,69).startOffset should be 11. Was 20. +PASS document.caretRangeFromPoint(290,20).startOffset is 3 +PASS document.caretRangeFromPoint(290,40).startOffset is 7 +PASS document.caretRangeFromPoint(290,60).startOffset is 11 +PASS document.caretRangeFromPoint(290,69).startOffset is 11 PASS document.caretRangeFromPoint(289,20).startOffset is 12 PASS document.caretRangeFromPoint(289,40).startOffset is 16 PASS document.caretRangeFromPoint(289,60).startOffset is 20 @@ -60,10 +60,10 @@ PASS document.caretRangeFromPoint(191,40).startOffset is 19 PASS document.caretRangeFromPoint(191,60).startOffset is 23 PASS document.caretRangeFromPoint(191,69).startOffset is 23 -FAIL document.caretRangeFromPoint(190,20).startOffset should be 15. Was 24. -FAIL document.caretRangeFromPoint(190,40).startOffset should be 19. Was 28. -FAIL document.caretRangeFromPoint(190,60).startOffset should be 23. Was 32. -FAIL document.caretRangeFromPoint(190,69).startOffset should be 23. Was 32. +PASS document.caretRangeFromPoint(190,20).startOffset is 15 +PASS document.caretRangeFromPoint(190,40).startOffset is 19 +PASS document.caretRangeFromPoint(190,60).startOffset is 23 +PASS document.caretRangeFromPoint(190,69).startOffset is 23 PASS document.caretRangeFromPoint(189,20).startOffset is 24 PASS document.caretRangeFromPoint(189,40).startOffset is 28 PASS document.caretRangeFromPoint(189,60).startOffset is 32
diff --git a/third_party/blink/web_tests/fast/multicol/caret-range-outside-columns-win-expected.txt b/third_party/blink/web_tests/fast/multicol/caret-range-outside-columns-win-expected.txt index de770b6..0336449 100644 --- a/third_party/blink/web_tests/fast/multicol/caret-range-outside-columns-win-expected.txt +++ b/third_party/blink/web_tests/fast/multicol/caret-range-outside-columns-win-expected.txt
@@ -4,36 +4,36 @@ Above first column: PASS document.caretRangeFromPoint(50,0).startOffset is 0 -FAIL document.caretRangeFromPoint(150,0).startOffset should be 2. Was 0. -FAIL document.caretRangeFromPoint(189,0).startOffset should be 3. Was 0. +PASS document.caretRangeFromPoint(150,0).startOffset is 2 +PASS document.caretRangeFromPoint(189,0).startOffset is 3 Above second column: PASS document.caretRangeFromPoint(190,0).startOffset is 12 -FAIL document.caretRangeFromPoint(250,0).startOffset should be 14. Was 12. -FAIL document.caretRangeFromPoint(289,0).startOffset should be 15. Was 12. +PASS document.caretRangeFromPoint(250,0).startOffset is 14 +PASS document.caretRangeFromPoint(289,0).startOffset is 15 Above third column: PASS document.caretRangeFromPoint(290,0).startOffset is 24 -FAIL document.caretRangeFromPoint(350,0).startOffset should be 26. Was 24. -FAIL document.caretRangeFromPoint(450,0).startOffset should be 27. Was 24. +PASS document.caretRangeFromPoint(350,0).startOffset is 26 +PASS document.caretRangeFromPoint(450,0).startOffset is 27 Below first column: -FAIL document.caretRangeFromPoint(50,100).startOffset should be 8. Was 12. -FAIL document.caretRangeFromPoint(150,100).startOffset should be 10. Was 12. -FAIL document.caretRangeFromPoint(189,100).startOffset should be 11. Was 12. +PASS document.caretRangeFromPoint(50,100).startOffset is 8 +PASS document.caretRangeFromPoint(150,100).startOffset is 10 +PASS document.caretRangeFromPoint(189,100).startOffset is 11 Below second column: -FAIL document.caretRangeFromPoint(190,100).startOffset should be 20. Was 24. -FAIL document.caretRangeFromPoint(250,100).startOffset should be 22. Was 24. -FAIL document.caretRangeFromPoint(289,100).startOffset should be 23. Was 24. +PASS document.caretRangeFromPoint(190,100).startOffset is 20 +PASS document.caretRangeFromPoint(250,100).startOffset is 22 +PASS document.caretRangeFromPoint(289,100).startOffset is 23 Below third column: PASS document.caretRangeFromPoint(290,100).startOffset is 32 -FAIL document.caretRangeFromPoint(350,100).startOffset should be 34. Was 32. -FAIL document.caretRangeFromPoint(389,100).startOffset should be 35. Was 32. +PASS document.caretRangeFromPoint(350,100).startOffset is 34 +PASS document.caretRangeFromPoint(389,100).startOffset is 35 To the left of the first column: PASS document.caretRangeFromPoint(0,10).startOffset is 0 PASS document.caretRangeFromPoint(0,30).startOffset is 0 PASS document.caretRangeFromPoint(0,50).startOffset is 4 PASS document.caretRangeFromPoint(0,70).startOffset is 8 -FAIL document.caretRangeFromPoint(0,90).startOffset should be 8. Was 12. +PASS document.caretRangeFromPoint(0,90).startOffset is 8 To the right of the third column: -FAIL document.caretRangeFromPoint(400,10).startOffset should be 27. Was 24. +PASS document.caretRangeFromPoint(400,10).startOffset is 27 PASS document.caretRangeFromPoint(400,30).startOffset is 27 PASS document.caretRangeFromPoint(400,50).startOffset is 31 PASS document.caretRangeFromPoint(400,70).startOffset is 35
diff --git a/third_party/blink/web_tests/fast/multicol/composited-layer-expected.txt b/third_party/blink/web_tests/fast/multicol/composited-layer-expected.txt index 67519b3d..4b699a9 100644 --- a/third_party/blink/web_tests/fast/multicol/composited-layer-expected.txt +++ b/third_party/blink/web_tests/fast/multicol/composited-layer-expected.txt
@@ -7,7 +7,7 @@ "backgroundColor": "#FFFFFF" }, { -"name": "LayoutBlockFlow DIV id='multicol'", +"name": "LayoutNGBlockFlow DIV id='multicol'", "bounds": [200, 100], "contentsOpaqueForText": true, "drawsContent": false,
diff --git a/third_party/blink/web_tests/fast/multicol/vertical-lr/caret-range-outside-columns-expected.txt b/third_party/blink/web_tests/fast/multicol/vertical-lr/caret-range-outside-columns-expected.txt index 8bf843aa..0ee75b0 100644 --- a/third_party/blink/web_tests/fast/multicol/vertical-lr/caret-range-outside-columns-expected.txt +++ b/third_party/blink/web_tests/fast/multicol/vertical-lr/caret-range-outside-columns-expected.txt
@@ -4,36 +4,36 @@ To the left of the first column: PASS document.caretRangeFromPoint(0,10).startOffset is 0 -FAIL document.caretRangeFromPoint(0,70).startOffset should be 2. Was 0. -FAIL document.caretRangeFromPoint(0,109).startOffset should be 3. Was 0. +PASS document.caretRangeFromPoint(0,70).startOffset is 2 +PASS document.caretRangeFromPoint(0,109).startOffset is 3 To the left of the second column: PASS document.caretRangeFromPoint(0,110).startOffset is 12 -FAIL document.caretRangeFromPoint(0,170).startOffset should be 14. Was 12. -FAIL document.caretRangeFromPoint(0,209).startOffset should be 15. Was 12. +PASS document.caretRangeFromPoint(0,170).startOffset is 14 +PASS document.caretRangeFromPoint(0,209).startOffset is 15 To the left of the third column: PASS document.caretRangeFromPoint(0,210).startOffset is 24 -FAIL document.caretRangeFromPoint(0,270).startOffset should be 26. Was 24. -FAIL document.caretRangeFromPoint(0,309).startOffset should be 27. Was 24. +PASS document.caretRangeFromPoint(0,270).startOffset is 26 +PASS document.caretRangeFromPoint(0,309).startOffset is 27 To the right of the first column: -FAIL document.caretRangeFromPoint(400,10).startOffset should be 8. Was 12. -FAIL document.caretRangeFromPoint(400,70).startOffset should be 10. Was 12. -FAIL document.caretRangeFromPoint(400,109).startOffset should be 11. Was 12. +PASS document.caretRangeFromPoint(400,10).startOffset is 8 +PASS document.caretRangeFromPoint(400,70).startOffset is 10 +PASS document.caretRangeFromPoint(400,109).startOffset is 11 To the right of the second column: -FAIL document.caretRangeFromPoint(400,110).startOffset should be 20. Was 24. -FAIL document.caretRangeFromPoint(400,170).startOffset should be 22. Was 24. -FAIL document.caretRangeFromPoint(400,209).startOffset should be 23. Was 24. +PASS document.caretRangeFromPoint(400,110).startOffset is 20 +PASS document.caretRangeFromPoint(400,170).startOffset is 22 +PASS document.caretRangeFromPoint(400,209).startOffset is 23 To the right of the third column: PASS document.caretRangeFromPoint(400,210).startOffset is 32 -FAIL document.caretRangeFromPoint(400,270).startOffset should be 34. Was 32. -FAIL document.caretRangeFromPoint(400,309).startOffset should be 35. Was 32. +PASS document.caretRangeFromPoint(400,270).startOffset is 34 +PASS document.caretRangeFromPoint(400,309).startOffset is 35 Above first column: PASS document.caretRangeFromPoint(90,0).startOffset is 0 PASS document.caretRangeFromPoint(110,0).startOffset is 0 PASS document.caretRangeFromPoint(130,0).startOffset is 4 PASS document.caretRangeFromPoint(150,0).startOffset is 8 -FAIL document.caretRangeFromPoint(170,0).startOffset should be 8. Was 12. +PASS document.caretRangeFromPoint(170,0).startOffset is 8 Below third column: -FAIL document.caretRangeFromPoint(90,350).startOffset should be 27. Was 24. +PASS document.caretRangeFromPoint(90,350).startOffset is 27 PASS document.caretRangeFromPoint(110,350).startOffset is 27 PASS document.caretRangeFromPoint(130,350).startOffset is 31 PASS document.caretRangeFromPoint(150,350).startOffset is 35
diff --git a/third_party/blink/web_tests/fast/multicol/vertical-lr/caret-range-outside-columns-rtl-expected.txt b/third_party/blink/web_tests/fast/multicol/vertical-lr/caret-range-outside-columns-rtl-expected.txt index 44576d7b..89c1e0f0 100644 --- a/third_party/blink/web_tests/fast/multicol/vertical-lr/caret-range-outside-columns-rtl-expected.txt +++ b/third_party/blink/web_tests/fast/multicol/vertical-lr/caret-range-outside-columns-rtl-expected.txt
@@ -4,40 +4,40 @@ To the left of the first column: PASS document.caretRangeFromPoint(0,309).startOffset is 0 -FAIL document.caretRangeFromPoint(0,270).startOffset should be 2. Was 0. -FAIL document.caretRangeFromPoint(0,211).startOffset should be 3. Was 0. -FAIL document.caretRangeFromPoint(0,210).startOffset should be 3. Was 12. +PASS document.caretRangeFromPoint(0,270).startOffset is 2 +PASS document.caretRangeFromPoint(0,211).startOffset is 3 +PASS document.caretRangeFromPoint(0,210).startOffset is 3 To the left of the second column: PASS document.caretRangeFromPoint(0,209).startOffset is 12 -FAIL document.caretRangeFromPoint(0,170).startOffset should be 14. Was 12. -FAIL document.caretRangeFromPoint(0,111).startOffset should be 15. Was 12. -FAIL document.caretRangeFromPoint(0,110).startOffset should be 15. Was 24. +PASS document.caretRangeFromPoint(0,170).startOffset is 14 +PASS document.caretRangeFromPoint(0,111).startOffset is 15 +PASS document.caretRangeFromPoint(0,110).startOffset is 15 To the left of the third column: PASS document.caretRangeFromPoint(0,109).startOffset is 24 -FAIL document.caretRangeFromPoint(0,70).startOffset should be 26. Was 24. -FAIL document.caretRangeFromPoint(0,0).startOffset should be 27. Was 24. +PASS document.caretRangeFromPoint(0,70).startOffset is 26 +PASS document.caretRangeFromPoint(0,0).startOffset is 27 To the right of the first column: -FAIL document.caretRangeFromPoint(400,309).startOffset should be 8. Was 12. -FAIL document.caretRangeFromPoint(400,270).startOffset should be 10. Was 12. -FAIL document.caretRangeFromPoint(400,211).startOffset should be 11. Was 12. -FAIL document.caretRangeFromPoint(400,210).startOffset should be 11. Was 24. +PASS document.caretRangeFromPoint(400,309).startOffset is 8 +PASS document.caretRangeFromPoint(400,270).startOffset is 10 +PASS document.caretRangeFromPoint(400,211).startOffset is 11 +PASS document.caretRangeFromPoint(400,210).startOffset is 11 To the right of the second column: -FAIL document.caretRangeFromPoint(400,209).startOffset should be 20. Was 24. -FAIL document.caretRangeFromPoint(400,170).startOffset should be 22. Was 24. -FAIL document.caretRangeFromPoint(400,111).startOffset should be 23. Was 24. -FAIL document.caretRangeFromPoint(400,110).startOffset should be 23. Was 32. +PASS document.caretRangeFromPoint(400,209).startOffset is 20 +PASS document.caretRangeFromPoint(400,170).startOffset is 22 +PASS document.caretRangeFromPoint(400,111).startOffset is 23 +PASS document.caretRangeFromPoint(400,110).startOffset is 23 To the right of the third column: PASS document.caretRangeFromPoint(400,109).startOffset is 32 -FAIL document.caretRangeFromPoint(400,70).startOffset should be 34. Was 32. -FAIL document.caretRangeFromPoint(400,11).startOffset should be 35. Was 32. +PASS document.caretRangeFromPoint(400,70).startOffset is 34 +PASS document.caretRangeFromPoint(400,11).startOffset is 35 Below first column: PASS document.caretRangeFromPoint(90,350).startOffset is 0 PASS document.caretRangeFromPoint(110,350).startOffset is 0 PASS document.caretRangeFromPoint(130,350).startOffset is 4 PASS document.caretRangeFromPoint(150,350).startOffset is 8 -FAIL document.caretRangeFromPoint(170,350).startOffset should be 8. Was 12. +PASS document.caretRangeFromPoint(170,350).startOffset is 8 Above third column: -FAIL document.caretRangeFromPoint(90,0).startOffset should be 27. Was 24. +PASS document.caretRangeFromPoint(90,0).startOffset is 27 PASS document.caretRangeFromPoint(110,0).startOffset is 27 PASS document.caretRangeFromPoint(130,0).startOffset is 31 PASS document.caretRangeFromPoint(150,0).startOffset is 35 @@ -46,10 +46,10 @@ PASS document.caretRangeFromPoint(120,211).startOffset is 7 PASS document.caretRangeFromPoint(140,211).startOffset is 11 PASS document.caretRangeFromPoint(159,211).startOffset is 11 -FAIL document.caretRangeFromPoint(100,210).startOffset should be 3. Was 12. -FAIL document.caretRangeFromPoint(120,210).startOffset should be 7. Was 16. -FAIL document.caretRangeFromPoint(140,210).startOffset should be 11. Was 20. -FAIL document.caretRangeFromPoint(159,210).startOffset should be 11. Was 20. +PASS document.caretRangeFromPoint(100,210).startOffset is 3 +PASS document.caretRangeFromPoint(120,210).startOffset is 7 +PASS document.caretRangeFromPoint(140,210).startOffset is 11 +PASS document.caretRangeFromPoint(159,210).startOffset is 11 PASS document.caretRangeFromPoint(100,209).startOffset is 12 PASS document.caretRangeFromPoint(120,209).startOffset is 16 PASS document.caretRangeFromPoint(140,209).startOffset is 20 @@ -59,10 +59,10 @@ PASS document.caretRangeFromPoint(120,111).startOffset is 19 PASS document.caretRangeFromPoint(140,111).startOffset is 23 PASS document.caretRangeFromPoint(159,111).startOffset is 23 -FAIL document.caretRangeFromPoint(100,110).startOffset should be 15. Was 24. -FAIL document.caretRangeFromPoint(120,110).startOffset should be 19. Was 28. -FAIL document.caretRangeFromPoint(140,110).startOffset should be 23. Was 32. -FAIL document.caretRangeFromPoint(159,110).startOffset should be 23. Was 32. +PASS document.caretRangeFromPoint(100,110).startOffset is 15 +PASS document.caretRangeFromPoint(120,110).startOffset is 19 +PASS document.caretRangeFromPoint(140,110).startOffset is 23 +PASS document.caretRangeFromPoint(159,110).startOffset is 23 PASS document.caretRangeFromPoint(100,109).startOffset is 24 PASS document.caretRangeFromPoint(120,109).startOffset is 28 PASS document.caretRangeFromPoint(140,109).startOffset is 32
diff --git a/third_party/blink/web_tests/fast/multicol/vertical-rl/caret-range-outside-columns-expected.txt b/third_party/blink/web_tests/fast/multicol/vertical-rl/caret-range-outside-columns-expected.txt index 9c7cf947..eb444cf 100644 --- a/third_party/blink/web_tests/fast/multicol/vertical-rl/caret-range-outside-columns-expected.txt +++ b/third_party/blink/web_tests/fast/multicol/vertical-rl/caret-range-outside-columns-expected.txt
@@ -4,28 +4,28 @@ To the right of the first column: PASS document.caretRangeFromPoint(550,10).startOffset is 0 -FAIL document.caretRangeFromPoint(550,70).startOffset should be 2. Was 0. -FAIL document.caretRangeFromPoint(550,109).startOffset should be 3. Was 0. +PASS document.caretRangeFromPoint(550,70).startOffset is 2 +PASS document.caretRangeFromPoint(550,109).startOffset is 3 To the right of the second column: -FAIL document.caretRangeFromPoint(550,110).startOffset should be 12. Was 8. -FAIL document.caretRangeFromPoint(550,170).startOffset should be 14. Was 8. -FAIL document.caretRangeFromPoint(550,209).startOffset should be 15. Was 8. +PASS document.caretRangeFromPoint(550,110).startOffset is 12 +PASS document.caretRangeFromPoint(550,170).startOffset is 14 +PASS document.caretRangeFromPoint(550,209).startOffset is 15 To the right of the third column: -FAIL document.caretRangeFromPoint(550,210).startOffset should be 24. Was 20. -FAIL document.caretRangeFromPoint(550,270).startOffset should be 26. Was 20. -FAIL document.caretRangeFromPoint(550,309).startOffset should be 27. Was 20. +PASS document.caretRangeFromPoint(550,210).startOffset is 24 +PASS document.caretRangeFromPoint(550,270).startOffset is 26 +PASS document.caretRangeFromPoint(550,309).startOffset is 27 To the left of the first column: PASS document.caretRangeFromPoint(0,10).startOffset is 8 -FAIL document.caretRangeFromPoint(0,70).startOffset should be 10. Was 8. -FAIL document.caretRangeFromPoint(0,109).startOffset should be 11. Was 8. +PASS document.caretRangeFromPoint(0,70).startOffset is 10 +PASS document.caretRangeFromPoint(0,109).startOffset is 11 To the left of the second column: PASS document.caretRangeFromPoint(0,110).startOffset is 20 -FAIL document.caretRangeFromPoint(0,170).startOffset should be 22. Was 20. -FAIL document.caretRangeFromPoint(0,209).startOffset should be 23. Was 20. +PASS document.caretRangeFromPoint(0,170).startOffset is 22 +PASS document.caretRangeFromPoint(0,209).startOffset is 23 To the left of the third column: PASS document.caretRangeFromPoint(0,210).startOffset is 32 -FAIL document.caretRangeFromPoint(0,270).startOffset should be 34. Was 32. -FAIL document.caretRangeFromPoint(0,309).startOffset should be 35. Was 32. +PASS document.caretRangeFromPoint(0,270).startOffset is 34 +PASS document.caretRangeFromPoint(0,309).startOffset is 35 Above first column: PASS document.caretRangeFromPoint(550,0).startOffset is 0 PASS document.caretRangeFromPoint(490,0).startOffset is 0
diff --git a/third_party/blink/web_tests/fast/multicol/vertical-rl/caret-range-outside-columns-rtl-expected.txt b/third_party/blink/web_tests/fast/multicol/vertical-rl/caret-range-outside-columns-rtl-expected.txt index c70a44c..7305c67 100644 --- a/third_party/blink/web_tests/fast/multicol/vertical-rl/caret-range-outside-columns-rtl-expected.txt +++ b/third_party/blink/web_tests/fast/multicol/vertical-rl/caret-range-outside-columns-rtl-expected.txt
@@ -4,32 +4,32 @@ To the right of the first column: PASS document.caretRangeFromPoint(550,340).startOffset is 0 -FAIL document.caretRangeFromPoint(550,270).startOffset should be 2. Was 0. -FAIL document.caretRangeFromPoint(550,211).startOffset should be 3. Was 0. -FAIL document.caretRangeFromPoint(550,210).startOffset should be 3. Was 8. +PASS document.caretRangeFromPoint(550,270).startOffset is 2 +PASS document.caretRangeFromPoint(550,211).startOffset is 3 +PASS document.caretRangeFromPoint(550,210).startOffset is 3 To the right of the second column: -FAIL document.caretRangeFromPoint(550,209).startOffset should be 12. Was 8. -FAIL document.caretRangeFromPoint(550,170).startOffset should be 14. Was 8. -FAIL document.caretRangeFromPoint(550,111).startOffset should be 15. Was 8. -FAIL document.caretRangeFromPoint(550,110).startOffset should be 15. Was 20. +PASS document.caretRangeFromPoint(550,209).startOffset is 12 +PASS document.caretRangeFromPoint(550,170).startOffset is 14 +PASS document.caretRangeFromPoint(550,111).startOffset is 15 +PASS document.caretRangeFromPoint(550,110).startOffset is 15 To the right of the third column: -FAIL document.caretRangeFromPoint(550,109).startOffset should be 24. Was 20. -FAIL document.caretRangeFromPoint(550,70).startOffset should be 26. Was 20. -FAIL document.caretRangeFromPoint(550,11).startOffset should be 27. Was 20. +PASS document.caretRangeFromPoint(550,109).startOffset is 24 +PASS document.caretRangeFromPoint(550,70).startOffset is 26 +PASS document.caretRangeFromPoint(550,11).startOffset is 27 To the left of the first column: PASS document.caretRangeFromPoint(0,340).startOffset is 8 -FAIL document.caretRangeFromPoint(0,270).startOffset should be 10. Was 8. -FAIL document.caretRangeFromPoint(0,211).startOffset should be 11. Was 8. -FAIL document.caretRangeFromPoint(0,210).startOffset should be 11. Was 20. +PASS document.caretRangeFromPoint(0,270).startOffset is 10 +PASS document.caretRangeFromPoint(0,211).startOffset is 11 +PASS document.caretRangeFromPoint(0,210).startOffset is 11 To the left of the second column: PASS document.caretRangeFromPoint(0,209).startOffset is 20 -FAIL document.caretRangeFromPoint(0,170).startOffset should be 22. Was 20. -FAIL document.caretRangeFromPoint(0,111).startOffset should be 23. Was 20. -FAIL document.caretRangeFromPoint(0,110).startOffset should be 23. Was 32. +PASS document.caretRangeFromPoint(0,170).startOffset is 22 +PASS document.caretRangeFromPoint(0,111).startOffset is 23 +PASS document.caretRangeFromPoint(0,110).startOffset is 23 To the left of the second column: PASS document.caretRangeFromPoint(0,109).startOffset is 32 -FAIL document.caretRangeFromPoint(0,70).startOffset should be 34. Was 32. -FAIL document.caretRangeFromPoint(0,0).startOffset should be 35. Was 32. +PASS document.caretRangeFromPoint(0,70).startOffset is 34 +PASS document.caretRangeFromPoint(0,0).startOffset is 35 Below first column: PASS document.caretRangeFromPoint(550,350).startOffset is 0 PASS document.caretRangeFromPoint(490,350).startOffset is 0 @@ -44,10 +44,10 @@ PASS document.caretRangeFromPoint(479,211).startOffset is 7 PASS document.caretRangeFromPoint(459,211).startOffset is 11 PASS document.caretRangeFromPoint(440,211).startOffset is 11 -FAIL document.caretRangeFromPoint(499,210).startOffset should be 3. Was 12. -FAIL document.caretRangeFromPoint(479,210).startOffset should be 7. Was 16. -FAIL document.caretRangeFromPoint(459,210).startOffset should be 11. Was 20. -FAIL document.caretRangeFromPoint(440,210).startOffset should be 11. Was 20. +PASS document.caretRangeFromPoint(499,210).startOffset is 3 +PASS document.caretRangeFromPoint(479,210).startOffset is 7 +PASS document.caretRangeFromPoint(459,210).startOffset is 11 +PASS document.caretRangeFromPoint(440,210).startOffset is 11 PASS document.caretRangeFromPoint(499,209).startOffset is 12 PASS document.caretRangeFromPoint(479,209).startOffset is 16 PASS document.caretRangeFromPoint(459,209).startOffset is 20 @@ -57,10 +57,10 @@ PASS document.caretRangeFromPoint(479,111).startOffset is 19 PASS document.caretRangeFromPoint(459,111).startOffset is 23 PASS document.caretRangeFromPoint(440,111).startOffset is 23 -FAIL document.caretRangeFromPoint(499,110).startOffset should be 15. Was 24. -FAIL document.caretRangeFromPoint(479,110).startOffset should be 19. Was 28. -FAIL document.caretRangeFromPoint(459,110).startOffset should be 23. Was 32. -FAIL document.caretRangeFromPoint(440,110).startOffset should be 23. Was 32. +PASS document.caretRangeFromPoint(499,110).startOffset is 15 +PASS document.caretRangeFromPoint(479,110).startOffset is 19 +PASS document.caretRangeFromPoint(459,110).startOffset is 23 +PASS document.caretRangeFromPoint(440,110).startOffset is 23 PASS document.caretRangeFromPoint(499,109).startOffset is 24 PASS document.caretRangeFromPoint(479,109).startOffset is 28 PASS document.caretRangeFromPoint(459,109).startOffset is 32
diff --git a/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-sdes-constraint.html b/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-sdes-constraint.html index c341dd8..a4d514e7 100644 --- a/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-sdes-constraint.html +++ b/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-sdes-constraint.html
@@ -42,100 +42,9 @@ pc1.addTrack(track); let offer = await pc1.createOffer(); // assert_regexp_match doesn't work - assert_true(offer.sdp.match('\na=fingerprint') === null); - assert_true(offer.sdp.match('\na=crypto') !== null); - await pc1.setLocalDescription(offer); - await pc2.setRemoteDescription(offer); - let answer = await pc2.createAnswer(); - assert_true(answer.sdp.match('\na=fingerprint') === null); - assert_true(answer.sdp.match('\na=crypto') !== null); - await pc2.setLocalDescription(answer); - await pc1.setRemoteDescription(answer); -}, 'DTLS constraint false means SDES'); - -promise_test(async t => { - let pc1 = new RTCPeerConnection(null, sdes_constraint); - t.add_cleanup(() => pc1.close()); - let pc2 = new RTCPeerConnection(); - t.add_cleanup(() => pc2.close()); - let stream = await navigator.mediaDevices.getUserMedia({audio: true}); - let track = stream.getAudioTracks()[0]; - pc1.addTrack(track); - let offer = await pc1.createOffer(); - await pc1.setLocalDescription(offer); - try { - await pc2.setRemoteDescription(offer); - assert_unreached('pc2.setRemote should have thrown'); - } catch(e) { - assert_equals(e.name, 'InvalidAccessError'); - } -}, 'SDES can\'t connect to default configuration'); - -promise_test(async t => { - let pc1 = new RTCPeerConnection(); - t.add_cleanup(() => pc1.close()); - let pc2 = new RTCPeerConnection(null, sdes_constraint); - t.add_cleanup(() => pc2.close()); - let stream = await navigator.mediaDevices.getUserMedia({audio: true}); - let track = stream.getAudioTracks()[0]; - pc1.addTrack(track); - let offer = await pc1.createOffer(); - try { - await pc2.setRemoteDescription(offer); - assert_unreached('pc2.setRemote should have thrown'); - } catch(e) { - assert_equals(e.name, 'InvalidAccessError'); - } -}, 'Default configuration can\'t connect to SDES'); - -causes_sdes = async function(constraint) { - pc = new RTCPeerConnection(null, constraint); - let stream = await navigator.mediaDevices.getUserMedia({audio: true}); - let track = stream.getAudioTracks()[0]; - pc.addTrack(track); - let offer = await pc.createOffer(); - return offer.sdp.match('\na=crypto') !== null -} - -valid_constraint_for_pc = async function(constraint) { - console.log(JSON.stringify(constraint)); - try { - pc = new RTCPeerConnection(null, constraint); - return true; - } catch (e) { - assert_equals(e.name, 'OperationError'); - return false; - } -} - -promise_test(async t => { - assert_true(await causes_sdes(sdes_constraint)); - assert_false(await causes_sdes( - {'mandatory': {'DtlsSrtpKeyAgreement': true}})); - assert_true(await causes_sdes( - {'mandatory': {'DtlsSrtpKeyAgreement': 'false'}})); - assert_false(await causes_sdes( - {'optional': [{'DtlsSrtpKeyAgreement': true}]})); - assert_true(await causes_sdes( - {'optional': [{'DtlsSrtpKeyAgreement': false}]})); -}, 'SDES shows up when expected'); - -valid_for_pc = function(constraint) { - try { - pc = new RTCPeerConnection(null, constraint); - return true; - } catch (e) { - return false; - } -} - -test(t => { - assert_true(valid_for_pc(sdes_constraint)); - assert_true(valid_for_pc({'optional': [{'DtlsSrtpKeyAgreement': false}]})); - assert_true(valid_for_pc({'optional': [{'DtlsSrtpKeyAgreement': 'false'}]})); - assert_false(valid_for_pc({'DtlsSrtpKeyAgreement': false}), - 'Modern style constraint is not supported'); -}, 'Syntaxes valid for PC are as expected'); + assert_true(offer.sdp.match('\na=fingerprint') !== null); + assert_true(offer.sdp.match('\na=crypto') === null); +}, 'DTLS constraint false has no effect'); </script>
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-multicol/multicol-overflow-positioned-transform-001-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-multicol/multicol-overflow-positioned-transform-001-expected.txt deleted file mode 100644 index 57a731a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-multicol/multicol-overflow-positioned-transform-001-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS Check scrollWidth before and after transform chage -PASS Check scrollHeight before and after transform chage -PASS Check scrollWidth and scrollHeight before and after transform chage -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-multicol/multicol-overflow-transform-001-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-multicol/multicol-overflow-transform-001-expected.txt deleted file mode 100644 index 57a731a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-multicol/multicol-overflow-transform-001-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS Check scrollWidth before and after transform chage -PASS Check scrollHeight before and after transform chage -PASS Check scrollWidth and scrollHeight before and after transform chage -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/win/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-expected.txt rename to third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-expected.txt
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/caret-range-outside-columns-mac-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/caret-range-outside-columns-mac-expected.txt similarity index 80% rename from third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/caret-range-outside-columns-mac-expected.txt rename to third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/caret-range-outside-columns-mac-expected.txt index 1fe9206..bf65ac3 100644 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/caret-range-outside-columns-mac-expected.txt +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/caret-range-outside-columns-mac-expected.txt
@@ -15,13 +15,13 @@ PASS document.caretRangeFromPoint(350,0).startOffset is 24 PASS document.caretRangeFromPoint(450,0).startOffset is 24 Below first column: -PASS document.caretRangeFromPoint(50,100).startOffset is 11 -PASS document.caretRangeFromPoint(150,100).startOffset is 11 -PASS document.caretRangeFromPoint(189,100).startOffset is 11 +FAIL document.caretRangeFromPoint(50,100).startOffset should be 11. Was 12. +FAIL document.caretRangeFromPoint(150,100).startOffset should be 11. Was 12. +FAIL document.caretRangeFromPoint(189,100).startOffset should be 11. Was 12. Below second column: -PASS document.caretRangeFromPoint(190,100).startOffset is 23 -PASS document.caretRangeFromPoint(250,100).startOffset is 23 -PASS document.caretRangeFromPoint(289,100).startOffset is 23 +FAIL document.caretRangeFromPoint(190,100).startOffset should be 23. Was 24. +FAIL document.caretRangeFromPoint(250,100).startOffset should be 23. Was 24. +FAIL document.caretRangeFromPoint(289,100).startOffset should be 23. Was 24. Below third column: PASS document.caretRangeFromPoint(290,100).startOffset is 35 PASS document.caretRangeFromPoint(350,100).startOffset is 35 @@ -31,7 +31,7 @@ PASS document.caretRangeFromPoint(0,30).startOffset is 0 PASS document.caretRangeFromPoint(0,50).startOffset is 4 PASS document.caretRangeFromPoint(0,70).startOffset is 8 -PASS document.caretRangeFromPoint(0,90).startOffset is 11 +FAIL document.caretRangeFromPoint(0,90).startOffset should be 11. Was 12. To the right of the third column: PASS document.caretRangeFromPoint(400,10).startOffset is 24 PASS document.caretRangeFromPoint(400,30).startOffset is 27
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/caret-range-outside-columns-rtl-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/caret-range-outside-columns-rtl-expected.txt new file mode 100644 index 0000000..72b77cb --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/caret-range-outside-columns-rtl-expected.txt
@@ -0,0 +1,75 @@ +Test that hitting areas outside columns takes us to the right text content inside columns. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +Above first column: +PASS document.caretRangeFromPoint(450,0).startOffset is 0 +FAIL document.caretRangeFromPoint(350,0).startOffset should be 2. Was 0. +FAIL document.caretRangeFromPoint(291,0).startOffset should be 3. Was 0. +FAIL document.caretRangeFromPoint(290,0).startOffset should be 3. Was 12. +Above second column: +PASS document.caretRangeFromPoint(289,0).startOffset is 12 +FAIL document.caretRangeFromPoint(250,0).startOffset should be 14. Was 12. +FAIL document.caretRangeFromPoint(191,0).startOffset should be 15. Was 12. +FAIL document.caretRangeFromPoint(190,0).startOffset should be 15. Was 24. +Above third column: +PASS document.caretRangeFromPoint(189,0).startOffset is 24 +FAIL document.caretRangeFromPoint(150,0).startOffset should be 26. Was 24. +FAIL document.caretRangeFromPoint(50,0).startOffset should be 27. Was 24. +Below first column: +FAIL document.caretRangeFromPoint(450,100).startOffset should be 8. Was 12. +FAIL document.caretRangeFromPoint(350,100).startOffset should be 10. Was 12. +FAIL document.caretRangeFromPoint(291,100).startOffset should be 11. Was 12. +FAIL document.caretRangeFromPoint(290,100).startOffset should be 11. Was 24. +Below second column: +FAIL document.caretRangeFromPoint(289,100).startOffset should be 20. Was 24. +FAIL document.caretRangeFromPoint(250,100).startOffset should be 22. Was 24. +FAIL document.caretRangeFromPoint(191,100).startOffset should be 23. Was 24. +FAIL document.caretRangeFromPoint(190,100).startOffset should be 23. Was 32. +Below third column: +PASS document.caretRangeFromPoint(189,100).startOffset is 32 +FAIL document.caretRangeFromPoint(150,100).startOffset should be 34. Was 32. +FAIL document.caretRangeFromPoint(50,100).startOffset should be 35. Was 32. +To the right of the first column: +PASS document.caretRangeFromPoint(400,10).startOffset is 0 +PASS document.caretRangeFromPoint(400,30).startOffset is 0 +PASS document.caretRangeFromPoint(400,50).startOffset is 4 +PASS document.caretRangeFromPoint(400,70).startOffset is 8 +FAIL document.caretRangeFromPoint(400,90).startOffset should be 8. Was 12. +To the left of the third column: +FAIL document.caretRangeFromPoint(0,10).startOffset should be 27. Was 24. +PASS document.caretRangeFromPoint(0,30).startOffset is 27 +PASS document.caretRangeFromPoint(0,50).startOffset is 31 +PASS document.caretRangeFromPoint(0,70).startOffset is 35 +FAIL document.caretRangeFromPoint(0,90).startOffset should be 35. Was 32. +In the gap between the first and second columns: +PASS document.caretRangeFromPoint(291,20).startOffset is 3 +PASS document.caretRangeFromPoint(291,40).startOffset is 7 +PASS document.caretRangeFromPoint(291,60).startOffset is 11 +PASS document.caretRangeFromPoint(291,69).startOffset is 11 +FAIL document.caretRangeFromPoint(290,20).startOffset should be 3. Was 12. +FAIL document.caretRangeFromPoint(290,40).startOffset should be 7. Was 16. +FAIL document.caretRangeFromPoint(290,60).startOffset should be 11. Was 20. +FAIL document.caretRangeFromPoint(290,69).startOffset should be 11. Was 20. +PASS document.caretRangeFromPoint(289,20).startOffset is 12 +PASS document.caretRangeFromPoint(289,40).startOffset is 16 +PASS document.caretRangeFromPoint(289,60).startOffset is 20 +PASS document.caretRangeFromPoint(289,69).startOffset is 20 +In the gap between the second and third columns: +PASS document.caretRangeFromPoint(191,20).startOffset is 15 +PASS document.caretRangeFromPoint(191,40).startOffset is 19 +PASS document.caretRangeFromPoint(191,60).startOffset is 23 +PASS document.caretRangeFromPoint(191,69).startOffset is 23 +FAIL document.caretRangeFromPoint(190,20).startOffset should be 15. Was 24. +FAIL document.caretRangeFromPoint(190,40).startOffset should be 19. Was 28. +FAIL document.caretRangeFromPoint(190,60).startOffset should be 23. Was 32. +FAIL document.caretRangeFromPoint(190,69).startOffset should be 23. Was 32. +PASS document.caretRangeFromPoint(189,20).startOffset is 24 +PASS document.caretRangeFromPoint(189,40).startOffset is 28 +PASS document.caretRangeFromPoint(189,60).startOffset is 32 +PASS document.caretRangeFromPoint(189,69).startOffset is 32 +PASS successfullyParsed is true + +TEST COMPLETE + +xxx xxx xxx xxx xxx xxx xxx xxx xxx
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/caret-range-outside-columns-win-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/caret-range-outside-columns-win-expected.txt new file mode 100644 index 0000000..de770b6 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/caret-range-outside-columns-win-expected.txt
@@ -0,0 +1,54 @@ +Test that hitting areas outside columns takes us to the right text content inside columns. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +Above first column: +PASS document.caretRangeFromPoint(50,0).startOffset is 0 +FAIL document.caretRangeFromPoint(150,0).startOffset should be 2. Was 0. +FAIL document.caretRangeFromPoint(189,0).startOffset should be 3. Was 0. +Above second column: +PASS document.caretRangeFromPoint(190,0).startOffset is 12 +FAIL document.caretRangeFromPoint(250,0).startOffset should be 14. Was 12. +FAIL document.caretRangeFromPoint(289,0).startOffset should be 15. Was 12. +Above third column: +PASS document.caretRangeFromPoint(290,0).startOffset is 24 +FAIL document.caretRangeFromPoint(350,0).startOffset should be 26. Was 24. +FAIL document.caretRangeFromPoint(450,0).startOffset should be 27. Was 24. +Below first column: +FAIL document.caretRangeFromPoint(50,100).startOffset should be 8. Was 12. +FAIL document.caretRangeFromPoint(150,100).startOffset should be 10. Was 12. +FAIL document.caretRangeFromPoint(189,100).startOffset should be 11. Was 12. +Below second column: +FAIL document.caretRangeFromPoint(190,100).startOffset should be 20. Was 24. +FAIL document.caretRangeFromPoint(250,100).startOffset should be 22. Was 24. +FAIL document.caretRangeFromPoint(289,100).startOffset should be 23. Was 24. +Below third column: +PASS document.caretRangeFromPoint(290,100).startOffset is 32 +FAIL document.caretRangeFromPoint(350,100).startOffset should be 34. Was 32. +FAIL document.caretRangeFromPoint(389,100).startOffset should be 35. Was 32. +To the left of the first column: +PASS document.caretRangeFromPoint(0,10).startOffset is 0 +PASS document.caretRangeFromPoint(0,30).startOffset is 0 +PASS document.caretRangeFromPoint(0,50).startOffset is 4 +PASS document.caretRangeFromPoint(0,70).startOffset is 8 +FAIL document.caretRangeFromPoint(0,90).startOffset should be 8. Was 12. +To the right of the third column: +FAIL document.caretRangeFromPoint(400,10).startOffset should be 27. Was 24. +PASS document.caretRangeFromPoint(400,30).startOffset is 27 +PASS document.caretRangeFromPoint(400,50).startOffset is 31 +PASS document.caretRangeFromPoint(400,70).startOffset is 35 +In the gap between the first and second columns: +PASS document.caretRangeFromPoint(180,20).startOffset is 3 +PASS document.caretRangeFromPoint(180,40).startOffset is 7 +PASS document.caretRangeFromPoint(180,60).startOffset is 11 +PASS document.caretRangeFromPoint(180,69).startOffset is 11 +In the gap between the second and third columns: +PASS document.caretRangeFromPoint(280,20).startOffset is 15 +PASS document.caretRangeFromPoint(280,40).startOffset is 19 +PASS document.caretRangeFromPoint(280,60).startOffset is 23 +PASS document.caretRangeFromPoint(280,69).startOffset is 23 +PASS successfullyParsed is true + +TEST COMPLETE + +xxx xxx xxx xxx xxx xxx xxx xxx xxx
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/composited-layer-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/composited-layer-expected.txt similarity index 88% rename from third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/composited-layer-expected.txt rename to third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/composited-layer-expected.txt index 4b699a9..67519b3d 100644 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/composited-layer-expected.txt +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/composited-layer-expected.txt
@@ -7,7 +7,7 @@ "backgroundColor": "#FFFFFF" }, { -"name": "LayoutNGBlockFlow DIV id='multicol'", +"name": "LayoutBlockFlow DIV id='multicol'", "bounds": [200, 100], "contentsOpaqueForText": true, "drawsContent": false,
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/composited-layer-multiple-fragments-translated-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/composited-layer-multiple-fragments-translated-expected.png new file mode 100644 index 0000000..996b8f8 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/composited-layer-multiple-fragments-translated-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png new file mode 100644 index 0000000..5835529 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/caret-range-outside-columns-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-lr/caret-range-outside-columns-expected.txt similarity index 64% rename from third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/caret-range-outside-columns-expected.txt rename to third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-lr/caret-range-outside-columns-expected.txt index 0ee75b0..8bf843aa 100644 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/caret-range-outside-columns-expected.txt +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-lr/caret-range-outside-columns-expected.txt
@@ -4,36 +4,36 @@ To the left of the first column: PASS document.caretRangeFromPoint(0,10).startOffset is 0 -PASS document.caretRangeFromPoint(0,70).startOffset is 2 -PASS document.caretRangeFromPoint(0,109).startOffset is 3 +FAIL document.caretRangeFromPoint(0,70).startOffset should be 2. Was 0. +FAIL document.caretRangeFromPoint(0,109).startOffset should be 3. Was 0. To the left of the second column: PASS document.caretRangeFromPoint(0,110).startOffset is 12 -PASS document.caretRangeFromPoint(0,170).startOffset is 14 -PASS document.caretRangeFromPoint(0,209).startOffset is 15 +FAIL document.caretRangeFromPoint(0,170).startOffset should be 14. Was 12. +FAIL document.caretRangeFromPoint(0,209).startOffset should be 15. Was 12. To the left of the third column: PASS document.caretRangeFromPoint(0,210).startOffset is 24 -PASS document.caretRangeFromPoint(0,270).startOffset is 26 -PASS document.caretRangeFromPoint(0,309).startOffset is 27 +FAIL document.caretRangeFromPoint(0,270).startOffset should be 26. Was 24. +FAIL document.caretRangeFromPoint(0,309).startOffset should be 27. Was 24. To the right of the first column: -PASS document.caretRangeFromPoint(400,10).startOffset is 8 -PASS document.caretRangeFromPoint(400,70).startOffset is 10 -PASS document.caretRangeFromPoint(400,109).startOffset is 11 +FAIL document.caretRangeFromPoint(400,10).startOffset should be 8. Was 12. +FAIL document.caretRangeFromPoint(400,70).startOffset should be 10. Was 12. +FAIL document.caretRangeFromPoint(400,109).startOffset should be 11. Was 12. To the right of the second column: -PASS document.caretRangeFromPoint(400,110).startOffset is 20 -PASS document.caretRangeFromPoint(400,170).startOffset is 22 -PASS document.caretRangeFromPoint(400,209).startOffset is 23 +FAIL document.caretRangeFromPoint(400,110).startOffset should be 20. Was 24. +FAIL document.caretRangeFromPoint(400,170).startOffset should be 22. Was 24. +FAIL document.caretRangeFromPoint(400,209).startOffset should be 23. Was 24. To the right of the third column: PASS document.caretRangeFromPoint(400,210).startOffset is 32 -PASS document.caretRangeFromPoint(400,270).startOffset is 34 -PASS document.caretRangeFromPoint(400,309).startOffset is 35 +FAIL document.caretRangeFromPoint(400,270).startOffset should be 34. Was 32. +FAIL document.caretRangeFromPoint(400,309).startOffset should be 35. Was 32. Above first column: PASS document.caretRangeFromPoint(90,0).startOffset is 0 PASS document.caretRangeFromPoint(110,0).startOffset is 0 PASS document.caretRangeFromPoint(130,0).startOffset is 4 PASS document.caretRangeFromPoint(150,0).startOffset is 8 -PASS document.caretRangeFromPoint(170,0).startOffset is 8 +FAIL document.caretRangeFromPoint(170,0).startOffset should be 8. Was 12. Below third column: -PASS document.caretRangeFromPoint(90,350).startOffset is 27 +FAIL document.caretRangeFromPoint(90,350).startOffset should be 27. Was 24. PASS document.caretRangeFromPoint(110,350).startOffset is 27 PASS document.caretRangeFromPoint(130,350).startOffset is 31 PASS document.caretRangeFromPoint(150,350).startOffset is 35
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-lr/caret-range-outside-columns-rtl-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-lr/caret-range-outside-columns-rtl-expected.txt new file mode 100644 index 0000000..44576d7b --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-lr/caret-range-outside-columns-rtl-expected.txt
@@ -0,0 +1,74 @@ +Test that hitting areas outside columns takes us to the right text content inside columns. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +To the left of the first column: +PASS document.caretRangeFromPoint(0,309).startOffset is 0 +FAIL document.caretRangeFromPoint(0,270).startOffset should be 2. Was 0. +FAIL document.caretRangeFromPoint(0,211).startOffset should be 3. Was 0. +FAIL document.caretRangeFromPoint(0,210).startOffset should be 3. Was 12. +To the left of the second column: +PASS document.caretRangeFromPoint(0,209).startOffset is 12 +FAIL document.caretRangeFromPoint(0,170).startOffset should be 14. Was 12. +FAIL document.caretRangeFromPoint(0,111).startOffset should be 15. Was 12. +FAIL document.caretRangeFromPoint(0,110).startOffset should be 15. Was 24. +To the left of the third column: +PASS document.caretRangeFromPoint(0,109).startOffset is 24 +FAIL document.caretRangeFromPoint(0,70).startOffset should be 26. Was 24. +FAIL document.caretRangeFromPoint(0,0).startOffset should be 27. Was 24. +To the right of the first column: +FAIL document.caretRangeFromPoint(400,309).startOffset should be 8. Was 12. +FAIL document.caretRangeFromPoint(400,270).startOffset should be 10. Was 12. +FAIL document.caretRangeFromPoint(400,211).startOffset should be 11. Was 12. +FAIL document.caretRangeFromPoint(400,210).startOffset should be 11. Was 24. +To the right of the second column: +FAIL document.caretRangeFromPoint(400,209).startOffset should be 20. Was 24. +FAIL document.caretRangeFromPoint(400,170).startOffset should be 22. Was 24. +FAIL document.caretRangeFromPoint(400,111).startOffset should be 23. Was 24. +FAIL document.caretRangeFromPoint(400,110).startOffset should be 23. Was 32. +To the right of the third column: +PASS document.caretRangeFromPoint(400,109).startOffset is 32 +FAIL document.caretRangeFromPoint(400,70).startOffset should be 34. Was 32. +FAIL document.caretRangeFromPoint(400,11).startOffset should be 35. Was 32. +Below first column: +PASS document.caretRangeFromPoint(90,350).startOffset is 0 +PASS document.caretRangeFromPoint(110,350).startOffset is 0 +PASS document.caretRangeFromPoint(130,350).startOffset is 4 +PASS document.caretRangeFromPoint(150,350).startOffset is 8 +FAIL document.caretRangeFromPoint(170,350).startOffset should be 8. Was 12. +Above third column: +FAIL document.caretRangeFromPoint(90,0).startOffset should be 27. Was 24. +PASS document.caretRangeFromPoint(110,0).startOffset is 27 +PASS document.caretRangeFromPoint(130,0).startOffset is 31 +PASS document.caretRangeFromPoint(150,0).startOffset is 35 +In the gap between the first and second columns: +PASS document.caretRangeFromPoint(100,211).startOffset is 3 +PASS document.caretRangeFromPoint(120,211).startOffset is 7 +PASS document.caretRangeFromPoint(140,211).startOffset is 11 +PASS document.caretRangeFromPoint(159,211).startOffset is 11 +FAIL document.caretRangeFromPoint(100,210).startOffset should be 3. Was 12. +FAIL document.caretRangeFromPoint(120,210).startOffset should be 7. Was 16. +FAIL document.caretRangeFromPoint(140,210).startOffset should be 11. Was 20. +FAIL document.caretRangeFromPoint(159,210).startOffset should be 11. Was 20. +PASS document.caretRangeFromPoint(100,209).startOffset is 12 +PASS document.caretRangeFromPoint(120,209).startOffset is 16 +PASS document.caretRangeFromPoint(140,209).startOffset is 20 +PASS document.caretRangeFromPoint(159,209).startOffset is 20 +In the gap between the second and third columns: +PASS document.caretRangeFromPoint(100,111).startOffset is 15 +PASS document.caretRangeFromPoint(120,111).startOffset is 19 +PASS document.caretRangeFromPoint(140,111).startOffset is 23 +PASS document.caretRangeFromPoint(159,111).startOffset is 23 +FAIL document.caretRangeFromPoint(100,110).startOffset should be 15. Was 24. +FAIL document.caretRangeFromPoint(120,110).startOffset should be 19. Was 28. +FAIL document.caretRangeFromPoint(140,110).startOffset should be 23. Was 32. +FAIL document.caretRangeFromPoint(159,110).startOffset should be 23. Was 32. +PASS document.caretRangeFromPoint(100,109).startOffset is 24 +PASS document.caretRangeFromPoint(120,109).startOffset is 28 +PASS document.caretRangeFromPoint(140,109).startOffset is 32 +PASS document.caretRangeFromPoint(159,109).startOffset is 32 +PASS successfullyParsed is true + +TEST COMPLETE + +xxx xxx xxx xxx xxx xxx xxx xxx xxx
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png new file mode 100644 index 0000000..b0e5e90 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/vertical-rl/caret-range-outside-columns-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-rl/caret-range-outside-columns-expected.txt similarity index 67% rename from third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/vertical-rl/caret-range-outside-columns-expected.txt rename to third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-rl/caret-range-outside-columns-expected.txt index eb444cf..9c7cf947 100644 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/vertical-rl/caret-range-outside-columns-expected.txt +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-rl/caret-range-outside-columns-expected.txt
@@ -4,28 +4,28 @@ To the right of the first column: PASS document.caretRangeFromPoint(550,10).startOffset is 0 -PASS document.caretRangeFromPoint(550,70).startOffset is 2 -PASS document.caretRangeFromPoint(550,109).startOffset is 3 +FAIL document.caretRangeFromPoint(550,70).startOffset should be 2. Was 0. +FAIL document.caretRangeFromPoint(550,109).startOffset should be 3. Was 0. To the right of the second column: -PASS document.caretRangeFromPoint(550,110).startOffset is 12 -PASS document.caretRangeFromPoint(550,170).startOffset is 14 -PASS document.caretRangeFromPoint(550,209).startOffset is 15 +FAIL document.caretRangeFromPoint(550,110).startOffset should be 12. Was 8. +FAIL document.caretRangeFromPoint(550,170).startOffset should be 14. Was 8. +FAIL document.caretRangeFromPoint(550,209).startOffset should be 15. Was 8. To the right of the third column: -PASS document.caretRangeFromPoint(550,210).startOffset is 24 -PASS document.caretRangeFromPoint(550,270).startOffset is 26 -PASS document.caretRangeFromPoint(550,309).startOffset is 27 +FAIL document.caretRangeFromPoint(550,210).startOffset should be 24. Was 20. +FAIL document.caretRangeFromPoint(550,270).startOffset should be 26. Was 20. +FAIL document.caretRangeFromPoint(550,309).startOffset should be 27. Was 20. To the left of the first column: PASS document.caretRangeFromPoint(0,10).startOffset is 8 -PASS document.caretRangeFromPoint(0,70).startOffset is 10 -PASS document.caretRangeFromPoint(0,109).startOffset is 11 +FAIL document.caretRangeFromPoint(0,70).startOffset should be 10. Was 8. +FAIL document.caretRangeFromPoint(0,109).startOffset should be 11. Was 8. To the left of the second column: PASS document.caretRangeFromPoint(0,110).startOffset is 20 -PASS document.caretRangeFromPoint(0,170).startOffset is 22 -PASS document.caretRangeFromPoint(0,209).startOffset is 23 +FAIL document.caretRangeFromPoint(0,170).startOffset should be 22. Was 20. +FAIL document.caretRangeFromPoint(0,209).startOffset should be 23. Was 20. To the left of the third column: PASS document.caretRangeFromPoint(0,210).startOffset is 32 -PASS document.caretRangeFromPoint(0,270).startOffset is 34 -PASS document.caretRangeFromPoint(0,309).startOffset is 35 +FAIL document.caretRangeFromPoint(0,270).startOffset should be 34. Was 32. +FAIL document.caretRangeFromPoint(0,309).startOffset should be 35. Was 32. Above first column: PASS document.caretRangeFromPoint(550,0).startOffset is 0 PASS document.caretRangeFromPoint(490,0).startOffset is 0
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-rl/caret-range-outside-columns-rtl-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-rl/caret-range-outside-columns-rtl-expected.txt new file mode 100644 index 0000000..c70a44c --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/multicol/vertical-rl/caret-range-outside-columns-rtl-expected.txt
@@ -0,0 +1,72 @@ +Test that hitting areas outside columns takes us to the right text content inside columns. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +To the right of the first column: +PASS document.caretRangeFromPoint(550,340).startOffset is 0 +FAIL document.caretRangeFromPoint(550,270).startOffset should be 2. Was 0. +FAIL document.caretRangeFromPoint(550,211).startOffset should be 3. Was 0. +FAIL document.caretRangeFromPoint(550,210).startOffset should be 3. Was 8. +To the right of the second column: +FAIL document.caretRangeFromPoint(550,209).startOffset should be 12. Was 8. +FAIL document.caretRangeFromPoint(550,170).startOffset should be 14. Was 8. +FAIL document.caretRangeFromPoint(550,111).startOffset should be 15. Was 8. +FAIL document.caretRangeFromPoint(550,110).startOffset should be 15. Was 20. +To the right of the third column: +FAIL document.caretRangeFromPoint(550,109).startOffset should be 24. Was 20. +FAIL document.caretRangeFromPoint(550,70).startOffset should be 26. Was 20. +FAIL document.caretRangeFromPoint(550,11).startOffset should be 27. Was 20. +To the left of the first column: +PASS document.caretRangeFromPoint(0,340).startOffset is 8 +FAIL document.caretRangeFromPoint(0,270).startOffset should be 10. Was 8. +FAIL document.caretRangeFromPoint(0,211).startOffset should be 11. Was 8. +FAIL document.caretRangeFromPoint(0,210).startOffset should be 11. Was 20. +To the left of the second column: +PASS document.caretRangeFromPoint(0,209).startOffset is 20 +FAIL document.caretRangeFromPoint(0,170).startOffset should be 22. Was 20. +FAIL document.caretRangeFromPoint(0,111).startOffset should be 23. Was 20. +FAIL document.caretRangeFromPoint(0,110).startOffset should be 23. Was 32. +To the left of the second column: +PASS document.caretRangeFromPoint(0,109).startOffset is 32 +FAIL document.caretRangeFromPoint(0,70).startOffset should be 34. Was 32. +FAIL document.caretRangeFromPoint(0,0).startOffset should be 35. Was 32. +Below first column: +PASS document.caretRangeFromPoint(550,350).startOffset is 0 +PASS document.caretRangeFromPoint(490,350).startOffset is 0 +PASS document.caretRangeFromPoint(470,350).startOffset is 4 +PASS document.caretRangeFromPoint(450,350).startOffset is 8 +Above third column: +PASS document.caretRangeFromPoint(490,0).startOffset is 27 +PASS document.caretRangeFromPoint(470,0).startOffset is 31 +PASS document.caretRangeFromPoint(450,0).startOffset is 35 +In the gap between the first and second columns: +PASS document.caretRangeFromPoint(499,211).startOffset is 3 +PASS document.caretRangeFromPoint(479,211).startOffset is 7 +PASS document.caretRangeFromPoint(459,211).startOffset is 11 +PASS document.caretRangeFromPoint(440,211).startOffset is 11 +FAIL document.caretRangeFromPoint(499,210).startOffset should be 3. Was 12. +FAIL document.caretRangeFromPoint(479,210).startOffset should be 7. Was 16. +FAIL document.caretRangeFromPoint(459,210).startOffset should be 11. Was 20. +FAIL document.caretRangeFromPoint(440,210).startOffset should be 11. Was 20. +PASS document.caretRangeFromPoint(499,209).startOffset is 12 +PASS document.caretRangeFromPoint(479,209).startOffset is 16 +PASS document.caretRangeFromPoint(459,209).startOffset is 20 +PASS document.caretRangeFromPoint(440,209).startOffset is 20 +In the gap between the second and third columns: +PASS document.caretRangeFromPoint(499,111).startOffset is 15 +PASS document.caretRangeFromPoint(479,111).startOffset is 19 +PASS document.caretRangeFromPoint(459,111).startOffset is 23 +PASS document.caretRangeFromPoint(440,111).startOffset is 23 +FAIL document.caretRangeFromPoint(499,110).startOffset should be 15. Was 24. +FAIL document.caretRangeFromPoint(479,110).startOffset should be 19. Was 28. +FAIL document.caretRangeFromPoint(459,110).startOffset should be 23. Was 32. +FAIL document.caretRangeFromPoint(440,110).startOffset should be 23. Was 32. +PASS document.caretRangeFromPoint(499,109).startOffset is 24 +PASS document.caretRangeFromPoint(479,109).startOffset is 28 +PASS document.caretRangeFromPoint(459,109).startOffset is 32 +PASS document.caretRangeFromPoint(440,109).startOffset is 32 +PASS successfullyParsed is true + +TEST COMPLETE + +xxx xxx xxx xxx xxx xxx xxx xxx xxx
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fragmentation/outline-crossing-columns-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fragmentation/outline-crossing-columns-expected.png new file mode 100644 index 0000000..b432a376 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fragmentation/outline-crossing-columns-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/multicol/multicol-as-paint-container-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/multicol/multicol-as-paint-container-expected.txt new file mode 100644 index 0000000..ca080b3c --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/multicol/multicol-as-paint-container-expected.txt
@@ -0,0 +1,47 @@ +{ + "layers": [ + { + "name": "Scrolling background of LayoutView #document", + "bounds": [800, 600], + "contentsOpaque": true, + "backgroundColor": "#FFFFFF" + }, + { + "name": "LayoutBlockFlow DIV id='target'", + "bounds": [630, 180], + "backfaceVisibility": "hidden", + "invalidations": [ + [325, 140, 300, 20], + [325, 100, 300, 20], + [325, 20, 300, 20], + [325, 0, 300, 20], + [0, 140, 300, 20], + [0, 20, 300, 20], + [325, 60, 280, 20], + [325, 120, 260, 20], + [0, 100, 260, 20], + [0, 120, 240, 20], + [325, 40, 220, 20], + [0, 80, 220, 20], + [0, 40, 220, 20], + [0, 0, 220, 20], + [0, 60, 200, 20], + [325, 80, 140, 20], + [0, 160, 120, 20] + ], + "transform": 1 + } + ], + "transforms": [ + { + "id": 1, + "transform": [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [8, 8, 0, 1] + ] + } + ] +} +
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/multicol/multicol-with-overflowing-block-rl-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/multicol/multicol-with-overflowing-block-rl-expected.txt new file mode 100644 index 0000000..a7f9b8bb --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/multicol/multicol-with-overflowing-block-rl-expected.txt
@@ -0,0 +1,16 @@ +{ + "layers": [ + { + "name": "Scrolling background of LayoutView #document", + "bounds": [800, 600], + "contentsOpaque": true, + "backgroundColor": "#008000", + "invalidations": [ + [8, 341, 500, 167], + [8, 8, 500, 167], + [8, 175, 500, 166] + ] + } + ] +} +
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/backface-visibility-interop/paint/invalidation/multicol/multicol-with-overflowing-block-rl-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/backface-visibility-interop/paint/invalidation/multicol/multicol-with-overflowing-block-rl-expected.txt new file mode 100644 index 0000000..a7f9b8bb --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/backface-visibility-interop/paint/invalidation/multicol/multicol-with-overflowing-block-rl-expected.txt
@@ -0,0 +1,16 @@ +{ + "layers": [ + { + "name": "Scrolling background of LayoutView #document", + "bounds": [800, 600], + "contentsOpaque": true, + "backgroundColor": "#008000", + "invalidations": [ + [8, 341, 500, 167], + [8, 8, 500, 167], + [8, 175, 500, 166] + ] + } + ] +} +
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/layout_ng_block_frag/fast/multicol/composited-layer-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/layout_ng_block_frag/fast/multicol/composited-layer-expected.txt deleted file mode 100644 index 4771c39..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/layout_ng_block_frag/fast/multicol/composited-layer-expected.txt +++ /dev/null
@@ -1,27 +0,0 @@ -{ -"layers": [ -{ -"name": "Scrolling Contents Layer", -"bounds": [800, 600], -"contentsOpaque": true, -"backgroundColor": "#FFFFFF" -}, -{ -"name": "LayoutNGBlockFlow DIV id='multicol'", -"bounds": [200, 100], -"transform": 1 -} -], -"transforms": [ -{ -"id": 1, -"transform": [ -[1, 0, 0, 0], -[0, 1, 0, 0], -[0, 0, 1, 0], -[8, 8, 0, 1] -] -} -] -} -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png new file mode 100644 index 0000000..7398e9e --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-features=LayoutNGBlockInInline/fast/block/skip-cleaning-up-anonymous-wrappers-when-subtree-being-destroyed-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=LayoutNGBlockInInline/fast/block/skip-cleaning-up-anonymous-wrappers-when-subtree-being-destroyed-expected.txt new file mode 100644 index 0000000..2274648 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-features=LayoutNGBlockInInline/fast/block/skip-cleaning-up-anonymous-wrappers-when-subtree-being-destroyed-expected.txt
@@ -0,0 +1,3 @@ +PASS +PASS PASSPASS +PASS PASS
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fragmentation/outline-crossing-columns-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fragmentation/outline-crossing-columns-expected.png index 26988a2b..113bfbb 100644 --- a/third_party/blink/web_tests/flag-specific/highdpi/fragmentation/outline-crossing-columns-expected.png +++ b/third_party/blink/web_tests/flag-specific/highdpi/fragmentation/outline-crossing-columns-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/images/rendering-broken-images-empty-alt-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/images/rendering-broken-images-empty-alt-expected.png index 7cf9a09..f300b25 100644 --- a/third_party/blink/web_tests/flag-specific/highdpi/images/rendering-broken-images-empty-alt-expected.png +++ b/third_party/blink/web_tests/flag-specific/highdpi/images/rendering-broken-images-empty-alt-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/virtual/layout_ng_block_frag/fast/multicol/input-with-overflow-second-column-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/virtual/layout_ng_block_frag/fast/multicol/input-with-overflow-second-column-expected.png deleted file mode 100644 index 1f0eedf..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/virtual/layout_ng_block_frag/fast/multicol/input-with-overflow-second-column-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png deleted file mode 100644 index 02f06f08..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png index 1f277bb..84a33578 100644 --- a/third_party/blink/web_tests/flag-specific/highdpi/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png +++ b/third_party/blink/web_tests/flag-specific/highdpi/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/handwriting/handwriting-recognition.https.html b/third_party/blink/web_tests/handwriting/handwriting-recognition.https.html new file mode 100644 index 0000000..f2c62e9 --- /dev/null +++ b/third_party/blink/web_tests/handwriting/handwriting-recognition.https.html
@@ -0,0 +1,64 @@ +<!DOCTYPE html> +<html> +<head> + <title>Handwriting Recognition API: Test WebIDL implementation.</title> + <script src="../resources/testharness.js"></script> + <script src="../resources/testharnessreport.js"></script> +</head> +<body> +<script type="module"> + promise_test(async () => { + assert_not_equals(navigator.queryHandwritingRecognizer, undefined); + assert_not_equals(navigator.queryHandwritingRecognizer, null); + assert_not_equals(navigator.createHandwritingRecognizer, undefined); + assert_not_equals(navigator.createHandwritingRecognizer, null); + assert_not_equals(HandwritingStroke, undefined); + assert_not_equals(HandwritingStroke, null); + }, 'Handwriting recognition exposed interfaces exist.'); + + promise_test(async () => { + const stroke = new HandwritingStroke(); + assert_equals(stroke.getPoints().length, 0); + stroke.addPoint({x:123, y:456, t:20}); + stroke.addPoint({x:31, y:654, t:100}); + assert_equals(stroke.getPoints().length, 2); + assert_equals(stroke.getPoints()[0].x, 123); + assert_equals(stroke.getPoints()[0].y, 456); + assert_equals(stroke.getPoints()[0].t, 20); + assert_equals(stroke.getPoints()[1].x, 31); + assert_equals(stroke.getPoints()[1].y, 654); + assert_equals(stroke.getPoints()[1].t, 100); + }, 'HandwritingStroke works as expected.'); + + promise_test(async () => { + const stroke = new HandwritingStroke(); + stroke.addPoint({x:1, y:2, t:3}); + assert_equals(stroke.getPoints().length, 1); + assert_equals(stroke.getPoints()[0].x, 1); + assert_equals(stroke.getPoints()[0].y, 2); + assert_equals(stroke.getPoints()[0].t, 3); + stroke.getPoints()[0].x = 100; + stroke.getPoints()[0].y = 200; + stroke.getPoints()[0].t = 300; + assert_equals(stroke.getPoints()[0].x, 1); + assert_equals(stroke.getPoints()[0].y, 2); + assert_equals(stroke.getPoints()[0].t, 3); + }, 'HandwritingPoint can not be changed after added.'); + + promise_test(async () => { + const response = await navigator.queryHandwritingRecognizer({ + languages: ['zxx-x-unsupported'], + }); + assert_equals(response, null); + }, 'queryHandwritingRecognizer unsupported language.'); + + promise_test(async () => { + try { + await navigator.createHandwritingRecognizer({languages: ['en']}); + } catch(e) { + assert_true(e instanceof DOMException); + } + }, 'createHandwritingRecognizer unsupported language.'); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked-expected.txt index b662210..9b8290c 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked-expected.txt +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked-expected.txt
@@ -19,9 +19,7 @@ StaticText "nested" StaticText "text" generic - generic - generic StaticText "normal text" InlineTextBox
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt index 277ef80..91f1c4c2 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt
@@ -270,7 +270,6 @@ none none *none - *none { childIds : <object> domNode : div @@ -295,9 +294,7 @@ RootWebArea none none - none - *none - *none + *none { childIds : <object> domNode : span @@ -606,7 +603,6 @@ none none *none - *none { childIds : <object> domNode : div
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-query-axtree-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-query-axtree-expected.txt index f6deaad..e509693 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-query-axtree-expected.txt +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-query-axtree-expected.txt
@@ -140,30 +140,6 @@ value : StaticText } } -{ - backendDOMNodeId : <number> - childIds : <object> - ignored : true - ignoredReasons : [ - [0] : { - name : notRendered - value : { - type : boolean - value : true - } - } - ] - name : { - type : computedString - value : title - } - nodeId : <string> - parentId : <string> - role : { - type : internalRole - value : StaticText - } -} Running test: testGetNodesForSubtreeByAccessibleName find all elements with accessible name "foo"
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/window-controls-overlay-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/window-controls-overlay-origin-trial-interfaces.html index eee42869..b23dc03 100644 --- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/window-controls-overlay-origin-trial-interfaces.html +++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/window-controls-overlay-origin-trial-interfaces.html
@@ -14,7 +14,7 @@ test(t => { OriginTrialsHelper.check_properties_exist(this, { - 'WindowControlsOverlay': ['visible', 'getBoundingClientRect', 'ongeometrychange'] + 'WindowControlsOverlay': ['visible', 'getTitlebarAreaRect', 'ongeometrychange'] }); }, 'Window Controls Overlay API interfaces and properties in Origin-Trial enabled document.');
diff --git a/third_party/blink/web_tests/paint/invalidation/multicol/multicol-as-paint-container-expected.txt b/third_party/blink/web_tests/paint/invalidation/multicol/multicol-as-paint-container-expected.txt index ca080b3c..32ae88f 100644 --- a/third_party/blink/web_tests/paint/invalidation/multicol/multicol-as-paint-container-expected.txt +++ b/third_party/blink/web_tests/paint/invalidation/multicol/multicol-as-paint-container-expected.txt
@@ -7,27 +7,11 @@ "backgroundColor": "#FFFFFF" }, { - "name": "LayoutBlockFlow DIV id='target'", + "name": "LayoutNGBlockFlow DIV id='target'", "bounds": [630, 180], "backfaceVisibility": "hidden", "invalidations": [ - [325, 140, 300, 20], - [325, 100, 300, 20], - [325, 20, 300, 20], - [325, 0, 300, 20], - [0, 140, 300, 20], - [0, 20, 300, 20], - [325, 60, 280, 20], - [325, 120, 260, 20], - [0, 100, 260, 20], - [0, 120, 240, 20], - [325, 40, 220, 20], - [0, 80, 220, 20], - [0, 40, 220, 20], - [0, 0, 220, 20], - [0, 60, 200, 20], - [325, 80, 140, 20], - [0, 160, 120, 20] + [0, 0, 625, 180] ], "transform": 1 }
diff --git a/third_party/blink/web_tests/paint/invalidation/multicol/multicol-with-overflowing-block-rl-expected.txt b/third_party/blink/web_tests/paint/invalidation/multicol/multicol-with-overflowing-block-rl-expected.txt index a7f9b8bb..ad2fd30 100644 --- a/third_party/blink/web_tests/paint/invalidation/multicol/multicol-with-overflowing-block-rl-expected.txt +++ b/third_party/blink/web_tests/paint/invalidation/multicol/multicol-with-overflowing-block-rl-expected.txt
@@ -4,11 +4,9 @@ "name": "Scrolling background of LayoutView #document", "bounds": [800, 600], "contentsOpaque": true, - "backgroundColor": "#008000", + "backgroundColor": "#FFFFFF", "invalidations": [ - [8, 341, 500, 167], - [8, 8, 500, 167], - [8, 175, 500, 166] + [8, 8, 500, 500] ] } ]
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt new file mode 100644 index 0000000..c4f0add2 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL enumerateDevices has stable deviceIds across same-origin iframe assert_true: deviceIds stay the same when loaded in same origin expected true got false +PASS enumerateDevices rotates deviceId across different-origin iframe +FAIL enumerateDevices rotates deviceId after clearing site data assert_false: deviceIds are not kept after clearing site data expected false got true +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/fast/multicol/composited-layer-multiple-fragments-translated-expected.png b/third_party/blink/web_tests/platform/linux/fast/multicol/composited-layer-multiple-fragments-translated-expected.png index 996b8f8..a9f925a 100644 --- a/third_party/blink/web_tests/platform/linux/fast/multicol/composited-layer-multiple-fragments-translated-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/multicol/composited-layer-multiple-fragments-translated-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/multicol/outline/outline-inline-across-columns-expected.png b/third_party/blink/web_tests/platform/linux/fast/multicol/outline/outline-inline-across-columns-expected.png index 8af42428..2318605e 100644 --- a/third_party/blink/web_tests/platform/linux/fast/multicol/outline/outline-inline-across-columns-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/multicol/outline/outline-inline-across-columns-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png b/third_party/blink/web_tests/platform/linux/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png index 5835529..9adc3473 100644 --- a/third_party/blink/web_tests/platform/linux/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png b/third_party/blink/web_tests/platform/linux/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png index b0e5e90..1c7811bd 100644 --- a/third_party/blink/web_tests/platform/linux/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fragmentation/outline-crossing-columns-expected.png b/third_party/blink/web_tests/platform/linux/fragmentation/outline-crossing-columns-expected.png index b432a376..2f6c293 100644 --- a/third_party/blink/web_tests/platform/linux/fragmentation/outline-crossing-columns-expected.png +++ b/third_party/blink/web_tests/platform/linux/fragmentation/outline-crossing-columns-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt new file mode 100644 index 0000000..c4f0add2 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL enumerateDevices has stable deviceIds across same-origin iframe assert_true: deviceIds stay the same when loaded in same origin expected true got false +PASS enumerateDevices rotates deviceId across different-origin iframe +FAIL enumerateDevices rotates deviceId after clearing site data assert_false: deviceIds are not kept after clearing site data expected false got true +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer-second-column-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer-second-column-expected.png deleted file mode 100644 index 367419d..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer-second-column-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/composited-layer-multiple-fragments-translated-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/composited-layer-multiple-fragments-translated-expected.png deleted file mode 100644 index a9f925a..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/composited-layer-multiple-fragments-translated-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/composited-layer-nested-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/composited-layer-nested-expected.png deleted file mode 100644 index a13e3e93..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/composited-layer-nested-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/composited-opacity-2nd-and-3rd-column-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/composited-opacity-2nd-and-3rd-column-expected.png deleted file mode 100644 index 02b2f1f..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/composited-opacity-2nd-and-3rd-column-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column-expected.png deleted file mode 100644 index 98de5cc..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/input-with-overflow-second-column-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/input-with-overflow-second-column-expected.png deleted file mode 100644 index 9339337..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/input-with-overflow-second-column-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-across-columns-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-across-columns-expected.png deleted file mode 100644 index 2318605e..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-across-columns-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png deleted file mode 100644 index 9adc3473..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png deleted file mode 100644 index 1c7811bd..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fragmentation/outline-crossing-columns-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fragmentation/outline-crossing-columns-expected.png deleted file mode 100644 index 2f6c293..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fragmentation/outline-crossing-columns-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png index 7398e9e..f3967c07 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png index 40c43370..14c7bc9c 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png index ae4c5e5..cf771a91 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu-rasterization/images/color-profile-background-image-cross-fade-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu-rasterization/images/color-profile-background-image-cross-fade-expected.png new file mode 100644 index 0000000..cc0f0b5d --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu-rasterization/images/color-profile-background-image-cross-fade-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-expected.txt deleted file mode 100644 index e027e8d0..0000000 --- a/third_party/blink/web_tests/platform/mac/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL fieldset multicol assert_equals: expected "18px" but got "90px" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt new file mode 100644 index 0000000..c4f0add2 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL enumerateDevices has stable deviceIds across same-origin iframe assert_true: deviceIds stay the same when loaded in same origin expected true got false +PASS enumerateDevices rotates deviceId across different-origin iframe +FAIL enumerateDevices rotates deviceId after clearing site data assert_false: deviceIds are not kept after clearing site data expected false got true +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/select/menulist-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/select/menulist-appearance-rtl-expected.png index 13be372..d474ff6 100644 --- a/third_party/blink/web_tests/platform/mac/fast/forms/select/menulist-appearance-rtl-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/forms/select/menulist-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/multicol/composited-layer-multiple-fragments-translated-expected.png b/third_party/blink/web_tests/platform/mac/fast/multicol/composited-layer-multiple-fragments-translated-expected.png index ea724a60a..8a409441 100644 --- a/third_party/blink/web_tests/platform/mac/fast/multicol/composited-layer-multiple-fragments-translated-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/multicol/composited-layer-multiple-fragments-translated-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png b/third_party/blink/web_tests/platform/mac/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png index 3e5585c..2af6e0a4 100644 --- a/third_party/blink/web_tests/platform/mac/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/multicol/outline/outline-inline-across-columns-expected.png b/third_party/blink/web_tests/platform/mac/fast/multicol/outline/outline-inline-across-columns-expected.png index 69baaa0..be30e3a 100644 --- a/third_party/blink/web_tests/platform/mac/fast/multicol/outline/outline-inline-across-columns-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/multicol/outline/outline-inline-across-columns-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png b/third_party/blink/web_tests/platform/mac/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png index ff65475..9e9a2d49 100644 --- a/third_party/blink/web_tests/platform/mac/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fragmentation/outline-crossing-columns-expected.png b/third_party/blink/web_tests/platform/mac/fragmentation/outline-crossing-columns-expected.png index 74ed196..55da340 100644 --- a/third_party/blink/web_tests/platform/mac/fragmentation/outline-crossing-columns-expected.png +++ b/third_party/blink/web_tests/platform/mac/fragmentation/outline-crossing-columns-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/composited-layer-multiple-fragments-translated-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/composited-layer-multiple-fragments-translated-expected.png deleted file mode 100644 index 8a409441..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/composited-layer-multiple-fragments-translated-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column-expected.png deleted file mode 100644 index 6f86227..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png deleted file mode 100644 index 2af6e0a4..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-across-columns-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-across-columns-expected.png deleted file mode 100644 index be30e3a..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-across-columns-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png deleted file mode 100644 index 9e9a2d49..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png deleted file mode 100644 index cf609fc..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fragmentation/outline-crossing-columns-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fragmentation/outline-crossing-columns-expected.png deleted file mode 100644 index 55da340..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fragmentation/outline-crossing-columns-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png b/third_party/blink/web_tests/platform/mac/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png index ce456c71..43fb848 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/multicol/composited-layer-multiple-fragments-translated-expected.png b/third_party/blink/web_tests/platform/win/fast/multicol/composited-layer-multiple-fragments-translated-expected.png index 194e96c9..9011e4f8 100644 --- a/third_party/blink/web_tests/platform/win/fast/multicol/composited-layer-multiple-fragments-translated-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/multicol/composited-layer-multiple-fragments-translated-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/multicol/outline/outline-inline-across-columns-expected.png b/third_party/blink/web_tests/platform/win/fast/multicol/outline/outline-inline-across-columns-expected.png index 784650b..67bc2e2 100644 --- a/third_party/blink/web_tests/platform/win/fast/multicol/outline/outline-inline-across-columns-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/multicol/outline/outline-inline-across-columns-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png b/third_party/blink/web_tests/platform/win/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png index 752d21cb..215beab3 100644 --- a/third_party/blink/web_tests/platform/win/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png b/third_party/blink/web_tests/platform/win/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png index e1c534e..a29f43f 100644 --- a/third_party/blink/web_tests/platform/win/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fragmentation/outline-crossing-columns-expected.png b/third_party/blink/web_tests/platform/win/fragmentation/outline-crossing-columns-expected.png index a4844fe..c888a00 100644 --- a/third_party/blink/web_tests/platform/win/fragmentation/outline-crossing-columns-expected.png +++ b/third_party/blink/web_tests/platform/win/fragmentation/outline-crossing-columns-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/composited-layer-multiple-fragments-translated-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/composited-layer-multiple-fragments-translated-expected.png deleted file mode 100644 index 9011e4f8..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/composited-layer-multiple-fragments-translated-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column-expected.png deleted file mode 100644 index 474a960..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-across-columns-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-across-columns-expected.png deleted file mode 100644 index 67bc2e2..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-across-columns-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png deleted file mode 100644 index 215beab3..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/outline/outline-inline-continuation-across-columns-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png deleted file mode 100644 index a29f43f..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fragmentation/outline-crossing-columns-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fragmentation/outline-crossing-columns-expected.png deleted file mode 100644 index c888a00..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fragmentation/outline-crossing-columns-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png index 3d1fa623..e41aee8 100644 --- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt b/third_party/blink/web_tests/platform/win7/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt new file mode 100644 index 0000000..c4f0add2 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL enumerateDevices has stable deviceIds across same-origin iframe assert_true: deviceIds stay the same when loaded in same origin expected true got false +PASS enumerateDevices rotates deviceId across different-origin iframe +FAIL enumerateDevices rotates deviceId after clearing site data assert_false: deviceIds are not kept after clearing site data expected false got true +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win7/virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt b/third_party/blink/web_tests/platform/win7/virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt new file mode 100644 index 0000000..c4f0add2 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL enumerateDevices has stable deviceIds across same-origin iframe assert_true: deviceIds stay the same when loaded in same origin expected true got false +PASS enumerateDevices rotates deviceId across different-origin iframe +FAIL enumerateDevices rotates deviceId after clearing site data assert_false: deviceIds are not kept after clearing site data expected false got true +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win7/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png b/third_party/blink/web_tests/platform/win7/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png index 18442e7..e2bbc47 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/text-antialias/letter-spacing-leading-and-trailing-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-break/README.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-break/README.txt deleted file mode 100644 index b33f7132..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-break/README.txt +++ /dev/null
@@ -1 +0,0 @@ -# The LayoutNG project is described here: http://goo.gl/1hwhfX
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-contain/README.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-contain/README.txt deleted file mode 100644 index a6e3a89..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-contain/README.txt +++ /dev/null
@@ -1,3 +0,0 @@ -# This suite runs the tests in external/wpt/css/css-contain with -# --enable-blink-features=LayoutNGBlockFragmentation,LayoutNGFieldset. -# The LayoutNG project is described here: http://goo.gl/1hwhfX
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-multicol/README.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-multicol/README.txt deleted file mode 100644 index fed8185..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-multicol/README.txt +++ /dev/null
@@ -1,3 +0,0 @@ - This suite runs the tests in external/wpt/css/css-multicol with -# --enable-blink-features=LayoutNGBlockFragmentation. -# The LayoutNG project is described here: http://goo.gl/1hwhfX
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-overflow-positioned-transform-001-expected.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-overflow-positioned-transform-001-expected.txt deleted file mode 100644 index 57a731a..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-overflow-positioned-transform-001-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS Check scrollWidth before and after transform chage -PASS Check scrollHeight before and after transform chage -PASS Check scrollWidth and scrollHeight before and after transform chage -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-overflow-transform-001-expected.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-overflow-transform-001-expected.txt deleted file mode 100644 index 57a731a..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-overflow-transform-001-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS Check scrollWidth before and after transform chage -PASS Check scrollHeight before and after transform chage -PASS Check scrollWidth and scrollHeight before and after transform chage -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/README.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/README.txt deleted file mode 100644 index b099f4e5..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/css/css-position/multicol/README.txt +++ /dev/null
@@ -1,3 +0,0 @@ -# This suite runs the tests in external/wpt/css/css-position/multicol -# with--enable-blink-features=LayoutNGBlockFragmentation. -# The LayoutNG project is described here: http://goo.gl/1hwhfX
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/README.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/README.txt deleted file mode 100644 index 0fe49352..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/README.txt +++ /dev/null
@@ -1,3 +0,0 @@ -# This suite runs the tests in external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements -# with --enable-blink-features=LayoutNGBlockFragmentation,LayoutNGFieldset. -# The LayoutNG project is described here: http://goo.gl/1hwhfX
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-expected.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-expected.txt deleted file mode 100644 index 2e736a5..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -PASS fieldset multicol -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/forms/fieldset/README.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/forms/fieldset/README.txt deleted file mode 100644 index 31a2b5fcb..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/forms/fieldset/README.txt +++ /dev/null
@@ -1,3 +0,0 @@ -# This suite runs the tests in fast/forms/fieldset -# with --enable-blink-features=LayoutNGBlockFragmentation,LayoutNGFieldset. -# The LayoutNG project is described here: http://goo.gl/1hwhfX
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/README.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/README.txt deleted file mode 100644 index 188643d..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/README.txt +++ /dev/null
@@ -1,3 +0,0 @@ -# This suite runs the tests in fast/multicol with -# --enable-blink-features=LayoutNGBlockFragmentation. -# The LayoutNG project is described here: http://goo.gl/1hwhfX
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/caret-range-outside-columns-rtl-expected.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/caret-range-outside-columns-rtl-expected.txt deleted file mode 100644 index 91ffe636..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/caret-range-outside-columns-rtl-expected.txt +++ /dev/null
@@ -1,75 +0,0 @@ -Test that hitting areas outside columns takes us to the right text content inside columns. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -Above first column: -PASS document.caretRangeFromPoint(450,0).startOffset is 0 -PASS document.caretRangeFromPoint(350,0).startOffset is 2 -PASS document.caretRangeFromPoint(291,0).startOffset is 3 -PASS document.caretRangeFromPoint(290,0).startOffset is 3 -Above second column: -PASS document.caretRangeFromPoint(289,0).startOffset is 12 -PASS document.caretRangeFromPoint(250,0).startOffset is 14 -PASS document.caretRangeFromPoint(191,0).startOffset is 15 -PASS document.caretRangeFromPoint(190,0).startOffset is 15 -Above third column: -PASS document.caretRangeFromPoint(189,0).startOffset is 24 -PASS document.caretRangeFromPoint(150,0).startOffset is 26 -PASS document.caretRangeFromPoint(50,0).startOffset is 27 -Below first column: -PASS document.caretRangeFromPoint(450,100).startOffset is 8 -PASS document.caretRangeFromPoint(350,100).startOffset is 10 -PASS document.caretRangeFromPoint(291,100).startOffset is 11 -PASS document.caretRangeFromPoint(290,100).startOffset is 11 -Below second column: -PASS document.caretRangeFromPoint(289,100).startOffset is 20 -PASS document.caretRangeFromPoint(250,100).startOffset is 22 -PASS document.caretRangeFromPoint(191,100).startOffset is 23 -PASS document.caretRangeFromPoint(190,100).startOffset is 23 -Below third column: -PASS document.caretRangeFromPoint(189,100).startOffset is 32 -PASS document.caretRangeFromPoint(150,100).startOffset is 34 -PASS document.caretRangeFromPoint(50,100).startOffset is 35 -To the right of the first column: -PASS document.caretRangeFromPoint(400,10).startOffset is 0 -PASS document.caretRangeFromPoint(400,30).startOffset is 0 -PASS document.caretRangeFromPoint(400,50).startOffset is 4 -PASS document.caretRangeFromPoint(400,70).startOffset is 8 -PASS document.caretRangeFromPoint(400,90).startOffset is 8 -To the left of the third column: -PASS document.caretRangeFromPoint(0,10).startOffset is 27 -PASS document.caretRangeFromPoint(0,30).startOffset is 27 -PASS document.caretRangeFromPoint(0,50).startOffset is 31 -PASS document.caretRangeFromPoint(0,70).startOffset is 35 -PASS document.caretRangeFromPoint(0,90).startOffset is 35 -In the gap between the first and second columns: -PASS document.caretRangeFromPoint(291,20).startOffset is 3 -PASS document.caretRangeFromPoint(291,40).startOffset is 7 -PASS document.caretRangeFromPoint(291,60).startOffset is 11 -PASS document.caretRangeFromPoint(291,69).startOffset is 11 -PASS document.caretRangeFromPoint(290,20).startOffset is 3 -PASS document.caretRangeFromPoint(290,40).startOffset is 7 -PASS document.caretRangeFromPoint(290,60).startOffset is 11 -PASS document.caretRangeFromPoint(290,69).startOffset is 11 -PASS document.caretRangeFromPoint(289,20).startOffset is 12 -PASS document.caretRangeFromPoint(289,40).startOffset is 16 -PASS document.caretRangeFromPoint(289,60).startOffset is 20 -PASS document.caretRangeFromPoint(289,69).startOffset is 20 -In the gap between the second and third columns: -PASS document.caretRangeFromPoint(191,20).startOffset is 15 -PASS document.caretRangeFromPoint(191,40).startOffset is 19 -PASS document.caretRangeFromPoint(191,60).startOffset is 23 -PASS document.caretRangeFromPoint(191,69).startOffset is 23 -PASS document.caretRangeFromPoint(190,20).startOffset is 15 -PASS document.caretRangeFromPoint(190,40).startOffset is 19 -PASS document.caretRangeFromPoint(190,60).startOffset is 23 -PASS document.caretRangeFromPoint(190,69).startOffset is 23 -PASS document.caretRangeFromPoint(189,20).startOffset is 24 -PASS document.caretRangeFromPoint(189,40).startOffset is 28 -PASS document.caretRangeFromPoint(189,60).startOffset is 32 -PASS document.caretRangeFromPoint(189,69).startOffset is 32 -PASS successfullyParsed is true - -TEST COMPLETE - -xxx xxx xxx xxx xxx xxx xxx xxx xxx
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/caret-range-outside-columns-win-expected.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/caret-range-outside-columns-win-expected.txt deleted file mode 100644 index 0336449..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/caret-range-outside-columns-win-expected.txt +++ /dev/null
@@ -1,54 +0,0 @@ -Test that hitting areas outside columns takes us to the right text content inside columns. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -Above first column: -PASS document.caretRangeFromPoint(50,0).startOffset is 0 -PASS document.caretRangeFromPoint(150,0).startOffset is 2 -PASS document.caretRangeFromPoint(189,0).startOffset is 3 -Above second column: -PASS document.caretRangeFromPoint(190,0).startOffset is 12 -PASS document.caretRangeFromPoint(250,0).startOffset is 14 -PASS document.caretRangeFromPoint(289,0).startOffset is 15 -Above third column: -PASS document.caretRangeFromPoint(290,0).startOffset is 24 -PASS document.caretRangeFromPoint(350,0).startOffset is 26 -PASS document.caretRangeFromPoint(450,0).startOffset is 27 -Below first column: -PASS document.caretRangeFromPoint(50,100).startOffset is 8 -PASS document.caretRangeFromPoint(150,100).startOffset is 10 -PASS document.caretRangeFromPoint(189,100).startOffset is 11 -Below second column: -PASS document.caretRangeFromPoint(190,100).startOffset is 20 -PASS document.caretRangeFromPoint(250,100).startOffset is 22 -PASS document.caretRangeFromPoint(289,100).startOffset is 23 -Below third column: -PASS document.caretRangeFromPoint(290,100).startOffset is 32 -PASS document.caretRangeFromPoint(350,100).startOffset is 34 -PASS document.caretRangeFromPoint(389,100).startOffset is 35 -To the left of the first column: -PASS document.caretRangeFromPoint(0,10).startOffset is 0 -PASS document.caretRangeFromPoint(0,30).startOffset is 0 -PASS document.caretRangeFromPoint(0,50).startOffset is 4 -PASS document.caretRangeFromPoint(0,70).startOffset is 8 -PASS document.caretRangeFromPoint(0,90).startOffset is 8 -To the right of the third column: -PASS document.caretRangeFromPoint(400,10).startOffset is 27 -PASS document.caretRangeFromPoint(400,30).startOffset is 27 -PASS document.caretRangeFromPoint(400,50).startOffset is 31 -PASS document.caretRangeFromPoint(400,70).startOffset is 35 -In the gap between the first and second columns: -PASS document.caretRangeFromPoint(180,20).startOffset is 3 -PASS document.caretRangeFromPoint(180,40).startOffset is 7 -PASS document.caretRangeFromPoint(180,60).startOffset is 11 -PASS document.caretRangeFromPoint(180,69).startOffset is 11 -In the gap between the second and third columns: -PASS document.caretRangeFromPoint(280,20).startOffset is 15 -PASS document.caretRangeFromPoint(280,40).startOffset is 19 -PASS document.caretRangeFromPoint(280,60).startOffset is 23 -PASS document.caretRangeFromPoint(280,69).startOffset is 23 -PASS successfullyParsed is true - -TEST COMPLETE - -xxx xxx xxx xxx xxx xxx xxx xxx xxx
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/fixedpos-in-transform-at-column-boundary-expected.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/fixedpos-in-transform-at-column-boundary-expected.txt deleted file mode 100644 index 9a73c31..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/fixedpos-in-transform-at-column-boundary-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -Test that a fixed positioned object inside a transform inside a multicol isn't paginated. - -The word "YO" should be seen below, with large letter spacing. - -Y -O -PASS
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/caret-range-outside-columns-rtl-expected.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/caret-range-outside-columns-rtl-expected.txt deleted file mode 100644 index 89c1e0f0..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/vertical-lr/caret-range-outside-columns-rtl-expected.txt +++ /dev/null
@@ -1,74 +0,0 @@ -Test that hitting areas outside columns takes us to the right text content inside columns. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -To the left of the first column: -PASS document.caretRangeFromPoint(0,309).startOffset is 0 -PASS document.caretRangeFromPoint(0,270).startOffset is 2 -PASS document.caretRangeFromPoint(0,211).startOffset is 3 -PASS document.caretRangeFromPoint(0,210).startOffset is 3 -To the left of the second column: -PASS document.caretRangeFromPoint(0,209).startOffset is 12 -PASS document.caretRangeFromPoint(0,170).startOffset is 14 -PASS document.caretRangeFromPoint(0,111).startOffset is 15 -PASS document.caretRangeFromPoint(0,110).startOffset is 15 -To the left of the third column: -PASS document.caretRangeFromPoint(0,109).startOffset is 24 -PASS document.caretRangeFromPoint(0,70).startOffset is 26 -PASS document.caretRangeFromPoint(0,0).startOffset is 27 -To the right of the first column: -PASS document.caretRangeFromPoint(400,309).startOffset is 8 -PASS document.caretRangeFromPoint(400,270).startOffset is 10 -PASS document.caretRangeFromPoint(400,211).startOffset is 11 -PASS document.caretRangeFromPoint(400,210).startOffset is 11 -To the right of the second column: -PASS document.caretRangeFromPoint(400,209).startOffset is 20 -PASS document.caretRangeFromPoint(400,170).startOffset is 22 -PASS document.caretRangeFromPoint(400,111).startOffset is 23 -PASS document.caretRangeFromPoint(400,110).startOffset is 23 -To the right of the third column: -PASS document.caretRangeFromPoint(400,109).startOffset is 32 -PASS document.caretRangeFromPoint(400,70).startOffset is 34 -PASS document.caretRangeFromPoint(400,11).startOffset is 35 -Below first column: -PASS document.caretRangeFromPoint(90,350).startOffset is 0 -PASS document.caretRangeFromPoint(110,350).startOffset is 0 -PASS document.caretRangeFromPoint(130,350).startOffset is 4 -PASS document.caretRangeFromPoint(150,350).startOffset is 8 -PASS document.caretRangeFromPoint(170,350).startOffset is 8 -Above third column: -PASS document.caretRangeFromPoint(90,0).startOffset is 27 -PASS document.caretRangeFromPoint(110,0).startOffset is 27 -PASS document.caretRangeFromPoint(130,0).startOffset is 31 -PASS document.caretRangeFromPoint(150,0).startOffset is 35 -In the gap between the first and second columns: -PASS document.caretRangeFromPoint(100,211).startOffset is 3 -PASS document.caretRangeFromPoint(120,211).startOffset is 7 -PASS document.caretRangeFromPoint(140,211).startOffset is 11 -PASS document.caretRangeFromPoint(159,211).startOffset is 11 -PASS document.caretRangeFromPoint(100,210).startOffset is 3 -PASS document.caretRangeFromPoint(120,210).startOffset is 7 -PASS document.caretRangeFromPoint(140,210).startOffset is 11 -PASS document.caretRangeFromPoint(159,210).startOffset is 11 -PASS document.caretRangeFromPoint(100,209).startOffset is 12 -PASS document.caretRangeFromPoint(120,209).startOffset is 16 -PASS document.caretRangeFromPoint(140,209).startOffset is 20 -PASS document.caretRangeFromPoint(159,209).startOffset is 20 -In the gap between the second and third columns: -PASS document.caretRangeFromPoint(100,111).startOffset is 15 -PASS document.caretRangeFromPoint(120,111).startOffset is 19 -PASS document.caretRangeFromPoint(140,111).startOffset is 23 -PASS document.caretRangeFromPoint(159,111).startOffset is 23 -PASS document.caretRangeFromPoint(100,110).startOffset is 15 -PASS document.caretRangeFromPoint(120,110).startOffset is 19 -PASS document.caretRangeFromPoint(140,110).startOffset is 23 -PASS document.caretRangeFromPoint(159,110).startOffset is 23 -PASS document.caretRangeFromPoint(100,109).startOffset is 24 -PASS document.caretRangeFromPoint(120,109).startOffset is 28 -PASS document.caretRangeFromPoint(140,109).startOffset is 32 -PASS document.caretRangeFromPoint(159,109).startOffset is 32 -PASS successfullyParsed is true - -TEST COMPLETE - -xxx xxx xxx xxx xxx xxx xxx xxx xxx
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/vertical-rl/caret-range-outside-columns-rtl-expected.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/vertical-rl/caret-range-outside-columns-rtl-expected.txt deleted file mode 100644 index 7305c67..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fast/multicol/vertical-rl/caret-range-outside-columns-rtl-expected.txt +++ /dev/null
@@ -1,72 +0,0 @@ -Test that hitting areas outside columns takes us to the right text content inside columns. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -To the right of the first column: -PASS document.caretRangeFromPoint(550,340).startOffset is 0 -PASS document.caretRangeFromPoint(550,270).startOffset is 2 -PASS document.caretRangeFromPoint(550,211).startOffset is 3 -PASS document.caretRangeFromPoint(550,210).startOffset is 3 -To the right of the second column: -PASS document.caretRangeFromPoint(550,209).startOffset is 12 -PASS document.caretRangeFromPoint(550,170).startOffset is 14 -PASS document.caretRangeFromPoint(550,111).startOffset is 15 -PASS document.caretRangeFromPoint(550,110).startOffset is 15 -To the right of the third column: -PASS document.caretRangeFromPoint(550,109).startOffset is 24 -PASS document.caretRangeFromPoint(550,70).startOffset is 26 -PASS document.caretRangeFromPoint(550,11).startOffset is 27 -To the left of the first column: -PASS document.caretRangeFromPoint(0,340).startOffset is 8 -PASS document.caretRangeFromPoint(0,270).startOffset is 10 -PASS document.caretRangeFromPoint(0,211).startOffset is 11 -PASS document.caretRangeFromPoint(0,210).startOffset is 11 -To the left of the second column: -PASS document.caretRangeFromPoint(0,209).startOffset is 20 -PASS document.caretRangeFromPoint(0,170).startOffset is 22 -PASS document.caretRangeFromPoint(0,111).startOffset is 23 -PASS document.caretRangeFromPoint(0,110).startOffset is 23 -To the left of the second column: -PASS document.caretRangeFromPoint(0,109).startOffset is 32 -PASS document.caretRangeFromPoint(0,70).startOffset is 34 -PASS document.caretRangeFromPoint(0,0).startOffset is 35 -Below first column: -PASS document.caretRangeFromPoint(550,350).startOffset is 0 -PASS document.caretRangeFromPoint(490,350).startOffset is 0 -PASS document.caretRangeFromPoint(470,350).startOffset is 4 -PASS document.caretRangeFromPoint(450,350).startOffset is 8 -Above third column: -PASS document.caretRangeFromPoint(490,0).startOffset is 27 -PASS document.caretRangeFromPoint(470,0).startOffset is 31 -PASS document.caretRangeFromPoint(450,0).startOffset is 35 -In the gap between the first and second columns: -PASS document.caretRangeFromPoint(499,211).startOffset is 3 -PASS document.caretRangeFromPoint(479,211).startOffset is 7 -PASS document.caretRangeFromPoint(459,211).startOffset is 11 -PASS document.caretRangeFromPoint(440,211).startOffset is 11 -PASS document.caretRangeFromPoint(499,210).startOffset is 3 -PASS document.caretRangeFromPoint(479,210).startOffset is 7 -PASS document.caretRangeFromPoint(459,210).startOffset is 11 -PASS document.caretRangeFromPoint(440,210).startOffset is 11 -PASS document.caretRangeFromPoint(499,209).startOffset is 12 -PASS document.caretRangeFromPoint(479,209).startOffset is 16 -PASS document.caretRangeFromPoint(459,209).startOffset is 20 -PASS document.caretRangeFromPoint(440,209).startOffset is 20 -In the gap between the second and third columns: -PASS document.caretRangeFromPoint(499,111).startOffset is 15 -PASS document.caretRangeFromPoint(479,111).startOffset is 19 -PASS document.caretRangeFromPoint(459,111).startOffset is 23 -PASS document.caretRangeFromPoint(440,111).startOffset is 23 -PASS document.caretRangeFromPoint(499,110).startOffset is 15 -PASS document.caretRangeFromPoint(479,110).startOffset is 19 -PASS document.caretRangeFromPoint(459,110).startOffset is 23 -PASS document.caretRangeFromPoint(440,110).startOffset is 23 -PASS document.caretRangeFromPoint(499,109).startOffset is 24 -PASS document.caretRangeFromPoint(479,109).startOffset is 28 -PASS document.caretRangeFromPoint(459,109).startOffset is 32 -PASS document.caretRangeFromPoint(440,109).startOffset is 32 -PASS successfullyParsed is true - -TEST COMPLETE - -xxx xxx xxx xxx xxx xxx xxx xxx xxx
diff --git a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fragmentation/README.txt b/third_party/blink/web_tests/virtual/layout_ng_block_frag/fragmentation/README.txt deleted file mode 100644 index 174aefe..0000000 --- a/third_party/blink/web_tests/virtual/layout_ng_block_frag/fragmentation/README.txt +++ /dev/null
@@ -1,3 +0,0 @@ -# This suite runs the tests in fragmentation with -# --enable-blink-features=LayoutNGBlockFragmentation. -# The LayoutNG project is described here: http://goo.gl/1hwhfX
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index 4c6a2ed3..1d9fe47 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -10736,7 +10736,7 @@ getter ongeometrychange getter visible method constructor - method getBoundingClientRect + method getTitlebarAreaRect setter ongeometrychange interface WindowControlsOverlayGeometryChangeEvent : Event attribute @@toStringTag
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-001.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-001.html index bd185585e..ae758a5 100644 --- a/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-001.html +++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-001.html
@@ -72,22 +72,18 @@ target.getBoundingClientRect(); axTarget = axElementById("target"); - // Now #target is not locked, but expect the same 9 children ("target" text node, 4 whitespace - // nodes between divs, and 4 div nodes). That's because the nodes already exist, they were - // updated to become ignored but they are still included in the tree. - t.step(() => { assert_equals(axTarget.childrenCount, 9, "Children count when not locked"); }); + // Now that #target is not locked, it is saved as a normal AXLayout object and has 4 children: + // the text node "target" and 4 div children (#child, #displayNone, #hidden, and #target_label). + t.step(() => { assert_equals(axTarget.childrenCount, 5, "Children count when not locked"); }); for (let i = 0; i < axTarget.childrenCount; ++i) { const axChild = axTarget.childAtIndex(i); if (axChild == axElementById("hidden") || axChild == axElementById("displayNone")) { t.step(() => { assert_true(axChild.isIgnored, "After commit, isIgnored is true on child #" + i); }); t.step(() => { assert_false(axChild.isVisible, "After commit, isVisible is false on child #" + i); }); - } else if (i == 0 || axChild == axElementById("child") || axChild == axElementById("target_label")) { + } else { t.step(() => { assert_false(axChild.isIgnored, "After update, isIgnored is false on child #" + i); }); t.step(() => { assert_true(axChild.isVisible, "After commit, isVisible is true on child #" + i); }); - } else { - // These are the whitespace nodes - t.step(() => { assert_true(axChild.isIgnored, "After update, isIgnored is true on child #" + i); }); } }
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-002.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-002.html index f1266eb..3618244 100644 --- a/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-002.html +++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-002.html
@@ -33,30 +33,23 @@ let target = document.getElementById("target"); let axTarget = axElementById("target"); t.step(() => { assert_false(axTarget.isIgnored); }); - // Note that it's 5 ignored children: one text node "target", two divs and two whitespace text nodes between divs - t.step(() => { assert_equals(axTarget.childrenCount, 5); }); + // Note that when locked, the ignored text nodes don't show up as children; so we expect 2. + t.step(() => { assert_equals(axTarget.childrenCount, 2, "When locked, nodes in hidden subtree are ignored"); }); t.step(() => { assert_equals(axTarget.name, "Label"); }); for (let i = 0; i < axTarget.childrenCount; ++i) { const axChild = axTarget.childAtIndex(i); - t.step(() => assert_true(axChild.isIgnored, "When locked, nodes in hidden subtree are ignored")); + t.step(() => assert_true(axChild.isIgnored)); } target.classList.remove("hidden"); requestAnimationFrame(() => requestAnimationFrame(() => { // The ax object for #target got replaced since the layout object changed, so use the new ax object. axTarget = axElementById("target"); - // It's still the same 5 children, but the non-whitespace nodes became unignored. - // Note whitespace nodes would not be there if the subtree was not hidden in first place, the total would be 3 children. - t.step(() => { assert_equals(axTarget.childrenCount, 5); }); + t.step(() => { assert_equals(axTarget.childrenCount, 3, "After getting unlocked, nodes in hidden subtree are not ignored"); }); t.step(() => { assert_equals(axTarget.name, "Label"); }); for (let i = 0; i < axTarget.childrenCount; ++i) { const axChild = axTarget.childAtIndex(i); - if (i == 0 || axChild == axElementById("child") || axChild == axElementById("target_label")) { - t.step(() => { assert_false(axChild.isIgnored, "After update, isIgnored is false on non-whitespace child #" + i); }); - } else { - // These are the whitespace nodes - t.step(() => { assert_true(axChild.isIgnored, "After update, isIgnored is true on whitespace child #" + i); }); - } + t.step(() => assert_false(axChild.isIgnored)); } t.done(); }));
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-003.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-003.html index 99e00c7f..8a292a0 100644 --- a/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-003.html +++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-003.html
@@ -43,12 +43,9 @@ requestAnimationFrame(() => { requestAnimationFrame(() => { axHidden = axElementById("hidden"); - // #hidden is now unlocked and saved as a normal AXLayoutObject, but it still has the same - // three child nodes. The whitespace node is still present because it was already created, - // but it's marked as ignored - t.step(() => { assert_equals(axHidden.childrenCount, 3, "Children count after activation"); }); - const axChild = axHidden.childAtIndex(2); - t.step(() => { assert_true(axChild.isIgnored, "After update, isIgnored is true on whitespace node"); }); + // #hidden is now unlocked and saved as a normal AXLayoutObject with 2 child nodes: + // "foo" text and #child node. + t.step(() => { assert_equals(axHidden.childrenCount, 2, "Children count after activation"); }); t.done(); }); });
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-004.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-004.html index 2629f2d..5c34289 100644 --- a/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-004.html +++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-004.html
@@ -36,19 +36,16 @@ // since it is interactable even though it is locked by content-visibility (see // https://github.com/WICG/display-locking for details). When that is done, // the element will become unlocked and AXNodeObjects will be replaced with - // AXLayoutObjects. Still, the <newline> that already existed will be around, but - // marked as ignored. + // AXLayoutObjects, causing <newline> to be collapsed, so we expect to see + // two children. axElementById("child").press(); // Wait for the next frame for the ax object to be recreated. requestAnimationFrame(() => { requestAnimationFrame(() => { axHidden = axElementById("hidden"); - // #hidden is now unlocked and saved as a normal AXLayoutObject, but it still has the same - // three child nodes. The whitespace node is still present because it was already created, - // but it's marked as ignored - t.step(() => { assert_equals(axHidden.childrenCount, 3, "Children count after activation"); }); - const axChild = axHidden.childAtIndex(2); - t.step(() => { assert_true(axChild.isIgnored, "After update, isIgnored is true on whitespace node"); }); + // #hidden is now unlocked and saved as a normal AXLayoutObject with 2 child nodes: + // "foo" text and #child node. + t.step(() => { assert_equals(axHidden.childrenCount, 2, "Children count after activation"); }); t.done(); }); });
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-005.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-005.html index 159dcf6a..ebab87f 100644 --- a/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-005.html +++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-005.html
@@ -47,15 +47,9 @@ requestAnimationFrame(() => { // Frame 3. requestAnimationFrame(() => { // Frame 4. axHidden = axElementById("hidden"); - // #hidden is now unlocked and saved as a normal AXLayoutObject but it still has the same - // three child nodes. The whitespace node is still present because it was already created, - // but it's marked as ignored t.step(() => { - assert_equals(axHidden.childrenCount, 3, "Child count after activation"); + assert_equals(axHidden.childrenCount, 2, "Child count after activation"); }); - const axChild = axHidden.childAtIndex(2); - t.step(() => { - assert_true(axChild.isIgnored, "After update, isIgnored is true on whitespace node"); }); t.done(); }); });
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-008.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-008.html index 7ab03e9..d13fd79 100644 --- a/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-008.html +++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-content-visibility/accessibility/content-visibility-accessibility-008.html
@@ -46,9 +46,8 @@ axTarget = axElementById("target"); axTarget.childrenCount; // Touch children to cause invalidations. Only necessary in web tests. Normally serializer does this. t.step(() => { assert_false(axTarget.isIgnored); }); - // Note that text nodes are marked ignored but still kept in the tree, because they might be - // needed for accname calculation. - t.step(() => { assert_equals(axTarget.childrenCount, 5, "When locked, nodes in hidden subtree are visible"); }); + // Note that when locked, the ignored text nodes don't show up as children; so we expect 2. + t.step(() => { assert_equals(axTarget.childrenCount, 2, "When locked, nodes in hidden subtree are visible"); }); t.step(() => { assert_equals(axTarget.name, "Label"); }); for (let i = 0; i < axTarget.childrenCount; ++i) { const axChild = axTarget.childAtIndex(i);
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-no-coep.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-no-coep.https.html new file mode 100644 index 0000000..21089e5 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-no-coep.https.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<title>Test COEP properties set for a Fenced Frame Tree</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/utils.js"></script> + +<body> +<script> +// This key is used by `resources/embeddee-coep-require-corp.https.html` to +// let us know if a script inside has been executed. +const corp_key = KEYS["embed_coep_require_corp"]; + +// This key is used by `resources/embeddee-no-coep.https.html` to let us know +// if a script inside has been executed. +const no_coep_key = KEYS["embed_no_coep"]; + +async function setupTest(test_type) { + switch (test_type) { + case "coep:require-corp": + return attachFencedFrame(`resources/embeddee-coep-require-corp.https.html`); + break; + case "no coep": + return attachFencedFrame(`resources/embeddee-no-coep.https.html`); + break; + } +} + +promise_test(async () => { + const frame = setupTest("coep:require-corp"); + const result = await nextValueFromServer(corp_key); + assert_equals(result, "PASS", "embedded page has been loaded."); +}, "Create fencedframe with COEP:require-corp"); + +promise_test(async () => { + const frame = setupTest("no coep"); + const result = await nextValueFromServer(no_coep_key); + assert_equals(result, "PASS", + "page without COEP should be able to load page with COEP"); +}, "Create fencedframe without COEP header"); + +</script> +</body>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-no-coep.https.html.headers b/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-no-coep.https.html.headers new file mode 100644 index 0000000..1b63235 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-no-coep.https.html.headers
@@ -0,0 +1 @@ +Supports-Loading-Mode: fenced-frame
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-require-corp.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-require-corp.https.html new file mode 100644 index 0000000..d4858a7c --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-require-corp.https.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<title>Test COEP properties set for a Fenced Frame Tree</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/utils.js"></script> + +<body> +<script> +// This key is used by `resources/embeddee-coep-require-corp.https.html` to +// let us know if a script inside has been executed. +const corp_key = KEYS["embed_coep_require_corp"]; + +// This key is used by `resources/embeddee-no-coep.https.html` to let us know +// if a script inside has been executed. +const no_coep_key = KEYS["embed_no_coep"]; + +async function setupTest(test_type) { + switch (test_type) { + case "coep:require-corp": + return attachFencedFrame(`resources/embeddee-coep-require-corp.https.html`); + break; + case "no coep": + return attachFencedFrame(`resources/embeddee-no-coep.https.html`); + break; + } +} + +promise_test(async () => { + const frame = setupTest("coep:require-corp"); + const result = await nextValueFromServer(corp_key); + assert_equals(result, "PASS", "embedded page has been loaded."); +}, "Create fencedframe with COEP:require-corp"); + +promise_test(async (t) => { + t.step_timeout(() => t.done(), 3000); + const frame = setupTest("no coep"); + const result = await nextValueFromServer(no_coep_key); + t.unreached_func("embedded page should not be loaded."); +}, "Create fencedframe without COEP header"); + +</script> +</body>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-require-corp.https.html.headers b/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-require-corp.https.html.headers new file mode 100644 index 0000000..6a268d77 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-require-corp.https.html.headers
@@ -0,0 +1,2 @@ +Supports-Loading-Mode: fenced-frame +cross-origin-embedder-policy: require-corp
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/history-length-outer-page-navigation-not-reflected-in-fenced.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/history-length-outer-page-navigation-not-reflected-in-fenced.html new file mode 100644 index 0000000..7fd13824 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/history-length-outer-page-navigation-not-reflected-in-fenced.html
@@ -0,0 +1,72 @@ +!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/utils.js"></script> +<title>history-length-outer-page-navigation-not-reflected-in-fenced</title> + +<body> +<script> +const fenced_history_length_key = KEYS["fenced_history_length"]; +const outer_page_ready_for_next_navigation_key = + KEYS["outer_page_ready_for_next_navigation"]; + +async function runTest(embed_scope_reporting) { + const kAssertionDesc = "history.length Should never reflect the length " + + "of joint session history that occured outside " + + "of the fenced frame tree. history.length will " + + "always return 1." + + ////////////// BEGIN NAVIGATIONS + // This block performs a sequence of 'kNavigationLimit' navigations in: + // -- the outer page + const kNavigationLimit = 5 + + const url = new URL(location.href); + + // First, perform some real navigations as well as history.pushState to this + // same page. Normally this would increase `history.length`. + if (url.searchParams.get("navigationCount") == null) + url.searchParams.append("navigationCount", 1); + + let navigationCount = parseInt(url.searchParams.get("navigationCount")); + + if (navigationCount <= kNavigationLimit) { + url.searchParams.set('navigationCount', ++navigationCount); + location.href = url; + history.pushState({} , ""); + return; + } + ////////////// END + + // Append an iframe to the outer page for subsequent navigations within + // the iframe + const iframe = document.createElement('iframe'); + iframe.src = "resources/history-length-outer-page-navigation-" + + "not-reflected-in-fenced-inner.html?embed_scope=outer_page::iframe"; + document.body.append(iframe); + + await nextValueFromServer(outer_page_ready_for_next_navigation_key); + + // Append a fenced frame to observe 'history.length' and report it back + // to the outer page + attachFencedFrame("resources/history-length-outer-page-navigation-" + + "not-reflected-in-fenced-inner.html?embed_scope_reporting=" + + embed_scope_reporting + "&embed_scope=outer_page::fenced_frame" + ); + + // Wait for the 'embed_scope_reporting' to report 'history.length' + let result = await nextValueFromServer(fenced_history_length_key); + assert_equals(result, "PASS > " + " history.length: 1", kAssertionDesc); +} + +promise_test(async () => { + await runTest("outer_page::fenced_frame"); +}, "history.length should not reflect navigations within outer page in " + + "fenced frame"); + +promise_test(async () => { + await runTest("outer_page::fenced_frame::iframe"); +}, "history.length should not reflect navigations within outer page in " + + "fenced frame nexted iframe"); +</script> +</body> \ No newline at end of file
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embeddee-coep-require-corp.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embeddee-coep-require-corp.https.html new file mode 100644 index 0000000..c116c38 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embeddee-coep-require-corp.https.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<script src="utils.js"></script> +<title>Embedded page embedded as a Fenced Frame</title> +<script> +const key = KEYS["embed_coep_require_corp"]; +writeValueToServer(key, "PASS"); +</script> +</script>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embeddee-coep-require-corp.https.html.headers b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embeddee-coep-require-corp.https.html.headers new file mode 100644 index 0000000..6a268d77 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embeddee-coep-require-corp.https.html.headers
@@ -0,0 +1,2 @@ +Supports-Loading-Mode: fenced-frame +cross-origin-embedder-policy: require-corp
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embeddee-no-coep.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embeddee-no-coep.https.html new file mode 100644 index 0000000..91070a3 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embeddee-no-coep.https.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<script src="utils.js"></script> +<title>Embedded page embedded as a Fenced Frame</title> +<script> +// This file is expected to be unreachable from +// wpt_internal/fenced_frame/embedder-require-corp.https.html +// because this file does not have COEP:require-corp and this file should not be +// loaded. +const key = KEYS["embed_no_coep"]; +writeValueToServer(key, "PASS"); +</script>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embeddee-no-coep.https.html.headers b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embeddee-no-coep.https.html.headers new file mode 100644 index 0000000..1b63235 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embeddee-no-coep.https.html.headers
@@ -0,0 +1 @@ +Supports-Loading-Mode: fenced-frame
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/history-length-outer-page-navigation-not-reflected-in-fenced-inner.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/history-length-outer-page-navigation-not-reflected-in-fenced-inner.html new file mode 100644 index 0000000..3c0ae69d --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/history-length-outer-page-navigation-not-reflected-in-fenced-inner.html
@@ -0,0 +1,74 @@ +<!DOCTYPE html> +<script src="utils.js"></script> +<title>history-length-outer-page-navigation-not-reflected-in-fenced-inner</title> + +<body> +<script> +(async () => { + // This is a helper file that will servec as the document loaded inside + // a fenced frame b 'history-length-outer-page-navigation-not-reflected-in- + // fenced' Once loaded, it reports to the observed value of history.length to + // the server so that the outer document can assert the value is 1. + + const fenced_history_length_key = KEYS["fenced_history_length"]; + const outer_page_ready_for_next_navigation_key = + KEYS["outer_page_ready_for_next_navigation"]; + + const url = new URL(location.href); + + const embed_scope_reporting = url.searchParams.get("embed_scope_reporting") + const embed_scope = url.searchParams.get("embed_scope") + + if (embed_scope == "outer_page::iframe"){ + ////////////// BEGIN NAVIGATIONS + // This block performs a sequence of 'kNavigationLimit' navigations in: + // -- the iframe + const kNavigationLimit = 5 + + const url = new URL(location.href); + + // First, perform some real navigations as well as history.pushState to + // this same page. Normally this would increase `history.length`. + if (url.searchParams.get("navigationCount") == null) + url.searchParams.append("navigationCount", 1); + + let navigationCount = parseInt(url.searchParams.get("navigationCount")); + + if (navigationCount <= kNavigationLimit) { + url.searchParams.set('navigationCount', ++navigationCount); + location.href = url; + history.pushState({} , ""); + return; + } + ////////////// END + writeValueToServer(outer_page_ready_for_next_navigation_key, "READY"); + return + } + + if (embed_scope == embed_scope_reporting) { + // Observe 'history.length' from within the 'embed_scope_reporting', + // and report the results back to the outer page. + if (history.length == 1) { + writeValueToServer(fenced_history_length_key, + "PASS > " + " history.length: " + history.length); + } else { + writeValueToServer(fenced_history_length_key, + "FAIL > " + " history.length: " + history.length); + } + return + } + + if (embed_scope_reporting == "outer_page::fenced_frame::iframe") { + // Append an iframe to the 'outer_page::fenced_frame' to report + // history.length to the outer_page from within the iframe + const iframe = document.createElement('iframe'); + iframe.src = + "history-length-outer-page-navigation-not-reflected-in-fenced-inner.html"+ + "?embed_scope_reporting=" + embed_scope_reporting + + "&embed_scope=outer_page::fenced_frame::iframe"; + document.body.append(iframe); + return + } +})(); +</script> +</body> \ No newline at end of file
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/history-length-outer-page-navigation-not-reflected-in-fenced-inner.html.headers b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/history-length-outer-page-navigation-not-reflected-in-fenced-inner.html.headers new file mode 100644 index 0000000..1b63235 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/history-length-outer-page-navigation-not-reflected-in-fenced-inner.html.headers
@@ -0,0 +1 @@ +Supports-Loading-Mode: fenced-frame
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/pointer-lock-inner.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/pointer-lock-inner.html index 57f0b74..d482926 100644 --- a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/pointer-lock-inner.html +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/pointer-lock-inner.html
@@ -6,30 +6,26 @@ <title>Fenced frame content to test pointer lock</title> <body> -<button id="button">Button</button> <script> -window.addEventListener("load", (async () => { - // Wait requestAnimationFrame to ensure that the page is updated, and - // test_driver.click() works. - await new Promise(resolve => { requestAnimationFrame(resolve); }); - const canvas = document.createElement('canvas'); - document.body.appendChild(canvas); - const button = document.getElementById("button"); - button.addEventListener('click', async () => { - const pointer_lock_key = KEYS['pointer-lock']; - const pointerlockerror_promise = new Promise(resolve => { - document.addEventListener('pointerlockerror', resolve); +window.onload = () => { + requestAnimationFrame(() => { + simulateGesture(async function() { + const canvas = document.createElement('canvas'); + document.body.appendChild(canvas); + const pointer_lock_key = KEYS['pointer-lock']; + const pointerlockerror_promise = new Promise(resolve => { + document.addEventListener('pointerlockerror', resolve); + }); + try { + await canvas.requestPointerLock(); + writeValueToServer(pointer_lock_key, 'Pointer lock succeeded'); + } catch (e) { + await pointerlockerror_promise; + writeValueToServer(pointer_lock_key, 'Pointer lock failed'); + } + document.exitPointerLock(); }); - try { - await canvas.requestPointerLock(); - writeValueToServer(pointer_lock_key, 'Pointer lock succeeded'); - } catch (e) { - await pointerlockerror_promise; - writeValueToServer(pointer_lock_key, 'Pointer lock failed'); - } - document.exitPointerLock(); }); - test_driver.click(button); -})); +}; </script> </body>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js index c24fff55..541a1ab 100644 --- a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js
@@ -89,6 +89,12 @@ "window.outersize" : "00000000-0000-0000-0000-00000000002D", "window.innersize" : "00000000-0000-0000-0000-00000000002E", + + "fenced_history_length" : "00000000-0000-0000-0000-00000000002F", + "outer_page_ready_for_next_navigation" : "00000000-0000-0000-0000-000000000030", + + "embed_coep_require_corp" : "00000000-0000-0000-0000-000000000031", + "embed_no_coep" : "00000000-0000-0000-0000-000000000032", // Add keys above this list, incrementing the key UUID in hexadecimal }
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/web-bluetooth-inner.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/web-bluetooth-inner.html index 45913a02..5c52ad3e 100644 --- a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/web-bluetooth-inner.html +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/web-bluetooth-inner.html
@@ -8,31 +8,27 @@ <body> <button id="button">Button</button> <script> -window.addEventListener("load", (async () => { - // Wait requestAnimationFrame to ensure that the page is updated, and - // test_driver.click() works. - await new Promise(resolve => { requestAnimationFrame(resolve); }); - - const button = document.getElementById("button"); - button.addEventListener('click', async () => { - const bluetooth_request_device_key = KEYS['bluetooth.requestDevice']; - try { - await navigator.bluetooth.requestDevice({filters: [{name: 'device'}]}); - writeValueToServer(bluetooth_request_device_key, - 'Web Bluetooth requestDevice() succeeded'); - } catch(e) { - if (e.name == 'NotAllowedError' && - e.message.includes( - 'Web Bluetooth is not allowed in a fenced frame tree.')) { +window.onload = () => { + requestAnimationFrame(() => { + simulateGesture(async function() { + const bluetooth_request_device_key = KEYS['bluetooth.requestDevice']; + try { + await navigator.bluetooth.requestDevice({filters: [{name: 'device'}]}); writeValueToServer(bluetooth_request_device_key, - 'Web Bluetooth requestDevice() failed'); - } else { - writeValueToServer(bluetooth_request_device_key, - `Web Bluetooth requestDevice() failed with unknown error - ${e.name}: ${e.message}`); + 'Web Bluetooth requestDevice() succeeded'); + } catch(e) { + if (e.name == 'NotAllowedError' && + e.message.includes( + 'Web Bluetooth is not allowed in a fenced frame tree.')) { + writeValueToServer(bluetooth_request_device_key, + 'Web Bluetooth requestDevice() failed'); + } else { + writeValueToServer(bluetooth_request_device_key, + `Web Bluetooth requestDevice() failed with unknown error - ${e.name}: ${e.message}`); + } } - } + }); }); - test_driver.click(button); -})) +}; </script> </body>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/web-share-inner.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/web-share-inner.html index 7ae4b6b..c3a850e 100644 --- a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/web-share-inner.html +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/web-share-inner.html
@@ -7,20 +7,18 @@ <body> <script> -(() => { - const button = document.createElement('button'); - button.appendChild(document.createTextNode('Click')); - button.addEventListener('click', async () => { - const navigator_share_key = KEYS['navigator.share']; - try { - await navigator.share({text: 'hello world'}); - writeValueToServer(navigator_share_key, 'Web Share succeeded'); - } catch(error) { - writeValueToServer(navigator_share_key, 'Web Share failed'); - } +window.onload = () => { + requestAnimationFrame(() => { + simulateGesture(async function() { + const navigator_share_key = KEYS['navigator.share']; + try { + await navigator.share({text: 'hello world'}); + writeValueToServer(navigator_share_key, 'Web Share succeeded'); + } catch(error) { + writeValueToServer(navigator_share_key, 'Web Share failed'); + } + }); }); - document.body.appendChild(button); - test_driver.click(button); -})(); +}; </script> </body>
diff --git a/third_party/blink/web_tests/wpt_internal/handwriting/handwriting-recognition-interface.https.html b/third_party/blink/web_tests/wpt_internal/handwriting/handwriting-recognition-interface.https.html index c1ec2b7e..d313b7ad 100644 --- a/third_party/blink/web_tests/wpt_internal/handwriting/handwriting-recognition-interface.https.html +++ b/third_party/blink/web_tests/wpt_internal/handwriting/handwriting-recognition-interface.https.html
@@ -10,44 +10,6 @@ import {generateHandwritingPrediction} from './resources/mock-handwriting-recognition-service.js'; promise_test(async () => { - assert_not_equals(navigator.queryHandwritingRecognizer, undefined); - assert_not_equals(navigator.queryHandwritingRecognizer, null); - assert_not_equals(navigator.createHandwritingRecognizer, undefined); - assert_not_equals(navigator.createHandwritingRecognizer, null); - assert_not_equals(HandwritingStroke, undefined); - assert_not_equals(HandwritingStroke, null); - }, 'Handwriting recognition exposed interfaces exist.'); - - promise_test(async () => { - const stroke = new HandwritingStroke(); - assert_equals(stroke.getPoints().length, 0); - stroke.addPoint({x:123, y:456, t:20}); - stroke.addPoint({x:31, y:654, t:100}); - assert_equals(stroke.getPoints().length, 2); - assert_equals(stroke.getPoints()[0].x, 123); - assert_equals(stroke.getPoints()[0].y, 456); - assert_equals(stroke.getPoints()[0].t, 20); - assert_equals(stroke.getPoints()[1].x, 31); - assert_equals(stroke.getPoints()[1].y, 654); - assert_equals(stroke.getPoints()[1].t, 100); - }, 'HandwritingStroke works as expected.'); - - promise_test(async () => { - const stroke = new HandwritingStroke(); - stroke.addPoint({x:1, y:2, t:3}); - assert_equals(stroke.getPoints().length, 1); - assert_equals(stroke.getPoints()[0].x, 1); - assert_equals(stroke.getPoints()[0].y, 2); - assert_equals(stroke.getPoints()[0].t, 3); - stroke.getPoints()[0].x = 100; - stroke.getPoints()[0].y = 200; - stroke.getPoints()[0].t = 300; - assert_equals(stroke.getPoints()[0].x, 1); - assert_equals(stroke.getPoints()[0].y, 2); - assert_equals(stroke.getPoints()[0].t, 3); - }, 'HandwritingPoint can not be changed after added.'); - - promise_test(async () => { const response = await navigator.queryHandwritingRecognizer({ languages: ['en'], });
diff --git a/third_party/libvpx/README.chromium b/third_party/libvpx/README.chromium index 4d22921..a6f74501 100644 --- a/third_party/libvpx/README.chromium +++ b/third_party/libvpx/README.chromium
@@ -6,9 +6,9 @@ License File: source/libvpx/LICENSE Security Critical: yes -Date: Friday November 19 2021 +Date: Tuesday December 07 2021 Branch: main -Commit: 13f984c2162d8392d3fd0ffb8666ee518f60665a +Commit: ab35ee100a38347433af24df05a5e1578172a2ae Description: Contains the sources used to compile libvpx binaries used by Google Chrome and
diff --git a/third_party/libvpx/source/config/vpx_version.h b/third_party/libvpx/source/config/vpx_version.h index 5f08a98b..c78057a 100644 --- a/third_party/libvpx/source/config/vpx_version.h +++ b/third_party/libvpx/source/config/vpx_version.h
@@ -2,8 +2,8 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 11 #define VERSION_PATCH 0 -#define VERSION_EXTRA "51-g13f984c21" +#define VERSION_EXTRA "53-gab35ee100" #define VERSION_PACKED \ ((VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | (VERSION_PATCH)) -#define VERSION_STRING_NOSP "v1.11.0-51-g13f984c21" -#define VERSION_STRING " v1.11.0-51-g13f984c21" +#define VERSION_STRING_NOSP "v1.11.0-53-gab35ee100" +#define VERSION_STRING " v1.11.0-53-gab35ee100"
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 6afd030..4714112 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -6971,12 +6971,14 @@ </action> <action name="EphemeralTab.NavigateLink"> + <obsolete>Deprecated as of 12/2021</obsolete> <owner>donnd@chromium.org</owner> <owner>jinsukkim@chromium.org</owner> <description>User navigated to a link inside the ephemeral tab.</description> </action> <action name="EphemeralTab.OpenInNewTab"> + <obsolete>Deprecated as of 12/2021</obsolete> <owner>donnd@chromium.org</owner> <owner>jinsukkim@chromium.org</owner> <description>User promoted the ephemeral tab to the full tab.</description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index e023d34..6bce7a2 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -3674,8 +3674,6 @@ <int value="10" label="Borealis app"/> <int value="11" label="System web app"/> <int value="12" label="Chrome browser (inc. web/Chrome apps in tabs)"/> - <int value="13" label="Chrome app opened in Standalone browser"/> - <int value="14" label="Browser extension"/> </enum> <enum name="AppTypeToMenuEntry"> @@ -3706,7 +3704,6 @@ <int value="13" label="System web app"/> <int value="14" label="Chrome browser (inc. web/Chrome apps in tabs)"/> <int value="15" label="Chrome app opened in Standalone browser"/> - <int value="16" label="Browser extension"/> </enum> <enum name="AppWillTerminateReceived"> @@ -12430,6 +12427,21 @@ <int value="5" label="Invoked through the omnibox entry point"/> </enum> +<enum name="ChromeOSSharesheetMimeType"> + <summary> + The mime types of the content the user is trying to share from the + sharesheet. + </summary> + <int value="0" label="Unknown mime type"/> + <int value="1" label="Text"/> + <int value="2" label="Url"/> + <int value="3" label="Text file"/> + <int value="4" label="Image file"/> + <int value="5" label="Video file"/> + <int value="6" label="Audio file"/> + <int value="7" label="Pdf file"/> +</enum> + <enum name="ChromeOSSharesheetShareAction"> <summary> The types of share actions present in the sharesheet when it is invoked. @@ -37298,6 +37310,12 @@ <int value="4" label="OPEN_MEDIA_DEVICE_IMPORT"/> </enum> +<enum name="FileManagerPrefsMigrationStatus"> + <int value="0" label="Success"/> + <int value="1" label="Fail to get existing preferences"/> + <int value="2" label="Fail to migrate preferences"/> +</enum> + <enum name="FileManagerQuickViewWayToOpen"> <int value="0" label="Context menu"/> <int value="1" label="Space key"/> @@ -42883,8 +42901,15 @@ <int value="-2147219425" label="GOOPDATE_E_APP_UPDATE_DISABLED_BY_POLICY_MANUAL"/> <int value="-2147219198" label="GOOPDATEINSTALL_E_INSTALLER_FAILED"/> + <int value="-2147174250" label="MSPR_E_NO_DECRYPTOR_AVAILABLE"/> <int value="-2147172343" label="DRM_E_LICENSEEXPIRED"/> - <int value="-2147169006" label="DRM_E_TEE_INVALID_CONTEXT"/> + <int value="-2147172333" label="DRM_E_LICENSE_NOT_FOUND"/> + <int value="-2147171352" label="DRM_E_LOGICERR"/> + <int value="-2147169008" label="DRM_E_TEE_INVALID_KEY_DATA"/> + <int value="-2147169006" label="DRM_E_TEE_INVALID_HWDRM_STATE"/> + <int value="-2147168990" + label="DRM_E_TEE_OUTPUT_PROTECTION_REQUIREMENTS_NOT_MET"/> + <int value="-2147168256" label="DRM_E_NONCE_STORE_TOKEN_NOT_FOUND"/> <int value="-2147168255" label="ITF_E_FONTFILE_UTIL_TOO_MANY_FILES_PER_FACE"/> <int value="-2147168254" label="ITF_E_FONTFILE_UTIL_EMPTY_FILE_PATH"/> <int value="-2147167999" label="ITF_E_SCANNING_TIMEOUT"/> @@ -42892,6 +42917,7 @@ <int value="-2147167997" label="ITF_E_EXTRACT_NO_FULL_NAME_OR_POSTSCRIPT_NAME"/> <int value="-2147167996" label="ITF_E_EXTRACT_NO_FAMILY_NAME"/> + <int value="-2147167231" label="DRM_E_XB_INVALID_OBJECT"/> <int value="-2147024894" label="ERROR_FILE_NOT_FOUND"/> <int value="-2147024893" label="ERROR_PATH_NOT_FOUND"/> <int value="-2147024891" label="E_ACCESSDENIED"/> @@ -47858,6 +47884,19 @@ <int value="1003" label="LAUNCH_RESULT_FAILURE"/> </enum> +<enum name="LauncherUserAction"> + <summary> + List of actions that represent a launcher workflow that the user can perform + within the launcher UI, either in tablet or clamshell mode. + </summary> + <int value="0" label="App launched from apps grid"/> + <int value="1" label="App launched from recent apps"/> + <int value="2" label="Search result opened"/> + <int value="3" label="App search result opened"/> + <int value="4" label="Continue section task opened"/> + <int value="5" label="Suggestion chip opened"/> +</enum> + <enum name="LaunchFromHomeScreen"> <int value="0" label="Launched as standalone web app"/> <int value="1" label="Launched as a tab"/> @@ -68573,7 +68612,7 @@ <int value="1" label="Missing"/> <int value="2" label="Read error"/> <int value="3" label="Parse error"/> - <int value="4" label="No-op"/> + <int value="4" label="No-op (unused)"/> </enum> <enum name="PersistentProtoWriteStatus"> @@ -75662,6 +75701,8 @@ <int value="0" label="Accepted"/> <int value="1" label="Dismissed"/> <int value="2" label="Settings"/> + <int value="3" label="Shown"/> + <int value="4" label="Rejected"/> </enum> <enum name="SafeBrowsingUserConsentVsUrlCheckRaceResult">
diff --git a/tools/metrics/histograms/metadata/apps/histograms.xml b/tools/metrics/histograms/metadata/apps/histograms.xml index 2cc8e8d1..98d312d 100644 --- a/tools/metrics/histograms/metadata/apps/histograms.xml +++ b/tools/metrics/histograms/metadata/apps/histograms.xml
@@ -47,7 +47,6 @@ <variant name="ChromeApp" summary="Chrome apps"/> <variant name="ChromeBrowser" summary="Chrome browsers"/> <variant name="Crostini" summary="Crostini apps"/> - <variant name="Extension" summary="Browser extensions"/> <variant name="MacOs" summary="MacOs apps"/> <variant name="PluginVm" summary="Plugin VM app"/> <variant name="RemoteApp" summary="Remote apps"/> @@ -69,7 +68,6 @@ summary="Chrome apps opened in standalone windows"/> <variant name="ChromeBrowser" summary="Chrome browsers"/> <variant name="Crostini" summary="Crostini apps"/> - <variant name="Extension" summary="Browser extensions"/> <variant name="MacOs" summary="MacOs apps"/> <variant name="PluginVm" summary="Plugin VM app"/> <variant name="RemoteApp" summary="Remote apps"/> @@ -369,6 +367,19 @@ </summary> </histogram> +<histogram name="Apps.AppList.AppLaunched{TabletOrClamshell}" + enum="AppListLaunchedFrom" expires_after="2022-12-19"> + <owner>gzadina@google.com</owner> + <owner>tbarzic@chromium.org</owner> + <summary> + The number of apps launched from different parts of the launcher (apps grid, + search results UI, recent apps), and the shelf. Values are incremented each + time the user launches an app. Each bucket represents where in the launcher + or shelf the app was launched from. Recorded for {TabletOrClamshell}. + </summary> + <token key="TabletOrClamshell" variants="TabletOrClamshellMode"/> +</histogram> + <histogram name="Apps.AppList.AppSearchProvider.QueryTime" units="ms" expires_after="2022-04-24"> <owner>jennyz@chromium.org</owner> @@ -761,7 +772,7 @@ </histogram> <histogram name="Apps.AppList.NumberOfRootLevelItems" units="count" - expires_after="2021-12-31"> + expires_after="2022-05-01"> <owner>mmourgos@chromium.org</owner> <owner>gzadina@google.com</owner> <summary> @@ -825,8 +836,7 @@ Various error states on reading a backing file from disk, in the score normalizer used by the Chrome OS launcher. Emitted once when a persistent proto initially reads from disk. Some number of Missing values are expected, - eg. because it is logged for each new user added to a device. Some number of - No-op values are expected if embedded messages are used. + eg. because it is logged for each new user added to a device. </summary> </histogram> @@ -1037,6 +1047,31 @@ </summary> </histogram> +<histogram name="Apps.AppList.TimeToUserAction{TabletOrClamshell}" units="ms" + expires_after="2022-12-19"> + <owner>gzadina@google.com</owner> + <owner>tbarzic@chromium.org</owner> + <summary> + Amount of time passed from when the launcher was shown to the user + performing a launcher workflow action, which includes launching an app from + the apps grid, launching an app from recent apps section, opening a search + result, or opening a task in continue section. Logged when the user performs + an action. Recorded for {TabletOrClamshell}. + </summary> + <token key="TabletOrClamshell" variants="TabletOrClamshellMode"/> +</histogram> + +<histogram name="Apps.AppList.UserAction{TabletOrClamshell}" + enum="LauncherUserAction" expires_after="2022-12-19"> + <owner>gzadina@google.com</owner> + <owner>tbarzic@chromium.org</owner> + <summary> + Tracks different launcher worflow actions the user performs in the launcher. + Logged when the user performs an action. Recorded for {TabletOrClamshell}. + </summary> + <token key="TabletOrClamshell" variants="TabletOrClamshellMode"/> +</histogram> + <histogram name="Apps.AppList.UserEvent.Error" enum="AppListSearchResult" expires_after="2022-08-15"> <obsolete> @@ -1377,7 +1412,7 @@ </histogram> <histogram name="Apps.AppListAppLaunchedV2{AppListState}" - enum="AppListLaunchedFrom" expires_after="2021-12-19"> + enum="AppListLaunchedFrom" expires_after="2022-12-19"> <owner>mmourgos@chromium.org</owner> <owner>newcomer@chromium.org</owner> <summary> @@ -1476,8 +1511,9 @@ </histogram> <histogram name="Apps.AppListCreationTime" units="ms" - expires_after="2021-04-18"> - <owner>calamity@chromium.org</owner> + expires_after="2022-06-01"> + <owner>tbarzic@chromium.org</owner> + <owner>mmourgos@chromium.org</owner> <summary> The amount of time it takes to build the app list UI. This is logged each time the app list is built from scratch. @@ -1485,7 +1521,7 @@ </histogram> <histogram name="Apps.AppListDefaultSearchResultOpenType" - enum="AppListSearchResult" expires_after="2021-12-31"> + enum="AppListSearchResult" expires_after="2022-06-01"> <owner>jennyz@chromium.org</owner> <owner>newcomer@chromium.org</owner> <summary> @@ -1517,7 +1553,7 @@ </histogram> <histogram base="true" name="Apps.AppListFolderNameLength" units="characters" - expires_after="2021-09-05"> + expires_after="2022-05-01"> <!-- Name completed by histogram_suffixes name="TabletOrClamshellMode" --> @@ -1541,7 +1577,7 @@ </histogram> <histogram name="Apps.AppListHide.InputLatency" units="ms" - expires_after="2021-04-05"> + expires_after="2022-05-01"> <owner>newcomer@chromium.org</owner> <owner>mmourgos@chromium.org</owner> <summary> @@ -1835,7 +1871,7 @@ </histogram> <histogram name="Apps.AppListSearchResultOpenTypeV2" enum="AppListSearchResult" - expires_after="2021-10-04"> + expires_after="2022-05-01"> <!-- Name completed by histogram_suffixes name="TabletOrClamshellMode" --> <owner>newcomer@chromium.org</owner> @@ -1848,7 +1884,7 @@ </histogram> <histogram name="Apps.AppListShow.InputLatency" units="ms" - expires_after="2021-02-14"> + expires_after="2022-12-31"> <owner>newcomer@chromium.org</owner> <owner>mmourgos@chromium.org</owner> <summary> @@ -2036,7 +2072,7 @@ </histogram> <histogram name="Apps.ContextMenuExecuteCommand{ContextMenuFromApp}" - enum="ChromeOSUICommands" expires_after="2021-01-31"> + enum="ChromeOSUICommands" expires_after="2022-12-31"> <owner>newcomer@chromium.org</owner> <owner>mmourgos@chromium.org</owner> <summary> @@ -2059,7 +2095,7 @@ <histogram name="Apps.ContextMenuShowSourceV2{AppUIComponent}{TabletOrClamshellMode}" - enum="MenuSourceType" expires_after="2022-01-31"> + enum="MenuSourceType" expires_after="2022-06-01"> <owner>wcwang@chromium.org</owner> <owner>mmourgos@chromium.org</owner> <summary> @@ -2099,7 +2135,7 @@ <histogram name="Apps.ContextMenuUserJourneyTimeV2{AppUIComponent}{TabletOrClamshellMode}" - units="ms" expires_after="2022-01-31"> + units="ms" expires_after="2022-06-01"> <owner>wcwang@chromium.org</owner> <owner>mmourgos@chromium.org</owner> <summary> @@ -2667,7 +2703,7 @@ </histogram> <histogram name="Apps.NumberOfFolders" units="folder(s)" - expires_after="2021-10-04"> + expires_after="2022-06-01"> <owner>mmourgos@chromium.org</owner> <owner>newcomer@chromium.org</owner> <summary> @@ -2678,7 +2714,7 @@ </histogram> <histogram name="Apps.NumberOfNonSystemFolders" units="folder(s)" - expires_after="2022-04-17"> + expires_after="2022-06-01"> <owner>jamescook@chromium.org</owner> <owner>newcomer@chromium.org</owner> <summary> @@ -2698,7 +2734,7 @@ </histogram> <histogram name="Apps.NumberOfPagesNotFull" units="page(s)" - expires_after="2021-12-12"> + expires_after="2022-04-17"> <owner>mmourgos@chromium.org</owner> <owner>newcomer@chromium.org</owner> <summary> @@ -2709,7 +2745,7 @@ <histogram name="Apps.OpenedAppListSearchResultFromSearchBox.{AnyNonAppBrowserWindowOpenAndNotMinimized}" - enum="AppListSearchResult" expires_after="M99"> + enum="AppListSearchResult" expires_after="M101"> <owner>andrewxu@chromium.org</owner> <owner>tbarzic@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml index cd17875..3be0273ca 100644 --- a/tools/metrics/histograms/metadata/chromeos/histograms.xml +++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -1897,6 +1897,21 @@ </token> </histogram> +<histogram name="ChromeOS.Sharesheet.CopyToClipboard.MimeType" units="mimetype" + expires_after="2022-10-08"> + <owner>melzhang@chromium.org</owner> + <owner>chromeos-apps-foundation-team@google.com</owner> + <summary> + Records the mime type of the content being copied after the Copy To + Clipboard action is invoked from the Sharesheet by the user. + + This histogram could record multiple times in a single share in the event + that the user shares data of mime types at once. However, a single share + will not record the same mime type twice. E.g. sharing 2 images in one share + will record the image mimetype once. + </summary> +</histogram> + <histogram name="ChromeOS.Sharesheet.FileCount" units="files" expires_after="2022-10-08"> <owner>dominickn@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/event/histograms.xml b/tools/metrics/histograms/metadata/event/histograms.xml index e2184591..97ce3f3 100644 --- a/tools/metrics/histograms/metadata/event/histograms.xml +++ b/tools/metrics/histograms/metadata/event/histograms.xml
@@ -2043,33 +2043,6 @@ </summary> </histogram> -<histogram name="Event.PageShow.Persisted.Unacked.Status" units="status" - expires_after="2022-10-01"> - <owner>hajimehoshi@chromium.org</owner> - <owner>fergal@chromium.org</owner> - <summary> - When we send a PageLifecycleState update that should trigger a pageshow - event with its persisted flag set but the renderer does not ack it and then - the renderer exits, this records the status of the process. This is an enum - (base::TerminationStatus in base/process/kill.h) but the values vary by - platform so we cannot use a regular enum metric. This is temporary debugging - for https://crbug.com/1234634. - </summary> -</histogram> - -<histogram name="Event.PageShow.Persisted.Unacked.Time" units="ms" - expires_after="2022-10-01"> - <owner>hajimehoshi@chromium.org</owner> - <owner>fergal@chromium.org</owner> - <summary> - When we send a PageLifecycleState update that should trigger a pageshow - event with its persisted flag set but the renderer does not ack it and then - the renderer exits, this records the time interval between sending the - update and exiting. This is temporary debugging for - https://crbug.com/1234634. - </summary> -</histogram> - <histogram name="Event.PassiveListeners" enum="EventResultType" expires_after="2022-04-10"> <owner>dtapuska@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/file/histograms.xml b/tools/metrics/histograms/metadata/file/histograms.xml index 2392cf2..c4e32ed 100644 --- a/tools/metrics/histograms/metadata/file/histograms.xml +++ b/tools/metrics/histograms/metadata/file/histograms.xml
@@ -775,6 +775,16 @@ </summary> </histogram> +<histogram name="FileBrowser.SWA.PrefsMigrationStatus" + enum="FileManagerPrefsMigrationStatus" expires_after="2022-04-17"> + <owner>simmonsjosh@google.com</owner> + <owner>src/ui/file_manager/OWNERS</owner> + <summary> + Chrome OS File Browser: Status of migration of preferences from Chrome app + version to System Web App + </summary> +</histogram> + <histogram name="FileBrowser.TeamDrivesCount" units="Team Drives" expires_after="M98"> <owner>simmonsjosh@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml index 769b417..5660bf56 100644 --- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml +++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -13388,9 +13388,6 @@ <suffix name="Malloc.BRPQuarantined" label="Memory used by objects quarantined by BRP, recorded when USE_BACKUP_REF_PTR build flag is enabled."/> - <suffix name="Malloc.BRPQuarantinedCount" - label="Number of slots quarantined by BRP, recorded when - USE_BACKUP_REF_PTR build flag is enabled."/> <suffix name="Malloc.ThreadCache" label="Memory used by all thread caches, recorded when PartitionAlloc is used as malloc()."/> @@ -13455,6 +13452,9 @@ </histogram_suffixes> <histogram_suffixes name="ProcessMemoryAllocatorTiny2" separator="."> + <suffix name="Malloc.BRPQuarantinedCount" + label="Number of slots quarantined by BRP, recorded when + USE_BACKUP_REF_PTR build flag is enabled."/> <suffix name="NumberOfAdSubframes" label=""/> <suffix name="NumberOfArrayBufferContents" label=""/> <suffix name="NumberOfAudioHandler" label=""/>
diff --git a/tools/metrics/histograms/metadata/login/histograms.xml b/tools/metrics/histograms/metadata/login/histograms.xml index 8ac017f2..06e0b2f 100644 --- a/tools/metrics/histograms/metadata/login/histograms.xml +++ b/tools/metrics/histograms/metadata/login/histograms.xml
@@ -243,6 +243,21 @@ </summary> </histogram> +<histogram name="Login.ReauthToken.FetchDuration.{Result}" units="ms" + expires_after="2022-06-01"> + <owner>yunkez@chromium.org</owner> + <owner>cros-oac@google.com</owner> + <summary> + Records the fetch duration of the reauth request token from the recovery + service when it {Result}. This is recorded on the GAIA reauth screen when + Cryptohome recovery is deemed to be needed in high probablity. + </summary> + <token key="Result"> + <variant name="Failure" summary="fails to fetch"/> + <variant name="Success" summary="successfully fetches"/> + </token> +</histogram> + <histogram name="Login.SessionExitType" enum="LoginSessionExitType" expires_after="2022-05-01"> <owner>iby@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml index 12fa89b7..d9e747b7 100644 --- a/tools/metrics/histograms/metadata/net/histograms.xml +++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -4951,6 +4951,21 @@ </summary> </histogram> +<histogram + name="Net.Radio.PossibleWakeupTrigger.{ProtocolType}WriteAnnotationId" + enum="TrafficAnnotationUniqueIdHash" expires_after="2022-06-01"> + <owner>bashi@chromium.org</owner> + <owner>src/net/OWNERS</owner> + <summary> + Records a traffic annotation ID hash when a write to a {ProtocolType} socket + happens and the radio state is dormant. Only recorded on Android. + </summary> + <token key="ProtocolType"> + <variant name="TCP"/> + <variant name="UDP"/> + </token> +</histogram> + <histogram name="Net.RedirectChainLength" units="redirects" expires_after="M85"> <owner>csharrison@chromium.org</owner> <owner>rsleevi@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index 67eccec..f03f6499 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -1574,8 +1574,9 @@ <summary>Records whenever a Blimp tab toggles visibility.</summary> </histogram> -<histogram name="BlueZ.AdapterLost" units="seconds" expires_after="2022-04-17"> +<histogram name="BlueZ.AdapterLost" units="seconds" expires_after="2022-12-31"> <owner>mcchou@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records a duration of a Bluetooth adapter being lost. This helps us better understand the Bluetooth controller drop @@ -1584,7 +1585,7 @@ </histogram> <histogram name="BlueZ.AdvertisementMonitor.NumOfMonitors" units="count" - expires_after="2022-04-24"> + expires_after="2022-12-31"> <owner>apusaka@chromium.org</owner> <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> @@ -1595,7 +1596,7 @@ </histogram> <histogram name="BlueZ.AdvertisementMonitor.{Filter}.FilterPatternsPerMinute" - units="count" expires_after="2021-12-31"> + units="count" expires_after="2022-12-31"> <owner>apusaka@chromium.org</owner> <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> @@ -1611,7 +1612,7 @@ </histogram> <histogram name="BlueZ.AdvertisementMonitor.{Filter}.{Operation}.Result" - enum="BlueZResultOfAdvertisementMonitor" expires_after="2021-12-31"> + enum="BlueZResultOfAdvertisementMonitor" expires_after="2022-12-31"> <owner>apusaka@chromium.org</owner> <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> @@ -1630,8 +1631,9 @@ </token> </histogram> -<histogram name="BlueZ.ChipLost2" units="seconds" expires_after="2022-04-10"> +<histogram name="BlueZ.ChipLost2" units="seconds" expires_after="2022-12-31"> <owner>sonnysasaka@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records a duration of a Bluetooth adapter being lost caused by hardware disconnection. This helps us better understand @@ -1640,8 +1642,9 @@ </histogram> <histogram name="BlueZ.NumberOfExistingAdvertisements" units="advertisements" - expires_after="2022-04-24"> + expires_after="2022-12-31"> <owner>mcchou@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records the number of existing advertisements when registering for a new advertisement. This helps us better understand @@ -1651,7 +1654,7 @@ </histogram> <histogram name="BlueZ.PerProfile.ConnectionResult" - enum="BlueZResultOfPerProfileConnection" expires_after="2021-12-31"> + enum="BlueZResultOfPerProfileConnection" expires_after="2022-12-31"> <!-- Name completed by histogram_suffixes name="BlueZPerProfileResult" --> <owner>mmandlik@google.com</owner> @@ -1664,7 +1667,7 @@ </histogram> <histogram name="BlueZ.PerProfile.ProbingResult" - enum="BlueZResultOfPerProfileProbing" expires_after="2021-12-31"> + enum="BlueZResultOfPerProfileProbing" expires_after="2022-12-31"> <!-- Name completed by histogram_suffixes name="BlueZPerProfileResult" --> <owner>mmandlik@google.com</owner> @@ -1677,8 +1680,9 @@ </histogram> <histogram name="BlueZ.ReasonOfDisconnection" enum="BlueZReasonOfDisconnection" - expires_after="2022-04-24"> + expires_after="2022-12-31"> <owner>mcchou@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records the reason of Bluetooth disconnection between the local device and the remote Bluetooth device. This helps us @@ -1687,8 +1691,9 @@ </histogram> <histogram name="BlueZ.ResultOfAdvertisementRegistration" - enum="BlueZResultOfAdvertisementRegistration" expires_after="2021-12-31"> + enum="BlueZResultOfAdvertisementRegistration" expires_after="2022-12-31"> <owner>mcchou@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records the outcomes of advertisement registration. This helps us better understand the persentage of successful @@ -1697,8 +1702,9 @@ </histogram> <histogram name="BlueZ.ResultOfConnection" enum="BlueZResultOfConnection" - expires_after="2022-04-03"> + expires_after="2022-12-31"> <owner>mcchou@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records the outcomes of connection requests to remote devices. This helps us better understand the persentage of @@ -1707,8 +1713,9 @@ </histogram> <histogram name="BlueZ.ResultOfPairing" enum="BlueZResultOfPairing" - expires_after="2022-04-03"> + expires_after="2022-12-31"> <owner>mcchou@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records the outcomes of pairing with remote devices. This helps us better understand the persentage of successful @@ -1717,8 +1724,9 @@ </histogram> <histogram name="BlueZ.TimeLengthOfAdvertisement" units="seconds" - expires_after="2021-12-31"> + expires_after="2022-12-31"> <owner>mcchou@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records the duration when the local device is performing Bluetooth advertisment and discoverable as a Bluetooth Low Energy @@ -1728,8 +1736,9 @@ </histogram> <histogram name="BlueZ.TimeLengthOfDiscoverable" units="seconds" - expires_after="2022-04-24"> + expires_after="2022-12-31"> <owner>mcchou@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records the duration when the local device is discoverable by other devices as a Bluetooth classic device. This helps us @@ -1739,8 +1748,9 @@ </histogram> <histogram name="BlueZ.TimeLengthOfDiscovering" units="seconds" - expires_after="2022-04-17"> + expires_after="2022-12-31"> <owner>mcchou@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records the duration for the local device to perform device discovery. This helps us better understand the amount of @@ -1750,8 +1760,9 @@ </histogram> <histogram name="BlueZ.TimeLengthOfPairing" units="seconds" - expires_after="2022-04-03"> + expires_after="2022-12-31"> <owner>mcchou@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records the duration taken to finish a successful pairing between the local device and a remote Bluetooth device. @@ -1760,8 +1771,9 @@ </histogram> <histogram name="BlueZ.TimeLengthOfSetupConnection" units="seconds" - expires_after="2022-04-10"> + expires_after="2022-12-31"> <owner>mcchou@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records the duration taken to finish a successful connection between the local device and a remote Bluetooth @@ -1771,8 +1783,9 @@ </histogram> <histogram name="BlueZ.TypeOfDiscovery" enum="BlueZTypeOfDiscovery" - expires_after="2022-04-24"> + expires_after="2022-12-31"> <owner>mcchou@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records the types of device discovery performed by the local device. This helps us better understand the most @@ -1781,8 +1794,9 @@ </histogram> <histogram name="BlueZ.TypeOfFoundDevice" enum="BlueZTypeOfFoundDevice" - expires_after="2021-12-31"> + expires_after="2022-12-31"> <owner>mcchou@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> <summary> This is specific to Chrome OS. Records the types of discovered devices in terms of Bluetooth classic, Bluetooth low energy and Dual-mode supports. @@ -5766,6 +5780,9 @@ <histogram name="EphemeralTab.Ctr" enum="BooleanOpened" expires_after="2021-12-12"> + <obsolete> + Deprecated as of 12/2021 + </obsolete> <owner>donnd@chromium.org</owner> <owner>jinsukkim@chromium.org</owner> <summary> @@ -5776,6 +5793,9 @@ <histogram name="EphemeralTab.CtrPeek" enum="BooleanOpened" expires_after="2021-12-12"> + <obsolete> + Deprecated as of 12/2021 + </obsolete> <owner>donnd@chromium.org</owner> <owner>jinsukkim@chromium.org</owner> <summary> @@ -5786,6 +5806,9 @@ <histogram name="EphemeralTab.DurationOpened" units="ms" expires_after="2021-12-12"> + <obsolete> + Deprecated as of 12/2021 + </obsolete> <owner>donnd@chromium.org</owner> <owner>jinsukkim@chromium.org</owner> <summary> @@ -5796,6 +5819,9 @@ <histogram name="EphemeralTab.DurationPeeked" units="ms" expires_after="2021-10-10"> + <obsolete> + Deprecated as of 12/2021 + </obsolete> <owner>donnd@chromium.org</owner> <owner>jinsukkim@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/platform/histograms.xml b/tools/metrics/histograms/metadata/platform/histograms.xml index e66a9914..e39a9ab 100644 --- a/tools/metrics/histograms/metadata/platform/histograms.xml +++ b/tools/metrics/histograms/metadata/platform/histograms.xml
@@ -1366,7 +1366,7 @@ </histogram> <histogram name="Platform.UnaggregatedUsageTime" units="seconds" - expires_after="2022-04-03"> + expires_after="2022-10-03"> <owner>mutexlox@chromium.org</owner> <owner>iby@chromium.org</owner> <owner>cros-telemetry@google.com</owner> @@ -1381,7 +1381,7 @@ </histogram> <histogram name="Platform.UnaggregatedUsageTimeTooBig" units="seconds" - expires_after="2022-01-08"> + expires_after="2022-07-08"> <owner>mutexlox@chromium.org</owner> <owner>iby@chromium.org</owner> <owner>cros-telemetry@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/power/histograms.xml b/tools/metrics/histograms/metadata/power/histograms.xml index a796910..9f00ee4 100644 --- a/tools/metrics/histograms/metadata/power/histograms.xml +++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -762,9 +762,9 @@ </histogram> <histogram name="Power.FrameDamageAreaInDip.{ProcessType}" units="dip" - expires_after="M98"> + expires_after="2022-06-30"> <owner>eseckler@chromium.org</owner> - <owner>skyostil@chromium.org</owner> + <owner>khokhlov@chromium.org</owner> <summary> Damaged area of a LayerTree's CompositorFrame in device-independent pixels. Recorded every time a new frame is produced. @@ -776,9 +776,9 @@ </histogram> <histogram name="Power.FrameDamageDiagonalInDip.{ProcessType}" units="dip" - expires_after="M98"> + expires_after="2022-06-30"> <owner>eseckler@chromium.org</owner> - <owner>skyostil@chromium.org</owner> + <owner>khokhlov@chromium.org</owner> <summary> Diagonal length of the damaged area of a LayerTree's CompositorFrame in device-independent pixels. Recorded every time a new frame is produced.
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml index 7c5eef1..f936655 100644 --- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml +++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -1737,6 +1737,25 @@ </summary> </histogram> +<histogram + name="SafeBrowsing.TailoredSecurityConsented{Status}{PromptType}Outcome" + enum="SafeBrowsingTailoredSecurityOutcome" expires_after="2022-11-22"> + <owner>bhatiarohit@google.com</owner> + <owner>chrome-safebrowsing-alerts@google.com</owner> + <summary> + Logs the outcome of displaying the {PromptType} when a signed-in, syncing + user changes their account tailored security setting to {Status}. + </summary> + <token key="Status"> + <variant name="Disabled" summary="disabled"/> + <variant name="Enabled" summary="enabled"/> + </token> + <token key="PromptType"> + <variant name="Message" summary="android message"/> + <variant name="Notification" summary="desktop notification"/> + </token> +</histogram> + <histogram name="SafeBrowsing.TailoredSecurityService.OAuthTokenCompletion" enum="BooleanSuccess" expires_after="2022-09-09"> <owner>bdea@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/startup/histograms.xml b/tools/metrics/histograms/metadata/startup/histograms.xml index 3fd91665..bc58ef3 100644 --- a/tools/metrics/histograms/metadata/startup/histograms.xml +++ b/tools/metrics/histograms/metadata/startup/histograms.xml
@@ -635,6 +635,17 @@ </summary> </histogram> +<histogram name="Startup.ConsecutiveDidFinishLaunchingWithoutLaunch" + units="count" expires_after="2022-09-30"> + <owner>olivierrobin@chromium.org</owner> + <owner>ajuma@chromium.org</owner> + <summary> + [IOS] The number of time [UIApplicationDelegate + application:didFinishLaynching] was called but no scene was activated. + Recorded when first scene is becomes active. + </summary> +</histogram> + <histogram name="Startup.ConsecutiveLoadsWithoutLaunch" units="count" expires_after="2022-09-30"> <owner>olivierrobin@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/webapps/histograms.xml b/tools/metrics/histograms/metadata/webapps/histograms.xml index 539081c..d5eca1d 100644 --- a/tools/metrics/histograms/metadata/webapps/histograms.xml +++ b/tools/metrics/histograms/metadata/webapps/histograms.xml
@@ -439,7 +439,7 @@ Preinstalled web app configs can specify a set of apps to uninstall after the preinstalled web app is installed. - This records whether these apps that are meant to be uninstalled are still + This records how many apps that are meant to be uninstalled are still installed. This could occur due to manual installation by the user or Chrome app sync, see https://crbug.com/1266234. @@ -448,6 +448,38 @@ </summary> </histogram> +<histogram name="WebApp.Preinstalled.AppToReplaceStillInstalledInShelfCount" + units="apps" expires_after="2022-04-17"> + <owner>alancutter@chromium.org</owner> + <owner>desktop-pwas-team@google.com</owner> + <summary> + Preinstalled web app configs can specify a set of apps to uninstall after + the preinstalled web app is installed. + + This records how many apps that are meant to be uninstalled are still + installed and present in the Chrome OS shelf; see https://crbug.com/1266234. + + This gets recorded at start up after preinstalled web apps configs have been + applied. + </summary> +</histogram> + +<histogram name="WebApp.Preinstalled.AppToReplaceStillSyncInstalledCount" + units="apps" expires_after="2022-04-17"> + <owner>alancutter@chromium.org</owner> + <owner>desktop-pwas-team@google.com</owner> + <summary> + Preinstalled web app configs can specify a set of apps to uninstall after + the preinstalled web app is installed. + + This records how many apps that are meant to be uninstalled are still + installed due to Chrome app sync; see https://crbug.com/1266234. + + This gets recorded at start up after preinstalled web apps configs have been + applied. + </summary> +</histogram> + <histogram name="WebApp.Preinstalled.ConfigErrorCount" units="apps" expires_after="2022-06-05"> <owner>alancutter@chromium.org</owner>
diff --git a/ui/accessibility/accessibility_features.cc b/ui/accessibility/accessibility_features.cc index 702c5a0..5ff9c807 100644 --- a/ui/accessibility/accessibility_features.cc +++ b/ui/accessibility/accessibility_features.cc
@@ -148,15 +148,6 @@ ::features::kExperimentalAccessibilityDictationCommands); } -const base::Feature kExperimentalAccessibilitySwitchAccessSetupGuide{ - "ExperimentalAccessibilitySwitchAccessSetupGuide", - base::FEATURE_ENABLED_BY_DEFAULT}; - -bool IsExperimentalAccessibilitySwitchAccessSetupGuideEnabled() { - return base::FeatureList::IsEnabled( - ::features::kExperimentalAccessibilitySwitchAccessSetupGuide); -} - const base::Feature kEnhancedNetworkVoices{"EnhancedNetworkVoices", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/ui/accessibility/accessibility_features.h b/ui/accessibility/accessibility_features.h index f3b0cdd..44c579b 100644 --- a/ui/accessibility/accessibility_features.h +++ b/ui/accessibility/accessibility_features.h
@@ -118,14 +118,6 @@ // text editing commands is enabled. AX_BASE_EXPORT bool IsExperimentalAccessibilityDictationCommandsEnabled(); -// Enable a setup guide to walk through the steps of initially configuring -// Switch Access. -AX_BASE_EXPORT extern const base::Feature - kExperimentalAccessibilitySwitchAccessSetupGuide; - -// Returns true if setup guide for Switch Access is enabled. -AX_BASE_EXPORT bool IsExperimentalAccessibilitySwitchAccessSetupGuideEnabled(); - // Enables high-quality, network-based voices in Select-to-speak. AX_BASE_EXPORT extern const base::Feature kEnhancedNetworkVoices;
diff --git a/ui/accessibility/ax_event_generator.cc b/ui/accessibility/ax_event_generator.cc index ae66c0f3..24125ba 100644 --- a/ui/accessibility/ax_event_generator.cc +++ b/ui/accessibility/ax_event_generator.cc
@@ -305,6 +305,12 @@ // and line layout. We don't expose those to platform APIs, though, so // suppress CHILDREN_CHANGED events on static text nodes. if (new_node_data.child_ids != old_node_data.child_ids && !node->IsText()) { + if (node->IsIgnored()) { + AXNode* unignored_parent = node->GetUnignoredParent(); + if (unignored_parent) + AddEvent(unignored_parent, Event::CHILDREN_CHANGED); + return; + } AddEvent(node, Event::CHILDREN_CHANGED); } }
diff --git a/ui/accessibility/ax_event_generator_unittest.cc b/ui/accessibility/ax_event_generator_unittest.cc index 38df4e1..bf9038fb 100644 --- a/ui/accessibility/ax_event_generator_unittest.cc +++ b/ui/accessibility/ax_event_generator_unittest.cc
@@ -3364,4 +3364,48 @@ // HasEventAtNode(AXEventGenerator::Event::PARENT_CHANGED, 101), } +TEST(AXEventGeneratorTest, InsertUnderIgnoredTest) { + AXTreeUpdate initial_state; + initial_state.root_id = 1; + { + AXNodeData data; + data.id = 1; + data.role = ax::mojom::Role::kRootWebArea; + data.child_ids = {3}; + initial_state.nodes.push_back(data); + } + { + AXNodeData data; + data.id = 3; + data.role = ax::mojom::Role::kGenericContainer; + data.AddState(ax::mojom::State::kIgnored); + initial_state.nodes.push_back(data); + } + AXTree tree(initial_state); + + AXEventGenerator event_generator(&tree); + AXTreeUpdate update; + update.node_id_to_clear = 3; + { + AXNodeData data; + data.id = 3; + data.role = ax::mojom::Role::kGenericContainer; + data.child_ids = {5}; + data.AddState(ax::mojom::State::kIgnored); + update.nodes.push_back(data); + } + { + AXNodeData data; + data.id = 5; + data.role = ax::mojom::Role::kGenericContainer; + update.nodes.push_back(data); + } + + EXPECT_TRUE(tree.Unserialize(update)); + EXPECT_THAT(event_generator, + UnorderedElementsAre( + HasEventAtNode(AXEventGenerator::Event::CHILDREN_CHANGED, 1), + HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 5))); +} + } // namespace ui
diff --git a/ui/chromeos/styles/cros_colors.json5 b/ui/chromeos/styles/cros_colors.json5 index e4f7b17..1ac6c0c 100644 --- a/ui/chromeos/styles/cros_colors.json5 +++ b/ui/chromeos/styles/cros_colors.json5
@@ -188,6 +188,10 @@ dark: "rgba($google_blue_300_rgb, 0.3)", debug: "rgba($google_red_300_rgb, 0.3)", }, + highlight_color_error: { + light: "$google_red_50", + dark: "rgba($color_alert_rgb, 0.3)", + }, highlight_color_hover: { light: "rgba($google_grey_700_rgb, 0.2)", dark: "rgba($white_rgb, 0.2)",
diff --git a/ui/chromeos/translations/ui_chromeos_strings_af.xtb b/ui/chromeos/translations/ui_chromeos_strings_af.xtb index 5edaf58..d0b76ed 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_af.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_af.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Alles is gerugsteun!</translation> <translation id="3634507049637220048">Netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, deur jou administrateur bestuur, besonderhede</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> items is geskuif.</translation> -<translation id="3645531960514756307">Ontspeld vouer</translation> <translation id="3685122418104378273">Google Drive-sinkronisering is by verstek afgeskakel wanneer dit mobiele data gebruik.</translation> <translation id="3689865792480713551">Kanselleer <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />; nie geaktiveer nie; <ph name="CONNECTION_STATUS" />; seinsterkte <ph name="SIGNAL_STRENGTH" />%; besonderhede</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Ons soek gedurig na maniere om jou blaai-ervaring veiliger te maak. Voorheen kon enige webwerf jou vra om 'n uitbreiding by jou blaaier te voeg. In die nuutste weergawes van Google Chrome moet jy Chrome spesifiek aansê dat jy hierdie uitbreidings wil installeer deur hulle via die uitbreidingbladsy by te voeg. <ph name="BEGIN_LINK" />Kom meer te wete<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Ontsluit</translation> <translation id="912419004897138677">Kodek</translation> -<translation id="9129931661813833980">Speld vouer vas</translation> <translation id="9130775360844693113">Lede van "<ph name="DESTINATION_NAME" />" sal toegang tot hierdie items kry.</translation> <translation id="9131598836763251128">Kies een of meer lêers</translation> <translation id="9133055936679483811">Kon nie kompakteer nie. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_am.xtb b/ui/chromeos/translations/ui_chromeos_strings_am.xtb index da0c05e..56259a0b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_am.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_am.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">ሁሉም በምትኬ ተቀምጧል!</translation> <translation id="3634507049637220048">አውታረመረብ <ph name="NETWORK_INDEX" /> ከ<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />፣ <ph name="CONNECTION_STATUS" />፣ በእርስዎ አስተዳዳሪ የሚተዳደር፣ ዝርዝሮች</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> ንጥሎች ተወስደዋል።</translation> -<translation id="3645531960514756307">አቃፍን አታያይዝ</translation> <translation id="3685122418104378273">የሞባይል ውሂብ ጥቅም ላይ በሚውልበት ጊዜ Google Drive ማመሳሰል በነባሪ ይሰናከላል።</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" />ን ሰርዝ።</translation> <translation id="3690128548376345212">አውታረ መረብ <ph name="NETWORK_INDEX" /> ከ<ph name="NETWORK_COUNT" />፣ <ph name="NETWORK_NAME" />፣ ያልነቃ፣ <ph name="CONNECTION_STATUS" />፣ የሲግናል ጥንካሬ <ph name="SIGNAL_STRENGTH" />%፣ ዝርዝሮች</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">የእርስዎን አሰሳ ይበልጥ ደህንነቱ የተጠበቀ የሚሆንባቸው መንገዶችን በቋሚነት እየፈለግን ነው። ከዚህ ቀደም ማንኛውም ድር ጣቢያ ቅጥያ በአሳሽዎ ላይ እንዲያክሉ ሊጠይቅዎ ይችል ነበር። በቅርቦቹ የGoogle Chrome ስሪቶች ላይ እነዚህን ቅጥያዎች በቅጥያዎች ገጹ በኩል በማከል እንደሚፈልጓቸው በግልጽ ለChrome መንገር አለብዎት። <ph name="BEGIN_LINK" />ተጨማሪ ለመረዳት<ph name="END_LINK" /></translation> <translation id="9111102763498581341">ክፈት</translation> <translation id="912419004897138677">ኮዴክ</translation> -<translation id="9129931661813833980">አቃፊን አያይዝ</translation> <translation id="9130775360844693113">የ«<ph name="DESTINATION_NAME" />» አባላት የእነዚህ ንጥሎች መዳረሻ ያገኛሉ።</translation> <translation id="9131598836763251128">አንድ ወይም ተጨማሪ ፋይሎችን ይምረጡ</translation> <translation id="9133055936679483811">መጭመቅ አልተሳካም። <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb index e26119f..8aa95ba 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">تم نسخ جميع العناصر احتياطيًا</translation> <translation id="3634507049637220048">الشبكة <ph name="NETWORK_INDEX" /> من <ph name="NETWORK_COUNT" />، الشبكة <ph name="NETWORK_NAME" />، حالة الاتصال <ph name="CONNECTION_STATUS" />، يديرها المشرف، التفاصيل</translation> <translation id="3645233063072417428">تم نقل <ph name="NUMBER_OF_ITEMS" /> عنصر.</translation> -<translation id="3645531960514756307">إزالة تثبيت علامة تبويب المجلد</translation> <translation id="3685122418104378273">يتم إيقاف مزامنة Google Drive بشكل تلقائي، عند استخدام بيانات الجوّال.</translation> <translation id="3689865792480713551">إلغاء <ph name="ACTIVITY_DESCRIPTION" /></translation> <translation id="3690128548376345212">الشبكة <ph name="NETWORK_INDEX" /> من إجمالي <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، غير مفعّلة، <ph name="CONNECTION_STATUS" />، قوة الإشارة <ph name="SIGNAL_STRENGTH" />%، التفاصيل</translation> @@ -928,7 +927,6 @@ <translation id="9110990317705400362">نحن نبحث باستمرار عن طرق من شأنها زيادة أمان تجربة تصفحك. في السابق، كان من الممكن لأي موقع إلكتروني أن يطالبك بتثبيت إضافة في متصفحك. أما في أحدث إصدارات Google Chrome، فيجب أن تبلغ Chrome صراحة أنك تريد تثبيت هذه الإضافات عن طريق إضافتها عبر صفحة الإضافات. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation> <translation id="9111102763498581341">فتح القفل</translation> <translation id="912419004897138677">برنامج ترميز</translation> -<translation id="9129931661813833980">تثبيت المجلد</translation> <translation id="9130775360844693113">سيحصل أعضاء '<ph name="DESTINATION_NAME" />' على إمكانية الوصول إلى هذه العناصر.</translation> <translation id="9131598836763251128">اختيار ملف واحد أو أكثر</translation> <translation id="9133055936679483811">تعذّر الضغط. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_as.xtb b/ui/chromeos/translations/ui_chromeos_strings_as.xtb index 2ae09ae..414b829 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_as.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_as.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">সকলো বেক আপ সম্পূর্ণ হৈ আছে!</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" />টা নেটৱৰ্কৰ <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, আপোনাৰ প্ৰশাসকে পৰিচালনা কৰে, সবিশেষ</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> টা বস্তু স্থানান্তৰ কৰা হ'ল।</translation> -<translation id="3645531960514756307">ফ’ল্ডাৰ আনপিন কৰক</translation> <translation id="3685122418104378273">ডিফ’ল্ট অনুসৰি ম’বাইল ডেটা ব্যৱহাৰ কৰাৰ সময়ত Google Drive ছিংক অক্ষম কৰা হৈছে।</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> বাতিল কৰক।</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" /> টাৰ ভিতৰত <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, সক্ৰিয় নকৰা, <ph name="CONNECTION_STATUS" />, ছিগনেলৰ ক্ষমতা <ph name="SIGNAL_STRENGTH" />%, সবিশেষ</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">আমি আপোনাৰ ব্ৰাউজিং সুৰক্ষিত কৰিবলৈ সদায়েই উপায় বিচাৰি আছোঁ। পূৰ্বতে, যিকোনো ৱেবছাইটে আপোনাৰ ব্ৰাউজাৰত এক্সটেনশ্বন যোগ কৰিবলৈ আপোনাক প্ৰ’ম্প্ট কৰিব পাৰিছিল। Google Chromeৰ শেহতীয়া সংস্কৰণত আপুনি Chromeক স্পষ্টভাৱে ক’ব লাগিব যে আপুনি এক্সটেনশ্বন পৃষ্ঠাটোৰ জৰিয়তে এই এক্সটেনশ্বনসমূহ ইনষ্টল কৰিবলৈ বিচাৰে। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /></translation> <translation id="9111102763498581341">আনলক</translation> <translation id="912419004897138677">ক’ডেক</translation> -<translation id="9129931661813833980">ফ’ল্ডাৰ পিন কৰক</translation> <translation id="9130775360844693113">‘<ph name="DESTINATION_NAME" />’ৰ সদস্যসকলে এই বস্তুবোৰলৈ এক্সেছ পাব।</translation> <translation id="9131598836763251128">এটা বা একাধিক ফাইল বাছনি কৰক</translation> <translation id="9133055936679483811">জিপ কৰিব পৰা নগ’ল। <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_az.xtb b/ui/chromeos/translations/ui_chromeos_strings_az.xtb index 823eda99c..1ad02433 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_az.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_az.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Hamısı yedəklənib!</translation> <translation id="3634507049637220048"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> şəbəkə, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Administratorunuz tərəfindən idarə olunur, Detallar</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> element köçürüldü</translation> -<translation id="3645531960514756307">Qovluğu paneldən çıxarın</translation> <translation id="3685122418104378273">Mobil data istifadə edərkən Google Disk sinxronizasiyası defolt olaraq deaktiv edilib.</translation> <translation id="3689865792480713551">Ləğv edin: <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Şəbəkə <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Deaktivdir, <ph name="CONNECTION_STATUS" />, Siqnal Gücü <ph name="SIGNAL_STRENGTH" />%, Detallar</translation> @@ -924,7 +923,6 @@ <translation id="9110990317705400362">Brauzerinizi güvənli etməyin yollarını daima axtarırıq. Son Chrome versiyasında artırmaları əlavə etmək üçün bunu Chrome'a açıq şəkildə deməlisiniz. <ph name="BEGIN_LINK" />Ətraflı məlumat<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Kiliddən çıxarın</translation> <translation id="912419004897138677">Kodeks</translation> -<translation id="9129931661813833980">Qovluğu panelə bərkidin</translation> <translation id="9130775360844693113">"<ph name="DESTINATION_NAME" />" üzvləri bu elementlərə daxil ola biləcək.</translation> <translation id="9131598836763251128">Bir və ya daha çox fayl seçin</translation> <translation id="9133055936679483811">Sızlaşdırma uğursuz oldu. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_be.xtb b/ui/chromeos/translations/ui_chromeos_strings_be.xtb index c1b2ae4a..249077a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_be.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_be.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Усё захавана ў рэзервовую копію!</translation> <translation id="3634507049637220048">Сетка <ph name="NETWORK_INDEX" /> з <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, знаходзіцца пад кіраваннем адміністратара, падрабязныя звесткі</translation> <translation id="3645233063072417428">Перамешчана элементаў: <ph name="NUMBER_OF_ITEMS" /></translation> -<translation id="3645531960514756307">Адмацаваць папку</translation> <translation id="3685122418104378273">Пры выкарыстанні мабільнай перадачы даных са стандартнымі наладамі сінхранізацыя з Google Дыскам выключана.</translation> <translation id="3689865792480713551">Скасаваць дзеянне "<ph name="ACTIVITY_DESCRIPTION" />".</translation> <translation id="3690128548376345212">Сетка <ph name="NETWORK_INDEX" /> з <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, адключана, <ph name="CONNECTION_STATUS" />, магутнасць сігналу – <ph name="SIGNAL_STRENGTH" />%, падрабязныя звесткі</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Мы пастаянна працуем над новымі спосабамі зрабіць працу ў інтэрнэце больш бяспечнай. Раней любы сайт мог прапанаваць вам дадаць пашырэнні ў браўзер. У апошніх версіях Google Chrome пашырэнні трэба дадаваць праз старонку "Пашырэнні", даючы браўзеру яўнае ўказанне, што вы хочаце іх усталяваць. <ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Разблакіраваць</translation> <translation id="912419004897138677">Кодэк</translation> -<translation id="9129931661813833980">Замацаваць папку</translation> <translation id="9130775360844693113">Да гэтых элементаў атрымаюць доступ удзельнікі дыска "<ph name="DESTINATION_NAME" />".</translation> <translation id="9131598836763251128">Выберыце адзін або некалькі файлаў</translation> <translation id="9133055936679483811">Збой архівавання. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb index 9e5343f..6b49a75 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">На всичко бе създадено резервно копие!</translation> <translation id="3634507049637220048">Мрежа <ph name="NETWORK_INDEX" /> от <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, управлява се от администратора ви, подробности</translation> <translation id="3645233063072417428">Преместихте <ph name="NUMBER_OF_ITEMS" /> елемента.</translation> -<translation id="3645531960514756307">Освобождаване на папката</translation> <translation id="3685122418104378273">Синхронизирането на Google Диск е деактивирано по подразбиране, когато се използват мобилни данни.</translation> <translation id="3689865792480713551">Анулиране на <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Мрежа <ph name="NETWORK_INDEX" /> от <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, неактивирана, <ph name="CONNECTION_STATUS" />, сила на сигнала: <ph name="SIGNAL_STRENGTH" />%, подробности</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Непрекъснато търсим начини да правим сърфирането ви по-безопасно. По-рано всеки уебсайт можеше да ви подкани да добавите разширение в браузъра си. В най-новите версии на Google Chrome трябва изрично да укажете на браузъра, че искате да инсталирате съответния софтуер, като го добавите чрез страницата „Разширения“. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Отключване</translation> <translation id="912419004897138677">Кодек</translation> -<translation id="9129931661813833980">Фиксиране на папката</translation> <translation id="9130775360844693113">Членовете на „<ph name="DESTINATION_NAME" />“ ще получат достъп до тези елементи.</translation> <translation id="9131598836763251128">Изберете един или повече файлове</translation> <translation id="9133055936679483811">Компресирането не бе успешно. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb index bbb24349..6ff6f8f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">সব ব্যাকআপ নেওয়া হয়ে গেছে!</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" />টির মধ্যে <ph name="NETWORK_INDEX" /> নম্বর নেটওয়ার্ক, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, অ্যাডমিনিস্ট্রেটর ম্যানেজ করে, বিবরণ</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" />টি আইটেম সরানো হয়েছে।</translation> -<translation id="3645531960514756307">ফোল্ডারটি আনপিন করুন</translation> <translation id="3685122418104378273">মোবাইল ডেটা ব্যবহার করার সময় ডিফল্টরূপে Google ড্রাইভ সিঙ্ক বন্ধ করা হয়৷</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> বাতিল করুন।</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" />টির মধ্যে <ph name="NETWORK_INDEX" /> নম্বর নেটওয়ার্ক, <ph name="NETWORK_NAME" />, চালু করা হয়নি, <ph name="CONNECTION_STATUS" />, সিগন্যাল ক্ষমতা <ph name="SIGNAL_STRENGTH" />%, বিবরণ</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">আমরা ক্রমাগত আপনার ব্রাউজিং নিরাপদ করতে উপায় খুঁজছি৷ আগে, যে কোনো ওয়েবসাইট আপনার ব্রাউজারে একটি এক্সটেনশন যোগ করার অনুরোধ জানাতে পারত৷ Google Chrome-এর সাম্প্রতিক ভার্সনে, আপনাকে অবশ্যই Chrome-কে স্পষ্টভাবে বলতে হবে যে আপনি এক্সটেনশনগুলির পৃষ্ঠার মাধ্যমে তাদের যোগ করে এই এক্সটেনশনগুলি ইনস্টল করতে চান৷ <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation> <translation id="9111102763498581341">আনলক</translation> <translation id="912419004897138677">কোডেক</translation> -<translation id="9129931661813833980">ফোল্ডার পিন করুন</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' এর সদস্যরা এই আইটেমগুলির অ্যাক্সেস পাবেন।</translation> <translation id="9131598836763251128">এক বা একাধিক ফাইল বেছে নিন৷</translation> <translation id="9133055936679483811">জিপ করা ব্যর্থ হয়েছে৷ <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb index e9d99a8..c72f96f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Napravljene su sigurnosne kopije za sve fajlove!</translation> <translation id="3634507049637220048">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, upravlja vaš administrator, detalji</translation> <translation id="3645233063072417428">Broj premještenih stavki: <ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Otkači folder</translation> <translation id="3685122418104378273">Sinkronizacija Google diska onemogućena je prema zadanim postavkama kada se upotrebljavaju mobilni podaci.</translation> <translation id="3689865792480713551">Otkaži <ph name="ACTIVITY_DESCRIPTION" /></translation> <translation id="3690128548376345212">Mreže: <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Deaktivirano, <ph name="CONNECTION_STATUS" />, Jačina signala <ph name="SIGNAL_STRENGTH" />%, Detalji</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Stalno tražimo načine da učinimo pregledanje sigurnijim. Prethodno je svaka web lokacija od vas mogla zatražiti da dodate ekstenziju u preglednik. U najnovijoj verziji Google Chromea, izričito morate reći Chromeu da želite instalirati ove ekstenzije tako što ćete ih dodati putem stranice Ekstenzije. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Otključaj</translation> <translation id="912419004897138677">Kodek</translation> -<translation id="9129931661813833980">Zakači folder</translation> <translation id="9130775360844693113">Članovi tima "<ph name="DESTINATION_NAME" />" dobit će pristup ovim stavkama.</translation> <translation id="9131598836763251128">Odaberite jedan ili više fajlova</translation> <translation id="9133055936679483811">Komprimiranje nije uspjelo. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb index 78a5cb4..e433c790 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Tots els elements tenen una còpia de seguretat.</translation> <translation id="3634507049637220048">Xarxa <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, gestionada per l'administrador, detalls</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> elements moguts.</translation> -<translation id="3645531960514756307">Deixa de fixar la carpeta</translation> <translation id="3685122418104378273">La sincronització amb Google Drive està desactivada de manera predeterminada en utilitzar les dades mòbils.</translation> <translation id="3689865792480713551">Cancel·la <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Xarxa <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, desactivada, <ph name="CONNECTION_STATUS" />, intensitat del senyal <ph name="SIGNAL_STRENGTH" />%, detalls</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Mai no deixem de cercar maneres de millorar la seguretat de la navegació. Anteriorment, des de qualsevol lloc web se us podia demanar que afegíssiu una extensió al navegador. A les versions més recents de Google Chrome, heu d'afegir aquestes extensions mitjançant la pàgina Extensions per fer saber explícitament a Chrome que voleu instal·lar-les. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Desbloqueja</translation> <translation id="912419004897138677">Còdec</translation> -<translation id="9129931661813833980">Fixa la carpeta</translation> <translation id="9130775360844693113">Els membres de la unitat <ph name="DESTINATION_NAME" />, obtindran accés a aquets elements.</translation> <translation id="9131598836763251128">Seleccioneu un o diversos fitxers</translation> <translation id="9133055936679483811">S'ha produït un error en la compressió. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb index e01956b..cddb7f2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Vše je zálohováno</translation> <translation id="3634507049637220048">Síť <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, spravováno administrátorem, podrobnosti</translation> <translation id="3645233063072417428">Přesunuté položky: <ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Odepnout složku</translation> <translation id="3685122418104378273">Když používáte mobilní datové připojení, synchronizace s Diskem Google je ve výchozím nastavení vypnutá.</translation> <translation id="3689865792480713551">Zrušit <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Síť <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, neaktivováno, <ph name="CONNECTION_STATUS" />, síla signálu <ph name="SIGNAL_STRENGTH" /> %, podrobnosti</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Neustále hledáme způsoby, jak zvýšit bezpečnost prohlížení. V minulosti vás k přidání rozšíření do prohlížeče mohl vyzvat kterýkoliv web. V nejnovějších verzích Google Chrome musíte Chromu výslovně sdělit, že rozšíření chcete nainstalovat. Učiníte tak tím, že rozšíření přidáte na stránce Rozšíření. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Odemknout</translation> <translation id="912419004897138677">Kodek</translation> -<translation id="9129931661813833980">Připnout složku</translation> <translation id="9130775360844693113">Členové týmu <ph name="DESTINATION_NAME" /> získají přístup k těmto položkám.</translation> <translation id="9131598836763251128">Vyberte jeden nebo více souborů</translation> <translation id="9133055936679483811">Komprimace se nezdařila. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb index 3369b74..0df68b9 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Alt er sikkerhedskopieret.</translation> <translation id="3634507049637220048">Netværk <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, administreret af din administrator, oplysninger</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> elementer blev flyttet.</translation> -<translation id="3645531960514756307">Frigør mappe</translation> <translation id="3685122418104378273">Synkronisering af Google Drev er som standard deaktiveret, når du bruger mobildata.</translation> <translation id="3689865792480713551">Annuller <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Netværk <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, ikke aktiveret, <ph name="CONNECTION_STATUS" />, signalstyrke på <ph name="SIGNAL_STRENGTH" /> %, oplysninger</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Vi leder hele tiden efter nye metoder til at gøre din browsing mere sikker. Før kunne ethvert website anmode dig om at tilføje en udvidelse i din browser. I de nyeste versioner af Google Chrome skal du udtrykkeligt give Chrome besked om, at du vil installere udvidelser, ved at tilføje dem via siden Udvidelser. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Lås op</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Fastgør mappe</translation> <translation id="9130775360844693113">Medlemmer af "<ph name="DESTINATION_NAME" />" får adgang til disse elementer.</translation> <translation id="9131598836763251128">Vælg en eller flere filer</translation> <translation id="9133055936679483811">Komprimering mislykkedes. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_de.xtb b/ui/chromeos/translations/ui_chromeos_strings_de.xtb index f7fa2fe..a38eb50 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_de.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_de.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Alle Daten gesichert</translation> <translation id="3634507049637220048">Netzwerk <ph name="NETWORK_INDEX" /> von <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, von Ihrem Administrator verwaltet, Details</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> Elemente verschoben.</translation> -<translation id="3645531960514756307">Ordner loslösen</translation> <translation id="3685122418104378273">Die Google Drive-Synchronisierung ist bei der mobilen Datennutzung standardmäßig deaktiviert.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> abbrechen.</translation> <translation id="3690128548376345212">Netzwerk <ph name="NETWORK_INDEX" /> von <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, nicht aktiviert, <ph name="CONNECTION_STATUS" />, Signalstärke <ph name="SIGNAL_STRENGTH" /> %, Details</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Wir arbeiten stets daran, das Surfen für Sie sicherer zu machen. Früher konnten Sie von jeder beliebigen Website aufgefordert werden, eine Erweiterung zu Ihrem Browser hinzuzufügen. In neueren Versionen von Google Chrome müssen Sie Chrome ausdrücklich mitteilen, dass Sie diese Erweiterungen installieren möchten, indem Sie sie über die Seite "Erweiterungen" hinzufügen. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Entsperren</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Ordner anpinnen</translation> <translation id="9130775360844693113">Mitglieder von "<ph name="DESTINATION_NAME" />" erhalten Zugriff auf diese Dateien.</translation> <translation id="9131598836763251128">Eine oder mehrere Dateien auswählen</translation> <translation id="9133055936679483811">Fehler beim Zippen. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_el.xtb b/ui/chromeos/translations/ui_chromeos_strings_el.xtb index 5d7d10f4..9ba91d3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_el.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_el.xtb
@@ -312,7 +312,6 @@ <translation id="3620292326130836921">Δημιουργήθηκαν αντίγραφα ασφαλείας για όλα τα αρχεία!</translation> <translation id="3634507049637220048">Δίκτυο <ph name="NETWORK_INDEX" /> από <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Διαχειριζόμενο από το διαχειριστή σας, Λεπτομέρειες</translation> <translation id="3645233063072417428">Μετακινήθηκαν <ph name="NUMBER_OF_ITEMS" /> στοιχεία.</translation> -<translation id="3645531960514756307">Ξεκαρφίτσωμα φακέλου</translation> <translation id="3685122418104378273">Ο συγχρονισμός του Google Drive είναι απενεργοποιημένος από προεπιλογή όταν χρησιμοποιούνται δεδομένα κινητής τηλεφωνίας.</translation> <translation id="3689865792480713551">Ακύρωση <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Δίκτυο <ph name="NETWORK_INDEX" /> από <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Απενεργοποιημένο, <ph name="CONNECTION_STATUS" />, Ισχύς σήματος <ph name="SIGNAL_STRENGTH" />%, Λεπτομέρειες</translation> @@ -950,7 +949,6 @@ <translation id="9110990317705400362">Αναζητούμε συνεχώς νέους τρόπους για να κάνουμε πιο ασφαλή την περιήγησή σας. Παλιότερα, ένας ιστότοπος μπορούσε να σας ζητήσει να προσθέσετε μια επέκταση στο πρόγραμμα περιήγησής σας. Στις πιο πρόσφατες εκδόσεις του Google Chrome, πρέπει να πείτε ρητά στο Chrome ότι επιθυμείτε την εγκατάσταση αυτών των επεκτάσεων, προσθέτοντάς τες μέσω της σελίδας "Επεκτάσεις". <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Ξεκλείδωμα</translation> <translation id="912419004897138677">Κωδικοποιητής</translation> -<translation id="9129931661813833980">Καρφίτσωμα φακέλου</translation> <translation id="9130775360844693113">Τα μέλη του "<ph name="DESTINATION_NAME" />" θα αποκτήσουν πρόσβαση σε αυτά τα στοιχεία.</translation> <translation id="9131598836763251128">Επιλέξτε ένα ή περισσότερα αρχεία</translation> <translation id="9133055936679483811">Αποτυχία συμπίεσης. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb index 85ecbbb..8ccde8f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">All backed up!</translation> <translation id="3634507049637220048">Network <ph name="NETWORK_INDEX" /> of <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, managed by your administrator, details</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> items moved.</translation> -<translation id="3645531960514756307">Unpin folder</translation> <translation id="3685122418104378273">Google Drive sync is disabled by default, when using mobile data.</translation> <translation id="3689865792480713551">Cancel <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Network <ph name="NETWORK_INDEX" /> of <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, unactivated, <ph name="CONNECTION_STATUS" />, signal strength <ph name="SIGNAL_STRENGTH" />%, details</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">We're constantly looking for ways to make your browsing safer. Previously, any website could prompt you to add an extension into your browser. In the latest versions of Google Chrome, you must explicitly tell Chrome that you want to install these extensions by adding them through the Extensions page. <ph name="BEGIN_LINK" />Learn more<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Unlock</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Pin folder</translation> <translation id="9130775360844693113">Members of '<ph name="DESTINATION_NAME" />' will gain access to these items.</translation> <translation id="9131598836763251128">Select one or more files</translation> <translation id="9133055936679483811">Zipping failed. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb index 9118926..98b3ed4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Todos los archivos están guardados en una copia de seguridad.</translation> <translation id="3634507049637220048">Red <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, administrada por tu administrador, detalles</translation> <translation id="3645233063072417428">Se movieron <ph name="NUMBER_OF_ITEMS" /> elementos.</translation> -<translation id="3645531960514756307">No fijar carpeta</translation> <translation id="3685122418104378273">La sincronización con Google Drive está inhabilitada de manera predeterminada cuando se usan los datos móviles.</translation> <translation id="3689865792480713551">Cancelar <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Red <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, no activada, <ph name="CONNECTION_STATUS" />, intensidad de la señal: <ph name="SIGNAL_STRENGTH" />%, detalles</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Constantemente buscamos la forma de ofrecerte una navegación más segura. Antes, cualquier sitio web podía pedirte agregar una extensión al navegador. En las últimas versiones de Google Chrome, debes indicar a Chrome explícitamente que deseas instalar estas extensiones al agregarlas en la página Extensiones. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Desbloquear</translation> <translation id="912419004897138677">Códec</translation> -<translation id="9129931661813833980">Fijar carpeta</translation> <translation id="9130775360844693113">Los miembros de "<ph name="DESTINATION_NAME" />" tendrán acceso a estos elementos.</translation> <translation id="9131598836763251128">Selecciona uno o más archivos.</translation> <translation id="9133055936679483811">Se produjo un error al comprimir. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es.xtb b/ui/chromeos/translations/ui_chromeos_strings_es.xtb index e1f0e6f..ee1ae6f6 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_es.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Se ha realizado la copia de seguridad de todos los archivos</translation> <translation id="3634507049637220048">Red <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, gestionada por el administrador, detalles</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> elementos movidos.</translation> -<translation id="3645531960514756307">No fijar carpeta</translation> <translation id="3685122418104378273">La sincronización con Google Drive está inhabilitada de forma predeterminada en redes de datos móviles.</translation> <translation id="3689865792480713551">Cancelar <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Red <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, no activada, <ph name="CONNECTION_STATUS" />, intensidad de la señal del <ph name="SIGNAL_STRENGTH" /> %, detalles</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">No dejamos de buscar formas de ofrecerte una navegación más segura. Anteriormente, cualquier sitio web podía solicitarte que añadieras una extensión al navegador. En las últimas versiones de Google Chrome, debes indicarle explícitamente a Chrome que quieres instalar esas extensiones añadiéndolas a través de la página Extensiones. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Desbloquear</translation> <translation id="912419004897138677">Códec</translation> -<translation id="9129931661813833980">Fijar carpeta</translation> <translation id="9130775360844693113">Los miembros de "<ph name="DESTINATION_NAME" />" obtendrán acceso a estos elementos.</translation> <translation id="9131598836763251128">Selecciona uno o varios archivos</translation> <translation id="9133055936679483811">Error al comprimir (<ph name="ERROR_MESSAGE" />)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_et.xtb b/ui/chromeos/translations/ui_chromeos_strings_et.xtb index 3319ad55..0d4b20bd 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_et.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_et.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Kõik on varundatud.</translation> <translation id="3634507049637220048"><ph name="NETWORK_INDEX" />. võrk <ph name="NETWORK_COUNT" />-st, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, võrku haldab teie administraator, üksikasjad</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> üksust on teisaldatud.</translation> -<translation id="3645531960514756307">Vabasta kaust</translation> <translation id="3685122418104378273">Google Drive'i sünkroonimine on mobiilse andmeside kasutamisel vaikimisi keelatud.</translation> <translation id="3689865792480713551">Tühista <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Võrk <ph name="NETWORK_INDEX" /> <ph name="NETWORK_COUNT" />-st, <ph name="NETWORK_NAME" />, inaktiveeritud, <ph name="CONNECTION_STATUS" />, signaalitugevus <ph name="SIGNAL_STRENGTH" />%, üksikasjad</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Otsime alati võimalusi, kuidas muuta sirvimine veelgi turvalisemaks. Varem võis iga veebisait paluda teil lisada brauserisse laiendusi. Google Chrome'i uusimas versioonis peate Chrome'ile selgelt ütlema, et soovite neid laiendusi installida, lisades need lehe Laiendused kaudu. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Ava lukk</translation> <translation id="912419004897138677">Kodek</translation> -<translation id="9129931661813833980">Kinnita kaust</translation> <translation id="9130775360844693113">Sihtkoha „<ph name="DESTINATION_NAME" />” liikmed saavad juurdepääsu nendele üksustele.</translation> <translation id="9131598836763251128">Valige üks või mitu faili</translation> <translation id="9133055936679483811">Pakkimine ebaõnnestus. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb index 1a6fc94f..6f8933c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Fitxategi guztien babeskopia egin da!</translation> <translation id="3634507049637220048"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> sarea. <ph name="NETWORK_NAME" /> (<ph name="CONNECTION_STATUS" />). Administratzaileak kudeatua. Xehetasunak.</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> elementu mugitu dira.</translation> -<translation id="3645531960514756307">Kendu aingura karpetari</translation> <translation id="3685122418104378273">Datu-konexioa erabiltzean, Google Drive sinkronizazioa modu lehenetsian desaktibatuta dago.</translation> <translation id="3689865792480713551">Utzi <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" /> saretatik <ph name="NETWORK_INDEX" />garrena, <ph name="NETWORK_NAME" />, aktibatu gabe, <ph name="CONNECTION_STATUS" />, seinalearen indarra: ehuneko <ph name="SIGNAL_STRENGTH" />, xehetasunak</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Arakatzea geroz eta seguruagoa izan dadin saiatzen gara etengabe. Lehen, edozein webgunek eskain ziezazukeen arakatzailean gehitzeko luzapen bat. Google Chrome-ren azken bertsioetan, ordea, luzapen horiek Luzapenak orrian gehituta instalatu nahi dituzula berariaz esan behar diozu Chrome-ri. <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Desblokeatu</translation> <translation id="912419004897138677">Kodeka</translation> -<translation id="9129931661813833980">Ainguratu karpeta</translation> <translation id="9130775360844693113">Elementu hauetarako sarbidea izango dute "<ph name="DESTINATION_NAME" />" unitateko kideek.</translation> <translation id="9131598836763251128">Hautatu fitxategi bat edo gehiago</translation> <translation id="9133055936679483811">Ezin izan da konprimatu. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb index db8c17e..ead8a4d0 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">همه پشتیبانگیری شدند.</translation> <translation id="3634507049637220048">شبکه <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، <ph name="CONNECTION_STATUS" />، تحتمدیریت سرپرست، جزئیات</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> مورد منتقل شد.</translation> -<translation id="3645531960514756307">برداشتن سنجاق پوشه</translation> <translation id="3685122418104378273">هنگام استفاده از دادههای شبکه همراه، همگامسازی Google Drive بهصورت پیشفرض غیرفعال است.</translation> <translation id="3689865792480713551">لغو <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">شبکه <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، غیرفعال، <ph name="CONNECTION_STATUS" />، قدرت سیگنال <ph name="SIGNAL_STRENGTH" />٪، جزئیات</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">همواره به دنبال راههایی هستیم تا مرورتان را ایمنتر کنیم. قبلاً هر وبسایتی از شما میخواست برنامهافزودنیای را در مرورگرتان اضافه کنید. در جدیدترین نسخه Google Chrome، باید به Chrome صراحتاً بگویید که میخواهید با افزودن این برنامههای افزودنی از طریق صفحه افزونهها آنها را نصب کنید. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation> <translation id="9111102763498581341">باز کردن قفل</translation> <translation id="912419004897138677">کدک</translation> -<translation id="9129931661813833980">سنجاق کردن پوشه</translation> <translation id="9130775360844693113">اعضای «<ph name="DESTINATION_NAME" />» به این موارد دسترسی پیدا میکنند.</translation> <translation id="9131598836763251128">انتخاب یک یا چند فایل</translation> <translation id="9133055936679483811">فشردهسازی انجام نشد. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb index 33a78ee..dc42466 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Kaikki on varmuuskopioitu!</translation> <translation id="3634507049637220048">Verkko <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, järjestelmänvalvojan hallinnoima, lisätietoja</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> kohdetta siirretty</translation> -<translation id="3645531960514756307">Irrota kansio</translation> <translation id="3685122418104378273">Google Driven synkronointi on oletuksena pois käytöstä käyttäessäsi mobiilitiedonsiirtoa.</translation> <translation id="3689865792480713551">Peru <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Verkko <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, ei aktivoitu, <ph name="CONNECTION_STATUS" />, signaalin voimakkuus <ph name="SIGNAL_STRENGTH" /> %, tiedot</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Pyrimme jatkuvasti tekemään selaamisesta turvallisempaa. Aiemmin mikä tahansa sivusto pystyi pyytämään laajennuksen lisäämistä selaimeen. Uusimmissa Google Chrome -versioissa sinun on erikseen ilmoitettava Chromelle, että haluat asentaa nämä laajennukset, lisäämällä ne Laajennukset-sivulla. <ph name="BEGIN_LINK" />Lisätietoja<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Poista lukitus</translation> <translation id="912419004897138677">Pakkaus</translation> -<translation id="9129931661813833980">Kiinnitä kansio</translation> <translation id="9130775360844693113">Paikan <ph name="DESTINATION_NAME" /> jäsenet saavat käyttöoikeuden näihin kohteisiin.</translation> <translation id="9131598836763251128">Valitse vähintään yksi tiedosto</translation> <translation id="9133055936679483811">Pakkaus epäonnistui. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb index 51cc2eff..6f1db9f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Naka-back up na ang lahat!</translation> <translation id="3634507049637220048">Network <ph name="NETWORK_INDEX" /> sa <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Pinapamahalaan ng iyong Administrator, Mga Detalye</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> (na) item ang inilipat.</translation> -<translation id="3645531960514756307">I-unpin ang folder</translation> <translation id="3685122418104378273">Naka-disable ang Google Drive bilang default, kapag gumagamit ng mobile data.</translation> <translation id="3689865792480713551">Kanselahin ang <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Network <ph name="NETWORK_INDEX" /> sa <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Hindi Naka-activate, <ph name="CONNECTION_STATUS" />, Lakas ng Signal <ph name="SIGNAL_STRENGTH" />%, Mga Detalye</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Patuloy kaming naghahanap ng mga paraan upang gawing mas ligtas ang iyong pagba-browse. Noong nakaraan, maaari kang i-prompt ng anumang website na magdagdag ng extension sa iyong browser. Sa mga pinakabagong bersyon ng Google Chrome, dapat na tahasan mong sabihin sa Chrome na gusto mong i-install ang mga extension na ito sa pamamagitan ng pagdaragdag sa mga ito sa page ng Mga Extension. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation> <translation id="9111102763498581341">I-unlock</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">I-pin ang folder</translation> <translation id="9130775360844693113">Magkakaroon ng access ang mga miyembro ng '<ph name="DESTINATION_NAME" />' sa mga item na ito.</translation> <translation id="9131598836763251128">Pumili ng isa o higit pang mga file</translation> <translation id="9133055936679483811">Nabigo ang pag-zip. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb index c724fe2..9018d3b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Tous les fichiers ont été sauvegardés!</translation> <translation id="3634507049637220048">Réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, géré par votre administrateur, détails</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> éléments déplacés.</translation> -<translation id="3645531960514756307">Annuler l'épinglage du dossier</translation> <translation id="3685122418104378273">La synchronisation Google Disque est désactivée par défaut, lors de l'utilisation de données mobiles.</translation> <translation id="3689865792480713551">Annuler <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, non activé, <ph name="CONNECTION_STATUS" />, force du signal : <ph name="SIGNAL_STRENGTH" /> %, renseignements</translation> @@ -928,7 +927,6 @@ <translation id="9110990317705400362">Nous recherchons sans cesse à sécuriser voter navigation. Avant, n'importe quel site Web pouvait vous inviter à ajouter une extension à votre navigateur. Avec les dernières versions de Google Chrome, vous devez préciser explicitement à Chrome que vous souhaitez installer ces extensions en les ajoutant depuis la page Extensions. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Déverrouiller</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Épingler le dossier</translation> <translation id="9130775360844693113">Les membres de « <ph name="DESTINATION_NAME" /> » pourront accéder à ces éléments.</translation> <translation id="9131598836763251128">Sélectionner un ou plusieurs fichiers</translation> <translation id="9133055936679483811">La compression au format ZIP a échoué. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb index 6fdc86b..5eab65e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Tout le contenu a été sauvegardé</translation> <translation id="3634507049637220048">Réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, géré par votre administrateur, détails</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> éléments déplacés.</translation> -<translation id="3645531960514756307">Retirer le dossier</translation> <translation id="3685122418104378273">Par défaut, la synchronisation Google Drive est désactivée lors de l'utilisation des données mobiles.</translation> <translation id="3689865792480713551">Annulez <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, désactivé, <ph name="CONNECTION_STATUS" />, force du signal : <ph name="SIGNAL_STRENGTH" /> %, détails</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Nous recherchons constamment à rendre votre navigation plus sûre. Auparavant, vous pouviez être invité à ajouter une extension dans votre navigateur par n'importe quel site Web. Dans les dernières versions de Google Chrome, vous devez explicitement indiquer que vous souhaitez installer une extension en l'ajoutant via la page "Extensions". <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Déverrouiller</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Épingler le dossier</translation> <translation id="9130775360844693113">Les membres de "<ph name="DESTINATION_NAME" />" auront accès à ces éléments.</translation> <translation id="9131598836763251128">Sélectionnez un ou plusieurs fichiers</translation> <translation id="9133055936679483811">Échec de la compression au format .zip. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gl.xtb b/ui/chromeos/translations/ui_chromeos_strings_gl.xtb index 019dd727..6bbe013 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_gl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_gl.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Todos os ficheiros teñen unha copia de seguranza</translation> <translation id="3634507049637220048">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, xestionada polo teu administrador, detalles</translation> <translation id="3645233063072417428">Movéronse <ph name="NUMBER_OF_ITEMS" /> elementos.</translation> -<translation id="3645531960514756307">Deixar de fixar cartafol</translation> <translation id="3685122418104378273">A sincronización con Google Drive está desactivada de xeito predeterminado cando se utilizan os datos móbiles.</translation> <translation id="3689865792480713551">Cancelar esta actividade: <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, desactivada, <ph name="CONNECTION_STATUS" />, intensidade do sinal do <ph name="SIGNAL_STRENGTH" /> %, detalles</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Estamos buscando constantemente maneiras de navegar de xeito máis seguro. Anteriormente calquera sitio web podía solicitarche engadir unha extensión ao teu navegador. Nas versións máis recentes de Google Chrome, debes indicar explicitamente a Chrome que queres instalar estas extensións engadíndoas a través da páxina Extensións. <ph name="BEGIN_LINK" />Máis información<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Desbloquear</translation> <translation id="912419004897138677">Códec</translation> -<translation id="9129931661813833980">Fixar cartafol</translation> <translation id="9130775360844693113">Os membros de "<ph name="DESTINATION_NAME" />" terán acceso a estes elementos.</translation> <translation id="9131598836763251128">Seleccionar un ou máis ficheiros</translation> <translation id="9133055936679483811">Non se puido comprimir. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb index 4d1ba44..9c7c73c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">તમામનો બેક અપ લેવાયો!</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" />માંથી નેટવર્ક <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, તમારા વ્યવસ્થાપક દ્વારા મેનેજ કરવામાં આવે છે, વિગતો</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> આઇટમ ખસેડી.</translation> -<translation id="3645531960514756307">ફોલ્ડરને અનપિન કરો</translation> <translation id="3685122418104378273">મોબાઇલ ડેટાનો ઉપયોગ કરી રહ્યાં હોય ત્યારે, Google ડ્રાઇવ સિંક ડિફોલ્ટ રૂપે બંધ છે.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" />ને રદ કરો.</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" />માંથી <ph name="NETWORK_INDEX" /> નેટવર્ક, <ph name="NETWORK_NAME" />, સક્રિય કર્યા વિનાનું, <ph name="CONNECTION_STATUS" />, સિગ્નલની પ્રબળતા <ph name="SIGNAL_STRENGTH" />%, વિગતો</translation> @@ -925,7 +924,6 @@ <translation id="9110990317705400362">અમે સતત તમારા બ્રાઉઝિંગને વધુ સલામત બનાવવાની રીતો શોધી રહ્યાં છીએ. પહેલાં, કોઈપણ વેબસાઇટ તમને તમારા બ્રાઉઝરમાં એક્સ્ટેન્શન ઉમેરવા માટે સંકેત આપી શકતી હતી. Google Chromeના નવીનતમ વર્ઝનમાં, તમે એક્સ્ટેન્શન પેજ દ્વારા આ એક્સ્ટેન્શનને ઉમેરીને તમે તેમને ઇન્સ્ટૉલ કરવા માગો છો તે, તમારે Chromeને સ્પષ્ટપણે કહેવું આવશ્યક છે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation> <translation id="9111102763498581341">અનલોક કરો</translation> <translation id="912419004897138677">કૉડેક</translation> -<translation id="9129931661813833980">ફોલ્ડર પિન કરો</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />'ના સભ્યો આ આઇટમનો ઍક્સેસ મેળવશે.</translation> <translation id="9131598836763251128">એક અથવા વધુ ફાઇલ પસંદ કરો</translation> <translation id="9133055936679483811">ઝિપ કરવાનું નિષ્ફળ: <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb index bb01659a..3f97f98 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">सभी का बैक अप लिया गया!</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" /> में से <ph name="NETWORK_INDEX" /> नेटवर्क, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, आपका एडमिन प्रबंधित करता है, जानकारी</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> आइटम भेजे गए.</translation> -<translation id="3645531960514756307">फ़ोल्डर को अनपिन करें</translation> <translation id="3685122418104378273">मोबाइल डेटा का उपयोग करते समय, Google डिस्क समन्वयन डिफ़ॉल्ट रूप से अक्षम रहता है.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> रद्द करें.</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" /> का नेटवर्क <ph name="NETWORK_INDEX" />, चालू नहीं किया गया, <ph name="CONNECTION_STATUS" />, सिग्नल की क्षमता <ph name="SIGNAL_STRENGTH" />%, जानकारी</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">हम आपकी ब्राउज़िंग को सुरक्षित रखने के तरीकों पर लगातार काम कर रहे हैं. पूर्व में, कोई भी वेबसाइट आपको अपने ब्राउज़र में एक्सटेंशन जोड़ने के लिए संकेत दे सकती थी. Google Chrome के नवीनतम संस्करणों में, आपको एक्सटेंशन पेज के माध्यम से इन एक्सटेंशन को जोड़कर Chrome को स्पष्ट रूप से बताना होगा कि आप इन्हें इंस्टॉल करना चाहते हैं. <ph name="BEGIN_LINK" />और जानें<ph name="END_LINK" /></translation> <translation id="9111102763498581341">अनलॉक करें</translation> <translation id="912419004897138677">कोडेक</translation> -<translation id="9129931661813833980">फ़ोल्डर को पिन करें</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' के सदस्यों को इन आइटम का एक्सेस मिल जाएगा.</translation> <translation id="9131598836763251128">एक या ज़्यादा फ़ाइल को चुनें</translation> <translation id="9133055936679483811">ज़िप करना विफल रहा. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb index dcdc202..652b7c7b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Sve je sigurnosno kopirano!</translation> <translation id="3634507049637220048">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, upravlja administrator, pojedinosti</translation> <translation id="3645233063072417428">Premješteno stavki: <ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Otkvači mapu</translation> <translation id="3685122418104378273">Sinkronizacija Google diska onemogućena je prema zadanim postavkama kada se upotrebljavaju mobilni podaci.</translation> <translation id="3689865792480713551">Otkažite <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, nije aktivirana, <ph name="CONNECTION_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, pojedinosti</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Neprestano nastojimo učiniti pregledavanje interneta sigurnijim. Ranije je bilo koja web-lokacija mogla tražiti da dodate proširenje u preglednik. Najnovije verzije Google Chromea traže da izričito odobrite instalaciju ovih proširenja tako da ih dodate na stranici Proširenja. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Otključaj</translation> <translation id="912419004897138677">Kodek</translation> -<translation id="9129931661813833980">Prikvači mapu</translation> <translation id="9130775360844693113">Članovi grupe "<ph name="DESTINATION_NAME" />" dobit će pristup tim stavkama.</translation> <translation id="9131598836763251128">Odaberite jednu ili više datoteka</translation> <translation id="9133055936679483811">Komprimiranje nije uspjelo. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb index bcf0b43..08d1a6e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Mindenről készült biztonsági másolat!</translation> <translation id="3634507049637220048"><ph name="NETWORK_INDEX" />. hálózat (összesen <ph name="NETWORK_COUNT" />), <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, a rendszergazdája kezeli, részletek</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> elem áthelyezve.</translation> -<translation id="3645531960514756307">Mappa rögzítésének feloldása</translation> <translation id="3685122418104378273">A Google Drive szinkronizálása alapértelmezés szerint le van tiltva mobiladat-kapcsolat használatakor.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> megszakítása.</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" />/<ph name="NETWORK_INDEX" /> hálózat, <ph name="NETWORK_NAME" />, Inaktiválva, <ph name="CONNECTION_STATUS" />, Jelerősség <ph name="SIGNAL_STRENGTH" />%, Részletek</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Folyamatosan keressük az új módszereket, hogy a böngészést biztonságosabbá tegyük. Korábban bármelyik webhely megkérhette Önt, hogy adjon hozzá egy bővítményt a böngészőjéhez. A Google Chrome legújabb verzióiban kifejezetten meg kell mondania a Chrome-nak, hogy telepíteni szeretné ezeket a bővítményeket. Ehhez a Bővítmények oldalon kell hozzáadnia őket. <ph name="BEGIN_LINK" />További információ<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Feloldás</translation> <translation id="912419004897138677">Kodek</translation> -<translation id="9129931661813833980">Mappa rögzítése</translation> <translation id="9130775360844693113">A(z) „<ph name="DESTINATION_NAME" />” tagjai hozzá fognak férni ezekhez az elemekhez.</translation> <translation id="9131598836763251128">Válasszon ki egy vagy több fájlt</translation> <translation id="9133055936679483811">A tömörítés sikertelen. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hy.xtb b/ui/chromeos/translations/ui_chromeos_strings_hy.xtb index 5b9fa139..1e97357 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hy.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hy.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Բոլորը ֆայլերը կրկնօրինակվեցին:</translation> <translation id="3634507049637220048">Ցանց <ph name="NETWORK_INDEX" />՝ <ph name="NETWORK_COUNT" />-ից, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, կառավարվում է ձեր ադմինիստրատորի կողմից, մանրամասներ</translation> <translation id="3645233063072417428">Տեղափոխվեց <ph name="NUMBER_OF_ITEMS" /> տարր։</translation> -<translation id="3645531960514756307">Ապամրացնել պանակը</translation> <translation id="3685122418104378273">Շարժական տվյալներն օգտագործելիս Google Drive համաժամացումը ըստ կանխադրման անջատվում է:</translation> <translation id="3689865792480713551">Չեղարկել՝ <ph name="ACTIVITY_DESCRIPTION" />։</translation> <translation id="3690128548376345212">Ցանց <ph name="NETWORK_INDEX" />՝ <ph name="NETWORK_COUNT" />-ից, <ph name="NETWORK_NAME" />, ակտիվացված չէ, <ph name="CONNECTION_STATUS" />, ազդանշանի ուժգնությունը՝ <ph name="SIGNAL_STRENGTH" /> տոկոս, մանրամասներ</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Մենք մշտապես փորձում ենք ձեր զննարկումն ավելի ապահով դարձնել: Նախկինում ցանկացած վեբկայք կարող էր առաջարկել ձեզ ընդլայնում ավելացնել ձեր դիտարկիչին: Google Chrome-ի վերջին տարբերակներում Chrome-ը ձեզանից հստակորեն պետք է հրաման ստանա, եթե դուք ցանկանաք տեղադրել որևէ ընդլայնում՝ ավելացնելով դրանք Ընդլայնումների էջի միջոցով: <ph name="BEGIN_LINK" />Իմանալ ավելին<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Ապակողպել</translation> <translation id="912419004897138677">Կոդեկ</translation> -<translation id="9129931661813833980">Ամրացնել պանակը</translation> <translation id="9130775360844693113">«<ph name="DESTINATION_NAME" />»-ի անդամներին այս տարրերը հասանելի կդառնան։</translation> <translation id="9131598836763251128">Ընտրեք մեկ կամ ավելի ֆայլեր</translation> <translation id="9133055936679483811">Արխիվացումը չհաջողվեց: <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_id.xtb b/ui/chromeos/translations/ui_chromeos_strings_id.xtb index c16d5a8..242853f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_id.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Semua dicadangkan!</translation> <translation id="3634507049637220048">Jaringan <ph name="NETWORK_INDEX" /> dari <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Dikelola oleh Administrator Anda, Detail</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> item dipindahkan.</translation> -<translation id="3645531960514756307">Lepas pin pada folder</translation> <translation id="3685122418104378273">Sinkronisasi Google Drive dinonaktifkan secara default saat menggunakan data seluler.</translation> <translation id="3689865792480713551">Batalkan <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Jaringan <ph name="NETWORK_INDEX" /> dari <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Tidak Diaktifkan, <ph name="CONNECTION_STATUS" />, Kekuatan Sinyal <ph name="SIGNAL_STRENGTH" />%, Detail</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Kami terus mencari cara agar penjelajahan Anda lebih aman. Sebelumnya, situs web apa pun dapat meminta Anda untuk menambahkan ekstensi ke browser. Pada versi terbaru Google Chrome, Anda harus memberitahukan dengan jelas kepada Chrome bahwa Anda ingin memasang ekstensi ini dengan menambahkannya melalui halaman Ekstensi. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Buka kunci</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Pasang pin pada folder</translation> <translation id="9130775360844693113">Anggota '<ph name="DESTINATION_NAME" />' akan mendapatkan akses ke item berikut.</translation> <translation id="9131598836763251128">Pilih satu atau beberapa file</translation> <translation id="9133055936679483811">Gagal membuat file zip. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_is.xtb b/ui/chromeos/translations/ui_chromeos_strings_is.xtb index ac9c1e77..f53db66 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_is.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_is.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Allt afritað!</translation> <translation id="3634507049637220048">Netkerfi <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, stjórnað af kerfisstjóra, upplýsingar</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> atriði færð.</translation> -<translation id="3645531960514756307">Losa möppu</translation> <translation id="3685122418104378273">Sjálfgefið er slökkt á Google Drive samstillingu þegar farsímagögn eru notuð.</translation> <translation id="3689865792480713551">Hætta við að <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Netkerfi <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, óvirkt, <ph name="CONNECTION_STATUS" />, sendistyrkur <ph name="SIGNAL_STRENGTH" />%, upplýsingar</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Við erum sífellt að leita leiða við að gera vefnotkun öruggari fyrir þig. Áður var það þannig að hvaða vefsvæði sem var gat birt kvaðningu um að þú bættir viðbót við vafrann. Í nýjustu útgáfum Google Chrome þarf notandinn að taka sérstaklega fram að Chrome eigi að setja upp viðbætur með því að bæta þeim við í gegnum síðuna Viðbætur. <ph name="BEGIN_LINK" />Frekari upplýsingar<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Taka úr lás</translation> <translation id="912419004897138677">Kóðari</translation> -<translation id="9129931661813833980">Festa möppu</translation> <translation id="9130775360844693113">Meðlimir „<ph name="DESTINATION_NAME" />“ fá aðgang að þessum atriðum.</translation> <translation id="9131598836763251128">Veldu eina eða fleiri skrár</translation> <translation id="9133055936679483811">Zip-þjöppun mistókst. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_it.xtb b/ui/chromeos/translations/ui_chromeos_strings_it.xtb index 49b3521..5552c0e5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_it.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Backup di tutti i contenuti completato.</translation> <translation id="3634507049637220048">Rete <ph name="NETWORK_INDEX" /> di <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, gestita dall'amministratore, dettagli</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> elementi spostati.</translation> -<translation id="3645531960514756307">Sblocca cartella</translation> <translation id="3685122418104378273">La sincronizzazione con Google Drive è disattivata per impostazione predefinita quando vengono utilizzati i dati mobili.</translation> <translation id="3689865792480713551">Annulla <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Rete <ph name="NETWORK_INDEX" /> di <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Non attivato, <ph name="CONNECTION_STATUS" />, Intensità del segnale <ph name="SIGNAL_STRENGTH" />%, Dettagli</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Cerchiamo costantemente nuovi modi per rendere più sicura la navigazione. In passato, qualsiasi sito web poteva chiederti di aggiungere un'estensione nel browser. Nelle ultime versioni di Google Chrome, devi indicare esplicitamente a Chrome di voler installare le estensioni aggiungendole tramite la pagina Estensioni. <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Sblocca</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Blocca cartella</translation> <translation id="9130775360844693113">I membri di "<ph name="DESTINATION_NAME" />" avranno accesso a questi elementi.</translation> <translation id="9131598836763251128">Seleziona uno o più file</translation> <translation id="9133055936679483811">Compressione non riuscita. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb index 16fc81ca..621a647 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">הכול מגובה!</translation> <translation id="3634507049637220048">רשת <ph name="NETWORK_INDEX" /> מתוך <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, הרשת מנוהלת על ידי מנהל המערכת שלך</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> פריטים הועברו.</translation> -<translation id="3645531960514756307">ביטול הצמדת התיקייה</translation> <translation id="3685122418104378273">הסנכרון של Google Drive מושבת כברירת מחדל בעת שימוש בנתונים לנייד.</translation> <translation id="3689865792480713551">ביטול <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">רשת <ph name="NETWORK_INDEX" /> מתוך <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, לא פעילה, <ph name="CONNECTION_STATUS" />, חוזק האות <ph name="SIGNAL_STRENGTH" />%, פרטים</translation> @@ -928,7 +927,6 @@ <translation id="9110990317705400362">אנחנו מחפשים כל הזמן דרכים לגלישה בטוחה יותר. בעבר, כל אתר יכול היה להציע לך להוסיף תוסף לדפדפן. בגרסאות האחרונות של Google Chrome, עליך לציין באופן מפורש ל-Chrome שברצונך להתקין תוספים אלה על-ידי הוספתם דרך הדף 'תוספים'. <ph name="BEGIN_LINK" />למידע נוסף<ph name="END_LINK" /></translation> <translation id="9111102763498581341">ביטול נעילה</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">הצמדת התיקייה</translation> <translation id="9130775360844693113">חברים באחסון השיתופי '<ph name="DESTINATION_NAME" />' יקבלו גישה לפריטים האלה.</translation> <translation id="9131598836763251128">יש לבחור קובץ אחד או יותר</translation> <translation id="9133055936679483811">הכיווץ נכשל. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb index ca1f796..b381f889 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">すべてバックアップ済みです。</translation> <translation id="3634507049637220048"><ph name="NETWORK_INDEX" /> 番目のネットワーク(全 <ph name="NETWORK_COUNT" /> 件)、<ph name="NETWORK_NAME" />、<ph name="CONNECTION_STATUS" />、管理者によって管理、詳細</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> 件のアイテムを移動しました。</translation> -<translation id="3645531960514756307">フォルダの固定を解除</translation> <translation id="3685122418104378273">Google ドライブの同期は既定で無効になっています(モバイルデータを使用する場合)。</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> をキャンセルします。</translation> <translation id="3690128548376345212">ネットワーク <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />、<ph name="NETWORK_NAME" />、未有効化、<ph name="CONNECTION_STATUS" />、電波強度 <ph name="SIGNAL_STRENGTH" />%、詳細</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Google では、より安全にウェブを閲覧できる方法を常に追求しています。以前は、どのウェブサイトでも、ブラウザに拡張機能を追加するように指示することができました。Google Chrome の最新バージョンでは、ユーザーのインストールの意思をより明確に確認するため、拡張機能の追加は拡張機能ページで行うこととなりました。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation> <translation id="9111102763498581341">ロック解除</translation> <translation id="912419004897138677">コーデック</translation> -<translation id="9129931661813833980">フォルダを固定</translation> <translation id="9130775360844693113">「<ph name="DESTINATION_NAME" />」のメンバーがこれらのアイテムにアクセスできるようになります。</translation> <translation id="9131598836763251128">1 つ以上のファイルを選択</translation> <translation id="9133055936679483811">圧縮できませんでした。<ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb index a6990cf..080aeae 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">ყველაფერი გადატანილია სარეზერვო მეხსიერებაში!</translation> <translation id="3634507049637220048">ქსელი <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />-დან, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, მართავს თქვენი ადმინისტრატორი, დეტალები</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> ერთეული გადატანილია.</translation> -<translation id="3645531960514756307">საქაღალდის ჩამაგრების მოხსნა</translation> <translation id="3685122418104378273">Google Drive სინქრონიზაცია ნაგულისხმევად გამორთულია მობილური მონაცემების გამოყენების დროს.</translation> <translation id="3689865792480713551">გაუქმდეს <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">ქსელი <ph name="NETWORK_INDEX" /> / <ph name="NETWORK_COUNT" />-დან, <ph name="NETWORK_NAME" />, არააქტიური, <ph name="CONNECTION_STATUS" />, სიგნალის სიძლიერეა <ph name="SIGNAL_STRENGTH" />%, დეტალები</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">ჩვენ მუდამ ვზრუნავთ იმაზე, თუ როგორ გავზარდოთ ჩვენი ბრაუზერის უსაფრთხოება. ადრე ნებისმიერ საიტს შეეძლო თქვენთვის ბრაუზერში გაფართოების დამატების შემოთავაზება. Google Chrome-ის უახლეს ვერსიებში პირდაპირ უნდა მიუთითოთ Chrome-ს, რომ გსურთ გაფართოების დაინსტალირება, გაფართოების გევრდზე მისი დამატების გზით. <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation> <translation id="9111102763498581341">განბლოკვა</translation> <translation id="912419004897138677">კოდეკი</translation> -<translation id="9129931661813833980">საქაღალდის ჩამაგრება</translation> <translation id="9130775360844693113">„<ph name="DESTINATION_NAME" />“-ის წევრები მიიღებენ წვდომას ამ ერთეულებზე.</translation> <translation id="9131598836763251128">აირჩიეთ ერთი ან რამდენიმე ფაილი</translation> <translation id="9133055936679483811">შეკუმშვა ვერ მოხერხდა. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb index 57ed7615..ded6c48 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Барлығының сақтық көшірмесі жасалған!</translation> <translation id="3634507049637220048"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, әкімшіңіз басқарады, мәліметтер</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> элемент жылжытылды.</translation> -<translation id="3645531960514756307">Қалтаны босату</translation> <translation id="3685122418104378273">Ұялы деректерді пайдалану кезінде әдепкі бойынша Google Drive синхрондауы өшіріледі.</translation> <translation id="3689865792480713551">Келесі әрекеттен бас тарту: <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="NETWORK_NAME" />, өшірілді, <ph name="CONNECTION_STATUS" />, сигнал күші <ph name="SIGNAL_STRENGTH" />%, мәліметтер</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Біз интернет шолуды барынша қауіпсіз ету жолдарын іздеуден жалықпаймыз. Бұрын кез келген сайт браузеріңізге кеңейтім қосу ұсынысын жасай алатын болса, Google Chrome соңғы нұсқасында енді кеңейтімдерді "Кеңейтімдер" бетіне кіріп қана орната аласыз. <ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Құлпын ашу</translation> <translation id="912419004897138677">Кодек</translation> -<translation id="9129931661813833980">Қалтаны бекіту</translation> <translation id="9130775360844693113">"<ph name="DESTINATION_NAME" />" мүшелері бұл файлдарға кіру рұқсатын алады.</translation> <translation id="9131598836763251128">Бір немесе бірнеше файлды таңдаңыз</translation> <translation id="9133055936679483811">Қысу орындалмады. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_km.xtb b/ui/chromeos/translations/ui_chromeos_strings_km.xtb index 17ddbd9..253a75419 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_km.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_km.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">បានបម្រុងទុកអស់ហើយ!</translation> <translation id="3634507049637220048">បណ្ដាញ <ph name="NETWORK_INDEX" /> នៃ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, គ្រប់គ្រងដោយអ្នកគ្រប់គ្រងរបស់អ្នក, ព័ត៌មានលម្អិត</translation> <translation id="3645233063072417428">បានផ្លាស់ទីធាតុ <ph name="NUMBER_OF_ITEMS" />។</translation> -<translation id="3645531960514756307">ដកខ្ទាស់ថត</translation> <translation id="3685122418104378273">សមកម្ម Google Drive ត្រូវបានបិទដំណើរការតាមលំនាំដើម នៅពេលប្រើទិន្នន័យចល័ត។</translation> <translation id="3689865792480713551">បោះបង់ <ph name="ACTIVITY_DESCRIPTION" /> ។</translation> <translation id="3690128548376345212">បណ្ដាញ <ph name="NETWORK_INDEX" /> នៃ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, បានបិទដំណើរការ, <ph name="CONNECTION_STATUS" />, កម្លាំងរលកសញ្ញា <ph name="SIGNAL_STRENGTH" />%, ព័ត៌មានលម្អិត</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">យើងតែងតែស្វែងរកមធ្យោបាយដើម្បីធ្វើឲ្យការរុករករបស់អ្នកមានសុវត្ថិភាពជាងមុនជានិច្ច។ កាលពីមុន គេហទំព័រទាំងឡាយអាចជម្រុញអ្នកឲ្យបន្ថែមកម្មវិធីបន្ថែមទៅក្នុងកម្មវិធីរុករករបស់អ្នក។ នៅក្នុងកំណែចុងក្រោយនៃ Google Chrome អ្នកត្រូវប្រាប់ Chrome ឲ្យច្បាស់ថាអ្នកចង់តំឡើងកម្មវិធីទាំងនេះ ដោយការបន្ថែមពួកវាតាមរយៈទំព័រកម្មវិធីបន្ថែម។ <ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែម<ph name="END_LINK" /></translation> <translation id="9111102763498581341">ដោះសោរ</translation> <translation id="912419004897138677">កូឌិក</translation> -<translation id="9129931661813833980">ខ្ទាស់ថត</translation> <translation id="9130775360844693113">សមាជិករបស់ '<ph name="DESTINATION_NAME" />' នឹងទទួលបានសិទិ្ធចូលប្រើធាតុទាំងនេះ។</translation> <translation id="9131598836763251128">ជ្រើសរើសឯកសារមួយ ឬច្រើន</translation> <translation id="9133055936679483811">ការបង្រួមបានបរាជ័យ។ <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb index af09d47..91711b4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
@@ -301,7 +301,6 @@ <translation id="3620292326130836921">ಎಲ್ಲವನ್ನೂ ಬ್ಯಾಕಪ್ ಮಾಡಲಾಗಿದೆ!</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" /> ರಲ್ಲಿ <ph name="NETWORK_INDEX" /> ನೆಟ್ವರ್ಕ್, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿರ್ವಹಿಸಿದ್ದಾರೆ, ವಿವರಗಳು</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> ಐಟಂಗಳನ್ನು ಸರಿಸಲಾಗಿದೆ.</translation> -<translation id="3645531960514756307">ಫೋಲ್ಡರ್ ಅನ್ನು ಅನ್ಪಿನ್ ಮಾಡಿ</translation> <translation id="3685122418104378273">ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಬಳಸುತ್ತಿರುವಾಗ, Google ಡ್ರೈವ್ ಸಿಂಕ್ ಅನ್ನು ಡೀಫಾಲ್ಟ್ ಮೂಲಕ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> ಅನ್ನು ರದ್ದುಮಾಡಿ.</translation> <translation id="3690128548376345212">ನೆಟ್ವರ್ಕ್ <ph name="NETWORK_COUNT" /> ರಲ್ಲಿ <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ, <ph name="CONNECTION_STATUS" />, ಸಿಗ್ನಲ್ ಸಾಮರ್ಥ್ಯ <ph name="SIGNAL_STRENGTH" />%, ವಿವರಗಳು</translation> @@ -915,7 +914,6 @@ <translation id="9110990317705400362">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಸುರಕ್ಷಿತವಾಗಿರಿಸಲು ನಾವು ನಿರಂತರವಾಗಿ ಪ್ರಯತ್ನಿಸುತ್ತಿರುತ್ತೇವೆ. ಹಿಂದೆ, ನಿಮ್ಮ ಬ್ರೌಸರ್ನಲ್ಲಿ ವಿಸ್ತರಣೆಯನ್ನು ಸೇರಿಸಲು ನಿಮಗೆ ಯಾವುದೇ ವೆಬ್ಸೈಟ್ ಕಾರ್ಯನಿರ್ವಹಿಸಿರಬಹುದು. ಇತ್ತೀಚಿನ Google Chrome ಆವೃತ್ತಿಗಳಲ್ಲಿ, ವಿಸ್ತರಣೆಗಳ ಪುಟದಿಂದ ಅವುಗಳನ್ನು ಸೇರಿಸುವ ಮೂಲಕ ಈ ವಿಸ್ತರಣೆಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಬಯಸುವುದಾಗಿ ನೀವು Chrome ಗೆ ಸ್ಪಷ್ಟವಾಗಿ ತಿಳಿಸಬೇಕು. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation> <translation id="9111102763498581341">ಅನ್ಲಾಕ್</translation> <translation id="912419004897138677">ಕೋಡೆಕ್</translation> -<translation id="9129931661813833980">ಫೋಲ್ಡರ್ ಅನ್ನು ಪಿನ್ ಮಾಡಿ</translation> <translation id="9130775360844693113">ಈ ಐಟಂಗಳಿಗೆ '<ph name="DESTINATION_NAME" />' ನ ಸದಸ್ಯರು ಪ್ರವೇಶ ಪಡೆದುಕೊಳ್ಳುವರು.</translation> <translation id="9131598836763251128">ಒಂದು ಅಥವಾ ಹೆಚ್ಚು ಫೈಲ್ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="9133055936679483811">ಜಿಪ್ ಮಾಡುವಿಕೆಯು ವಿಫಲವಾಗಿದೆ. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb index c69e223e..bbab999 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">백업되지 않은 파일이 없습니다.</translation> <translation id="3634507049637220048">네트워크 <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, 관리자가 관리함, 세부정보</translation> <translation id="3645233063072417428">항목 <ph name="NUMBER_OF_ITEMS" />개를 이동했습니다.</translation> -<translation id="3645531960514756307">폴더 고정 해제</translation> <translation id="3685122418104378273">모바일 데이터를 사용할 때는 Google Drive 동기화가 기본적으로 사용 중지됩니다.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> 작업을 취소합니다.</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" />개 중 <ph name="NETWORK_INDEX" />번째 네트워크, <ph name="NETWORK_NAME" />, 비활성화됨, <ph name="CONNECTION_STATUS" />, 신호 강도 <ph name="SIGNAL_STRENGTH" />%, 세부정보</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Google은 더 안전한 인터넷 사용 방법을 끊임없이 모색하고 있습니다. 이전에는 브라우저에 확장 프로그램을 추가하라는 메시지가 어느 웹사이트에서나 표시되었습니다. 하지만 Chrome의 최신 버전에서는 확장 프로그램 페이지를 통해 확장 프로그램을 추가함으로써 설치를 원한다는 사실을 Chrome에 명시적으로 알려야 합니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> <translation id="9111102763498581341">잠금 해제</translation> <translation id="912419004897138677">코덱</translation> -<translation id="9129931661813833980">폴더 고정</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' 멤버에게 이 항목에 액세스할 수 있는 권한이 부여됩니다.</translation> <translation id="9131598836763251128">파일을 한 개 이상 선택하세요.</translation> <translation id="9133055936679483811">압축에 실패했습니다. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ky.xtb b/ui/chromeos/translations/ui_chromeos_strings_ky.xtb index 93b67f2e..ad8b4fe 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ky.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ky.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Баарынын камдык көчүрмөсү сакталды!</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" /> ичинен <ph name="NETWORK_INDEX" />-тармак,<ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Администраторуңуз башкарат, Чоо-жайы</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> нерсе жылдырылды.</translation> -<translation id="3645531960514756307">Папканы бошотуу</translation> <translation id="3685122418104378273">Мобилдик дайындар колдонулуп жатканда, Google Drive шайкештештирүүсү демейки шартта өчүрүлөт.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> аракети жокко чыгарылат.</translation> <translation id="3690128548376345212">Тармак (<ph name="NETWORK_COUNT" /> ичинен <ph name="NETWORK_INDEX" />), <ph name="NETWORK_NAME" />, жандырылган эмес, <ph name="CONNECTION_STATUS" />, сигналдын күчү <ph name="SIGNAL_STRENGTH" />%, чоо-жайы</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Серептөө аракетиңиздин коопсуздугун чыңдоо үчүн болгон аракетибизди жумшап жатабыз. Буга чейин серепчиңизге кеңейтүү кошууну вебсайттар сунуштап турушчу. Ал эми Google Chrome'дун эң акыркы версияларында керектүү кеңейтүүлөрдү Кеңейтүүлөр бетинен кошуп, орното турганыңызды Chrome'го өзүңүз ачык билдиресиз. <ph name="BEGIN_LINK" />Көбүрөөк билүү<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Кулпуну ачуу</translation> <translation id="912419004897138677">Кодек</translation> -<translation id="9129931661813833980">Папканы кадап коюу</translation> <translation id="9130775360844693113">"<ph name="DESTINATION_NAME" />" жалпы дискинин колдонуучулары бул файлдарды колдоно алышат.</translation> <translation id="9131598836763251128">Бир же бир нече файл тандаңыз</translation> <translation id="9133055936679483811">Кысылбай калды. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lo.xtb b/ui/chromeos/translations/ui_chromeos_strings_lo.xtb index e30523f..a1cfda9 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lo.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lo.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">ສຳຮອງທັງໝົດແລ້ວ!</translation> <translation id="3634507049637220048">ເຄືອຂ່າຍທີ <ph name="NETWORK_INDEX" /> ຈາກທັງໝົດ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ຈັດການໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ, ລາຍລະອຽດ</translation> <translation id="3645233063072417428">ຍ້າຍ <ph name="NUMBER_OF_ITEMS" /> ລາຍການແລ້ວ.</translation> -<translation id="3645531960514756307">ຖອດປັກໝຸດໂຟນເດີ</translation> <translation id="3685122418104378273">ການຊິງຄ໌ Google Drive ປິດໃຊ້ງານໂດຍມາດຕະຖານແລ້ວ, ເມື່ອກຳລັງໃຊ້ຂໍ້ມູນມືຖື.</translation> <translation id="3689865792480713551">ຍົກເລີກ <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">ເຄືອຂ່າຍທີ <ph name="NETWORK_INDEX" /> ຈາກທັງໝົດ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, ບໍ່ໄດ້ເປີດໃຊ້, <ph name="CONNECTION_STATUS" />, ຄວາມແຮງສັນຍານ <ph name="SIGNAL_STRENGTH" />%, ລາຍລະອຽດ</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">ພວກເຮົາກໍາລັງຊອກຫາວິທີເຮັດໃຫ້ການທ່ອງເວັບຂອງທ່ານມີຄວາມປອດໄພກ່ວາເກົ່າຢ່າງຕໍ່ເນື່ອງ. ກ່ອນນັ້ນ, ເວັບໄຊທ໌ໃດໜຶ່ງສາມາດເຕືອນໃຫ້ທ່ານເພີມສ່ວນຂະຫຍາຍເຂົ້າໃສ່ບຣາວເຊີຂອງທ່ານ. ຢູ່ໃນ Google Chrome ລຸ້ນຫຼ້າສຸດ, ທ່ານບອກ Chrome ຢ່າງຈະແຈ້ງວ່າ ທ່ານຕ້ອງການຕິດຕັ້ງສ່ວນຂະຫຍາຍນີ້ໂດຍການເພີ່ມພວກມັນຜ່ານໜ້າສ່ວນຂະຫຍາຍ. <ph name="BEGIN_LINK" />ຮຽນຮູ້ເພີ່ມເຕີມ<ph name="END_LINK" /></translation> <translation id="9111102763498581341">ປົດລັອກ</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">ປັກໝຸດໂຟນເດີ</translation> <translation id="9130775360844693113">ສະມາຊິກຂອງ '<ph name="DESTINATION_NAME" />' ຈະມີການເຂົ້າເຖິງລາຍການເຫຼົ່ານີ້.</translation> <translation id="9131598836763251128">ເລືອກໜຶ່ງ ຫຼືຫຼາຍໄຟລ໌</translation> <translation id="9133055936679483811">ການຊິບບໍ່ສໍາເລັດ. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb index ba35598b..4a134ef3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Atsarginis kopijavimas baigtas!</translation> <translation id="3634507049637220048"><ph name="NETWORK_INDEX" /> tinklas iš <ph name="NETWORK_COUNT" />, „<ph name="NETWORK_NAME" />“, <ph name="CONNECTION_STATUS" />, tvarko administratorius, išsami informacija</translation> <translation id="3645233063072417428">Perkelta elementų: <ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Atsegti aplanką</translation> <translation id="3685122418104378273">„Google“ disko sinchronizavimas pagal numatytuosius nustatymus yra išjungtas, kai naudojami mobiliojo ryšio duomenys.</translation> <translation id="3689865792480713551">Atšaukti <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212"><ph name="NETWORK_INDEX" /> tinklas iš <ph name="NETWORK_COUNT" />, „<ph name="NETWORK_NAME" />“, nesuaktyvintas, <ph name="CONNECTION_STATUS" />, signalo stiprumas <ph name="SIGNAL_STRENGTH" /> proc., išsami informacija</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Nuolat stengiamės padaryti naršymą saugesnį. Anksčiau bet kurioje svetainėje buvo leidžiama raginti jus pridėti plėtinį prie naršyklės. Naudodami naujausių versijų „Google Chrome“, privalote aiškiai nurodyti „Chrome“, kad norite įdiegti šiuos plėtinius, pridėję juos „Plėtinių“ puslapyje. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Atrakinti</translation> <translation id="912419004897138677">Kodekas</translation> -<translation id="9129931661813833980">Prisegti aplanką</translation> <translation id="9130775360844693113">„<ph name="DESTINATION_NAME" />“ nariai galės pasiekti šiuos elementus.</translation> <translation id="9131598836763251128">Pasirinkite bent vieną failą</translation> <translation id="9133055936679483811">Archyvuojant įvyko klaida. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb index 5d5f47c..9b29b66 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Visi faili ir dublēti.</translation> <translation id="3634507049637220048"><ph name="NETWORK_INDEX" />. tīkls no <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, pārvalda jūsu administrators, informācija</translation> <translation id="3645233063072417428">Pārvietoti vienumi: <ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Atspraust mapi</translation> <translation id="3685122418104378273">Izmantojot mobilos datus, Google diska sinhronizācija pēc noklusējuma ir atspējota.</translation> <translation id="3689865792480713551">Atcelt: <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Tīkls numur <ph name="NETWORK_INDEX" /> no <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, nav aktivizēts, <ph name="CONNECTION_STATUS" />, signāla stiprums procentos ir <ph name="SIGNAL_STRENGTH" />, detalizēta informācija</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Mēs arvien meklējam veidus, kā papildus aizsargāt pārlūkošanu. Iepriekš jebkura vietne varēja aicināt pievienot paplašinājumu pārlūkā. Jaunākajās Google Chrome versijās lapā “Paplašinājumi” ir precīzi jānorāda, ka vēlaties instalēt šos paplašinājumus. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation> <translation id="9111102763498581341">Atbloķēt</translation> <translation id="912419004897138677">Kodeks</translation> -<translation id="9129931661813833980">Piespraust mapi</translation> <translation id="9130775360844693113">“<ph name="DESTINATION_NAME" />” dalībnieki iegūs piekļuvi šiem vienumiem.</translation> <translation id="9131598836763251128">Lūdzu, atlasiet vienu vai vairākus failus</translation> <translation id="9133055936679483811">Tilpsaspiešana neizdevās. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mk.xtb b/ui/chromeos/translations/ui_chromeos_strings_mk.xtb index ca4acc5..4312911 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mk.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Сѐ е ископирано!</translation> <translation id="3634507049637220048">Мрежа <ph name="NETWORK_INDEX" /> од <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, управувана од администраторот, детали</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> ставки се преместени.</translation> -<translation id="3645531960514756307">Откачете ја папката</translation> <translation id="3685122418104378273">Кога се користи мобилен интернет, синхронизацијата со Google Drive стандардно е оневозможена.</translation> <translation id="3689865792480713551">Откажете <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Мрежа <ph name="NETWORK_INDEX" /> од <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Деактивирана, <ph name="CONNECTION_STATUS" />, Јачина на сигналот <ph name="SIGNAL_STRENGTH" /> %, Детали</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Ние постојано бараме начини да го направиме вашето прелистување побезбедно. Порано, која било веб-локација можеше да побара од вас да додадете наставка на прелистувачот. Во најновите верзии на Google Chrome, мора јасно да му кажете на Chrome дека сакате да ги инсталирате овие наставки со нивно додавање преку страницата Наставки. <ph name="BEGIN_LINK" />Дознајте повеќе<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Отклучи</translation> <translation id="912419004897138677">Кодек</translation> -<translation id="9129931661813833980">Прикачи папка</translation> <translation id="9130775360844693113">Членовите на „<ph name="DESTINATION_NAME" />“ ќе добијат пристап до ставкиве.</translation> <translation id="9131598836763251128">Изберете една или повеќе датотеки</translation> <translation id="9133055936679483811">Пакувањето не успеа. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb index d0f4c973..15ecad8 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">എല്ലാം ബാക്കപ്പുചെയ്തു!</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" />-ൽ <ph name="NETWORK_INDEX" /> നെറ്റ്വർക്ക്, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, നിങ്ങളുടെ അഡ്മിൻ മാനേജ് ചെയ്യുന്നത്, വിശദാംശങ്ങൾ</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> ഇനങ്ങൾ നീക്കി.</translation> -<translation id="3645531960514756307">ഫോൾഡർ അൺപിൻ ചെയ്യുക</translation> <translation id="3685122418104378273">മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കുമ്പോൾ, സാധാരണയായി Google ഡ്രൈവ് സമന്വയം പ്രവർത്തനരഹിതമാകുന്നു.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> റദ്ദാക്കുക.</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" />-ൽ <ph name="NETWORK_INDEX" />-ാമത്തെ നെറ്റ്വർക്ക്, <ph name="NETWORK_NAME" />, സജീവമാക്കിയിട്ടില്ല <ph name="CONNECTION_STATUS" />, സിഗ്നൽ ശക്തി <ph name="SIGNAL_STRENGTH" />%, വിശദാംശങ്ങൾ</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">നിങ്ങളുടെ ബ്രൗസിംഗ് സുരക്ഷിതമാക്കുന്നതിനുള്ള മാർഗങ്ങൾക്കായി ഞങ്ങൾ സ്ഥിരമായി തിരയുന്നു. മുമ്പ്, എല്ലാ വെബ്സൈറ്റും നിങ്ങളുടെ ബ്രൗസറിൽ ഒരു വിപുലീകരണം ചേർക്കുന്നതിന് ആവശ്യപ്പെടുമായിരുന്നു. Google Chrome-ന്റെ ഏറ്റവും പുതിയ പതിപ്പുകളിൽ, വിപുലീകരണങ്ങളുടെ പേജ് മുഖേന ഈ വിപുലീകരണങ്ങൾ ചേർത്ത് അവ ഇൻസ്റ്റാൾ ചെയ്യണമെന്ന് നിങ്ങൾ Chrome-നോട് സ്പഷ്ടമായി പറയേണ്ടതുണ്ട്. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="9111102763498581341">അണ്ലോക്ക് ചെയ്യുക</translation> <translation id="912419004897138677">കൊഡെക്</translation> -<translation id="9129931661813833980">ഫോൾഡർ പിൻ ചെയ്യൂ</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' എന്നതിലെ അംഗങ്ങൾ ഈ ഇനങ്ങളിലേക്ക് ആക്സസ് കരസ്ഥമാക്കും.</translation> <translation id="9131598836763251128">ഒന്നോ അതില്ക്കൂടുതലോ ഫയലുകള് തിരഞ്ഞെടുക്കുക</translation> <translation id="9133055936679483811">സിപ്പുചെയ്യൽ പരാജയപ്പെട്ടു. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb index 92ab10a..181240f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Бүгдийг хадгалсан болно!</translation> <translation id="3634507049637220048">Сүлжээ: <ph name="NETWORK_COUNT" />-н <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, таны администратор удирддаг, дэлгэрэнгүй мэдээлэл</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> зүйлийг зөөсөн.</translation> -<translation id="3645531960514756307">Фолдерийг тогтоосныг болиулах</translation> <translation id="3685122418104378273">Гар утасны мэдээллийг ашиглаж байх үед Google Drive синк нь автоматаар идэвхгүй болно.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" />-г цуцлах.</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" />-с <ph name="NETWORK_INDEX" />-р сүлжээ, <ph name="NETWORK_NAME" />, Идэвхжүүлээгүй, <ph name="CONNECTION_STATUS" />, Дохионы хүч <ph name="SIGNAL_STRENGTH" />%, Дэлгэрэнгүй</translation> @@ -924,7 +923,6 @@ <translation id="9110990317705400362">Бид таны веб хөтчийг илүү аюулгүй болгох аргыг үргэлж хайж байдаг. Өмнө нь ямар ч вебсайт таны веб хөтчид өргөтгөл нэмэхийг таниас хүсэж болдог байсан. Google Chrome-ийн сүүлийн үеийн хувилбаруудын тусламжтай та эдгээр өргөтгөлүүдийг Өргөтгөлийн хуудсанд нэмсэнээр суурьлуулж болох сонголтыг Chrome-д хийж болно. <ph name="BEGIN_LINK" />Дэлгэрэнгүй мэдээллийг<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Нээх</translation> <translation id="912419004897138677">Кодлогч</translation> -<translation id="9129931661813833980">Фолдерийг бэхлэх</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />'-н гишүүд эдгээр зүйлд хандах эрхтэй болно.</translation> <translation id="9131598836763251128">Нэг буюу хэд хэдэн файлуудыг сонгох</translation> <translation id="9133055936679483811">Файл нэгтгэлт амжилтгүй боллоо. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb index b47cd402..9357623 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">सर्व बॅकअप घेतला!</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" /> पैकी <ph name="NETWORK_INDEX" /> नेटवर्क, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, तुमच्या अॅडमिनिस्ट्रेटरने व्यवस्थापित केलेले, तपशील</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> आयटम हलवले.</translation> -<translation id="3645531960514756307">फोल्डर अनपिन करा</translation> <translation id="3685122418104378273">मोबाइल डेटा वापरला जातो, तेव्हा Google ड्राइव्ह सिंक बाय डीफॉल्ट बंद केले जाते.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> रद्द करा.</translation> <translation id="3690128548376345212"><ph name="NETWORK_NAME" /> चे <ph name="NETWORK_INDEX" /> पैकी <ph name="NETWORK_COUNT" /> नेटवर्क, ॲक्टिव्हेट केलेले नाही, <ph name="CONNECTION_STATUS" /> सिग्नलची क्षमता <ph name="SIGNAL_STRENGTH" />%, तपशील</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">आम्ही तुमचे ब्राउझिंग सुरक्षित करण्यासाठी सातत्याने मार्ग शोधत आहोत. मागे, तुमच्या ब्राउझरमध्ये एक्स्टेंशन जोडण्यासाठी कोणतीही वेबसाइट तुम्हाला सूचित करू शकत होती. Google Chrome च्या नवीनतम आवृत्तीमध्ये, एक्स्टेंशन पेजद्वारे ते जोडून हे एक्स्टेंशन तुम्ही इंस्टॉल करू इच्छित आहात हे तुम्ही Chrome ला स्पष्टपणे सांगणे आवश्यक आहे. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation> <translation id="9111102763498581341">अनलॉक करा</translation> <translation id="912419004897138677">कोडेक</translation> -<translation id="9129931661813833980">फोल्डर पिन करा</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' चे सदस्य या आयटमचा ॲक्सेस मिळवतील.</translation> <translation id="9131598836763251128">एक किंवा अधिक फाइल निवडा</translation> <translation id="9133055936679483811">झिप करणे अयशस्वी. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb index 12a899e..eddbd02 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Semua disandarkan!</translation> <translation id="3634507049637220048">Rangkaian <ph name="NETWORK_INDEX" /> daripada <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Diurus oleh Pentadbir anda, Butiran</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> item dialihkan.</translation> -<translation id="3645531960514756307">Nyahsemat folder</translation> <translation id="3685122418104378273">Penyegerakan Google Drive dilumpuhkan secara lalai, apabila menggunakan data mudah alih.</translation> <translation id="3689865792480713551">Batalkan <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Rangkaian <ph name="NETWORK_INDEX" /> daripada <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Dinyahaktifkan, <ph name="CONNECTION_STATUS" />, Kekuatan Isyarat <ph name="SIGNAL_STRENGTH" />%, Butiran</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Kami sentiasa mencari cara-cara untuk membuat penyemakan imbas anda lebih selamat. Sebelum ini, mana-mana laman web boleh menggesa anda untuk menambah sambungan ke dalam penyemak imbas anda. Dalam versi terbaharu Google Chrome, anda mesti memberitahu Chrome dengan jelas bahawa anda mahu memasang sambungan ini dengan menambahnya melalui halaman Sambungan. <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Buka kunci</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Semat folder</translation> <translation id="9130775360844693113">Ahli '<ph name="DESTINATION_NAME" />' akan mendapat akses ke item ini.</translation> <translation id="9131598836763251128">Pilih satu fail atau lebih</translation> <translation id="9133055936679483811">Gagal mengezip. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_my.xtb b/ui/chromeos/translations/ui_chromeos_strings_my.xtb index fc8921b..4ebe0b8 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_my.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_my.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">အားလုံးအရံသိမ်းဆည်းပြီးပါပြီ!</translation> <translation id="3634507049637220048">ကွန်ရက် <ph name="NETWORK_COUNT" /> ခုအနက်မှ <ph name="NETWORK_INDEX" />၊ <ph name="NETWORK_NAME" />၊ <ph name="CONNECTION_STATUS" />၊ သင့် 'စီမံခန့်ခွဲသူ' က ကြီးကြပ်ထားသည်၊ အသေးစိတ်များ</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> ခု ရွှေ့ပြီးပြီ။</translation> -<translation id="3645531960514756307">ဖိုင်တွဲကို ပင်ဖြုတ်ရန်</translation> <translation id="3685122418104378273">မိုဘိုင်း ဒေတာကို အသုံးပြုချိန်မှာ ပုံသေအားဖြင့် Google ဒရိုက်ဗ် စင့်ကို ပိတ်ထားသည်။</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> ကို ပယ်ဖျက်မည်။</translation> <translation id="3690128548376345212">ကွန်ရက် <ph name="NETWORK_COUNT" /> ခုအနက် <ph name="NETWORK_INDEX" />၊<ph name="NETWORK_NAME" />၊ ဖွင့်မထားပါ၊ <ph name="CONNECTION_STATUS" />၊ လိုင်းဆွဲအား <ph name="SIGNAL_STRENGTH" />%၊ အသေးစိတ်</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">သင်၏ ဘရောင်ဇာ သုံးမှု ပိုလုံခြုုံလာရေး နည်းလမ်းများကို ကျွန်ုပ်တို့ တချိန်လုံး ရှာကြံနေကြပါသည်။ အရင်တုန်းက၊ ဘယ် ဝက်ဘ်ဆိုက်မဆို သင်၏ ဘရောက်ဇာ ထဲသို့ တိုးချဲ့မှု တစ်ခုခိုကို ထည့်ပေးရန် တိုက်တွန်းခဲ့ပါမည်။ Google Chrome ၏ နောက်ဆုံး ဗားရှင်း ထဲမှာ၊ သင်သည် တိုးချဲ့မှု စာမျက်နှာ ထဲကို ထည့်ပေးခြင်း မှတစ်ဆင့် ထိုတိုးချဲ့မှုများကို ထည့်သွင်းလိုကြောင်း သင်သည် အတိအလင်း ပြောရန် လိုပါသည်။ <ph name="BEGIN_LINK" />ပိုမို လေ့လာရန်<ph name="END_LINK" /></translation> <translation id="9111102763498581341">သော့ဖွင့်ရန်</translation> <translation id="912419004897138677">ကိုးဒက်ခ်</translation> -<translation id="9129931661813833980">ဖိုင်တွဲကို ပင်ထိုးရန်</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' ၏ အဖွဲ့ဝင်များသည် ဤအရာများကို အသုံးပြုခွင့်ရရှိမည်ဖြစ်သည်။</translation> <translation id="9131598836763251128">ဖိုင်များကို တစ်ခု သို့မဟုတ် ပိုများပြီး ရွေးရန်</translation> <translation id="9133055936679483811">ဇစ်လုပ်ခြင်း မအောင်မြင်ပါ။ <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ne.xtb b/ui/chromeos/translations/ui_chromeos_strings_ne.xtb index 2b6757c9..f9a6788 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ne.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ne.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">सबै जगेडा गरियो!</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" /> मध्ये नेटवर्क <ph name="NETWORK_INDEX" />, तपाईंका प्रशासकले व्यवस्थित गर्नुभएको छ, विवरणहरू</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> वटा वस्तु सारिए।</translation> -<translation id="3645531960514756307">फोल्डर अनपिन गर्नुहोस्</translation> <translation id="3685122418104378273">Google ड्राइभ सिंक डिफल्ट रूपमा अक्षम गरिएको हुन्छ, मोबाइल डेटाको खपत गर्ने क्रममा।</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> रद्द गर्नुहोस्।</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" /> मध्ये <ph name="NETWORK_INDEX" /> नेटवर्क, <ph name="NETWORK_NAME" />, अन नगरिएको, <ph name="CONNECTION_STATUS" />सिग्नलको क्षमता <ph name="SIGNAL_STRENGTH" />%, विवरणहरू</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">हामी लगातार तपाईंको ब्राउजर अझ सुरक्षित बनाउने तरिकाहरू खोजिरहेकाछौं। योभन्दा पहिले, कुनैपनि वेबसाइटले आफ्नो ब्राउजरमा एक्स्टेन्शन थप्न तपाईंलाई प्रेरित गर्न सक्थ्यो। Google Chrome को यो नवीनतम संस्करणमा, तपाईंले तिनीहरूलाई एक्स्टेन्शनहरू भन्ने पृष्ठमा थपेर आफूले ती एक्स्टेन्शनहरू स्थापना गर्न चाहेको कुरा Chrome लाई भन्नैपर्छ। <ph name="BEGIN_LINK" />थप जान्नुहोस्<ph name="END_LINK" /></translation> <translation id="9111102763498581341">अनलक गर्नुहोस्</translation> <translation id="912419004897138677">कोडेक</translation> -<translation id="9129931661813833980">फोल्डर पिन गर्नुहोस्</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' का सदस्यहरूले यी वस्तुहरूको प्रतिलिपिमाथिको पहुँच पाउनुहुनेछ।</translation> <translation id="9131598836763251128">एक वा बढी फाइलहरू चयन गर्नुहोस्</translation> <translation id="9133055936679483811">जिप गर्ने कार्य असफल भयो। <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb index bca4306..d952d0af 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Er is een back-up van alles gemaakt</translation> <translation id="3634507049637220048">Netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, beheerd door je beheerder, details</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> items verplaatst.</translation> -<translation id="3645531960514756307">Map losmaken</translation> <translation id="3685122418104378273">De synchronisatie van Google Drive is bij het gebruik van mobiele data standaard uitgezet.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> annuleren.</translation> <translation id="3690128548376345212">Netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, niet geactiveerd, <ph name="CONNECTION_STATUS" />, signaalsterkte <ph name="SIGNAL_STRENGTH" />%, details</translation> @@ -928,7 +927,6 @@ <translation id="9110990317705400362">We zijn altijd op zoek naar manieren om het surfen veiliger te maken. Vroeger kon elke website je vragen een extensie toe te voegen aan je browser. In de nieuwste versies van Google Chrome moet je Chrome expliciet toestemming geven om deze extensies te installeren door ze toe te voegen via de pagina 'Extensies'. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Ontgrendelen</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Map vastzetten</translation> <translation id="9130775360844693113">Leden van '<ph name="DESTINATION_NAME" />' krijgen toegang tot deze items.</translation> <translation id="9131598836763251128">Selecteer een of meer bestanden</translation> <translation id="9133055936679483811">Inpakken mislukt. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_no.xtb b/ui/chromeos/translations/ui_chromeos_strings_no.xtb index b891a6ba..f701db1 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_no.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Alt er sikkerhetskopiert!</translation> <translation id="3634507049637220048">Nettverk <ph name="NETWORK_INDEX" /> av <ph name="NETWORK_COUNT" /> – <ph name="NETWORK_NAME" /> – <ph name="CONNECTION_STATUS" /> – administreres av administratoren din</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> elementer er flyttet.</translation> -<translation id="3645531960514756307">Løsne mappen</translation> <translation id="3685122418104378273">Google Disk-synkronisering er deaktivert som standard ved bruk av mobile data.</translation> <translation id="3689865792480713551">Avbryt <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Nettverk <ph name="NETWORK_INDEX" /> av <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, ikke aktivert, <ph name="CONNECTION_STATUS" />, signalstyrke <ph name="SIGNAL_STRENGTH" /> %, detaljer</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Vi jobber kontinuerlig for å gjøre surfingen din tryggere. Tidligere kunne et hvilket som helst nettsted be deg å legge til en utvidelse i nettleseren din. I de nyeste versjonene av Google Chrome må du gi Chrome uttrykkelig beskjed om at du ønsker å installere disse utvidelsene ved å legge dem til via Utvidelser-siden. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Lås opp</translation> <translation id="912419004897138677">Kodek</translation> -<translation id="9129931661813833980">Fest mappe</translation> <translation id="9130775360844693113">Medlemmer av «<ph name="DESTINATION_NAME" />» får tilgang til disse elementene.</translation> <translation id="9131598836763251128">Velg én eller flere filer</translation> <translation id="9133055936679483811">Opprettelsen av zip-filen mislyktes. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_or.xtb b/ui/chromeos/translations/ui_chromeos_strings_or.xtb index 4a66245..eb27f21 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_or.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_or.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">ସମସ୍ତ ବ୍ୟାକ୍ଅପ୍ ନିଆଯାଇଛି!</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" />ଟିର <ph name="NETWORK_INDEX" /> ନେଟ୍ୱାର୍କ, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" /> ଆପଣଙ୍କ ଆଡ୍ମିନିଷ୍ଟ୍ରେଟର୍ଙ୍କ ଦ୍ୱାରା ପରିଚାଳିତ, ବିବରଣୀ</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" />ଟି ଆଇଟମ୍ ମୁଭ୍ କରାଯାଇଛି।</translation> -<translation id="3645531960514756307">ଫୋଲ୍ଡର୍ ଅନ୍ପିନ୍ କରନ୍ତୁ</translation> <translation id="3685122418104378273">ମୋବାଇଲ୍ ଡାଟା ବ୍ୟବହାର କରିବା ସମୟରେ Google ଡ୍ରାଇଭ୍ ସିଙ୍କ ଡିଫଲ୍ଟ ରୂପେ ଅକ୍ଷମ କରାଯାଇଛି।</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> ବାତିଲ୍ କରନ୍ତୁ।</translation> <translation id="3690128548376345212"><ph name="NETWORK_NAME" />ର <ph name="NETWORK_COUNT" />ଟିରୁ <ph name="NETWORK_INDEX" /> ନମ୍ବର ନେଟୱାର୍କକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି, <ph name="CONNECTION_STATUS" />, ସିଗନାଲର କ୍ଷମତା <ph name="SIGNAL_STRENGTH" />%, ବିବରଣୀ</translation> @@ -921,7 +920,6 @@ <translation id="9110990317705400362">ଆପଣଙ୍କର ବ୍ରାଉଜର୍କୁ ସୁରକ୍ଷିତ କରିବାକୁ ଆମେ ନିରିବିଚ୍ଛିନ୍ନ ଭାବରେ ଉପାୟ ଖୋଜୁଛୁ। ପୂର୍ବରୁ, ଯେକୌଣସି ୱେବ୍ସାଇଟ୍ ଆପଣଙ୍କର ବ୍ରାଉଜର୍ରେ ଗୋଟିଏ ଏକ୍ସଟେନ୍ସନ୍ ଯୋଗ କରିବାକୁ ଆପଣଙ୍କୁ ସଙ୍କେତ ଦେଇଥିଲା। Google Chromeର ନବୀନତମ ସଂସ୍କରଣରେ, ଆପଣଙ୍କୁ ଏକ୍ସଟେନ୍ସନ୍ ପୃଷ୍ଠା ମାଧ୍ୟମରେ ଏହି ଏକ୍ସଟେନ୍ସନ୍କୁ ଯୋଗ କରି Chromeକୁ ସ୍ପଷ୍ଟ ଭାବରେ କହିବାକୁ ପଡ଼ିବ ଯେ ଆପଣ ଏହି ଏକ୍ସଟେନ୍ସନ୍ଗୁଡ଼ିକୁ ଇନ୍ଷ୍ଟଲ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି। <ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation> <translation id="9111102763498581341">ଅନ୍ଲକ୍ କରନ୍ତୁ</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">ଫୋଲ୍ଡର୍ ପିନ୍ କରନ୍ତୁ</translation> <translation id="9130775360844693113"><ph name="DESTINATION_NAME" />ର ସଦସ୍ୟମାନେ ଏହି ଆଇଟମ୍ଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିପାରିବେ।</translation> <translation id="9131598836763251128">ଏକ କିମ୍ବା ଏକାଧିକ ଫାଇଲ୍ ଚିହ୍ନଟ କରନ୍ତୁ</translation> <translation id="9133055936679483811">ଜିପ୍ କରିବା ବିଫଳ ହୋଇଛି। <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pa.xtb b/ui/chromeos/translations/ui_chromeos_strings_pa.xtb index 1514990..7eec5bb2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pa.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pa.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">ਸਾਰੇ ਬੈਕ ਅਪ ਕੀਤੇ ਗਏ!</translation> <translation id="3634507049637220048">ਨੈੱਟਵਰਕ <ph name="NETWORK_COUNT" /> ਵਿੱਚੋਂ <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਵੇਰਵੇ</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> ਆਈਟਮਾਂ ਲਿਜਾਈਆਂ ਗਈਆਂ।</translation> -<translation id="3645531960514756307">ਫੋਲਡਰ ਨੂੰ ਅਨਪਿੰਨ ਕਰੋ</translation> <translation id="3685122418104378273">Google Drive ਸਿੰਕ ਮੋਬਾਈਲ ਡਾਟਾ ਵਰਤਦੇ ਸਮੇਂ, ਬਾਇ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਅਸਮਰਥਿਤ ਹੁੰਦਾ ਹੈ।</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> ਨੂੰ ਰੱਦ ਕਰੋ।</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" /> ਵਿੱਚੋਂ <ph name="NETWORK_INDEX" /> ਨੈੱਟਵਰਕ, <ph name="NETWORK_NAME" />, ਅਕਿਰਿਆਸ਼ੀਲ ਕੀਤਾ ਗਿਆ, <ph name="CONNECTION_STATUS" />, ਸਿਗਨਲ ਦੀ ਤੀਬਰਤਾ <ph name="SIGNAL_STRENGTH" />%, ਵੇਰਵੇ</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">ਅਸੀਂ ਲਗਾਤਾਰ ਤੁਹਾਡੀ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਵੱਧ ਸੁਰੱਖਿਅਤ ਬਣਾਉਣ ਦੇ ਤਰੀਕੇ ਖੋਜਦੇ ਰਹਿੰਦੇ ਹਾਂ। ਪਹਿਲਾਂ, ਕੋਈ ਵੀ ਵੈੱਬਸਾਈਟ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਇੱਕ ਐਕਸਟੈਂਸ਼ਨ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ ਕਹਿ ਸਕਦੀ ਸੀ। Google Chrome ਦੇ ਨਵੇਂ ਵਰਜਨਾਂ ਵਿੱਚ, ਤੁਹਾਨੂੰ Chrome ਨੂੰ ਸਪਸ਼ਟ ਰੂਪ ਨਾਲ ਦੱਸਣਾ ਪਵੇਗਾ ਕਿ ਤੁਸੀਂ ਇਹਨਾਂ ਐਕਸਟੈਂਸ਼ਨਾਂ ਨੂੰ ਐਕਸਟੈਂਸ਼ਨਾਂ ਪੰਨੇ ਰਾਹੀਂ ਸ਼ਾਮਲ ਕਰਕੇ ਇਹਨਾਂ ਨੂੰ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation> <translation id="9111102763498581341">ਅਣਲਾਕ ਕਰੋ</translation> <translation id="912419004897138677">ਕੋਡੈਕ</translation> -<translation id="9129931661813833980">ਫੋਲਡਰ ਨੂੰ ਪਿੰਨ ਕਰੋ</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' ਦੇ ਮੈਂਬਰ ਇਹਨਾਂ ਆਈਟਮਾਂ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰਨਗੇ।</translation> <translation id="9131598836763251128">ਇੱਕ ਜਾਂ ਵੱਧ ਫਾਈਲਾਂ ਚੁਣੋ</translation> <translation id="9133055936679483811">ਜ਼ਿਪ ਕਰਨਾ ਅਸਫਲ। <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb index 55a9bfe..c299050 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Wszystko ma już kopię zapasową.</translation> <translation id="3634507049637220048">Sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, zarządzana przez administratora, szczegóły</translation> <translation id="3645233063072417428">Liczba przeniesionych elementów: <ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Odepnij folder</translation> <translation id="3685122418104378273">Gdy komórkowa transmisja danych jest włączona, synchronizacja z Dyskiem Google jest domyślnie wyłączona.</translation> <translation id="3689865792480713551">Anuluj <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, nieaktywowana, <ph name="CONNECTION_STATUS" />, siła sygnału <ph name="SIGNAL_STRENGTH" />%, szczegóły</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Stale szukamy rozwiązań, dzięki którym przeglądanie internetu będzie bezpieczniejsze. Wcześniej każda strona mogła poprosić o dodanie rozszerzenia do przeglądarki. W nowszych wersjach Google Chrome musisz dodać rozszerzenie na stronie Rozszerzenia, by wyraźnie poinformować przeglądarkę, że chcesz je zainstalować. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Odblokuj</translation> <translation id="912419004897138677">Kodek</translation> -<translation id="9129931661813833980">Przypnij folder</translation> <translation id="9130775360844693113">Osoby z uprawnieniami do: „<ph name="DESTINATION_NAME" />” uzyskają dostęp do tych elementów.</translation> <translation id="9131598836763251128">Wybierz jeden lub kilka plików</translation> <translation id="9133055936679483811">Pakowanie nie powiodło się. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb index b5e224b..2267682 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Backup completo.</translation> <translation id="3634507049637220048">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, gerenciada pelo seu administrador, detalhes</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> itens movidos.</translation> -<translation id="3645531960514756307">Liberar pasta</translation> <translation id="3685122418104378273">A sincronização do Google Drive é desativada por padrão durante o uso de dados móveis.</translation> <translation id="3689865792480713551">Cancelar <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, inativa, <ph name="CONNECTION_STATUS" />, intensidade do sinal <ph name="SIGNAL_STRENGTH" />%, detalhes</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Estamos constantemente à procura de maneiras para tornar sua navegação mais segura. Anteriormente, qualquer website podia pedir que você adicionasse uma extensão no seu navegador. Nas versões mais recentes do Google Chrome, você deve dizer explicitamente ao Chrome que deseja instalar essas extensões, adicionando-as através da página de extensões. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Desbloquear</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Fixar pasta</translation> <translation id="9130775360844693113">Membros de '<ph name="DESTINATION_NAME" />' terão acesso a esses itens.</translation> <translation id="9131598836763251128">Selecione um ou mais arquivos</translation> <translation id="9133055936679483811">Falha na compactação. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb index 0e96d60f..f31bc033 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Foi feita uma cópia de segurança de todos os ficheiros!</translation> <translation id="3634507049637220048">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, gerida pelo administrador, detalhes</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> itens movidos.</translation> -<translation id="3645531960514756307">Soltar pasta</translation> <translation id="3685122418104378273">Quando utiliza dados móveis, a sincronização do Google Drive é desativada por predefinição.</translation> <translation id="3689865792480713551">Cancele <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Desativada, <ph name="CONNECTION_STATUS" />, Intensidade do sinal: <ph name="SIGNAL_STRENGTH" />%, Detalhes</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Estamos constantemente a procurar formas de tornar a navegação mais segura. Anteriormente, qualquer Website poderia pedir-lhe para adicionar uma extensão ao navegador. Nas versões mais recentes do Google Chrome, tem de definir explicitamente no Chrome que pretende instalar estas extensões adicionando-as através da página Extensões. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Desbloquear</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Fixar pasta</translation> <translation id="9130775360844693113">Os membros de "<ph name="DESTINATION_NAME" />" irão obter acesso a estes itens.</translation> <translation id="9131598836763251128">Selecione um ou mais ficheiros</translation> <translation id="9133055936679483811">Falha na criação de zip. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb index ca006b0..4417ca4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">S-a făcut backup pentru tot!</translation> <translation id="3634507049637220048">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, gestionată de administratorul tău, detalii</translation> <translation id="3645233063072417428">Elemente mutate: <ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Anulează fixarea dosarului</translation> <translation id="3685122418104378273">Sincronizarea cu Google Drive este dezactivată în mod prestabilit la folosirea datelor mobile.</translation> <translation id="3689865792480713551">Anulează <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, inactivă, <ph name="CONNECTION_STATUS" />, puterea semnalului: <ph name="SIGNAL_STRENGTH" /> %, detalii</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Google caută mereu modalități de a face navigarea mai sigură. Înainte, orice site îți putea solicita să adaugi o extensie în browser. În ultimele versiuni Google Chrome, trebuie să indici explicit că dorești să instalezi aceste extensii, adăugându-le în pagina Extensii. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Deblochează</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Fixează dosarul</translation> <translation id="9130775360844693113">Membrii „<ph name="DESTINATION_NAME" />” vor obține acces la aceste articole.</translation> <translation id="9131598836763251128">Selectează un fișier sau mai multe</translation> <translation id="9133055936679483811">Arhivarea nu a reușit. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb index 8586a76..2fd548fd 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Данные сохранены!</translation> <translation id="3634507049637220048">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, название – "<ph name="NETWORK_NAME" />", статус подключения – "<ph name="CONNECTION_STATUS" />", под управлением администратора, подробная информация</translation> <translation id="3645233063072417428">Перемещено объектов: <ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Открепить папку</translation> <translation id="3685122418104378273">Синхронизация Google Диска по мобильной сети отключена по умолчанию.</translation> <translation id="3689865792480713551">Отменить <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, не активирована, <ph name="CONNECTION_STATUS" />, уровень сигнала – <ph name="SIGNAL_STRENGTH" /> %, подробная информация</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Мы постоянно работаем над тем, чтобы сделать наш браузер ещё более защищенным. Раньше любой сайт мог предложить вам установить расширение, что было небезопасно. В последних версиях Google Chrome добавить расширения можно только на странице "Расширения". <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Разблокировать</translation> <translation id="912419004897138677">Кодек</translation> -<translation id="9129931661813833980">Закрепить папку</translation> <translation id="9130775360844693113">Пользователи общего диска "<ph name="DESTINATION_NAME" />" получат доступ к этим объектам.</translation> <translation id="9131598836763251128">Выберите файлы</translation> <translation id="9133055936679483811">Не удалось выполнить архивирование. <ph name="ERROR_MESSAGE" />.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_si.xtb b/ui/chromeos/translations/ui_chromeos_strings_si.xtb index e85fd46..0073d23 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_si.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_si.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">සියල්ල උපස්ථ කර ඇත!</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" />න් <ph name="NETWORK_INDEX" /> වැනි ජාලය, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ඔබේ පරිපාලකයා විසින් කළමනාකරණය කරයි, විස්තර</translation> <translation id="3645233063072417428">අයිතම <ph name="NUMBER_OF_ITEMS" />ක් ගෙන යන ලදී.</translation> -<translation id="3645531960514756307">ෆෝල්ඩරය නොඅමුණන්න</translation> <translation id="3685122418104378273">ජංගම දත්ත භාවිතා කරන විට, Google Drive සමමුහුර්තය සුපුරුද්දෙන් අබල කර ඇත.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> අවලංගු කරන්න.</translation> <translation id="3690128548376345212">ජාල <ph name="NETWORK_COUNT" />කින් <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, සක්රිය නොකළ, <ph name="CONNECTION_STATUS" /> සංඥා ප්රබලතාව <ph name="SIGNAL_STRENGTH" />%, විස්තර</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">අපි නිරන්තරයෙන්ම ඔබගේ පිරික්සීම වඩාත් ආරක්ෂිත කිරීමට ක්රම සොයමින් සිටිමු. කලින්, ඕනෑම වෙබ් අඩවියකට ඔබගේ බ්රවුසරය වෙත දිගුවක් එක් කිරීමට ඔබව පෙළඹවීය හැකි විය. Google Chrome නවතම අනුවාදයේ දී, ඔබ ඒවා දිගු පිටුව හරහා එක් කිරීමෙන් මෙම දිගු ස්ථාපනය කිරීමට අවශ්ය බව Chrome හට ප්රකාශිතවම පැවසිය යුතුයි. <ph name="BEGIN_LINK" />වැඩිදුර හදාරන්න<ph name="END_LINK" /></translation> <translation id="9111102763498581341">අගුලු හරන්න</translation> <translation id="912419004897138677">කොඩෙක්</translation> -<translation id="9129931661813833980">ෆෝල්ඩරය අමුණන්න</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' හි සාමාජිකයන්ට මෙම අයිතම වෙත ප්රවේශය ලැබෙනු ඇත.</translation> <translation id="9131598836763251128">ගොනු එකක් හෝ කිහිපයක් තෝරන්න</translation> <translation id="9133055936679483811">සිප් කිරීම අසාර්තකයි. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb index 59878df..48757935 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Všetko je zálohované!</translation> <translation id="3634507049637220048"><ph name="NETWORK_INDEX" />. sieť z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ovládaná správcom, podrobnosti</translation> <translation id="3645233063072417428">Počet presunutých položiek: <ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Odopnúť priečinok</translation> <translation id="3685122418104378273">Synchronizácia Disku Google je pri používaní mobilných dát v predvolenom nastavení zakázaná.</translation> <translation id="3689865792480713551">Zrušiť <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212"><ph name="NETWORK_INDEX" />. sieť z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, neaktivovaná, <ph name="CONNECTION_STATUS" />, sila signálu: <ph name="SIGNAL_STRENGTH" /> %, podrobnosti</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Neustále hľadáme spôsoby, ako zvýšiť bezpečnosť vášho prehliadania. Predtým vás mohli všetky webové stránky vyzvať pridať rozšírenie do prehliadača. Keď chcete v novších verziách prehliadača Google Chrome pridať rozšírenia, musíte to urobiť explicitne ich pridaním na stránke Rozšírenia. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Odomknúť</translation> <translation id="912419004897138677">Kodek</translation> -<translation id="9129931661813833980">Pripnúť priečinok</translation> <translation id="9130775360844693113">Členovia cieľa <ph name="DESTINATION_NAME" /> získajú prístup k týmto položkám.</translation> <translation id="9131598836763251128">Vyberte jeden alebo viac súborov</translation> <translation id="9133055936679483811">Komprimovanie zlyhalo. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb index 3ea96dd..3c5d7f47 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Vse je varnostno kopirano!</translation> <translation id="3634507049637220048">Omrežje <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, upravlja ga vaš skrbnik, podrobnosti</translation> <translation id="3645233063072417428">Toliko elementov je bilo premaknjenih: <ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Odpni mapo</translation> <translation id="3685122418104378273">Sinhronizacija z Googlom Drive je ob uporabi prenosa podatkov v mobilnih omrežjih privzeto onemogočena.</translation> <translation id="3689865792480713551">Prekliči: <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212"><ph name="NETWORK_INDEX" />. omrežje od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, neaktivirano, <ph name="CONNECTION_STATUS" />, moč signala <ph name="SIGNAL_STRENGTH" /> %, podrobnosti</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Stalno si prizadevamo zagotoviti, da bi bilo brskanje varnejše. Prej vas je lahko vsako spletno mesto pozvalo, da dodate razširitev v brskalnik. V zadnjih različicah Google Chroma pa morate Chromu izrecno povedati, da želite te razširitve namestiti, tako da jih dodate na strani »Razširitve«. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Odkleni</translation> <translation id="912419004897138677">Kodek</translation> -<translation id="9129931661813833980">Pripni mapo</translation> <translation id="9130775360844693113">Člani skupine »<ph name="DESTINATION_NAME" />« bodo imeli dostop do teh elementov.</translation> <translation id="9131598836763251128">Izberite eno ali več datotek</translation> <translation id="9133055936679483811">Ustvarjanje datoteke zip ni uspelo. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sq.xtb b/ui/chromeos/translations/ui_chromeos_strings_sq.xtb index d87f5ea..70f4219a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sq.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sq.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Të gjitha u rezervuan!</translation> <translation id="3634507049637220048">Rrjeti <ph name="NETWORK_INDEX" /> nga <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, menaxhuar nga administratori yt, detaje</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> artikuj janë zhvendosur.</translation> -<translation id="3645531960514756307">Zhgozhdo dosjen</translation> <translation id="3685122418104378273">Sinkronizimi i "Diskut të Google" është çaktivizuar si parazgjedhje kur përdor të dhënat celulare.</translation> <translation id="3689865792480713551">Anuloje <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Rrjeti <ph name="NETWORK_INDEX" /> nga <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, i paaktivizuar, <ph name="CONNECTION_STATUS" />, fuqia e sinjalit <ph name="SIGNAL_STRENGTH" />%, detajet</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Ne kërkojmë vazhdimisht mënyra për ta bërë shfletimin tënd më të sigurt. Më parë, çdo uebsajt mund të të kërkonte të shtoje një shtesë në shfletues. Në versioniet e fundit të Google Chrome, duhet t'i tregosh ti vetë posaçërisht Chrome se dëshiron t'i instalosh këto shtesa duke i shtuar ato përmes faqes "Shtesat". <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Shkyç</translation> <translation id="912419004897138677">Kodeku</translation> -<translation id="9129931661813833980">Gozhdo dosjen</translation> <translation id="9130775360844693113">Anëtarët e "<ph name="DESTINATION_NAME" />" do të fitojnë qasje te këta artikuj.</translation> <translation id="9131598836763251128">Zgjidh një ose më shumë skedarë</translation> <translation id="9133055936679483811">Ngjeshja dështoi. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb b/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb index 9c34dce..0d7cc4cb 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Napravljene su rezervne kopije svih datoteka!</translation> <translation id="3634507049637220048"><ph name="NETWORK_INDEX" />. mreža od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, upravlja administrator, detalji</translation> <translation id="3645233063072417428">Premeštenih stavki: <ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Otkači direktorijum</translation> <translation id="3685122418104378273">Sinhronizacija sa Google diskom je podrazumevano onemogućena kada se koristi mobilna veza za prenos podataka.</translation> <translation id="3689865792480713551">Otkažite <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, nije aktivirana, <ph name="CONNECTION_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, detalji</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Stalno tražimo nove načine da učinimo pregledanje bezbednijim. Ranije je svaki veb-sajt mogao da vam zatraži da dodate dodatak u pregledač. U najnovijim verzijama Google Chrome-a morate eksplicitno da kažete Chrome-u da želite da instalirate te dodatke tako što ćete ih dodati preko stranice Dodaci. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Otključaj</translation> <translation id="912419004897138677">Kodek</translation> -<translation id="9129931661813833980">Zakači direktorijum</translation> <translation id="9130775360844693113">Članovi iz „<ph name="DESTINATION_NAME" />“ će dobiti pristup ovim stavkama.</translation> <translation id="9131598836763251128">Izbor jedne ili više datoteka</translation> <translation id="9133055936679483811">Dodavanje u zip datoteku nije uspelo. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb index c8f656c1..e83e213 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Направљене су резервне копије свих датотека!</translation> <translation id="3634507049637220048"><ph name="NETWORK_INDEX" />. мрежа од <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, управља администратор, детаљи</translation> <translation id="3645233063072417428">Премештених ставки: <ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Откачи директоријум</translation> <translation id="3685122418104378273">Синхронизација са Google диском је подразумевано онемогућена када се користи мобилна веза за пренос података.</translation> <translation id="3689865792480713551">Откажите <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Мрежа <ph name="NETWORK_INDEX" /> од <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, није активирана, <ph name="CONNECTION_STATUS" />, јачина сигнала <ph name="SIGNAL_STRENGTH" />%, детаљи</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Стално тражимо нове начине да учинимо прегледање безбеднијим. Раније је сваки веб-сајт могао да вам затражи да додате додатак у прегледач. У најновијим верзијама Google Chrome-а морате експлицитно да кажете Chrome-у да желите да инсталирате те додатке тако што ћете их додати преко странице Додаци. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Откључај</translation> <translation id="912419004897138677">Кодек</translation> -<translation id="9129931661813833980">Закачи директоријум</translation> <translation id="9130775360844693113">Чланови из „<ph name="DESTINATION_NAME" />“ ће добити приступ овим ставкама.</translation> <translation id="9131598836763251128">Избор једне или више датотека</translation> <translation id="9133055936679483811">Додавање у zip датотеку није успело. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb index cffada9d..b6ef5af 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Allt har säkerhetskopierats!</translation> <translation id="3634507049637220048">Nätverk <ph name="NETWORK_INDEX" /> av <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, hanteras av administratören, information</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> objekt flyttades.</translation> -<translation id="3645531960514756307">Lossa mapp</translation> <translation id="3685122418104378273">Google Drive-synkronisering inaktiveras som standard när mobildata används.</translation> <translation id="3689865792480713551">Avbryt <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Nätverk <ph name="NETWORK_INDEX" /> av <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, inaktiverat, <ph name="CONNECTION_STATUS" />, signalstyrka <ph name="SIGNAL_STRENGTH" /> %, information</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Vi strävar hela tiden efter att göra det säkrare för dig att surfa. Tidigare kunde du uppmanas att lägga till ett tillägg i webbläsaren på vilken webbplats som helst. I de senaste versionerna av Google Chrome måste du uttryckligen tala om för Chrome att du vill installera dessa tillägg genom att lägga till dem via sidan Tillägg. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Lås upp</translation> <translation id="912419004897138677">Kodek</translation> -<translation id="9129931661813833980">Fäst mapp</translation> <translation id="9130775360844693113">De som använder <ph name="DESTINATION_NAME" /> får åtkomst till dessa objekt.</translation> <translation id="9131598836763251128">Välj en eller flera filer</translation> <translation id="9133055936679483811">Komprimeringen misslyckades. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb index 5318055..b0e3e62 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Zote zimehifadhiwa nakala!</translation> <translation id="3634507049637220048">Mtandao wa <ph name="NETWORK_INDEX" /> kati ya <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Unadhibitiwa na Msimamizi wako, Maelezo</translation> <translation id="3645233063072417428">Vipengee <ph name="NUMBER_OF_ITEMS" /> vimehamishwa.</translation> -<translation id="3645531960514756307">Bandua folda</translation> <translation id="3685122418104378273">Usawazishaji wa Hifadhi ya Google umezimwa kwa chaguomsingi wakati wa kutumia data ya kifaa cha mkononi.</translation> <translation id="3689865792480713551">Ghairi <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Mtandao wa <ph name="NETWORK_INDEX" /> kati ya <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Haijawashwa, <ph name="CONNECTION_STATUS" />, Uthabiti wa Mtandao, asilimia <ph name="SIGNAL_STRENGTH" />, Maelezo</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Tunaendelea kutafuta njia za kufanya kuvinjari kwako kuwe salama zaidi. Hapo awali, tovuti yoyote ingeweza kukuomba kuongeza kiendelezi katika kivinjari chako. Katika matoleo mapya ya Google Chrome, lazima uiambie Chrome kwa uwazi kuwa unataka kusakinisha viendelezi hivi kwa kuviongeza kupitia ukurasa wa Viendelezi. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Fungua</translation> <translation id="912419004897138677">Kodeki</translation> -<translation id="9129931661813833980">Bandika folda</translation> <translation id="9130775360844693113">Wanachama wa '<ph name="DESTINATION_NAME" />' watapata idhini ya kuvifikia vipengee hivi.</translation> <translation id="9131598836763251128">Chagua faili moja au zaidi</translation> <translation id="9133055936679483811">Haikuwezekana kubana. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb index 6286240..f53d2900 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">எல்லாம் காப்புப் பிரதி எடுக்கப்பட்டன!</translation> <translation id="3634507049637220048">நெட்வொர்க்: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, உங்கள் நிர்வாகி நிர்வகிக்கிறார், விவரங்கள்</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> ஃபைல்கள் /கோப்பகங்கள் நகர்த்தப்பட்டன.</translation> -<translation id="3645531960514756307">ஃபோல்டரைப் பிரித்தெடு</translation> <translation id="3685122418104378273">மொபைல் டேட்டாவைப் பயன்படுத்தும்போது, இயல்புநிலையாகவே Google இயக்கக ஒத்திசைவு முடக்கப்பட்டுள்ளது.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> ரத்துசெய்யப்படும்.</translation> <translation id="3690128548376345212">நெட்வொர்க் <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, இயக்கப்படவில்லை, <ph name="CONNECTION_STATUS" />, சிக்னல் வலிமை <ph name="SIGNAL_STRENGTH" />%, விவரங்கள்</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">உங்கள் உலாவலைத் பாதுகாப்பாக்கும் வழிகளைத் தொடர்ந்து தேடுகிறோம். முன்னர், எந்த இணையதளமும் நீட்டிப்பை உங்கள் உலாவியில் சேர்க்கக் கேட்கலாம். சமீபத்திய Google Chrome பதிப்புகளில், நீட்டிப்புகள் பக்கம் வழியாக அவற்றைச் சேர்ப்பதன் மூலம், இந்த நீட்டிப்புகளை நிறுவ விரும்புகிறீர்களா என்பதை வெளிப்படையாக Chromeக்குக் கூற வேண்டும். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation> <translation id="9111102763498581341">அன்லாக் செய்</translation> <translation id="912419004897138677">கோடெக்</translation> -<translation id="9129931661813833980">ஃபோல்டரைப் பின் செய்</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' இன் உறுப்பினர்கள் இந்த ஃபைல்களுக்கான அணுகலைப் பெறுவார்கள்.</translation> <translation id="9131598836763251128">ஒன்று அல்லது அதற்குமேற்பட்ட ஃபைல்களைத் தேர்ந்தெடுக்கவும்</translation> <translation id="9133055936679483811">ஜிப் செய்தல் தோல்வி. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_te.xtb b/ui/chromeos/translations/ui_chromeos_strings_te.xtb index 8d3ee904..f85f338 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_te.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">అన్నీ బ్యాకప్ చేయబడ్డాయి!</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" />లో <ph name="NETWORK_INDEX" /> నెట్వర్క్, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, మీ అడ్మినిస్ట్రేటర్ ద్వారా నిర్వహించబడుతోంది, వివరాలు</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> ఐటెమ్లు తరలించబడ్డాయి.</translation> -<translation id="3645531960514756307">ఫోల్డర్ను అన్పిన్ చేయి</translation> <translation id="3685122418104378273">మొబైల్ డేటాను ఉపయోగిస్తున్నప్పుడు Google Drive సింక్ డిఫాల్ట్గా నిలిపివేయబడుతుంది.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" />ను రద్దు చేయి.</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" />లోని నెట్వర్క్ <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, యాక్టివేట్ చేయబడలేదు, <ph name="CONNECTION_STATUS" />, సిగ్నల్ సామర్థ్యం <ph name="SIGNAL_STRENGTH" />%, వివరాలు</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">మేము మీ బ్రౌజింగ్ను సురక్షితం చేసే మార్గాల కోసం నిరంతరం శోధిస్తున్నాము. గతంలో, ఏ వెబ్సైట్ అయినా మీ బ్రౌజర్కు ఎక్స్టెన్షన్ను జోడించడానికి మిమ్మల్ని ప్రాంప్ట్ చేసి ఉండవచ్చు. Google Chrome తాజా వెర్షన్లలో, మీరు తప్పనిసరిగా ఎక్స్టెన్షన్ల పేజీలో వాటిని జోడించడం ద్వారా ఈ ఎక్స్టెన్షన్లను ఇన్స్టాల్ చేయాలని అనుకుంటున్నట్లు Chromeకు ప్రత్యేకించి తెలియజేయాలి. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation> <translation id="9111102763498581341">అన్లాక్ చేయి</translation> <translation id="912419004897138677">కోడెక్</translation> -<translation id="9129931661813833980">ఫోల్డర్ను పిన్ చేయి</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' యొక్క సభ్యులు ఈ అంశాలకు యాక్సెస్ పొందుతారు.</translation> <translation id="9131598836763251128">దయచేసి ఒకటి లేదా మరిన్ని ఫైళ్ళను ఎంచుకోండి</translation> <translation id="9133055936679483811">జిప్ చేయడంలో విఫలమైంది. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb index e213defc..e1c4eb4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">สำรองข้อมูลทั้งหมดแล้ว!</translation> <translation id="3634507049637220048">เครือข่ายที่ <ph name="NETWORK_INDEX" /> จาก <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, จัดการโดยผู้ดูแลระบบ, รายละเอียด</translation> <translation id="3645233063072417428">ย้าย <ph name="NUMBER_OF_ITEMS" /> รายการแล้ว</translation> -<translation id="3645531960514756307">เลิกตรึงโฟลเดอร์</translation> <translation id="3685122418104378273">เมื่อใช้ข้อมูลมือถือ การซิงค์ Google ไดรฟ์จะปิดใช้อยู่เป็นค่าเริ่มต้น</translation> <translation id="3689865792480713551">ยกเลิก<ph name="ACTIVITY_DESCRIPTION" /></translation> <translation id="3690128548376345212"><ph name="NETWORK_INDEX" /> จาก <ph name="NETWORK_COUNT" /> เครือข่าย, <ph name="NETWORK_NAME" />, ไม่ได้เปิดใช้งาน, <ph name="CONNECTION_STATUS" />, ความแรงของสัญญาณ <ph name="SIGNAL_STRENGTH" />%, รายละเอียด</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">เรายังคงค้นหาวิธีที่จะทำให้การท่องเว็บของคุณปลอดภัยยิ่งขึ้นอย่างสม่ำเสมอ ก่อนหน้านี้ทุกเว็บไซต์สามารถแสดงข้อความแจ้งให้คุณเพิ่มส่วนขยายในเบราว์เซอร์ แต่ใน Google Chrome เวอร์ชันล่าสุด คุณจะต้องแจ้งให้ Chrome ทราบอย่างชัดเจนว่าคุณต้องการติดตั้งส่วนขยายเหล่านี้โดยการเพิ่มส่วนขยายผ่านหน้า "ส่วนขยาย" <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation> <translation id="9111102763498581341">ปลดล็อก</translation> <translation id="912419004897138677">ตัวแปลงรหัส</translation> -<translation id="9129931661813833980">ตรึงโฟลเดอร์</translation> <translation id="9130775360844693113">สมาชิกของ "<ph name="DESTINATION_NAME" />" จะได้รับสิทธิ์เข้าถึงรายการเหล่านี้</translation> <translation id="9131598836763251128">โปรดเลือกอย่างน้อยหนึ่งไฟล์</translation> <translation id="9133055936679483811">การซิปล้มเหลว <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb index cc4b768..e753b29a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Tümü yedeklendi!</translation> <translation id="3634507049637220048">Ağ <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Yöneticiniz tarafından yönetiliyor, Ayrıntılar</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> öğe taşındı.</translation> -<translation id="3645531960514756307">Klasörün sabitlemesini kaldır</translation> <translation id="3685122418104378273">Mobil veriler kullanılırken Google Drive senkronizasyonu varsayılan olarak devre dışıdır.</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> işlemi iptal edilecek.</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" /> ağdan <ph name="NETWORK_INDEX" />., <ph name="NETWORK_NAME" />, Etkinleştirilmemiş, <ph name="CONNECTION_STATUS" />, Sinyal Gücü %<ph name="SIGNAL_STRENGTH" />, Ayrıntılar</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Sürekli olarak, web'e daha güvenli göz atabilmenizi sağlamanın yollarını aramaktayız. Önceden, herhangi bir web sitesi, tarayıcınıza uzantı eklemeniz için istekte bulunabiliyordu. Google Chrome'un son sürümlerinde bu uzantıları yüklemek istediğinizi Chrome'a açıkça söylemelisiniz. Bunu yapmak için uzantıları Uzantılar sayfası üzerinden eklemeniz gerekiyor. <ph name="BEGIN_LINK" />Daha fazla bilgi edinin<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Kilidi Aç</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Klasörü sabitle</translation> <translation id="9130775360844693113">"<ph name="DESTINATION_NAME" />" hedefinin üyeleri, bu öğelere erişim hakkı kazanacaktır.</translation> <translation id="9131598836763251128">Bir veya daha fazla dosya seçin</translation> <translation id="9133055936679483811">Sıkıştırma başarısız oldu. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb index 29231aed..93f8dfc 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Усі файли імпортовано!</translation> <translation id="3634507049637220048">Мережа <ph name="NETWORK_INDEX" /> з <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />. Мережею керує адміністратор. Докладніше</translation> <translation id="3645233063072417428">Переміщено елементів: <ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Відкріпити папку</translation> <translation id="3685122418104378273">Коли використовується мобільний Інтернет, синхронізацію Google Диска вимкнено за умовчанням.</translation> <translation id="3689865792480713551">Скасувати <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Мережа <ph name="NETWORK_INDEX" /> з <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, не активовано, <ph name="CONNECTION_STATUS" />, рівень сигналу – <ph name="SIGNAL_STRENGTH" />%, відомості</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Ми постійно шукаємо способи зробити перегляд веб-сторінок безпечнішим. Раніше будь-який веб-сайт міг пропонувати вам додати розширення у веб-переглядач. В останніх версіях Google Chrome ви маєте чітко вказати, що хочете встановити ці розширення, додавши їх на сторінці "Розширення". <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Розблокувати</translation> <translation id="912419004897138677">Кодек</translation> -<translation id="9129931661813833980">Закріпити папку</translation> <translation id="9130775360844693113">Учасники, які мають доступ до розташування "<ph name="DESTINATION_NAME" />", отримають доступ до цих елементів.</translation> <translation id="9131598836763251128">Виберіть один або декілька файлів</translation> <translation id="9133055936679483811">Помилка архівування. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb index 6834906..c0431f2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">سبھی کا بیک اپ بنا لیا گیا!</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" /> میں سے نیٹ ورک <ph name="NETWORK_INDEX" />، <ph name="NETWORK_NAME" />، <ph name="CONNECTION_STATUS" />، آپ کے منتظم کے زیر انتظام ہے، تفصیلات</translation> <translation id="3645233063072417428"><ph name="NUMBER_OF_ITEMS" /> آئٹمز منتقل کیے گئے۔</translation> -<translation id="3645531960514756307">فولڈر کا پن ہٹائیں</translation> <translation id="3685122418104378273">موبائل ڈیٹا استعمال کرتے وقت، Google Drive کی مطابقت پذیری بطور ڈیفالٹ غیر فعال کر دی جاتی ہے۔</translation> <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> منسوخ کریں۔</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" /> <ph name="NETWORK_NAME" /> کا نیٹ ورک <ph name="NETWORK_INDEX" /> غیر فعال ہے، <ph name="CONNECTION_STATUS" />، <ph name="SIGNAL_STRENGTH" />% سگنل کی مضبوطی کی تفصیلات</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">ہم آپ کی براؤزنگ کو محفوظ تر بنانے کے طریقے مستقل تلاش کر رہے ہیں۔ ازیں قبل، کوئی بھی ویب سائٹ آپ کو اپنے براؤزر میں ایک ایکسٹینشن شامل کرنے کا اشارہ دے سکتی تھی۔ Google Chrome کے تازہ ترین ورژن میں، ایکسٹینشنز صفحہ کے ذریعہ ایکسٹینشنز کو شامل کر کے آپ کو واضح طور پر Chrome کو بتا دینا چاہیے کہ آپ انہیں شامل کرنا چاہتے ہیں۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="9111102763498581341">غیر مقفل کریں</translation> <translation id="912419004897138677">کوڈیک</translation> -<translation id="9129931661813833980">فولڈر کو پن کریں</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' کے اراکین کو ان آئٹمز تک رسائي حاصل ہوگي۔</translation> <translation id="9131598836763251128">ایک یا مزید فائلیں منتخب کریں</translation> <translation id="9133055936679483811">زپ کرنا ناکام ہوگیا۔ <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uz.xtb b/ui/chromeos/translations/ui_chromeos_strings_uz.xtb index 1172647..c3e4d45 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_uz.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_uz.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Ma’lumotlar saqlandi!</translation> <translation id="3634507049637220048">Tarmoq: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, Nomi: <ph name="NETWORK_NAME" />, Ulanish:<ph name="CONNECTION_STATUS" />, Administrator boshqaruvida, Batafsil</translation> <translation id="3645233063072417428">Boshqa joyga olindi: <ph name="NUMBER_OF_ITEMS" /></translation> -<translation id="3645531960514756307">Jildni olib tashlash</translation> <translation id="3685122418104378273">Google Disk‘ni mobil internet orqali sinxronlash birlamchi holatda o‘chirib qo‘yilgan.</translation> <translation id="3689865792480713551">Bekor qilish <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Tarmoq: <ph name="NETWORK_INDEX" /> / <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, faolsizlantirilgan, <ph name="CONNECTION_STATUS" />, signal kuchi <ph name="SIGNAL_STRENGTH" />%, tafsilotlar</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Biz doim brauzerimizni yanada havfsizroq qilish ustida ishlaymiz. Avval har qanday sayt kengaytma o‘rnatishga ruxsati bo‘lgan edi. Google Chrome‘ning so‘nggi versiyalarida kengaytmalar endi faqat “Kengaytmalar” sahifasidan o‘rnatiladi. <ph name="BEGIN_LINK" />Batafsil...<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Qulfdan yechish</translation> <translation id="912419004897138677">Kodek</translation> -<translation id="9129931661813833980">Jildni mahkamlash</translation> <translation id="9130775360844693113">“<ph name="DESTINATION_NAME" />” foydalanuvchilari bu elemntlardan foydalana olishadi.</translation> <translation id="9131598836763251128">Fayllarni tanlang</translation> <translation id="9133055936679483811">Arxivlashda xatolik yuz berdi. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb index 623934c..cd83fa7 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Đã sao lưu tất cả!</translation> <translation id="3634507049637220048">Mạng <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Do quản trị viên của bạn quản lý, Thông tin chi tiết</translation> <translation id="3645233063072417428">Đã di chuyển <ph name="NUMBER_OF_ITEMS" /> mục.</translation> -<translation id="3645531960514756307">Bỏ ghim thư mục</translation> <translation id="3685122418104378273">Tính năng đồng bộ hóa Google Drive được tắt theo mặc định khi sử dụng dữ liệu di động.</translation> <translation id="3689865792480713551">Hủy <ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Mạng <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Chưa kích hoạt, <ph name="CONNECTION_STATUS" />, Cường độ tín hiệu: <ph name="SIGNAL_STRENGTH" />%, Thông tin chi tiết</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">Chúng tôi không ngừng tìm cách để giúp cho quá trình duyệt web của bạn trở nên an toàn hơn. Trước đây, bất kỳ trang web nào cũng có thể nhắc bạn thêm tiện ích vào trình duyệt. Trong các phiên bản mới nhất của Google Chrome, bạn phải cho Chrome biết rõ rằng bạn muốn cài đặt các tiện ích này bằng cách thêm chúng thông qua trang Tiện ích. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Mở khóa</translation> <translation id="912419004897138677">Codec</translation> -<translation id="9129931661813833980">Ghim thư mục</translation> <translation id="9130775360844693113">Thành viên của '<ph name="DESTINATION_NAME" />' sẽ có quyền truy cập vào các tệp này.</translation> <translation id="9131598836763251128">Chọn một hoặc nhiều tệp</translation> <translation id="9133055936679483811">Nén không thành công. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb index c13aac37..609f180e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">所有文件都已备份!</translation> <translation id="3634507049637220048">第 <ph name="NETWORK_INDEX" /> 个网络(共 <ph name="NETWORK_COUNT" /> 个),<ph name="NETWORK_NAME" />,<ph name="CONNECTION_STATUS" />,由您的管理员管理,详细信息</translation> <translation id="3645233063072417428">已移动 <ph name="NUMBER_OF_ITEMS" /> 项。</translation> -<translation id="3645531960514756307">取消固定文件夹</translation> <translation id="3685122418104378273">当您使用移动数据网络时,Google 云端硬盘同步功能默认情况下处于停用状态。</translation> <translation id="3689865792480713551">取消<ph name="ACTIVITY_DESCRIPTION" />。</translation> <translation id="3690128548376345212">第 <ph name="NETWORK_INDEX" /> 个网络(共 <ph name="NETWORK_COUNT" /> 个),<ph name="NETWORK_NAME" />,未激活,<ph name="CONNECTION_STATUS" />,信号强度 <ph name="SIGNAL_STRENGTH" />%,详细信息</translation> @@ -922,7 +921,6 @@ <translation id="9110990317705400362">我们在不断寻找各种方式来提高上网安全。之前,任何网站都可以提示您在浏览器中添加扩展程序;而在最新版本的Google Chrome中,您必须明确告诉Chrome您想要安装这些扩展程序(即:在“扩展程序”页添加它们)后才可以。<ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation> <translation id="9111102763498581341">解锁</translation> <translation id="912419004897138677">编解码器</translation> -<translation id="9129931661813833980">固定文件夹</translation> <translation id="9130775360844693113">“<ph name="DESTINATION_NAME" />”的成员将会有权访问这些内容。</translation> <translation id="9131598836763251128">选择一个或多个文件</translation> <translation id="9133055936679483811">压缩失败。<ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb index b46df65..36f5955 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">已全部備份!</translation> <translation id="3634507049637220048">第 <ph name="NETWORK_INDEX" /> 個網絡,一共有 <ph name="NETWORK_COUNT" /> 個網絡,<ph name="NETWORK_NAME" />,<ph name="CONNECTION_STATUS" />,由管理員管理,詳情</translation> <translation id="3645233063072417428">已移動 <ph name="NUMBER_OF_ITEMS" /> 個項目。</translation> -<translation id="3645531960514756307">取消固定資料夾</translation> <translation id="3685122418104378273">使用流動數據時,系統根據預設停用「Google 雲端硬碟」同步功能。</translation> <translation id="3689865792480713551">取消 <ph name="ACTIVITY_DESCRIPTION" />。</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" /> 個網絡之中嘅第 <ph name="NETWORK_INDEX" /> 個網絡,<ph name="NETWORK_NAME" />,未啟用,<ph name="CONNECTION_STATUS" />,訊號強度係 <ph name="SIGNAL_STRENGTH" />%,詳細資料</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">我們不斷努力提升瀏覽網絡的安全性。過去,任何網站都可以提示您在瀏覽器中新增擴充功能。在最新版本的 Google Chrome 中,您必須透過「擴充功能」頁面新增擴充功能,讓 Chrome 明確瞭解您想要安裝這些擴充功能。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="9111102763498581341">解鎖</translation> <translation id="912419004897138677">編解碼器</translation> -<translation id="9129931661813833980">固定資料夾</translation> <translation id="9130775360844693113">「<ph name="DESTINATION_NAME" />」的成員將可存取這些項目。</translation> <translation id="9131598836763251128">選取一個或多個檔案</translation> <translation id="9133055936679483811">壓縮失敗。<ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb index 13087e7..ce4c0194 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">所有檔案都已備份!</translation> <translation id="3634507049637220048">第 <ph name="NETWORK_INDEX" /> 個網路 (共 <ph name="NETWORK_COUNT" /> 個),<ph name="NETWORK_NAME" />,<ph name="CONNECTION_STATUS" />,由系統管理員管理,詳細資料</translation> <translation id="3645233063072417428">已移動 <ph name="NUMBER_OF_ITEMS" /> 個項目。</translation> -<translation id="3645531960514756307">取消固定資料夾</translation> <translation id="3685122418104378273">使用行動數據時,Google 雲端硬碟同步功能預設為停用。</translation> <translation id="3689865792480713551">取消<ph name="ACTIVITY_DESCRIPTION" />。</translation> <translation id="3690128548376345212"><ph name="NETWORK_COUNT" /> 個網路中的第 <ph name="NETWORK_INDEX" /> 個,<ph name="NETWORK_NAME" />,未啟用,<ph name="CONNECTION_STATUS" />,訊號強度 <ph name="SIGNAL_STRENGTH" />%,詳細資料</translation> @@ -927,7 +926,6 @@ <translation id="9110990317705400362">我們不斷努力提升網路瀏覽的安全性。過去,任何網站都可以提示你在瀏覽器中新增擴充功能。在最新版本的 Google Chrome 中,你必須統一透過「擴充功能」頁面新增擴充功能,讓 Chrome 確實瞭解你要安裝的各項擴充功能。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="9111102763498581341">解除鎖定</translation> <translation id="912419004897138677">轉碼器</translation> -<translation id="9129931661813833980">固定資料夾</translation> <translation id="9130775360844693113">「<ph name="DESTINATION_NAME" />」的成員將可存取這些項目。</translation> <translation id="9131598836763251128">選取一或多個檔案</translation> <translation id="9133055936679483811">壓縮失敗。<ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb index 6e87165..830eae9 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb
@@ -305,7 +305,6 @@ <translation id="3620292326130836921">Konke kwenziwe isipele!</translation> <translation id="3634507049637220048">Inethiwekhi <ph name="NETWORK_INDEX" /> ye-<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Iphethwe umlawuli wakho, imininingwane</translation> <translation id="3645233063072417428">izinto ezihanjisiwe ezingu-<ph name="NUMBER_OF_ITEMS" />.</translation> -<translation id="3645531960514756307">Susa ukuphina ifolda</translation> <translation id="3685122418104378273">Ukuvumelanisa kwe-Google Drayivu kukhutshaziwe ngokuzenzakalela, uma kusetshenziswa idatha yeselula.</translation> <translation id="3689865792480713551">Khansela i-<ph name="ACTIVITY_DESCRIPTION" />.</translation> <translation id="3690128548376345212">Inethiwekhi engu-<ph name="NETWORK_INDEX" /> kwezingu-<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Akusetshenzisiwe <ph name="CONNECTION_STATUS" />, Amandla Wesignali <ph name="SIGNAL_STRENGTH" />%, Imininingwane</translation> @@ -926,7 +925,6 @@ <translation id="9110990317705400362">Sibheka izindlela zokwenza ukuphequlula kwakho kuphephe. Ngaphambilini, noma iyiphi iwebhusayithi ingakukhomba ukuthi ungeze isandiso kusiphequluli sakho. Kuzinguqulo zakamuva ze-Google Chrome, kufanele utshele ngokusobala i-Chrome ukuthi ufuna ukufaka lezi zelulo ngokuzingeza ngekhasi lezandiso. <ph name="BEGIN_LINK" />Funda kabanzi<ph name="END_LINK" /></translation> <translation id="9111102763498581341">Vula</translation> <translation id="912419004897138677">I-Codec</translation> -<translation id="9129931661813833980">Phina ifolda</translation> <translation id="9130775360844693113">Amalungu e-'<ph name="DESTINATION_NAME" />' azothola ukufinyelela kulezi zinto.</translation> <translation id="9131598836763251128">Khetha ifayela elilodwa noma amaningi</translation> <translation id="9133055936679483811">Ukuzipha kuhlulekile. <ph name="ERROR_MESSAGE" /></translation>
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager.css b/ui/file_manager/file_manager/foreground/css/file_manager.css index 45d6c02..f3f3f090 100644 --- a/ui/file_manager/file_manager/foreground/css/file_manager.css +++ b/ui/file_manager/file_manager/foreground/css/file_manager.css
@@ -292,7 +292,7 @@ } html.drag-drop-active #directory-tree .tree-item.denies > .tree-row > .file-row { - background-color: var(--google-red-50); + background-color: var(--cros-highlight-color-error); } html.drag-drop-active #directory-tree .tree-item.accepts > .tree-row > .file-row {
diff --git a/ui/file_manager/file_manager/foreground/elements/files_tooltip.html b/ui/file_manager/file_manager/foreground/elements/files_tooltip.html index abbb9c7..6b2d996 100644 --- a/ui/file_manager/file_manager/foreground/elements/files_tooltip.html +++ b/ui/file_manager/file_manager/foreground/elements/files_tooltip.html
@@ -16,7 +16,7 @@ } :host([visible]) { - opacity: 80%; + opacity: 100%; } #label { @@ -32,7 +32,7 @@ background-color: var(--cros-bg-color-elevation-1); border-radius: 8px; box-shadow: var(--cros-elevation-1-shadow); - color: var(--cros-text-primary-color); + color: var(--cros-text-color-primary); height: auto; margin-top: 4px; padding: 12px 16px;
diff --git a/ui/message_center/views/notification_view.cc b/ui/message_center/views/notification_view.cc index 5a6917c..2c1ebe5 100644 --- a/ui/message_center/views/notification_view.cc +++ b/ui/message_center/views/notification_view.cc
@@ -56,6 +56,8 @@ kLeftContentPadding.right() - kContentRowPadding.left() - kContentRowPadding.right(); +constexpr gfx::Insets kLargeImageContainerPadding(0, 16, 16, 16); + // Max number of lines for title_view_. constexpr int kMaxLinesForTitleView = 1; @@ -289,7 +291,10 @@ AddChildView(std::move(header_row)); AddChildView(std::move(content_row)); - AddChildView(CreateImageContainerBuilder().Build()); + AddChildView( + CreateImageContainerBuilder() + .SetBorder(views::CreateEmptyBorder(kLargeImageContainerPadding)) + .Build()); AddChildView(CreateInlineSettingsBuilder().Build()); AddChildView(CreateActionsRow()); @@ -484,6 +489,11 @@ return kIconViewSize; } +int NotificationView::GetLargeImageViewMaxWidth() const { + return kNotificationWidth - kLargeImageContainerPadding.width() - + GetInsets().width(); +} + void NotificationView::OnThemeChanged() { MessageView::OnThemeChanged(); UpdateHeaderViewBackgroundColor();
diff --git a/ui/message_center/views/notification_view.h b/ui/message_center/views/notification_view.h index 73d48e8c..cf7a080c 100644 --- a/ui/message_center/views/notification_view.h +++ b/ui/message_center/views/notification_view.h
@@ -48,6 +48,7 @@ const std::u16string& label) override; void UpdateViewForExpandedState(bool expanded) override; gfx::Size GetIconViewSize() const override; + int GetLargeImageViewMaxWidth() const override; void OnThemeChanged() override; void UpdateCornerRadius(int top_radius, int bottom_radius) override; void ToggleInlineSettings(const ui::Event& event) override;
diff --git a/ui/message_center/views/notification_view_base.cc b/ui/message_center/views/notification_view_base.cc index 9e86fe7..57ed7e8 100644 --- a/ui/message_center/views/notification_view_base.cc +++ b/ui/message_center/views/notification_view_base.cc
@@ -70,7 +70,6 @@ constexpr int kActionsRowHorizontalSpacing = 8; constexpr gfx::Insets kStatusTextPadding(4, 0, 0, 0); constexpr gfx::Insets kActionsRowPadding(8); -constexpr gfx::Insets kLargeImageContainerPadding(0, 16, 16, 16); constexpr int kLargeImageMaxHeight = 218; constexpr int kCompactTitleMessageViewSpacing = 12; @@ -451,11 +450,14 @@ header_view_in_ash_notification_ = true; #endif - return views::Builder<NotificationHeaderView>() - .SetID(kHeaderRow) - .CopyAddressTo(&header_row_) - .SetCallback(base::BindRepeating(&NotificationViewBase::HeaderRowPressed, - base::Unretained(this))); + auto header_row_builder = views::Builder<NotificationHeaderView>() + .SetID(kHeaderRow) + .CopyAddressTo(&header_row_); + if (!header_view_in_ash_notification_) { + header_row_builder.SetCallback(base::BindRepeating( + &NotificationViewBase::HeaderRowPressed, base::Unretained(this))); + } + return header_row_builder; } views::Builder<views::BoxLayoutView> @@ -493,8 +495,7 @@ DCHECK(!image_container_view_); return views::Builder<views::View>() .CopyAddressTo(&image_container_view_) - .SetUseDefaultFillLayout(true) - .SetBorder(views::CreateEmptyBorder(kLargeImageContainerPadding)); + .SetUseDefaultFillLayout(true); } std::unique_ptr<views::View> NotificationViewBase::CreateActionsRow( @@ -734,10 +735,8 @@ } if (image_container_view_->children().empty()) { - int max_width = kNotificationWidth - kLargeImageContainerPadding.width() - - GetInsets().width(); image_container_view_->AddChildView(std::make_unique<LargeImageView>( - gfx::Size(max_width, kLargeImageMaxHeight))); + gfx::Size(GetLargeImageViewMaxWidth(), kLargeImageMaxHeight))); image_container_view_->SetVisible(true); }
diff --git a/ui/message_center/views/notification_view_base.h b/ui/message_center/views/notification_view_base.h index 82a6643d..8101b70 100644 --- a/ui/message_center/views/notification_view_base.h +++ b/ui/message_center/views/notification_view_base.h
@@ -269,6 +269,9 @@ // Returns the size of `icon_view_`. virtual gfx::Size GetIconViewSize() const = 0; + // Returns the max width of the large image inside `image_container_view_`. + virtual int GetLargeImageViewMaxWidth() const = 0; + private: FRIEND_TEST_ALL_PREFIXES(NotificationViewBaseTest, AppNameExtension); FRIEND_TEST_ALL_PREFIXES(NotificationViewBaseTest, AppNameSystemNotification);
diff --git a/ui/message_center/views/notification_view_base_unittest.cc b/ui/message_center/views/notification_view_base_unittest.cc index b30c5d5..8ffd6742 100644 --- a/ui/message_center/views/notification_view_base_unittest.cc +++ b/ui/message_center/views/notification_view_base_unittest.cc
@@ -82,6 +82,7 @@ // NotificationViewBase: void CreateOrUpdateTitleView(const Notification& notification) override {} gfx::Size GetIconViewSize() const override { return gfx::Size(); } + int GetLargeImageViewMaxWidth() const override { return 0; } void CreateOrUpdateSmallIconView(const Notification& notification) override {} void CreateOrUpdateInlineSettingsViews( const Notification& notification) override {
diff --git a/ui/ozone/platform/wayland/fuzzer/wayland_buffer_fuzzer.cc b/ui/ozone/platform/wayland/fuzzer/wayland_buffer_fuzzer.cc index 1e3388d..8f948ac 100644 --- a/ui/ozone/platform/wayland/fuzzer/wayland_buffer_fuzzer.cc +++ b/ui/ozone/platform/wayland/fuzzer/wayland_buffer_fuzzer.cc
@@ -29,6 +29,7 @@ #include "ui/gfx/geometry/rect.h" #include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h" #include "ui/ozone/platform/wayland/host/wayland_connection.h" +#include "ui/ozone/platform/wayland/host/wayland_event_source.h" #include "ui/ozone/platform/wayland/host/wayland_output_manager.h" #include "ui/ozone/platform/wayland/host/wayland_window.h" #include "ui/ozone/platform/wayland/test/test_wayland_server_thread.h" @@ -140,6 +141,9 @@ std::make_unique<ui::WaylandConnection>(); CHECK(connection->Initialize()); + // See |use_dedicated_polling_thread| in WaylandEventWatcher. + connection->event_source()->UseSingleThreadedPollingForTesting(); + // Wait until everything is initialised. env.task_environment.RunUntilIdle();
diff --git a/ui/ozone/platform/wayland/host/wayland_keyboard.cc b/ui/ozone/platform/wayland/host/wayland_keyboard.cc index 7c575f9b..cbc9fa0 100644 --- a/ui/ozone/platform/wayland/host/wayland_keyboard.cc +++ b/ui/ozone/platform/wayland/host/wayland_keyboard.cc
@@ -4,6 +4,7 @@ #include "ui/ozone/platform/wayland/host/wayland_keyboard.h" +#include <keyboard-extension-unstable-v1-client-protocol.h> #include <sys/mman.h> #include <cstddef>
diff --git a/ui/ozone/platform/wayland/host/wayland_keyboard.h b/ui/ozone/platform/wayland/host/wayland_keyboard.h index cb882edc..b0773edb 100644 --- a/ui/ozone/platform/wayland/host/wayland_keyboard.h +++ b/ui/ozone/platform/wayland/host/wayland_keyboard.h
@@ -5,8 +5,6 @@ #ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_KEYBOARD_H_ #define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_KEYBOARD_H_ -#include <keyboard-extension-unstable-v1-client-protocol.h> - #include <cstdint> #include "base/time/time.h"
diff --git a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc index 669903a..9c64a7d9 100644 --- a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
@@ -359,7 +359,7 @@ // bounds. if (width_dip > 1 && height_dip > 1) { pending_bounds_dip_ = gfx::Rect(0, 0, width_dip, height_dip); - if (frame_insets_px()) { + if (is_normal && frame_insets_px()) { pending_bounds_dip_.Inset( -gfx::ScaleToRoundedInsets(*frame_insets_px(), 1.f / window_scale())); pending_bounds_dip_.set_origin({0, 0}); @@ -453,7 +453,7 @@ if (!shell_toplevel_) return; - if (frame_insets_px()) { + if (state_ == PlatformWindowState::kNormal && frame_insets_px()) { bounds_dip.Inset( gfx::ScaleToRoundedInsets(*frame_insets_px(), 1.f / window_scale())); }
diff --git a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc index efb732f0..a8fcacb 100644 --- a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
@@ -805,8 +805,16 @@ } TEST_P(WaylandWindowTest, CompositorSideStateChanges) { + // Real insets used by default on HiDPI. + const auto kInsets = gfx::Insets{38, 44, 55, 44}; + const auto kNormalBounds = window_->GetBounds(); + EXPECT_EQ(window_->GetPlatformWindowState(), PlatformWindowState::kNormal); - auto normal_bounds = window_->GetBounds(); + + // Set nonzero insets and ensure that they are only used when the window has + // normal state. + // See https://crbug.com/1274629 + window_->SetDecorationInsets(&kInsets); ScopedWlArray states = InitializeWlArrayWithActivatedState(); AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get()); @@ -828,8 +836,11 @@ EXPECT_CALL(delegate_, OnWindowStateChanged(_, Eq(PlatformWindowState::kNormal))) .Times(1); - EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, normal_bounds.width(), - normal_bounds.height())); + EXPECT_CALL(*xdg_surface_, + SetWindowGeometry( + kInsets.left(), kInsets.top(), + kNormalBounds.width() - (kInsets.left() + kInsets.right()), + kNormalBounds.height() - (kInsets.top() + kInsets.bottom()))); Sync(); @@ -850,8 +861,11 @@ EXPECT_CALL(delegate_, OnWindowStateChanged(_, Eq(PlatformWindowState::kNormal))) .Times(1); - EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, normal_bounds.width(), - normal_bounds.height())); + EXPECT_CALL(*xdg_surface_, + SetWindowGeometry( + kInsets.left(), kInsets.top(), + kNormalBounds.width() - (kInsets.left() + kInsets.right()), + kNormalBounds.height() - (kInsets.top() + kInsets.bottom()))); Sync(); @@ -882,8 +896,11 @@ EXPECT_CALL(delegate_, OnWindowStateChanged(_, Eq(PlatformWindowState::kNormal))) .Times(1); - EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, normal_bounds.width(), - normal_bounds.height())); + EXPECT_CALL(*xdg_surface_, + SetWindowGeometry( + kInsets.left(), kInsets.top(), + kNormalBounds.width() - (kInsets.left() + kInsets.right()), + kNormalBounds.height() - (kInsets.top() + kInsets.bottom()))); Sync(); }
diff --git a/ui/views/widget/widget_interactive_uitest.cc b/ui/views/widget/widget_interactive_uitest.cc index d07418d..8845590a 100644 --- a/ui/views/widget/widget_interactive_uitest.cc +++ b/ui/views/widget/widget_interactive_uitest.cc
@@ -916,19 +916,8 @@ #if defined(USE_AURA) -#if BUILDFLAG(IS_CHROMEOS_ASH) || defined(USE_OZONE) -// TODO(crbug.com/916272): investigate fixing and enabling on Chrome OS. -// TODO(crbug.com/1200034): investigate fixing and enabling on Ozone/Wayland. -#define MAYBE_TouchSelectionQuickMenuIsNotActivated \ - DISABLED_TouchSelectionQuickMenuIsNotActivated -#else -#define MAYBE_TouchSelectionQuickMenuIsNotActivated \ - TouchSelectionQuickMenuIsNotActivated -#endif - // Test that touch selection quick menu is not activated when opened. -TEST_F(DesktopWidgetTestInteractive, - MAYBE_TouchSelectionQuickMenuIsNotActivated) { +TEST_F(DesktopWidgetTestInteractive, TouchSelectionQuickMenuIsNotActivated) { WidgetAutoclosePtr widget(CreateTopLevelNativeWidget()); widget->SetBounds(gfx::Rect(0, 0, 200, 200)); @@ -938,16 +927,16 @@ textfield_ptr->SetText(u"some text"); widget->GetRootView()->AddChildView(std::move(textfield)); - widget->Show(); + ShowSync(widget.get()); textfield_ptr->RequestFocus(); textfield_ptr->SelectAll(true); TextfieldTestApi textfield_test_api(textfield_ptr); - RunPendingMessages(); - ui::test::EventGenerator generator(GetRootWindow(widget.get())); generator.GestureTapAt(textfield_ptr->GetBoundsInScreen().origin() + gfx::Vector2d(10, 10)); + // The touch selection controller must be created in response to tapping. + ASSERT_TRUE(textfield_test_api.touch_selection_controller()); static_cast<TouchSelectionControllerImpl*>( textfield_test_api.touch_selection_controller()) ->ShowQuickMenuImmediatelyForTesting();
diff --git a/ui/webui/resources/BUILD.gn b/ui/webui/resources/BUILD.gn index e7b1bc6..f55ad20 100644 --- a/ui/webui/resources/BUILD.gn +++ b/ui/webui/resources/BUILD.gn
@@ -209,6 +209,7 @@ "cr_elements/cr_container_shadow_mixin.ts", "cr_elements/cr_nav_menu_item_style.ts", "cr_elements/find_shortcut_mixin.ts", + "cr_elements/mouse_hoverable_mixin.ts", "js/i18n_mixin.ts", "js/list_property_update_mixin.ts", "js/web_ui_listener_mixin.ts", @@ -242,7 +243,6 @@ "$root_dir/cr_elements/hidden_style_css.m.d.ts", "$root_dir/cr_elements/icons.m.d.ts", "$root_dir/cr_elements/md_select_css.m.d.ts", - "$root_dir/cr_elements/mouse_hoverable_mixin.d.ts", "$root_dir/cr_elements/mwb_shared_icons.d.ts", "$root_dir/cr_elements/mwb_shared_style.d.ts", "$root_dir/cr_elements/mwb_shared_vars.d.ts", @@ -309,7 +309,6 @@ "cr_elements/hidden_style_css.m.js", "cr_elements/icons.m.js", "cr_elements/md_select_css.m.js", - "cr_elements/mouse_hoverable_mixin.js", "cr_elements/mwb_element_shared_style.js", "cr_elements/mwb_shared_icons.js", "cr_elements/mwb_shared_style.js",
diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_elements/BUILD.gn index 49670fcd..0c77fb7 100644 --- a/ui/webui/resources/cr_elements/BUILD.gn +++ b/ui/webui/resources/cr_elements/BUILD.gn
@@ -53,7 +53,7 @@ "cr_search_field/cr_search_field_behavior.js", "cr_splitter/cr_splitter.js", "find_shortcut_mixin.ts", - "mouse_hoverable_mixin.js", + "mouse_hoverable_mixin.ts", ] if (is_chromeos_ash) { @@ -280,12 +280,6 @@ deps = [ "//ui/webui/resources/js:assert" ] } -js_library("mouse_hoverable_mixin") { - deps = [ - "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - ] -} - # Targets for auto-generating Polymer 3 JS Modules. polymer_modulizer("action_link_css") { @@ -399,7 +393,6 @@ deps = [ ":cr_container_shadow_behavior.m", ":cr_scrollable_behavior.m", - ":mouse_hoverable_mixin", ] if (is_chromeos_ash) {
diff --git a/ui/webui/resources/cr_elements/mouse_hoverable_mixin.js b/ui/webui/resources/cr_elements/mouse_hoverable_mixin.js deleted file mode 100644 index e503dd0..0000000 --- a/ui/webui/resources/cr_elements/mouse_hoverable_mixin.js +++ /dev/null
@@ -1,50 +0,0 @@ -// 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. - -/** - * @fileoverview This file provides a mixin to manage a `hovered` style on mouse - * events. Relies on listening for pointer events as touch devices may fire - * mouse events too. - */ - -import {dedupingMixin} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -/** @type {string} */ -const HOVERED_STYLE = 'hovered'; - -/** @interface */ -export class MouseHoverableMixinInterface {} - -/** - * @polymer - * @mixinFunction - */ -export const MouseHoverableMixin = dedupingMixin(superClass => { - /** - * @polymer - * @mixinClass - * @implements {MouseHoverableMixinInterface} - */ - class MouseHoverableMixin extends superClass { - ready() { - super.ready(); - - this.addEventListener('pointerenter', (e) => { - const hostElement = /** @type {!Element} */ (e.currentTarget); - hostElement.classList.toggle(HOVERED_STYLE, e.pointerType === 'mouse'); - }); - - this.addEventListener('pointerleave', (e) => { - if (e.pointerType !== 'mouse') { - return; - } - - const hostElement = /** @type {!Element} */ (e.currentTarget); - hostElement.classList.remove(HOVERED_STYLE); - }); - } - } - - return MouseHoverableMixin; -});
diff --git a/ui/webui/resources/cr_elements/mouse_hoverable_mixin.ts b/ui/webui/resources/cr_elements/mouse_hoverable_mixin.ts new file mode 100644 index 0000000..ee1f05a0 --- /dev/null +++ b/ui/webui/resources/cr_elements/mouse_hoverable_mixin.ts
@@ -0,0 +1,41 @@ +// 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. + +/** + * @fileoverview This file provides a mixin to manage a `hovered` style on mouse + * events. Relies on listening for pointer events as touch devices may fire + * mouse events too. + */ + +import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +const HOVERED_STYLE: string = 'hovered'; + +type Constructor<T> = new (...args: any[]) => T; + +export const MouseHoverableMixin = + dedupingMixin(<T extends Constructor<PolymerElement>>(superClass: T): T => { + class MouseHoverableMixin extends superClass { + ready() { + super.ready(); + + this.addEventListener('pointerenter', (e) => { + const hostElement = e.currentTarget as HTMLElement; + hostElement.classList.toggle( + HOVERED_STYLE, e.pointerType === 'mouse'); + }); + + this.addEventListener('pointerleave', (e) => { + if (e.pointerType !== 'mouse') { + return; + } + + const hostElement = e.currentTarget as HTMLElement; + hostElement.classList.remove(HOVERED_STYLE); + }); + } + } + + return MouseHoverableMixin; + });
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ExternalNavigationTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ExternalNavigationTest.java index 66d86b4..cab8908 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ExternalNavigationTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ExternalNavigationTest.java
@@ -28,7 +28,6 @@ import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.DisableIf; -import org.chromium.base.test.util.DisabledTest; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.weblayer.Browser; import org.chromium.weblayer.Callback; @@ -929,7 +928,6 @@ @Test @SmallTest @MinWebLayerVersion(97) - @DisabledTest(message = "crbug.com/1273004") // Failing on android-arm64-proguard-rel public void testExternalIntentWithNoRedirectBlockedIfIntentProcessingDisabledOnNavigationStarted() throws Throwable { @@ -985,7 +983,6 @@ @Test @SmallTest @MinWebLayerVersion(97) - @DisabledTest(message = "crbug.com/1273004") // Failing on android-arm64-proguard-rel public void testExternalIntentAfterRedirectBlockedIfIntentProcessingDisabledOnNavigationStarted() throws Throwable {
diff --git a/weblayer/browser/profile_impl.cc b/weblayer/browser/profile_impl.cc index 1573b61..dacd6daa 100644 --- a/weblayer/browser/profile_impl.cc +++ b/weblayer/browser/profile_impl.cc
@@ -637,7 +637,8 @@ safe_browsing::SetSafeBrowsingState( pref_service, value ? safe_browsing::SafeBrowsingState::STANDARD_PROTECTION - : safe_browsing::SafeBrowsingState::NO_SAFE_BROWSING); + : safe_browsing::SafeBrowsingState::NO_SAFE_BROWSING, + /*is_esb_enabled_in_sync=*/false); #endif break; case SettingType::UKM_ENABLED: {