diff --git a/DEPS b/DEPS index 469f95b..423e3f6 100644 --- a/DEPS +++ b/DEPS
@@ -299,11 +299,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': '2734e39eb0e0615f8a39d3926e98d6e3b714fc4f', + 'skia_revision': 'bda263d1662f5265d5068a39e708655ce8d57dd8', # 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': '1c819853afbee9ae46a8fda055c4cc0d229cf3f3', + 'v8_revision': '540f15a2c7bd2d0a93e041553a46c2fe7f979eb3', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -326,7 +326,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:11.20230220.1.1', + 'fuchsia_version': 'version:11.20230221.0.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -350,7 +350,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': 'bbfcd79eacb4985d4b68783565f4b494aa64516b', + 'freetype_revision': '713580f41dcc2054d7fa56265f03eeb9c67e0937', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -370,7 +370,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': '6234cc4e018dad1198f8c9042b3083f4f9d3e773', + 'catapult_revision': 'a22c2597b5bfa481324838866945c3ed7394ac47', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. @@ -386,7 +386,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': 'b0a07c88b47635a275b74a73a61c73511d38c5eb', + 'devtools_frontend_revision': '3f06e8987583e27960ce523aec58ac78853bf3a5', # 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. @@ -426,7 +426,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': 'adcc598cc757a102f75e2af083f6f704e9d7f8e4', + 'dawn_revision': '2d6f90771b4745441e281aee5d40d4148a508bfc', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -450,7 +450,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling nearby # and whatever else without interference from each other. - 'nearby_revision': 'f655636db7282a694ed7764bd07fb985e960c2aa', + 'nearby_revision': 'a977a6bd7c85b417919111bf98c139be782ce6cc', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling securemessage # and whatever else without interference from each other. @@ -462,7 +462,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. - 'cros_components_revision': 'd42a4d0a4837dce479842ea7453fcfe8fa897fb1', + 'cros_components_revision': 'c5b6710b0a19bfdcf10e7629b78e4059e4ac38e9', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -764,7 +764,7 @@ 'src/clank': { 'url': 'https://chrome-internal.googlesource.com/clank/internal/apps.git' + '@' + - 'c2c77dcedfbbdac65f27fa9793f0fe08e7f52778', + '6919860fdbee73e3412420f7777172aaa21e5aaf', 'condition': 'checkout_android and checkout_src_internal', }, @@ -863,7 +863,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'VcdzPH5Mzkh2V6Ak_aoaecy37122Xw0witGWm7qKHlAC', + 'version': 'ASXxLj9jOzDFy1UqFP4fx7EKVHk8DU-bJH9Eg5teH4AC', }, ], 'dep_type': 'cipd', @@ -874,7 +874,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'jAp-9LRADV2dw2EiiDTXWzlzhVZVdo6JeBxQTkEhGo8C', + 'version': '5riL5eBswRhKMeQXrej2uBm5vkbQqRmRHQN0UHMQPkoC', }, ], 'dep_type': 'cipd', @@ -885,7 +885,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': 'Gg3BRf4kHZA0ej8fDnuAYYCtF8ztT3a9BlH3I8VP7GgC', + 'version': '2JIE-BRRHOhSxU-CGPDobqdw0siUDCZjIrNHZigVEKcC', }, ], 'dep_type': 'cipd', @@ -953,7 +953,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': '5XJ66D6bMy33f2PGbWb1DSMYbCeqjKLqPB5CJXuhL9wC', + 'version': 'Q8JPQbrQ0L3piEiSuY49ZgHsn3rkbi1UpetSEm8GmCYC', }, ], 'condition': 'checkout_android', @@ -1174,7 +1174,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '7a78af164884ae47c489771e8d4c5fa00ff06267', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '0c0617fd0903c94dd3b0440b5200de00041c99b6', 'condition': 'checkout_chromeos', }, @@ -1206,13 +1206,13 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '62c7a8bad074fdb4339e544b0053206a4f820e15', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '30136f0cb715c04b8e3fb7aec59338f1563a76ae', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '2548a7562b07c9822d7b7d57480683e5b7a6ae40', + 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '94992adedb6758d99cce5bf56e83f00c46de8c91', 'condition': 'checkout_src_internal', }, @@ -1684,7 +1684,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '0d180f46481a96cbe8340734fa5cdce3bba636c8', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f396a983fe100dec36e2c7d9285ca8a74e0ade91', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1718,7 +1718,7 @@ }, 'src/third_party/re2/src': - Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + '9049cd28d7496e05e7b7beaec89291d8bc6a31ee', + Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + '3a8436ac436124a57a4e22d5c8713a2d42b381d7', 'src/third_party/r8': { 'packages': [ @@ -1869,7 +1869,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '6c8361e98f1daba65902f5e2fc1297893ac14b67', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '8ad4924936dea2bd97990b0a951df93f7526f0ff', + Var('webrtc_git') + '/src.git' + '@' + '8188e59076fb8e80ae66bf716474d9dea7deed65', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -1939,7 +1939,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@5954eccec822de2912423edcc1aa909d32fb9e0d', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ee60eaa85819ddb1ed0b58c5f0d4fcb5225ba131', 'condition': 'checkout_src_internal', }, @@ -1958,7 +1958,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/eche_app/app', - 'version': 'QkqVXJUjipHJdTmUu1rYTzRX20EUVl77L00P0yPSdIoC', + 'version': 'yVdTLWNd1_GForz4AMt5vtHRJ0MZjptee-KZ7ihy2GgC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1969,7 +1969,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'GWd4BVjiT8R08INGZRLMAdGEM4rr6OOzmri0KbqUI2gC', + 'version': 'kfBmEH0HYrsxJ3dRE4eqoYadu5PS8mP1_5rMbxr6DCgC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1991,7 +1991,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': 'rBm2O5fJU4DWjmD-qwJuLOT2pSBW9od8sIzlVJWnYr4C', + 'version': 'q9dbwOJkgrjUMzW1Zb1fVGKI9A3xs-jv9vp9UHE2ZScC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/components/arc/compat_mode/test/compat_mode_test_base.cc b/ash/components/arc/compat_mode/test/compat_mode_test_base.cc index 3f355da77..f16eda5 100644 --- a/ash/components/arc/compat_mode/test/compat_mode_test_base.cc +++ b/ash/components/arc/compat_mode/test/compat_mode_test_base.cc
@@ -69,6 +69,7 @@ CompatModeTestBase::~CompatModeTestBase() = default; void CompatModeTestBase::SetUp() { + display::Screen::SetScreenInstance(&test_screen_); views::ViewsTestBase::SetUp(); pref_delegate_ = std::make_unique<TestArcResizeLockPrefDelegate>(); @@ -79,6 +80,7 @@ void CompatModeTestBase::TearDown() { views::ViewsTestBase::TearDown(); + display::Screen::SetScreenInstance(nullptr); } std::unique_ptr<views::Widget> CompatModeTestBase::CreateWidget(bool show) {
diff --git a/ash/components/arc/compat_mode/test/compat_mode_test_base.h b/ash/components/arc/compat_mode/test/compat_mode_test_base.h index fcf60ab..47050e2 100644 --- a/ash/components/arc/compat_mode/test/compat_mode_test_base.h +++ b/ash/components/arc/compat_mode/test/compat_mode_test_base.h
@@ -10,7 +10,6 @@ #include "ash/components/arc/compat_mode/arc_resize_lock_pref_delegate.h" #include "third_party/abseil-cpp/absl/types/optional.h" -#include "ui/display/test/scoped_screen_override.h" #include "ui/display/test/test_screen.h" #include "ui/views/test/views_test_base.h" #include "ui/views/view.h" @@ -45,7 +44,6 @@ private: std::unique_ptr<ArcResizeLockPrefDelegate> pref_delegate_; display::test::TestScreen test_screen_; - display::test::ScopedScreenOverride scoped_screen_override_{&test_screen_}; }; } // namespace arc
diff --git a/ash/components/arc/net/arc_net_utils.cc b/ash/components/arc/net/arc_net_utils.cc index 0a38578..fd9a81020 100644 --- a/ash/components/arc/net/arc_net_utils.cc +++ b/ash/components/arc/net/arc_net_utils.cc
@@ -200,7 +200,7 @@ if (shill_dict) { for (const auto* property : {shill::kStaticIPConfigProperty, shill::kSavedIPConfigProperty}) { - AddIpConfiguration(mojo.get(), shill_dict->FindKey(property)); + AddIpConfiguration(mojo.get(), shill_dict->GetDict().Find(property)); } }
diff --git a/ash/constants/ash_switches.cc b/ash/constants/ash_switches.cc index a63cfe74f..f20f93f9 100644 --- a/ash/constants/ash_switches.cc +++ b/ash/constants/ash_switches.cc
@@ -303,6 +303,11 @@ // flow. const char kCryptohomeRecoveryReauthUrl[] = "cryptohome-recovery-reauth-url"; +// Forces cryptohome recovery process to use test environment (test keys / +// URLs). +const char kCryptohomeRecoveryUseTestEnvironment[] = + "cryptohome-recovery-use-test-env"; + // Controls if AuthSession API should be used when interacting with cryptohomed. const char kCryptohomeUseAuthSession[] = "cryptohome-use-authsession";
diff --git a/ash/constants/ash_switches.h b/ash/constants/ash_switches.h index f0c9deb..6f224aa 100644 --- a/ash/constants/ash_switches.h +++ b/ash/constants/ash_switches.h
@@ -95,6 +95,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kCrosRegion[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kCryptohomeRecoveryReauthUrl[]; +COMPONENT_EXPORT(ASH_CONSTANTS) +extern const char kCryptohomeRecoveryUseTestEnvironment[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kCryptohomeUseAuthSession[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kCryptohomeUseOldEncryptionForTesting[];
diff --git a/ash/system/message_center/notification_grouping_controller_unittest.cc b/ash/system/message_center/notification_grouping_controller_unittest.cc index 9e0d63308..1c0f0d55 100644 --- a/ash/system/message_center/notification_grouping_controller_unittest.cc +++ b/ash/system/message_center/notification_grouping_controller_unittest.cc
@@ -544,7 +544,8 @@ // When the last child of the group notification is removed, its parent // notification should be removed as well. We are testing in the case where // there is no popup or notification center is not showing. -TEST_P(NotificationGroupingControllerTest, ChildNotificationRemove) { +// TODO(crbug.com/1417929): Re-enable this test +TEST_P(NotificationGroupingControllerTest, DISABLED_ChildNotificationRemove) { auto* message_center = MessageCenter::Get(); std::string id0, id1; const GURL url(u"http://test-url.com/");
diff --git a/ash/webui/common/resources/network/network_config.js b/ash/webui/common/resources/network/network_config.js index d84a99f..41d453c7 100644 --- a/ash/webui/common/resources/network/network_config.js +++ b/ash/webui/common/resources/network/network_config.js
@@ -637,6 +637,11 @@ return; } this.eapProperties_.subjectAltNameMatch = sanm; + if (!this.eapConfigServerCaCertAllowed_()) { + this.setError_('missingEapDefaultServerCaSubjectVerification'); + this.propertiesSent_ = false; + return; + } } const propertiesToSet = this.getPropertiesToSet_(); if (this.managedProperties_.source === OncSource.kNone) { @@ -2494,4 +2499,38 @@ this.setError_(''); } }, + + /** + * Verifies if the selected server CA certificate can be used for the selected + * EAP method. This method returns false is the selected EAP method requires a + * server CA certificate and the user selected the default certificate without + * configuring the domain suffix match or subject alternative match and + * without explicitly allowing insecure connections via Chrome flags. + * Otherwise returns true. + * @return {boolean} + * @private + */ + eapConfigServerCaCertAllowed_() { + if (loadTimeData.getBoolean( + 'eapDefaultCasWithoutSubjectVerificationAllowed')) { + return true; + } + + const outer = this.eapProperties_.outer; + if (!(outer === 'EAP-TLS' || outer === 'EAP-TTLS' || outer === 'PEAP')) { + return true; + } + + if (!this.eapProperties_.useSystemCas) { + // Does not use default CA server certs. + return true; + } + + if (this.eapProperties_.domainSuffixMatch.length != 0 || + this.eapProperties_.subjectAltNameMatch.length != 0) { + return true; + } + + return false; + }, });
diff --git a/ash/webui/common/resources/network/network_list_item.html b/ash/webui/common/resources/network/network_list_item.html index e32ee84..8b8f696 100644 --- a/ash/webui/common/resources/network/network_list_item.html +++ b/ash/webui/common/resources/network/network_list_item.html
@@ -18,7 +18,7 @@ :host([disabled_]) cr-policy-indicator, :host([disabled_]) #networkIconContainer, - :host([disabled_]) #networkStateText, + :host([disabled_]) #sublabel, :host([disabled_]) #divText, :host([is-e-sim-pending-profile_]) #divText, :host([is-e-sim-pending-profile_]) #divIcon, @@ -58,11 +58,11 @@ margin-inline-start: 20px; } - #networkStateText { + #sublabel { font-size: inherit; } - #networkStateText[active] { + #sublabel[active] { color: var(--cros-text-color-positive); } @@ -127,15 +127,18 @@ <div id="itemTitle" aria-hidden="true"> [[itemTitle_]] </div> - <div id="networkStateText" - class$="[[getNetworkStateTextClass_(networkState.*, + <div id="sublabel" + class$="[[getSublabelClass_(networkState.*, isPSimUnavailableNetwork_, isESimUnactivatedProfile_)]]" - hidden$="[[!isStateTextVisible_(networkState.*, - isPSimUnavailableNetwork_, isESimUnactivatedProfile_)]]" - active$="[[isStateTextActive_(networkState.*, - activationUnavailable, isESimUnactivatedProfile_)]]"> - [[getNetworkStateText_(networkState.*, activationUnavailable, + hidden$="[[!isSublabelVisible_(networkState.*, + isPSimUnavailableNetwork_, isUserLoggedIn_, + isESimUnactivatedProfile_, isPSimPendingActivationNetwork_)]]" + active$="[[isSublabelActive_(networkState.*, + isUserLoggedIn_, isPSimPendingActivationNetwork_, + activationUnavailable, isESimUnactivatedProfile_)]]"> + [[getSublabelText_(networkState.*, activationUnavailable, deviceState.*, isPSimUnavailableNetwork_, + isPSimPendingActivationNetwork_, isUserLoggedIn_, isESimUnactivatedProfile_)]] </div> </div> @@ -146,7 +149,7 @@ </template> <template is="dom-if" if="[[shouldShowActivateButton_(isPSimPendingActivationNetwork_, - showButtons)]]" restamp> + showButtons, isUserLoggedIn_)]]" restamp> <cr-button id="activateButton" aria-label$="[[getActivateBtnA11yLabel_(item)]]" on-click="onActivateButtonClick_"
diff --git a/ash/webui/common/resources/network/network_list_item.js b/ash/webui/common/resources/network/network_list_item.js index 030772b..547eca6 100644 --- a/ash/webui/common/resources/network/network_list_item.js +++ b/ash/webui/common/resources/network/network_list_item.js
@@ -21,6 +21,7 @@ import {getESimProfileProperties} from '//resources/ash/common/cellular_setup/esim_manager_utils.js'; import {FocusRowBehavior} from '//resources/ash/common/focus_row_behavior.js'; import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; +import {loadTimeData} from '//resources/ash/common/load_time_data.m.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ActivationStateType, CrosNetworkConfigRemote, GlobalPolicy, ManagedCellularProperties, ManagedProperties, SecurityType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {ConnectionStateType, NetworkType, OncSource, PortalState} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js'; @@ -51,7 +52,7 @@ reflectToAttribute: true, observer: 'disabledChanged_', computed: 'computeDisabled_(deviceState, deviceState.inhibitReason,' + - 'disableItem)', + 'disableItem, isUserLoggedIn_, isPSimPendingActivationNetwork_)', }, /** @@ -239,6 +240,15 @@ type: Boolean, value: false, }, + + /** @private {boolean} */ + isUserLoggedIn_: { + type: Boolean, + value() { + return loadTimeData.valueExists('isUserLoggedIn') && + loadTimeData.getBoolean('isUserLoggedIn'); + }, + }, }, /** @private {?CrosNetworkConfigRemote} */ @@ -401,6 +411,10 @@ if (!this.deviceState) { return false; } + if (this.isPsimPendingActivationWhileLoggedOut_()) { + return true; + } + return OncMojo.deviceIsInhibited(this.deviceState); }, @@ -414,7 +428,7 @@ return ''; } - const status = this.getNetworkStateText_(); + const sublabel = this.getSublabelText_(); const isManaged = this.item.source === OncSource.kDevicePolicy || this.item.source === OncSource.kUserPolicy; @@ -435,16 +449,26 @@ switch (this.item.type) { case NetworkType.kCellular: if (isManaged) { - if (status) { + if (sublabel) { if (this.subtitle_) { + if (this.isPsimPendingActivationWhileLoggedOut_()) { + return this.i18n( + 'networkListItemLabelManagedActivateAfterSetupWithProviderName', + index, total, this.getItemName_(), this.subtitle_); + } return this.i18n( 'networkListItemLabelCellularManagedWithConnectionStatusAndProviderName', - index, total, this.getItemName_(), this.subtitle_, status, + index, total, this.getItemName_(), this.subtitle_, sublabel, this.item.typeState.cellular.signalStrength); } + if (this.isPsimPendingActivationWhileLoggedOut_()) { + return this.i18n( + 'networkListItemLabelManagedActivateAfterSetup', index, total, + this.getItemName_()); + } return this.i18n( 'networkListItemLabelCellularManagedWithConnectionStatus', - index, total, this.getItemName_(), status, + index, total, this.getItemName_(), sublabel, this.item.typeState.cellular.signalStrength); } if (this.subtitle_) { @@ -457,28 +481,38 @@ 'networkListItemLabelCellularManaged', index, total, this.getItemName_(), this.item.typeState.cellular.signalStrength); } - if (status) { + if (sublabel) { + if (this.subtitle_) { + if (this.isPsimPendingActivationWhileLoggedOut_()) { + return this.i18n( + 'networkListItemLabelActivateAfterSetupWithProviderName', + index, total, this.getItemName_(), this.subtitle_); + } + return this.i18n( + 'networkListItemLabelCellularWithConnectionStatusAndProviderName', + index, total, this.getItemName_(), this.subtitle_, sublabel, + this.item.typeState.cellular.signalStrength); + } + if (this.isPsimPendingActivationWhileLoggedOut_()) { + return this.i18n( + 'networkListItemLabelActivateAfterSetup', index, total); + } if (this.isPSimPendingActivationNetwork_) { return this.i18n( 'networkListItemLabelCellularUnactivatedWithConnectionStatus', - index, total, this.getItemName_(), status, + index, total, this.getItemName_(), sublabel, this.item.typeState.cellular.signalStrength); } if (this.isBlockedNetwork_) { return this.i18n( 'networkListItemCellularBlockedWithConnectionStatusA11yLabel', - index, total, this.getItemName_(), status, + index, total, this.getItemName_(), sublabel, this.item.typeState.cellular.signalStrength); } - if (this.subtitle_) { - return this.i18n( - 'networkListItemLabelCellularWithConnectionStatusAndProviderName', - index, total, this.getItemName_(), this.subtitle_, status, - this.item.typeState.cellular.signalStrength); - } + return this.i18n( 'networkListItemLabelCellularWithConnectionStatus', index, total, - this.getItemName_(), status, + this.getItemName_(), sublabel, this.item.typeState.cellular.signalStrength); } @@ -505,35 +539,35 @@ this.item.typeState.cellular.signalStrength); case NetworkType.kEthernet: if (isManaged) { - if (status) { + if (sublabel) { return this.i18n( 'networkListItemLabelCellularManagedWithConnectionStatus', - index, total, this.getItemName_(), status); + index, total, this.getItemName_(), sublabel); } return this.i18n( 'networkListItemLabelEthernetManaged', index, total, this.getItemName_()); } - if (status) { + if (sublabel) { return this.i18n( 'networkListItemLabelEthernetWithConnectionStatus', index, total, - this.getItemName_(), status); + this.getItemName_(), sublabel); } return this.i18n( 'networkListItemLabel', index, total, this.getItemName_()); case NetworkType.kTether: // Tether networks will never be controlled by policy (only disabled). - if (status) { + if (sublabel) { if (this.subtitle_) { return this.i18n( 'networkListItemLabelTetherWithConnectionStatusAndProviderName', - index, total, this.getItemName_(), this.subtitle_, status, + index, total, this.getItemName_(), this.subtitle_, sublabel, this.item.typeState.tether.signalStrength, this.item.typeState.tether.batteryPercentage); } return this.i18n( 'networkListItemLabelTetherWithConnectionStatus', index, total, - this.getItemName_(), status, + this.getItemName_(), sublabel, this.item.typeState.tether.signalStrength, this.item.typeState.tether.batteryPercentage); } @@ -554,10 +588,10 @@ this.i18n('wifiNetworkStatusUnsecured') : this.i18n('wifiNetworkStatusSecured'); if (isManaged) { - if (status) { + if (sublabel) { return this.i18n( 'networkListItemLabelWifiManagedWithConnectionStatus', index, - total, this.getItemName_(), secured, status, + total, this.getItemName_(), secured, sublabel, this.item.typeState.wifi.signalStrength); } return this.i18n( @@ -565,17 +599,17 @@ this.getItemName_(), secured, this.item.typeState.wifi.signalStrength); } - if (status) { + if (sublabel) { if (this.isBlockedNetwork_) { return this.i18n( 'networkListItemWiFiBlockedWithConnectionStatusA11yLabel', - index, total, this.getItemName_(), secured, status, + index, total, this.getItemName_(), secured, sublabel, this.item.typeState.wifi.signalStrength); } return this.i18n( 'networkListItemLabelWifiWithConnectionStatus', index, total, - this.getItemName_(), secured, status, + this.getItemName_(), secured, sublabel, this.item.typeState.wifi.signalStrength); } @@ -618,8 +652,8 @@ * @return {boolean} * @private */ - isStateTextVisible_() { - return !!this.networkState && !!this.getNetworkStateText_(); + isSublabelVisible_() { + return !!this.networkState && !!this.getSublabelText_(); }, /** @@ -627,12 +661,15 @@ * @return {string} * @private */ - getNetworkStateText_() { + getSublabelText_() { if (!this.networkState) { return ''; } if (this.networkState.type === NetworkType.kCellular) { + if (this.isPsimPendingActivationWhileLoggedOut_()) { + return this.i18n('networkListItemActivateAfterDeviceSetup'); + } if (this.networkState.typeState.cellular.simLocked) { return this.i18n('networkListItemUpdatedCellularSimCardLocked'); } @@ -665,7 +702,7 @@ * @return {string} * @private */ - getNetworkStateTextClass_() { + getSublabelClass_() { if (this.shouldShowWarningState_()) { return 'warning'; } @@ -690,6 +727,10 @@ return true; } + if (this.isPsimPendingActivationWhileLoggedOut_()) { + return true; + } + // Warning is shown when there is restricted connectivity. if (this.networkState && OncMojo.isRestrictedConnectivity(this.networkState.portalState)) { @@ -729,13 +770,16 @@ * additional properties (e.g., must be activated for cellular networks). * @private */ - isStateTextActive_() { + isSublabelActive_() { if (!this.networkState) { return false; } if (this.shouldShowNotAvailableText_()) { return false; } + if (this.isPsimPendingActivationWhileLoggedOut_()) { + return false; + } if (this.isESimUnactivatedProfile_) { return false; } @@ -947,6 +991,10 @@ if (!this.showButtons) { return false; } + if (!this.isUserLoggedIn_) { + return false; + } + return this.isPSimPendingActivationNetwork_; }, @@ -1145,4 +1193,14 @@ return portalState === PortalState.kPortal || portalState === PortalState.kProxyAuthRequired; }, + + /** + * Return true if current network is pSIM, requires activation and user is + * not logged in or gone through device setup(OOBE). + * @return {boolean} + * @private + */ + isPsimPendingActivationWhileLoggedOut_() { + return !this.isUserLoggedIn_ && this.isPSimPendingActivationNetwork_; + }, });
diff --git a/base/allocator/partition_alloc_features.cc b/base/allocator/partition_alloc_features.cc index 16c04a6..40e57fe 100644 --- a/base/allocator/partition_alloc_features.cc +++ b/base/allocator/partition_alloc_features.cc
@@ -32,7 +32,13 @@ BASE_FEATURE(kPartitionAllocDanglingPtr, "PartitionAllocDanglingPtr", - FEATURE_DISABLED_BY_DEFAULT); +#if BUILDFLAG(ENABLE_DANGLING_RAW_PTR_FEATURE_FLAGS_FOR_BOTS) + FEATURE_ENABLED_BY_DEFAULT +#else + FEATURE_DISABLED_BY_DEFAULT +#endif +); + constexpr FeatureParam<DanglingPtrMode>::Option kDanglingPtrModeOption[] = { {DanglingPtrMode::kCrash, "crash"}, {DanglingPtrMode::kLogOnly, "log_only"}, @@ -98,7 +104,8 @@ BASE_FEATURE(kPartitionAllocBackupRefPtr, "PartitionAllocBackupRefPtr", -#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN) || \ +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN) || \ + BUILDFLAG(ENABLE_DANGLING_RAW_PTR_FEATURE_FLAGS_FOR_BOTS) || \ (BUILDFLAG(USE_ASAN_BACKUP_REF_PTR) && BUILDFLAG(IS_LINUX)) FEATURE_ENABLED_BY_DEFAULT #else
diff --git a/base/allocator/partition_allocator/BUILD.gn b/base/allocator/partition_allocator/BUILD.gn index 24c0a05..36f2b30 100644 --- a/base/allocator/partition_allocator/BUILD.gn +++ b/base/allocator/partition_allocator/BUILD.gn
@@ -430,6 +430,7 @@ "ENABLE_BACKUP_REF_PTR_SUPPORT=$enable_backup_ref_ptr_support", "ENABLE_BACKUP_REF_PTR_SLOW_CHECKS=$enable_backup_ref_ptr_slow_checks", "ENABLE_DANGLING_RAW_PTR_CHECKS=$enable_dangling_raw_ptr_checks", + "ENABLE_DANGLING_RAW_PTR_FEATURE_FLAGS_FOR_BOTS=$enable_dangling_raw_ptr_feature_flags_for_bots", "ENABLE_DANGLING_RAW_PTR_PERF_EXPERIMENT=$enable_dangling_raw_ptr_perf_experiment", "BACKUP_REF_PTR_POISON_OOB_PTR=$backup_ref_ptr_poison_oob_ptr", "PUT_REF_COUNT_IN_PREVIOUS_SLOT=$put_ref_count_in_previous_slot",
diff --git a/base/allocator/partition_allocator/partition_alloc.gni b/base/allocator/partition_allocator/partition_alloc.gni index 6de277f..6f82921 100644 --- a/base/allocator/partition_allocator/partition_alloc.gni +++ b/base/allocator/partition_allocator/partition_alloc.gni
@@ -136,6 +136,14 @@ enable_dangling_raw_ptr_checks = enable_dangling_raw_ptr_checks_default && enable_backup_ref_ptr_support + # Enable the feature flags required to check for dangling pointers. That is to + # say `PartitionAllocBackupRefPtr` and `PartitionAllocDanglingPtr`. + # + # This is meant to be used on bots only. It is much easier to override the + # feature flags using a binary flag instead of updating multiple bots's + # scripts to pass command line arguments. + enable_dangling_raw_ptr_feature_flags_for_bots = false + # Enables the dangling raw_ptr checks feature for the performance experiment. # Not every dangling pointers have been fixed or annotated yet. To avoid # accounting for the cost of calling the PA's embedder's callbacks when a
diff --git a/base/allocator/partition_allocator/pointers/raw_ptr.h b/base/allocator/partition_allocator/pointers/raw_ptr.h index ac926de5..a41c60789 100644 --- a/base/allocator/partition_allocator/pointers/raw_ptr.h +++ b/base/allocator/partition_allocator/pointers/raw_ptr.h
@@ -134,6 +134,11 @@ // // Test only. kUseCountingWrapperForTest = (1 << 4), + + // Helper trait that can be used to test raw_ptr's behaviour or conversions. + // + // Test only. + kDummyForTest = (1 << 5), }; // Used to combine RawPtrTraits: @@ -160,12 +165,12 @@ } constexpr bool AreValid(RawPtrTraits traits) { - return Remove(traits, RawPtrTraits::kMayDangle | - RawPtrTraits::kDisableMTECheckedPtr | - RawPtrTraits::kDisableHooks | - RawPtrTraits::kAllowPtrArithmetic | - RawPtrTraits::kUseCountingWrapperForTest) == - RawPtrTraits::kEmpty; + return Remove(traits, + RawPtrTraits::kMayDangle | RawPtrTraits::kDisableMTECheckedPtr | + RawPtrTraits::kDisableHooks | + RawPtrTraits::kAllowPtrArithmetic | + RawPtrTraits::kUseCountingWrapperForTest | + RawPtrTraits::kDummyForTest) == RawPtrTraits::kEmpty; } template <RawPtrTraits Traits> @@ -834,17 +839,37 @@ #endif // BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) || // BUILDFLAG(USE_ASAN_UNOWNED_PTR) + // Cross-kind copy constructor. + // Move is not supported as different traits may use different ref-counts, so + // let move operations degrade to copy, which handles it well. template <RawPtrTraits PassedTraits, typename Unused = std::enable_if_t<Traits != PassedTraits>> PA_ALWAYS_INLINE explicit raw_ptr(const raw_ptr<T, PassedTraits>& p) noexcept : wrapped_ptr_(Impl::WrapRawPtrForDuplication( raw_ptr_traits::TraitsToImpl<PassedTraits>::Impl:: - UnsafelyUnwrapPtrForDuplication(p.wrapped_ptr_))) {} + UnsafelyUnwrapPtrForDuplication(p.wrapped_ptr_))) { + // Limit cross-kind conversions only to cases where kMayDangle gets added, + // because that's needed for Unretained(Ref)Wrapper. Use a static_assert, + // instead of disabling via SFINAE, so that the compiler catches other + // conversions. Otherwise implicit raw_ptr<T> -> T* -> raw_ptr<> route will + // be taken. + static_assert(Traits == (PassedTraits | RawPtrTraits::kMayDangle)); + } + // Cross-kind assignment. + // Move is not supported as different traits may use different ref-counts, so + // let move operations degrade to copy, which handles it well. template <RawPtrTraits PassedTraits, typename Unused = std::enable_if_t<Traits != PassedTraits>> PA_ALWAYS_INLINE raw_ptr& operator=( const raw_ptr<T, PassedTraits>& p) noexcept { + // Limit cross-kind assignments only to cases where kMayDangle gets added, + // because that's needed for Unretained(Ref)Wrapper. Use a static_assert, + // instead of disabling via SFINAE, so that the compiler catches other + // conversions. Otherwise implicit raw_ptr<T> -> T* -> raw_ptr<> route will + // be taken. + static_assert(Traits == (PassedTraits | RawPtrTraits::kMayDangle)); + Impl::ReleaseWrappedPtr(wrapped_ptr_); wrapped_ptr_ = Impl::WrapRawPtrForDuplication( raw_ptr_traits::TraitsToImpl<PassedTraits>::Impl::
diff --git a/base/allocator/partition_allocator/pointers/raw_ptr_unittest.cc b/base/allocator/partition_allocator/pointers/raw_ptr_unittest.cc index 452ad003..376ab43d 100644 --- a/base/allocator/partition_allocator/pointers/raw_ptr_unittest.cc +++ b/base/allocator/partition_allocator/pointers/raw_ptr_unittest.cc
@@ -1352,7 +1352,7 @@ EXPECT_EQ(&x, absl::get<raw_ptr<int>>(vary)); } -TEST_F(RawPtrTest, CrossKindConversions) { +TEST_F(RawPtrTest, CrossKindConversion) { int x = 123; CountingRawPtr<int> ptr1 = &x; @@ -1360,28 +1360,37 @@ RawPtrCountingMayDangleImpl::ClearCounters(); CountingRawPtrMayDangle<int> ptr2(ptr1); + CountingRawPtrMayDangle<int> ptr3(std::move(ptr1)); // Falls back to copy. EXPECT_THAT((CountingRawPtrExpectations<RawPtrCountingImpl>{ .get_for_dereference_cnt = 0, .get_for_extraction_cnt = 0, - .get_for_duplication_cnt = 1}), + .get_for_duplication_cnt = 2}), CountersMatch()); EXPECT_THAT((CountingRawPtrExpectations<RawPtrCountingMayDangleImpl>{ - .wrap_raw_ptr_cnt = 0, .wrap_raw_ptr_for_dup_cnt = 1}), + .wrap_raw_ptr_cnt = 0, .wrap_raw_ptr_for_dup_cnt = 2}), CountersMatch()); +} + +TEST_F(RawPtrTest, CrossKindAssignment) { + int x = 123; + CountingRawPtr<int> ptr1 = &x; RawPtrCountingImpl::ClearCounters(); RawPtrCountingMayDangleImpl::ClearCounters(); - CountingRawPtr<int> ptr3(ptr2); + CountingRawPtrMayDangle<int> ptr2; + CountingRawPtrMayDangle<int> ptr3; + ptr2 = ptr1; + ptr3 = std::move(ptr1); // Falls back to copy. - EXPECT_THAT((CountingRawPtrExpectations<RawPtrCountingMayDangleImpl>{ + EXPECT_THAT((CountingRawPtrExpectations<RawPtrCountingImpl>{ .get_for_dereference_cnt = 0, .get_for_extraction_cnt = 0, - .get_for_duplication_cnt = 1}), + .get_for_duplication_cnt = 2}), CountersMatch()); - EXPECT_THAT((CountingRawPtrExpectations<RawPtrCountingImpl>{ - .wrap_raw_ptr_cnt = 0, .wrap_raw_ptr_for_dup_cnt = 1}), + EXPECT_THAT((CountingRawPtrExpectations<RawPtrCountingMayDangleImpl>{ + .wrap_raw_ptr_cnt = 0, .wrap_raw_ptr_for_dup_cnt = 2}), CountersMatch()); } @@ -1841,48 +1850,36 @@ } // Check the assignment operator works, even across raw_ptr with different -// dangling policies. +// dangling policies (only `not dangling` -> `dangling` direction is supported). TEST_F(BackupRefPtrTest, DanglingPtrAssignment) { ScopedInstallDanglingRawPtrChecks enable_dangling_raw_ptr_checks; void* ptr = allocator_.root()->Alloc(16, ""); - raw_ptr<void, DisableDanglingPtrDetection> dangling_ptr_1; - raw_ptr<void, DisableDanglingPtrDetection> dangling_ptr_2; + raw_ptr<void, DisableDanglingPtrDetection> dangling_ptr; raw_ptr<void> not_dangling_ptr; - dangling_ptr_1 = ptr; - - not_dangling_ptr = dangling_ptr_1; - dangling_ptr_1 = nullptr; - - dangling_ptr_2 = not_dangling_ptr; + not_dangling_ptr = ptr; + dangling_ptr = not_dangling_ptr; not_dangling_ptr = nullptr; allocator_.root()->Free(ptr); - dangling_ptr_1 = dangling_ptr_2; - dangling_ptr_2 = nullptr; - - not_dangling_ptr = dangling_ptr_1; - dangling_ptr_1 = nullptr; + dangling_ptr = nullptr; } // Check the copy constructor works, even across raw_ptr with different dangling -// policies. +// policies (only `not dangling` -> `dangling` direction is supported). TEST_F(BackupRefPtrTest, DanglingPtrCopyContructor) { ScopedInstallDanglingRawPtrChecks enable_dangling_raw_ptr_checks; void* ptr = allocator_.root()->Alloc(16, ""); - raw_ptr<void, DisableDanglingPtrDetection> dangling_ptr_1(ptr); - raw_ptr<void> not_dangling_ptr_1(ptr); + raw_ptr<void> not_dangling_ptr(ptr); + raw_ptr<void, DisableDanglingPtrDetection> dangling_ptr(not_dangling_ptr); - raw_ptr<void, DisableDanglingPtrDetection> dangling_ptr_2(not_dangling_ptr_1); - raw_ptr<void> not_dangling_ptr_2(dangling_ptr_1); - - not_dangling_ptr_1 = nullptr; - not_dangling_ptr_2 = nullptr; + not_dangling_ptr = nullptr; + dangling_ptr = nullptr; allocator_.root()->Free(ptr); }
diff --git a/base/allocator/partition_allocator/pointers/raw_ptr_unittest.nc b/base/allocator/partition_allocator/pointers/raw_ptr_unittest.nc index 4cc2688..6375ade 100644 --- a/base/allocator/partition_allocator/pointers/raw_ptr_unittest.nc +++ b/base/allocator/partition_allocator/pointers/raw_ptr_unittest.nc
@@ -227,6 +227,66 @@ #endif // !BUILDFLAG(HAS_64_BIT_POINTERS) } +#elif defined(NCTEST_CROSS_KIND_CONVERSION_FROM_MAY_DANGLE) // [r"static assertion failed due to requirement '\(base::RawPtrTraits\)0U == \(\(base::RawPtrTraits\)1U | RawPtrTraits::kMayDangle\)'"] + +void WontCompile() { + raw_ptr<int, base::RawPtrTraits::kMayDangle> ptr = new int(3); + [[maybe_unused]] raw_ptr<int> ptr2(ptr); +} + +#elif defined(NCTEST_CROSS_KIND_CONVERSION_FROM_DUMMY) // [r"static assertion failed due to requirement '\(base::RawPtrTraits\)0U == \(\(base::RawPtrTraits\)1U | RawPtrTraits::kMayDangle\)'"] + +void WontCompile() { + raw_ptr<int, base::RawPtrTraits::kDummyForTest> ptr = new int(3); + [[maybe_unused]] raw_ptr<int, base::RawPtrTraits::kMayDangle> ptr2(ptr); +} + +#elif defined(NCTEST_CROSS_KIND_MOVE_CONVERSION_FROM_MAY_DANGLE) // [r"static assertion failed due to requirement '\(base::RawPtrTraits\)0U == \(\(base::RawPtrTraits\)1U | RawPtrTraits::kMayDangle\)'"] + +void WontCompile() { + raw_ptr<int, base::RawPtrTraits::kMayDangle> ptr = new int(3); + [[maybe_unused]] raw_ptr<int> ptr2(std::move(ptr)); +} + +#elif defined(NCTEST_CROSS_KIND_MOVE_CONVERSION_FROM_DUMMY) // [r"static assertion failed due to requirement '\(base::RawPtrTraits\)0U == \(\(base::RawPtrTraits\)1U | RawPtrTraits::kMayDangle\)'"] + +void WontCompile() { + raw_ptr<int, base::RawPtrTraits::kDummyForTest> ptr = new int(3); + [[maybe_unused]] raw_ptr<int, base::RawPtrTraits::kMayDangle> ptr2(std::move(ptr)); +} + +#elif defined(NCTEST_CROSS_KIND_ASSIGNMENT_FROM_MAY_DANGLE) // [r"static assertion failed due to requirement '\(base::RawPtrTraits\)1U == \(\(base::RawPtrTraits\)16U | RawPtrTraits::kMayDangle\)'"] + +void WontCompile() { + raw_ptr<int, base::RawPtrTraits::kMayDangle> ptr = new int(3); + raw_ptr<int> ptr2; + ptr2 = ptr; +} + +#elif defined(NCTEST_CROSS_KIND_ASSIGNMENT_FROM_DUMMY) // [r"static assertion failed due to requirement '\(base::RawPtrTraits\)1U == \(\(base::RawPtrTraits\)16U | RawPtrTraits::kMayDangle\)'"] + +void WontCompile() { + raw_ptr<int, base::RawPtrTraits::kDummyForTest> ptr = new int(3); + raw_ptr<int, base::RawPtrTraits::kMayDangle> ptr2; + ptr2 = ptr; +} + +#elif defined(NCTEST_CROSS_KIND_MOVE_ASSIGNMENT_FROM_MAY_DANGLE) // [r"static assertion failed due to requirement '\(base::RawPtrTraits\)1U == \(\(base::RawPtrTraits\)16U | RawPtrTraits::kMayDangle\)'"] + +void WontCompile() { + raw_ptr<int, base::RawPtrTraits::kMayDangle> ptr = new int(3); + raw_ptr<int> ptr2; + ptr2 = std::move(ptr); +} + +#elif defined(NCTEST_CROSS_KIND_MOVE_ASSIGNMENT_FROM_DUMMY) // [r"static assertion failed due to requirement '\(base::RawPtrTraits\)1U == \(\(base::RawPtrTraits\)16U | RawPtrTraits::kMayDangle\)'"] + +void WontCompile() { + raw_ptr<int, base::RawPtrTraits::kDummyForTest> ptr = new int(3); + raw_ptr<int, base::RawPtrTraits::kMayDangle> ptr2; + ptr2 = std::move(ptr); +} + #endif } // namespace
diff --git a/base/sampling_heap_profiler/sampling_heap_profiler.cc b/base/sampling_heap_profiler/sampling_heap_profiler.cc index 6b259919..0b531aa 100644 --- a/base/sampling_heap_profiler/sampling_heap_profiler.cc +++ b/base/sampling_heap_profiler/sampling_heap_profiler.cc
@@ -32,26 +32,12 @@ #include <sys/prctl.h> #endif -#if BUILDFLAG(IS_ANDROID) && BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE) && \ - defined(OFFICIAL_BUILD) -#include "base/trace_event/cfi_backtrace_android.h" // no-presubmit-check -#define CFI_BACKTRACE_AVAILABLE 1 -#else -#define CFI_BACKTRACE_AVAILABLE 0 -#endif - namespace base { constexpr uint32_t kMaxStackEntries = 256; namespace { -#if CFI_BACKTRACE_AVAILABLE -BASE_FEATURE(kAvoidCFIBacktrace, - "AndroidHeapSamplerAvoidCFIBacktrace", - base::FEATURE_DISABLED_BY_DEFAULT); -#endif - #if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS) BASE_FEATURE(kAvoidFramePointers, "AndroidHeapSamplerAvoidFramePointers", @@ -115,16 +101,6 @@ } StackUnwinder ChooseStackUnwinder() { -#if CFI_BACKTRACE_AVAILABLE - // Only check the kAvoidCFIBacktrace feature if CFIBacktrace would actually be - // used, so the experiment group directly measures what happens when it's - // disabled. - if (trace_event::CFIBacktraceAndroid::GetInitializedInstance() - ->can_unwind_stack_frames() && - !base::FeatureList::IsEnabled(kAvoidCFIBacktrace)) { - return StackUnwinder::kCFIBacktrace; - } -#endif #if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS) // Use frame pointers if available, since they can be faster than the default. if (!base::FeatureList::IsEnabled(kAvoidFramePointers)) { @@ -217,13 +193,6 @@ size_t skip_frames = 3; size_t frame_count = 0; switch (unwinder_) { -#if CFI_BACKTRACE_AVAILABLE - case StackUnwinder::kCFIBacktrace: - frame_count = - base::trace_event::CFIBacktraceAndroid::GetInitializedInstance() - ->Unwind(const_cast<const void**>(frames), max_entries); - break; -#endif #if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS) case StackUnwinder::kFramePointers: frame_count = base::debug::TraceStackFramePointers(
diff --git a/base/sampling_heap_profiler/sampling_heap_profiler.h b/base/sampling_heap_profiler/sampling_heap_profiler.h index 4eacc50c1..d0931a0a 100644 --- a/base/sampling_heap_profiler/sampling_heap_profiler.h +++ b/base/sampling_heap_profiler/sampling_heap_profiler.h
@@ -64,7 +64,7 @@ enum class StackUnwinder { DEPRECATED_kNotChecked, kDefault, - kCFIBacktrace, + DEPRECATED_kCFIBacktrace, kUnavailable, kFramePointers, kMaxValue = kFramePointers,
diff --git a/cc/PRESUBMIT.py b/cc/PRESUBMIT.py index a751cd31..9a2dd4c 100644 --- a/cc/PRESUBMIT.py +++ b/cc/PRESUBMIT.py
@@ -15,7 +15,7 @@ USE_PYTHON3 = True CC_SOURCE_FILES=(r'^cc[\\/].*\.(cc|h)$',) -def CheckChangeLintsClean(input_api, output_api): +def _CheckChangeLintsClean(input_api, output_api): allowlist = CC_SOURCE_FILES denylist = None source_filter = lambda x: input_api.FilterSourceFile(x, allowlist, denylist) @@ -23,7 +23,7 @@ return input_api.canned_checks.CheckChangeLintsClean( input_api, output_api, source_filter, lint_filters=[], verbose_level=1) -def CheckChangeInBundle(input_api, output_api): +def _CheckChangeInBundle(input_api, output_api): import sys old_sys_path = sys.path[:] results = [] @@ -36,7 +36,7 @@ sys.path = old_sys_path return results -def CheckAsserts(input_api, output_api, allowlist=CC_SOURCE_FILES, +def _CheckAsserts(input_api, output_api, allowlist=CC_SOURCE_FILES, denylist=None): denylist = tuple(denylist or input_api.DEFAULT_FILES_TO_SKIP) source_file_filter = lambda x: input_api.FilterSourceFile(x, allowlist, @@ -56,7 +56,7 @@ items=assert_files)] return [] -def CheckStdAbs(input_api, output_api, +def _CheckStdAbs(input_api, output_api, allowlist=CC_SOURCE_FILES, denylist=None): denylist = tuple(denylist or input_api.DEFAULT_FILES_TO_SKIP) source_file_filter = lambda x: input_api.FilterSourceFile(x, @@ -102,7 +102,7 @@ items=missing_std_prefix_files)) return result -def CheckPassByValue(input_api, +def _CheckPassByValue(input_api, output_api, allowlist=CC_SOURCE_FILES, denylist=None): @@ -130,7 +130,7 @@ (f.LocalPath(), match.group('type')))) return local_errors -def CheckTodos(input_api, output_api): +def _CheckTodos(input_api, output_api): errors = [] source_file_filter = lambda x: x @@ -146,7 +146,7 @@ items=errors)] return [] -def CheckDoubleAngles(input_api, output_api, allowlist=CC_SOURCE_FILES, +def _CheckDoubleAngles(input_api, output_api, allowlist=CC_SOURCE_FILES, denylist=None): errors = [] @@ -162,11 +162,11 @@ return [output_api.PresubmitError('Use >> instead of > >:', items=errors)] return [] -def FindUnquotedQuote(contents, pos): +def _FindUnquotedQuote(contents, pos): match = re.search(r"(?<!\\)(?P<quote>\")", contents[pos:]) return -1 if not match else match.start("quote") + pos -def FindUselessIfdefs(input_api, output_api): +def _FindUselessIfdefs(input_api, output_api): errors = [] source_file_filter = lambda x: x for f in input_api.AffectedSourceFiles(source_file_filter): @@ -179,7 +179,7 @@ items=errors)] return [] -def FindNamespaceInBlock(pos, namespace, contents, allowlist=[]): +def _FindNamespaceInBlock(pos, namespace, contents, allowlist=[]): open_brace = -1 close_brace = -1 quote = -1 @@ -189,7 +189,7 @@ while pos < len(contents) and brace_count > 0: if open_brace < pos: open_brace = contents.find("{", pos) if close_brace < pos: close_brace = contents.find("}", pos) - if quote < pos: quote = FindUnquotedQuote(contents, pos) + if quote < pos: quote = _FindUnquotedQuote(contents, pos) if name < pos: name = contents.find(("%s::" % namespace), pos) if name < 0: @@ -222,7 +222,7 @@ # Checks for the use of cc:: within the cc namespace, which is usually # redundant. -def CheckNamespace(input_api, output_api): +def _CheckNamespace(input_api, output_api): errors = [] source_file_filter = lambda x: x @@ -231,7 +231,10 @@ match = re.search(r'namespace\s*cc\s*{', contents) if match: allowlist = [] - if FindNamespaceInBlock(match.end(), 'cc', contents, allowlist=allowlist): + if _FindNamespaceInBlock(match.end(), + 'cc', + contents, + allowlist=allowlist): errors.append(f.LocalPath()) if errors: @@ -240,7 +243,7 @@ items=errors)] return [] -def CheckForUseOfWrongClock(input_api, +def _CheckForUseOfWrongClock(input_api, output_api, allowlist=CC_SOURCE_FILES, denylist=None): @@ -295,14 +298,14 @@ def CheckChangeOnUpload(input_api, output_api): results = [] - results += CheckAsserts(input_api, output_api) - results += CheckStdAbs(input_api, output_api) - results += CheckPassByValue(input_api, output_api) - results += CheckChangeLintsClean(input_api, output_api) - results += CheckChangeInBundle(input_api, output_api) - results += CheckTodos(input_api, output_api) - results += CheckDoubleAngles(input_api, output_api) - results += CheckNamespace(input_api, output_api) - results += CheckForUseOfWrongClock(input_api, output_api) - results += FindUselessIfdefs(input_api, output_api) + results += _CheckAsserts(input_api, output_api) + results += _CheckStdAbs(input_api, output_api) + results += _CheckPassByValue(input_api, output_api) + results += _CheckChangeLintsClean(input_api, output_api) + results += _CheckChangeInBundle(input_api, output_api) + results += _CheckTodos(input_api, output_api) + results += _CheckDoubleAngles(input_api, output_api) + results += _CheckNamespace(input_api, output_api) + results += _CheckForUseOfWrongClock(input_api, output_api) + results += _FindUselessIfdefs(input_api, output_api) return results
diff --git a/chrome/VERSION b/chrome/VERSION index 1d7882b..135f39a 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=112 MINOR=0 -BUILD=5608 +BUILD=5610 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java index ef82010b..6a3726e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java
@@ -35,6 +35,7 @@ import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.quick_delete.QuickDeleteController; import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; import org.chromium.chrome.browser.signin.services.SigninManager; import org.chromium.chrome.browser.sync.settings.ClearDataProgressDialog; @@ -408,6 +409,10 @@ Activity activity = getActivity(); List<TimePeriodSpinnerOption> options = new ArrayList<>(); + if (QuickDeleteController.isQuickDeleteEnabled()) { + options.add(new TimePeriodSpinnerOption(TimePeriod.LAST_15_MINUTES, + activity.getString(R.string.clear_browsing_data_tab_period_15_minutes))); + } options.add(new TimePeriodSpinnerOption(TimePeriod.LAST_HOUR, activity.getString(R.string.clear_browsing_data_tab_period_hour))); options.add(new TimePeriodSpinnerOption(TimePeriod.LAST_DAY, @@ -533,6 +538,18 @@ clearButton.setEnabled(isEnabled); } + private int getSpinnerIndex( + @TimePeriod int timePeriod, TimePeriodSpinnerOption[] spinnerOptions) { + int spinnerOptionIndex = -1; + for (int i = 0; i < spinnerOptions.length; ++i) { + if (spinnerOptions[i].getTimePeriod() == timePeriod) { + spinnerOptionIndex = i; + break; + } + } + return spinnerOptionIndex; + } + @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { if (savedInstanceState != null) { @@ -580,12 +597,10 @@ @TimePeriod int selectedTimePeriod = BrowsingDataBridge.getInstance().getBrowsingDataDeletionTimePeriod( getClearBrowsingDataTabType()); - int spinnerOptionIndex = -1; - for (int i = 0; i < spinnerOptions.length; ++i) { - if (spinnerOptions[i].getTimePeriod() == selectedTimePeriod) { - spinnerOptionIndex = i; - break; - } + int spinnerOptionIndex = getSpinnerIndex(selectedTimePeriod, spinnerOptions); + // If there is no previously-selected value, use last hour as the default. + if (spinnerOptionIndex == -1) { + spinnerOptionIndex = getSpinnerIndex(TimePeriod.LAST_HOUR, spinnerOptions); } assert spinnerOptionIndex != -1; spinner.setOptions(spinnerOptions, spinnerOptionIndex);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridgeTest.java index d2b83c53..0ee6508 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridgeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridgeTest.java
@@ -339,7 +339,7 @@ new int[] { org.chromium.chrome.browser.browsing_data.BrowsingDataType.COOKIES, }, - TimePeriod.LAST_WEEK); + TimePeriod.LAST_15_MINUTES); }); Assert.assertTrue(WebappRegistry.getRegisteredWebappIdsForTesting().isEmpty());
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb index a9b0533..a6b0a43 100644 --- a/chrome/app/resources/chromium_strings_am.xtb +++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">በመለያ የገቡትን የGoogle መለያዎችዎን ማቀናበር ይችላሉ። የእርስዎ የGoogle መለያዎች ለChromium አሳሽ፣ ለPlay መደብር፣ ለGmail እና ለሌሎችም ያገለግላሉ። እንደ የቤተሰብ አባል ለሆነ ለሌላ ሰው መለያ ማከል ከፈለጉ በምትኩ በ<ph name="DEVICE_TYPE" /> ላይ አዲስ ሰው ያክሉ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="1863308913976887472">ጣቢያዎች ስለዝንባሌዎችዎ መረጃን በChromium አማካኝነት ማከማቸት ይችላሉ። ለምሳሌ፣ ለማራቶን ጫማ ለመግዛት ጣቢያን ከጎበኙ ጣቢያው ዝንባሌዎን እንደ ማራቶን መሮጥ ሊገልጽ ይችላል። በኋላ ላይ ለሩጫ ለመመዝገብ ሌላ ጣቢያ ከጎበኙ ይህ ጣቢያ በዝንባሌዎችዎ ላይ ተመስርቶ የመሮጫ ጫማ ማስታወቂያ ሊያሳየዎት ይችላል።</translation> <translation id="1881322772814446296">በሚተዳደር መለያ እየገቡ ነው፣ እና አስተዳዳሪው በእርስዎ Chromium መገለጫ ላይ ቁጥጥር እየሰጡት ነው። እንደ እርስዎ መተግበሪያዎች፣ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ያሉ የእርስዎ Chromium ውሂብ እስከ መጨረሻው ከ<ph name="USER_NAME" /> ጋር የተያያዙ ይሆናሉ። ይህን ውሂብ በGoogle የመለያዎች Dashboard አማካኝነት ሊሰርዙት ይችላሉ፣ ነገር ግን ይህን ውሂብ ከሌላ መለያ ጋር ሊያጎዳኙት አይችሉም። ነባሩ የእርስዎ Chromium ውሂብ ለይተው ለማስቀመጥም አዲስ መገለጫ እንደ አማራጭ መፍጠር ይችላሉ። <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">የአድራሻ አሞሌ ወይም የፍለጋ ሳጥን ውስጥ ሲተይቡ Chromium የንጥል ጥቆማዎችን ለማግኘት የሚተይቡትን ወደ Google Drive ይልካል። ይህ ማንነት የማያሳውቅ ውስጥ ጠፍቷል።</translation> <translation id="1911763535808217981">ይህንን በማጥፋት፣ እንደ Gmail ወደ መሰሉ የGoogle ጣቢያዎች ወደ Chromium በመለያ ሳይገቡ መግባት ይችላሉ</translation> <translation id="1929939181775079593">Chromium መልስ አይሰጥም። አሁን ዳግም ይጀምር?</translation> <translation id="193439633299369377">ChromiumOS ዝማኔውን ለመተግበር ዳግም መጀመር አለበት።</translation>
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb index aa56eafc..68cfefee 100644 --- a/chrome/app/resources/chromium_strings_az.xtb +++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">Daxil olunmuş Google Hesablarını idarə edə bilərsiniz. Google Hesablarınız Chromium brauzeri, Play Market, Gmail və digər xidmətlər üçün istifadə olunur. Ailə üzvü kimi başqası üçün bir hesab əlavə etmək istəyirsinizsə, əvəzində <ph name="DEVICE_TYPE" /> cihazınıza yeni bir şəxs əlavə edin. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="1863308913976887472">Saytlar maraqlarınız haqqında Chromium ilə məlumat saxlaya bilər. Məsələn, marafona ayaqqabı almaq üçün sayta daxil olsanız, sayt marağınızı qaçış marafonu kimi müəyyən edə bilər. Sonra yarışa yazılmaq üçün başqa sayta daxil olsanız, həmin sayt maraqlarınız əsasında sizə qaçış ayaqqabısı reklamı göstərə bilər.</translation> <translation id="1881322772814446296">Nəzarət olunan hesabla daxil olursunuz və hesabın administratoruna Chromium profiliniz üzərində nəzarət etmək imkanı verirsiniz. Tətbiqləriniz, əlfəcinləriniz, tarixçəniz, parollarınız və digər ayarlarınız <ph name="USER_NAME" /> adına həmişəlik bağlı qalacaq. Bu datanı Google Hesab İdarə Paneli vasitəsilə silə biləcəksiniz, lakin bu datanı digər hesabla əlaqələndirə bilməyəcəksiniz. Mövcud Chromium datanızı ayrı saxlamaq üçün yeni profil yarada bilərsiniz. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">Ünvan panelinə, yaxud axtarış xanasına yazdıqda element təklifləri almaq üçün Chromium yazdıqlarınızı Google Diskə göndərir. Bu, Anonim rejimdə deaktivdir.</translation> <translation id="1911763535808217981">Bunu deaktiv etməklə Chromium'a giriş etmədən Gmail kimi Google saytlarına daxil ola bilərsiniz</translation> <translation id="1929939181775079593">Chromium cavab vermir. İndi yenidən başladılsın?</translation> <translation id="193439633299369377">Güncəlləşmənin tətbiq olunması üçün ChromiumOS yenidən başladılmalıdır.</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index 5619054..7212090 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -31,6 +31,7 @@ <translation id="185970820835152459">Pots gestionar els Comptes de Google en què tens la sessió iniciada. Els Comptes de Google s'utilitzen per al navegador Chromium, Play Store, Gmail i més. Si vols afegir un compte per a algú altre, com ara un membre de la família, afegeix una persona nova al teu dispositiu <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="1863308913976887472">Els llocs web poden emmagatzemar informació a Chromium sobre els teus interessos. Per exemple, si visites un lloc web per comprar sabatilles per a una marató, és possible que el lloc web defineixi que t'interessa córrer maratons. Més endavant, si visites un altre lloc web per inscriure't a una cursa, aquest altre lloc web et pot mostrar un anunci de sabatilles de curses basant-se en els teus interessos.</translation> <translation id="1881322772814446296">Esteu a punt d'iniciar la sessió amb un compte gestionat i d'atorgar el control del vostre perfil de Chromium a l'administrador corresponent. Les dades de Chromium, com ara aplicacions, adreces d'interès, historial, contrasenyes i altres configuracions, s'enllaçaran permanentment amb <ph name="USER_NAME" />. Podreu suprimir aquestes dades mitjançant el Tauler de Comptes de Google, però no les podreu associar amb un altre compte. De manera opcional, podeu crear un perfil nou per mantenir les vostres dades de Chromium a part. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">Quan escrius a la barra d'adreces o al quadre de cerca, Chromium envia el que escrius a Google Drive per obtenir suggeriments d'elements. Aquesta opció està desactivada en mode d'incògnit.</translation> <translation id="1911763535808217981">En desactivar aquesta opció, pots iniciar la sessió en llocs web de Google, com ara Gmail, sense iniciar la sessió a Chromium</translation> <translation id="1929939181775079593">Chromium no respon. Voleu tornar-lo a iniciar ara?</translation> <translation id="193439633299369377">Cal reiniciar Chromium OS per aplicar l'actualització.</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb index d20d36b..5139b8f 100644 --- a/chrome/app/resources/chromium_strings_cs.xtb +++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">Můžete spravovat účty Google, ke kterým jste přihlášeni. Účty Google jsou používány v prohlížeči Chromium, Obchodu Play, Gmailu a dalších službách. Pokud chcete přidat účet někoho jiného, například člena rodiny, přidejte nového uživatele do zařízení <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="1863308913976887472">Weby mohou v prohlížeči Chromium ukládat informace o vašich zájmech. Např. když navštívíte web, kde se prodávají boty na maraton, web může definovat váš zájem jako běhání maratonů. Když později navštívíte jiný web s registrací na závod, může se vám na něm na základě vašich zájmů zobrazit reklama na boty na běhání.</translation> <translation id="1881322772814446296">Přihlašujete se pomocí spravovaného účtu a poskytujete jeho správci kontrolu nad vaším profilem prohlížeče Chromium. Vaše údaje prohlížeče Chromium, například aplikace, záložky, historie, hesla a jiná nastavení, budou trvale přidružena k účtu <ph name="USER_NAME" />. Tyto údaje budete moci smazat pomocí stránky Dashboard služby Účty Google, ale nebudete je moci přidružit k jinému účtu. Pokud chcete uchovat existující údaje prohlížeče Chromium odděleně, můžete vytvořit nový profil. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">Při psaní do adresního řádku nebo vyhledávacího pole odesílá Chromium zadaný text na Disk Google, aby vám mohl nabízet návrhy. V anonymním režimu je tato funkce vypnutá.</translation> <translation id="1911763535808217981">Pokud tuto možnost vypnete, budete se moci přihlásit k většině webů Google, jako je Gmail, aniž byste se přihlásili do prohlížeče Chromium</translation> <translation id="1929939181775079593">Prohlížeč Chromium neodpovídá. Chcete jej znovu načíst?</translation> <translation id="193439633299369377">Aktualizace se použije po restartování systému ChromiumOS.</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb index dbe36615..df1cacf 100644 --- a/chrome/app/resources/chromium_strings_da.xtb +++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -31,6 +31,7 @@ <translation id="185970820835152459">Du kan administrere de Google-konti, du er logget ind på. Dine Google-konti bruges i Chromium-browseren, Play Butik, Gmail m.m. Hvis du vil tilføje en konto, der tilhører en anden, f.eks. et familiemedlem, skal du føje en ny person til din <ph name="DEVICE_TYPE" /> i stedet. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="1863308913976887472">Websites kan gemme oplysninger med Chromium om dine interesser. Hvis du f.eks. besøger et website for at købe sko til et maraton, kan websitet muligvis definere, at din interesse er at løbe maraton. Hvis du derefter besøger et andet website for at tilmelde dig et løb, kan det website vise dig en annonce for løbesko baseret på dine interesser.</translation> <translation id="1881322772814446296">Du er ved at logge ind med en managerstyret konto og give dens administrator kontrol over din profil i Chromium. Dine Chromium-data, f.eks. dine apps, bogmærker, historikdata, adgangskoder og andre indstillinger, knyttes permanent til <ph name="USER_NAME" />. Du kan slette disse data via kontrolpanelet for Google Konti, men du kan ikke knytte disse data til en anden konto. Du kan eventuelt oprette en ny profil for at holde dine Chromium-data adskilt. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">Når du indtaster noget i adresselinjen eller søgefeltet, sender Chromium det, du skriver, til Google Drev for at få forslag til elementer. Dette er deaktiveret i inkognito.</translation> <translation id="1911763535808217981">Når du deaktiverer denne indstilling, kan du logge ind på Google-websites som f.eks. Gmail uden at logge ind i Chromium</translation> <translation id="1929939181775079593">Chromium svarer ikke. Vil du genstarte nu?</translation> <translation id="193439633299369377">Chromium OS skal genstartes, før opdateringen kan anvendes.</translation>
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb index 7b05fe9..553aad6 100644 --- a/chrome/app/resources/chromium_strings_eu.xtb +++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">Saioa hasita daukaten Google-ko kontuak kudea ditzakezu. Google-ko kontuak Chromium arakatzaile, Play Store, Gmail eta abarrerako erabiltzen dira. Kontu bat beste norbaitentzat gehitu nahi baduzu (adibidez, familiako kide batentzat), gehitu beste pertsona bat <ph name="DEVICE_TYPE" /> gailuan. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation> <translation id="1863308913976887472">Webguneek zure interesei buruzko informazioa gorde dezakete Chromium-en; esaterako, webgune batera joaten bazara maratoi baterako oinetakoak erostera, baliteke webgune horrek "maratoiak" definitzea interes gisa. Ondorioz, beranduago beste webgune batera joaten bazara lasterketa batean izena emateko, litekeena da webgune horrek lasterketetarako oinetakoekin erlazionatutako iragarki bat erakustea zure interesetan oinarrituta.</translation> <translation id="1881322772814446296">Kontu kudeatu batekin hasten ari zara saioa eta kontuaren administratzaileari zure Chromium profila kontrolatzeko ahalmena ematera zoaz. Chromium aplikazioan dituzun datuak, esaterako, aplikazioak, laster-markak, historia, pasahitzak eta beste ezarpen batzuk betiko lotuko zaizkio <ph name="USER_NAME" /> erabiltzaileari. Google-ko kontuetako Panelaren bidez ezabatu ahalko dituzu datu horiek, baina ezingo dituzu beste kontu batekin lotu. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">Helbide-barran edo bilaketa-koadroan zerbait idazten duzunean, Chromium-ek Google Drive-ra bidaltzen du, elementuen iradokizunak lortzeko. Ezkutuko moduan, aukera hori desaktibatuta dago.</translation> <translation id="1911763535808217981">Aukera hau desaktibatzen baduzu, Google-ren webguneetan saioa hasi ahalko duzu (adibidez, Gmail-en) Chromium-en saioa hasi beharrik gabe</translation> <translation id="1929939181775079593">Chromium-ek ez du eranzuten. Berrabiarazi nahi duzu?</translation> <translation id="193439633299369377">Eguneratzea aplikatzeko, berrabiarazi egin behar da Chromium OS.</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb index 57c40bb..9450cc7 100644 --- a/chrome/app/resources/chromium_strings_fa.xtb +++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -31,6 +31,7 @@ <translation id="185970820835152459">میتوانید «حسابهای Google» خودتان را که به سیستم آنها وارد شدهاید مدیریت کنید. از «حسابهای Google» شما در مرورگر Chromium، «فروشگاه Play»، Gmail، و محصولات دیگر استفاده میشود. اگر میخواهید حساب فرد دیگری را اضافه کنید (مثلاً یکی از اعضای خانواده)، بهجای این کار، شخص جدیدی را به <ph name="DEVICE_TYPE" /> خود اضافه کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="1863308913976887472">سایتها میتوانند بااستفاده از Chromium اطلاعاتی درباره علایقتان ذخیره کنند. برای مثال، اگر برای خرید کفش مخصوص ماراتون از سایتی بازدید کنید، ممکن است آن سایت علاقه شما را بهصورت دونده ماراتون مشخص کند. بعداً، اگر برای ثبتنام در مسابقهای به سایتی دیگر مراجعه کردید، آن سایت میتواند براساس علایقتان آگهیای برای کفش مخصوص دویدن به شما نشان دهد.</translation> <translation id="1881322772814446296">شما با حساب مدیریتشده وارد سیستم میشوید و به سرپرست آن اجازه کنترل بر نمایه Chromium خود را میدهید. دادههای Chromium شما شامل برنامهها، نشانکها، سابقه، گذرواژهها و سایر تنظیمات برای همیشه به <ph name="USER_NAME" /> مرتبط خواهد شد. میتوانید این دادهها را از طریق داشبورد حسابهای Google حذف کنید اما نمیتوانید این دادهها را به حساب دیگری مرتبط سازید. در صورت تمایل برای ذخیره دادههای Chromium موجود به صورت جداگانه میتوانید نمایه جدیدی ایجاد کنید. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">وقتی در نوار نشانی یا چارگوش جستجو تایپ میکنید، Chromium آنچه را تایپ میکنید به Google Drive ارسال میکند تا مواردی برای پیشنهاد دریافت کند. این ویژگی در «حالت ناشناس» خاموش است.</translation> <translation id="1911763535808217981">با خاموش کردن این گزینه، میتوانید بدون ورود به سیستم Chromium به سیستم سایتهای Google مانند Gmail وارد شوید</translation> <translation id="1929939181775079593">Chromium پاسخ نمیدهد. مجدداً راهاندازی شود؟</translation> <translation id="193439633299369377">برای اعمال بهروزرسانی، ChromiumOS باید بازراهاندازی شود.</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb index 58fdfec..8bb2442e 100644 --- a/chrome/app/resources/chromium_strings_gu.xtb +++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">તમે તમારા સાઇન ઇન કરેલા હોય એવા Google એકાઉન્ટ મેનેજ કરી શકો છો. તમારા Google એકાઉન્ટનો ઉપયોગ Chromium બ્રાઉઝર, Play Store, Gmail અને વધુ માટે થાય છે. જો તમે કોઈ બીજા, જેમકે તમારા કુટુંબના સભ્ય માટે એકાઉન્ટ ઉમેરવા માંગતા હો, તો તેના બદલે નવી વ્યક્તિને તમારા <ph name="DEVICE_TYPE" />માં ઉમેરો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="1863308913976887472">સાઇટ, Chromium પર તમારી રુચિના વિષયો વિશેની માહિતી સ્ટોર કરી શકે છે. ઉદાહરણ તરીકે જો તમે મૅરેથનમાં દોડવા માટે શૂઝ ખરીદવા કોઈ સાઇટની મુલાકાત લો, તો એ સાઇટ મૅરેથન દોડને તમારી રુચિના વિષય તરીકે સાચવી શકે છે. પછી, જો તમે દોડ માટે રજિસ્ટ્રેશન કરાવવા કોઈ અન્ય સાઇટની મુલાકાત લેશો, તો તે સાઇટ તમારી રુચિના વિષયના આધારે તમને દોડવા માટેના શૂઝની જાહેરાત બતાવી શકે છે.</translation> <translation id="1881322772814446296">તમે મેનેજ કરેલા એકાઉન્ટ સાથે સાઇન ઇન કરી રહ્યાં છો અને તમારી Chromium પ્રોફાઇલ પર ઍડમિનને એનું નિયંત્રણ આપી રહ્યાં છો. તમારો Chromium ડેટા, જેમ કે ઍપ, બુકમાર્ક, ઇતિહાસ, પાસવર્ડ અને બીજા સેટિંગ, કાયમ માટે <ph name="USER_NAME" />થી જોડાયેલા રહેશે. તમે Google એકાઉન્ટ ડૅશબોર્ડથી આ ડેટાને ડિલીટ કરી શકશો, પરંતુ તમે આ ડેટાને બીજા એકાઉન્ટ સાથે સાંકળી શકશો નહીં. તમે હાલના Chromium ડેટાને અલગ રાખવા માટે વૈકલ્પિક રીતે એક નવી પ્રોફાઇલ બનાવી શકો છો. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">જ્યારે તમે ઍડ્રેસ બાર અથવા શોધ બૉક્સમાં ટાઇપ કરો છો, ત્યારે આઇટમના સૂચનો મેળવવા માટે Chromium તમે જે ટાઇપ કરો છો, તે Google Driveને મોકલે છે. આ સુવિધા છૂપા મોડમાં બંધ હોય છે.</translation> <translation id="1911763535808217981">આને બંધ કરવાથી, તમે Chromiumમાં સાઇન ઇન કર્યા સિવાય Gmail જેવી Googleની સાઇટમાં સાઇન ઇન કરી શકશો</translation> <translation id="1929939181775079593">Chromium પ્રતિસાદ આપતું નથી. હવે ફરીથી લોંચ કરીએ?</translation> <translation id="193439633299369377">અપડેટ લાગુ કરવા માટે ChromiumOSને ફરી શરૂ કરવાની જરૂર છે.</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb index 9c3cd464..dceeac6 100644 --- a/chrome/app/resources/chromium_strings_id.xtb +++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -31,6 +31,7 @@ <translation id="185970820835152459">Anda dapat mengelola Akun Google yang Anda gunakan untuk login. Akun Google Anda digunakan untuk browser Chromium, Play Store, Gmail, dan lainnya. Jika Anda ingin menambahkan akun untuk orang lain, seperti anggota keluarga, tambahkan pengguna baru ke <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="1863308913976887472">Situs dapat menyimpan informasi tentang minat Anda ke Chromium. Misalnya, jika Anda mengunjungi suatu situs untuk membeli sepatu maraton, situs tersebut dapat menetapkan minat Anda sebagai lari maraton. Kemudian, jika Anda mengunjungi situs lain untuk mendaftar lomba lari, situs tersebut dapat menampilkan iklan sepatu lari berdasarkan minat Anda.</translation> <translation id="1881322772814446296">Anda masuk dengan akun terkelola dan memberikan administratornya kontrol atas profil Chromium Anda. Data Chromium Anda, seperti aplikasi, bookmark, histori, sandi, dan setelan lain selamanya akan dikaitkan ke <ph name="USER_NAME" />. Anda dapat menghapus data ini melalui Dasbor Akun Google, namun Anda tidak akan dapat mengaitkan data ini dengan akun yang lain. Secara opsional, Anda dapat membuat profil untuk menjaga data Chromium Anda yang sudah ada tetap terpisah. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">Saat Anda mengetik di kolom URL atau kotak penelusuran, Chromium akan mengirimkan hal yang Anda ketik ke Google Drive untuk mendapatkan saran item. Fitur ini nonaktif dalam mode Samaran.</translation> <translation id="1911763535808217981">Dengan menonaktifkan ini, Anda dapat login ke situs Google seperti Gmail tanpa harus login ke Chromium</translation> <translation id="1929939181775079593">Chromium tidak merespons. Luncurkan ulang sekarang?</translation> <translation id="193439633299369377">ChromiumOS harus dimulai ulang untuk menerapkan update.</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb index 3e2dc51..6a49083 100644 --- a/chrome/app/resources/chromium_strings_ja.xtb +++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -31,6 +31,7 @@ <translation id="185970820835152459">ログインする Google アカウントを管理できます。Google アカウントは、Chromium ブラウザ、Play ストア、Gmail などで使用されます。家族など、あなた以外の人のアカウントを追加する場合は、<ph name="DEVICE_TYPE" /> に新しいユーザーを追加してください。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="1863308913976887472">サイトでは、ユーザーの興味 / 関心についての情報を Chromium に保存する場合があります。たとえば、マラソン用のシューズを購入するためにあるサイトにアクセスすると、そのサイトでは「ランニング」をユーザーの興味 / 関心として定義する可能性があります。その後、別のサイトにアクセスして競技に登録しようとすると、そのサイトでは、ユーザーの興味 / 関心に基づいてランニング用シューズの広告が表示される場合があります。</translation> <translation id="1881322772814446296">現在、管理対象アカウントでログインしており、あなたの Chromium プロフィールを管理者が制御できる状態になっています。あなたの Chromium データ(アプリ、ブックマーク、履歴、パスワードなどの設定)は永続的に <ph name="USER_NAME" /> に関連付けられます。このデータは Google アカウントのダッシュボードを介して削除できますが、このデータを別のアカウントに関連付けることはできなくなります。新しいプロフィールを作成して、既存の Chromium データを別に保管することができます。<ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">Chromium でアドレスバーや検索ボックスに入力を始めると、入力内容が Google ドライブに送信され、検索候補が表示されます。シークレット モードの場合、この設定はオフになっています。</translation> <translation id="1911763535808217981">この設定を無効にすると、Chromium にログインすることなく Gmail などの Google サイトにログインできます</translation> <translation id="1929939181775079593">Chromium が応答しません。今すぐ再起動しますか?</translation> <translation id="193439633299369377">更新を適用するには、Chromium OS を再起動する必要があります。</translation>
diff --git a/chrome/app/resources/chromium_strings_ky.xtb b/chrome/app/resources/chromium_strings_ky.xtb index b018acc..b9d31b1 100644 --- a/chrome/app/resources/chromium_strings_ky.xtb +++ b/chrome/app/resources/chromium_strings_ky.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">Кирип турган Google аккаунттарыңызды башкара аласыз. Google аккаунттарыңыз Chromium серепчисинде, Play Store'до, Gmail'де жана башка жерлерде колдонулат. Эгер кимдир бирөөнүн, мисалы, үй-бүлөлүк топтун мүчөсүнүн аккаунтун кошкуңуз келсе, жаңы адамды <ph name="DEVICE_TYPE" /> түзмөгүнө кошуп коюңуз. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="1863308913976887472">Сайттар кызыккан нерселериңиз тууралуу маалыматты Chromium'да сакташы мүмкүн. Мисалы, марафон үчүн бут кийим сатып алуу үчүн сайтка баш баксаңыз, ал сайт "марафондо чуркоону" кызыккан нерсеңиз катары аныктайт. Кийинчерээк, жарышууга катталуу үчүн башка бир сайтка баш баксаңыз, ал сайт кызыккан нерселериңиздин негизинде чуркоо үчүн бут кийимдин жарнамасын көрсөтүшү мүмкүн.</translation> <translation id="1881322772814446296">Башкарылган аккаунт менен кирип, анын администраторунун милдетин Chromium профилиңизге өткөрүп берип жатасыз. Chromium дайын-даректериңизди, колдонмолоруңузду, кыстармаларыңызды, таржымалыңызды, сырсөздөрүңүздү жана башка жөндөөлөрдү <ph name="USER_NAME" /> менен биротоло байланыштырат. Бул дайындарды Google Каттоо эсептеринин жеке кеңсеси аркылуу жок кылсаңыз болот, бирок бул дайындарды башка аккаунтка байлай албайсыз. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">Дарек тилкесине же издөө кутучасына жазганыңызда, Chromium сизге ылайыктуу нерселерди сунуштоо максатында сурамды Google Drive'га жөнөтөт. Бул параметр Жашыруун режимде өчүк болот.</translation> <translation id="1911763535808217981">Ушуну өчүрүү менен Gmail сыяктуу Google сайттарына Chromium'суз кире аласыз</translation> <translation id="1929939181775079593">Chromium жооп бербей жатат. Өчүрүп кайра ишке киргизесизби?</translation> <translation id="193439633299369377">Жаңыртууну колдонуу үчүн ChromiumOS өчүрүлүп күйгүзүлүшү керек.</translation>
diff --git a/chrome/app/resources/chromium_strings_lo.xtb b/chrome/app/resources/chromium_strings_lo.xtb index 7a45684d..d4932508 100644 --- a/chrome/app/resources/chromium_strings_lo.xtb +++ b/chrome/app/resources/chromium_strings_lo.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">ທ່ານສາມາດຈັດການບັນຊີ Google ທີ່ເຂົ້າສູ່ລະບົບແລ້ວຂອງທ່ານໄດ້. ບັນຊີ Google ຂອງທ່ານແມ່ນໃຊ້ສຳລັບໂປຣແກຣມທ່ອງເວັບ Chromium, Play Store, Gmail ແລະ ອື່ນໆ. ຫາກທ່ານຕ້ອງການເພີ່ມບັນຊີໃຫ້ຄົນອື່ນ ເຊັ່ນ: ສະມາຊິກຄອບຄົວ, ໃຫ້ເພີ່ມຄົນໃໝ່ໃສ່ <ph name="DEVICE_TYPE" /> ຂອງທ່ານແທນ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="1863308913976887472">ເວັບໄຊສາມາດບັນທຶກຂໍ້ມູນກັບ Chromium ກ່ຽວກັບຄວາມສົນໃຈຂອງທ່ານໄດ້. ຕົວຢ່າງ: ຫາກທ່ານເຂົ້າເວັບໄຊໃດໜຶ່ງເພື່ອຊື້ເກີບສຳລັບແລ່ນມາຣາທອນ, ເວັບໄຊດັ່ງກ່າວອາດນິຍາມຄວາມສົນໃຈຂອງທ່ານວ່າເປັນການແລ່ນມາຣາທອນ. ໃນພາຍຫຼັງ, ຫາກທ່ານເຂົ້າເວັບໄຊອື່ນເພື່ອລົງທະບຽນການແຂ່ງຂັນ, ເວັບໄຊນັ້ນອາດສະແດງໂຄສະນາເກີບແລ່ນໃຫ້ທ່ານໂດຍອ້າງອີງໃສ່ຄວາມສົນໃຈຂອງທ່ານ.</translation> <translation id="1881322772814446296">ທ່ານກໍາລັງລົງຊື່ເຂົ້າໃຊ້ດ້ວຍບັນຊີຄຸ້ມຄອງ ແລະໃຫ້ຜູ້ຄວບຄຸມຂອງມັນຄວບຄຸມໂປຣໄຟລ໌ Chromium ຂອງທ່ານ. ຂໍ້ມູນ Chromium ຂອງທ່ານ, ເຊັ່ນ: ແອັບ, ບຸກມາກສ໌, ປະຫວັດ, ລະຫັດຜ່ານ, ແລະການຕັ້ງຄ່າອື່ນໆຂອງທ່ານຈະຜູກມັດກັບ <ph name="USER_NAME" /> ຢ່າງຖາວອນ. ທ່ານຈະສາມາດລຶບຂໍ້ມູນນີ້ໄດ້ຜ່ານ Google Accounts Dashboard, ແຕ່ທ່ານຈະບໍ່ສາມາດເອົາຂໍ້ມູນນີ້ເຂົ້າຮ່ວມກັບບັນຊີອື່ນໄດ້. ໂດຍເລືອກໄດ້ ທ່ານສາມາດສ້າງໂປຣໄຟລ໌ໃໝ່ເພື່ອຮັກສາຂໍ້ມູນ Chromium ທີ່ມີຢູ່ຂອງທ່ານແຍກຕ່າງຫາກ. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">ເມື່ອທ່ານພິມໃສ່ແຖບທີ່ຢູ່ ຫຼື ກ່ອງຊອກຫາ, Chromium ຈະສົ່ງສິ່ງທີ່ທ່ານພິມໄປໃຫ້ Google Drive ເພື່ອຮັບການແນະນຳລາຍການ. ສິ່ງນີ້ຖືກປິດໃນໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ.</translation> <translation id="1911763535808217981">ໂດຍການປິດສິ່ງນີ້, ທ່ານສາມາດເຂົ້າສູ່ລະບົບເວັບໄຊຂອງ Google ເຊັ່ນ: Gmail ໄດ້ໂດຍບໍ່ຕ້ອງເຂົ້າສູ່ລະບົບ Chromium</translation> <translation id="1929939181775079593">Chromium ບໍ່ຕອບຮັບ. ເລີ່ມເປີດໃຊ້ໃໝ່ດຽວນີ້ບໍ?</translation> <translation id="193439633299369377">ຈຳເປັນຕ້ອງຣີສະຕາດ ChromiumOS ເພື່ອນຳໃຊ້ການອັບເດດ.</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb index b88ac35a..4456b07 100644 --- a/chrome/app/resources/chromium_strings_lt.xtb +++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">Galite tvarkyti „Google“ paskyras, prie kurių prisijungiate. Jūsų „Google“ paskyros naudojamos naršyklei „Chromium“, „Play“ parduotuvei, „Gmail“ ir kt. Jei norite kam nors pridėti paskyrą, pvz., šeimos grupės nariui, pridėkite naują asmenį prie „<ph name="DEVICE_TYPE" />“ įrenginio. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> <translation id="1863308913976887472">Svetainėse gali būti saugoma su „Chromium“ susijusi informacija apie jūsų pomėgius. Pavyzdžiui, jei apsilankote svetainėje norėdami įsigyti batelius maratonui, svetainė gali prie jūsų pomėgių prisikirti maratonų bėgimą. Vėliau, apsilankius kitoje svetainėje norint užsiregistruoti į lenktynes, atsižvelgiant į jūsų pomėgius joje galės būti rodomas bėgimo batelių skelbimas.</translation> <translation id="1881322772814446296">Prisijungiate su valdoma paskyra ir leidžiate jos administratoriui valdyti jūsų „Chromium“ profilį. „Chromium“ duomenys, pvz., programos, žymės, istorija, slaptažodžiai ir kiti nustatymai, bus visam laikui susieti su <ph name="USER_NAME" />. Galėsite ištrinti šiuos duomenis naudodami „Google“ paskyrų informacijos suvestinę, bet negalėsite susieti šių duomenų su kita paskyra. Galite pasirinktinai sukurti naują profilį, kad esami „Chromium“ duomenys būtų saugomi atskirai. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">Kai įvedate tekstą adreso juostoje ar paieškos laukelyje, „Chromium“ siunčia tai, ką įvedate, į „Google“ diską, kad gautų elementų pasiūlymų. Ši funkcija inkognito režimu išjungta.</translation> <translation id="1911763535808217981">Jei išjungsite šį nustatymą, prie „Google“ svetainių galėsite prisijungti kaip prie „Gmail“ neprisijungę prie „Chromium“</translation> <translation id="1929939181775079593">„Chromium“ neatsako. Paleisti iš naujo dabar?</translation> <translation id="193439633299369377">Kad būtų galima pritaikyti naujinį, „Chromium“ OS reikia paleisti iš naujo.</translation>
diff --git a/chrome/app/resources/chromium_strings_my.xtb b/chrome/app/resources/chromium_strings_my.xtb index 23f7652..457da84 100644 --- a/chrome/app/resources/chromium_strings_my.xtb +++ b/chrome/app/resources/chromium_strings_my.xtb
@@ -34,6 +34,7 @@ <translation id="1863308913976887472">ဝဘ်ဆိုက်များသည် သင်၏စိတ်ဝင်စားမှုများကို Chromium တွင် သိမ်းနိုင်သည်။ ဥပမာ မာရသွန်အတွက် ရှူးဖိနပ်ဝယ်ရန် ဝဘ်ဆိုက်တွင်ဝင်ကြည့်ပါက ဝဘ်ဆိုက်သည် သင်၏စိတ်ဝင်စားမှုကို မာရသွန်ပြေးခြင်းအဖြစ် သတ်မှတ်နိုင်သည်။ နောင်တွင် ပြိုင်ပွဲအတွက်စာရင်းသွင်းရန် အခြားဝဘ်ဆိုက်သို့ ဝင်ကြည့်သောအခါ ထိုဝဘ်ဆိုက်က သင်၏စိတ်ဝင်စားမှုများပေါ် အခြေခံပြီး အပြေးဖိနပ်ကြော်ငြာကို ပြနိုင်သည်။</translation> <translation id="1881322772814446296">သင်သည် စီမံကွပ်ကဲထားသည့် အကောင့် ထဲသို့ လက်မှတ် ထိုးဝင်နေကာ စီမံအုပ်ချုပ်သူအား သင့် Chromium ပရိုဖိုင်ကို ထိန်းချုပ်ခွင့်ကို လွှဲပေးနေသည်။ သင်၏ အက်ပ်များ၊စာညှပ်များ၊ မှတ်တမ်း၊ စကားဝှက်များ၊ နှင့် အခြား ဆက်တင်များလို သင်၏ Chromium ဒေတာများမှာ <ph name="USER_NAME" /> သို့ ထာဝရ ချိတ်တွဲလျက် ရှိလာကြမည်။ သင်သည် ဒီဒေတာကို Google အကောင့်များ ဒိုင်ခွက်မှ တစ်ဆင့် ဖျက်လို့ ရနိုင်သော်လည်း၊ သင်သည် ၎င်းဒေတာကို အခြား အကောင့်နှင့် ဆက်စပ်၍ မရနိုင်ပါ။ သင်သည် သင်၏ ရှိနေဆဲ Chromium ဒေတာကို ထားရှိရန် အတွက် ပရိုဖိုင် အသစ်ကို ပြုလုပ်ရန် ရွေးနိုင်ပါသည်။ ပိုမို လေ့လာရန်။ <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">လိပ်စာဘား (သို့) ရှာဖွေစာလုံးဖြည့်ကွက်လပ်တွင် စာရိုက်သောအခါ ဖိုင်အကြံပြုချက်များ ရယူရန်အတွက် Chromium သည် သင်ရိုက်ထည့်သောအရာကို Google Drive သို့ ပို့သည်။ ၎င်းသည် ‘ရုပ်ဖျက်’ တွင် ပိတ်နေမည်။</translation> <translation id="1911763535808217981">၎င်းကိုပိတ်ခြင်းဖြင့် Chromium တွင် လက်မှတ်ထိုးမဝင်ဘဲ Gmail ကဲ့သို့ Google ဝဘ်ဆိုက်များသို့ လက်မှတ်ထိုးဝင်နိုင်ပါသည်</translation> <translation id="1929939181775079593">Chromium သည် မတုံ့ပြန်ပါ။ ယခု ပြန်ပြီး ဖွင့်တင်ရမလား?</translation> <translation id="193439633299369377">အပ်ဒိတ်ပြီးဆုံးရန် ChromiumOS ကို ပြန်စရမည်။</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb index 7f41059..fac044b 100644 --- a/chrome/app/resources/chromium_strings_nl.xtb +++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">Je kunt je ingelogde Google-accounts beheren. Je Google-accounts worden gebruikt voor onder andere de Chromium-browser, Play Store, en Gmail. Als je een account wilt toevoegen voor iemand anders, bijvoorbeeld een gezinslid, voeg je een nieuw persoon toe aan je <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation> <translation id="1863308913976887472">Sites kunnen informatie over je interesses in Chromium opslaan. Als je bijvoorbeeld een site bezoekt om schoenen voor een marathon te kopen, kan de site je interesse definiëren als 'deelname aan marathons'. Als je later een andere site bezoekt om je aan te melden voor een race, kan die site je een advertentie voor hardloopschoenen laten zien op basis van je interesses.</translation> <translation id="1881322772814446296">Je logt in op een beheerd account waarmee de eigenaar van dat account beheer krijgt over je Chromium-profiel. Je Chromium-gegevens zoals je apps, bookmarks, geschiedenis, wachtwoorden en andere instellingen worden permanent gekoppeld aan <ph name="USER_NAME" />. Je kunt deze gegevens verwijderen via het Google Accounts Dashboard, maar je kunt deze gegevens niet koppelen aan een ander account. Je kunt een nieuw profiel maken om je bestaande Chromium-gegevens apart te houden. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">Als je in de adresbalk of het zoekvak typt, stuurt Chromium wat je typt naar Google Drive om itemsuggesties te krijgen. Dit staat uit in de incognitomodus.</translation> <translation id="1911763535808217981">Als je dit uitzet, kun je inloggen bij Google-sites zoals Gmail zonder in te loggen bij Chromium</translation> <translation id="1929939181775079593">Chromium reageert niet. Nu opnieuw starten?</translation> <translation id="193439633299369377">Chromium OS moet opnieuw worden gestart om de update uit te voeren.</translation>
diff --git a/chrome/app/resources/chromium_strings_pa.xtb b/chrome/app/resources/chromium_strings_pa.xtb index 1d259f8..3da78f7 100644 --- a/chrome/app/resources/chromium_strings_pa.xtb +++ b/chrome/app/resources/chromium_strings_pa.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">ਤੁਸੀਂ ਆਪਣੇ ਸਾਈਨ-ਇਨ ਕੀਤੇ ਗਏ Google ਖਾਤਿਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦੇ ਹੋ। ਤੁਹਾਡੇ Google ਖਾਤਿਆਂ ਦੀ ਵਰਤੋਂ Chromium ਬ੍ਰਾਊਜ਼ਰ, Play Store, Gmail ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਲਈ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਜੇ ਤੁਸੀਂ ਕਿਸੇ ਹੋਰ ਲਈ ਇੱਕ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ, ਜਿਵੇਂ ਕਿ ਕਿਸੇ ਪਰਿਵਾਰਕ ਮੈਂਬਰ ਲਈ, ਤਾਂ ਇਸਦੀ ਬਜਾਏ ਆਪਣੀ <ph name="DEVICE_TYPE" /> ਵਿੱਚ ਕੋਈ ਨਵਾਂ ਵਿਅਕਤੀ ਸ਼ਾਮਲ ਕਰੋ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="1863308913976887472">ਸਾਈਟਾਂ ਤੁਹਾਡੀਆਂ ਦਿਲਚਸਪੀਆਂ ਬਾਰੇ Chromium ਵਿੱਚ ਜਾਣਕਾਰੀ ਸਟੋਰ ਕਰ ਸਕਦੀਆਂ ਹਨ। ਉਦਾਹਰਨ ਲਈ, ਜੇ ਤੁਸੀਂ ਮੈਰਾਥਨ ਲਈ ਜੁੱਤੇ ਖਰੀਦਣ ਵਾਸਤੇ ਕਿਸੇ ਸਾਈਟ 'ਤੇ ਜਾਂਦੇ ਹੋ, ਤਾਂ ਸਾਈਟ ਤੁਹਾਡੀ ਦਿਲਚਸਪੀ ਨੂੰ ਮੈਰਾਥਨ ਦੌੜਨ ਵਜੋਂ ਪਰਿਭਾਸ਼ਿਤ ਕਰ ਸਕਦੀ ਹੈ। ਬਾਅਦ ਵਿੱਚ, ਜੇ ਤੁਸੀਂ ਦੌੜ ਲਈ ਰਜਿਸਟਰ ਕਰਨ ਵਾਸਤੇ ਕਿਸੇ ਵੱਖਰੀ ਸਾਈਟ 'ਤੇ ਜਾਂਦੇ ਹੋ, ਤਾਂ ਉਹ ਸਾਈਟ ਤੁਹਾਨੂੰ ਤੁਹਾਡੀਆਂ ਦਿਲਚਸਪੀਆਂ ਦੇ ਆਧਾਰ 'ਤੇ ਦੌੜਨ ਵਾਲੇ ਜੁੱਤੇ ਲਈ ਵਿਗਿਆਪਨ ਦਿਖਾ ਸਕਦੀ ਹੈ।</translation> <translation id="1881322772814446296">ਤੁਸੀਂ ਇੱਕ ਪ੍ਰਬੰਧਿਤ ਕੀਤੇ ਖਾਤੇ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰ ਰਹੇ ਹੋ ਅਤੇ ਇਸ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਆਪਣੇ Chromium ਪ੍ਰੋਫਾਈਲ ਦਾ ਕੰਟਰੋਲ ਦੇ ਰਹੇ ਹੋ। ਤੁਹਾਡਾ Chromium ਡਾਟਾ, ਜਿਵੇਂ ਕਿ ਤੁਹਾਡੀਆਂ ਐਪਾਂ, ਬੁੱਕਮਾਰਕ, ਇਤਿਹਾਸ, ਪਾਸਵਰਡ, ਅਤੇ ਹੋਰ ਸੈਟਿੰਗਾਂ <ph name="USER_NAME" /> ਨਾਲ ਸਥਾਈ ਤੌਰ 'ਤੇ ਜੋੜੇ ਜਾਣਗੇ। ਤੁਸੀਂ ਇਸ ਡਾਟੇ ਨੂੰ Google ਖਾਤੇ ਡੈਸ਼ਬੋਰਡ ਰਾਹੀਂ ਮਿਟਾ ਸਕੋਗੇ, ਪਰ ਤੁਸੀਂ ਇਸ ਡਾਟੇ ਨੂੰ ਦੂਜੇ ਖਾਤੇ ਨਾਲ ਨਹੀਂ ਜੋੜ ਸਕੋਗੇ। ਤੁਸੀਂ ਆਪਣੇ ਮੌਜੂਦਾ Chromium ਡਾਟੇ ਨੂੰ ਵੱਖ ਰੱਖਣ ਲਈ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਇੱਕ ਨਵੇਂ ਪ੍ਰੋਫਾਈਲ ਬਣਾ ਸਕਦੇ ਹੋ। <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">ਤੁਹਾਡੇ ਵੱਲੋਂ ਪਤਾ ਬਾਰ ਜਾਂ ਖੋਜ ਬਾਕਸ ਵਿੱਚ ਟਾਈਪ ਕਰਨ ਵੇਲੇ, Chromium ਉਸਨੂੰ Google Drive 'ਤੇ ਭੇਜਦਾ ਹੈ, ਤਾਂ ਜੋ ਆਈਟਮਾਂ ਸੰਬੰਧੀ ਸੁਝਾਅ ਪ੍ਰਾਪਤ ਕੀਤੇ ਜਾ ਸਕਣ। ਇਹ ਇਨਕੋਗਨਿਟੋ ਵਿੱਚ ਬੰਦ ਹੈ।</translation> <translation id="1911763535808217981">ਇਸਨੂੰ ਬੰਦ ਕਰਕੇ, ਤੁਸੀਂ Chromium ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕੀਤੇ ਬਿਨਾਂ Gmail ਵਰਗੀਆਂ Google ਸਾਈਟਾਂ 'ਤੇ ਸਾਈਨ-ਇਨ ਕਰ ਸਕਦੇ ਹੋ</translation> <translation id="1929939181775079593">Chromium ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਿਹਾ ਹੈ। ਕੀ ਹੁਣ ਰੀਲੌਂਚ ਕਰਨਾ ਹੈ?</translation> <translation id="193439633299369377">ਅੱਪਡੇਟ ਲਾਗੂ ਕਰਨ ਲਈ ChromiumOS ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕੀਤੇ ਜਾਣ ਦੀ ਲੋੜ ਹੈ।</translation>
diff --git a/chrome/app/resources/chromium_strings_si.xtb b/chrome/app/resources/chromium_strings_si.xtb index 25b0a202..baa2f1b 100644 --- a/chrome/app/resources/chromium_strings_si.xtb +++ b/chrome/app/resources/chromium_strings_si.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">ඔබට ඔබගේ පුරන ලද Google ගිණුම් කළමනාකරණය කළ හැකිය. ඔබගේ Google ගිණුම් Chromium බ්රව්සරය, Play Store, Gmail සහ තවත් දේ සඳහා භාවිත කෙරේ. ඔබට පවුලේ සාමාජිකයකු වැනි, වෙනත් යම් කෙනෙකු සඳහා ගිණුමක් එක් කිරීමට අවශ්ය නම්, ඒ වෙනුවට ඔබගේ <ph name="DEVICE_TYPE" /> වෙත නව පුද්ගලයකු එක් කරන්න. <ph name="LINK_BEGIN" />තව දැන ගන්න<ph name="LINK_END" /></translation> <translation id="1863308913976887472">ඔබගේ ලැදිකම් පිළිබඳ තොරතුරු අඩවිවලට Chromium සමග ගබඩා කළ හැකිය. උදාහරණ ලෙස, ඔබ මැරතන් තරඟයක් සඳහා සපත්තු මිලදී ගැනීමට අඩවියකට පිවිසුණහොත්, එම අඩවිය ඔබගේ ලැදිකම මැරතන් ධාවන තරඟ ලෙස අර්ථ දැක්විය හැකිය. පසුව, ඔබ තරඟයක් සඳහා ලියාපදිංචි වීමට වෙනත් අඩවියකට පිවිසුණහොත්, එම අඩවියට ඔබගේ ලැදිකම් මත පදනම්ව දිවීමේ සපත්තු සඳහා වන වෙළඳ දැන්වීමක් පෙන්විය හැකිය.</translation> <translation id="1881322772814446296">ඔබ කළමනාකරණය කළ ගිණුමක් වෙත සයින් ඉන් වන අතර ඔබේ Chromium පැතිකඩෙහි පරිපාලක පාලනය ලබා දේ. යෙදුම්, පිටු සලකුණු, ඉතිහාසය, රහස්වචන, සහ අනෙකුත් පසුතල වැනි ඔබේ Chromium දත්ත ස්ථිරවම <ph name="USER_NAME" /> වෙත බැඳෙනු ඇත. Google Accounts Dashboard හරහා මෙම දත්ත මැකීමට ඔබට හැකි වනු ඇත, නමුත් ඔබට මෙම දත්ත වෙනත් ගිණුමක් සමඟ සම්බන්ධ කළ නොහැක. ඔබේ පවතින Chromium දත්ත වෙනමම තබා ගැනීමට ඔබට විකල්ප වශයෙන් නව පැතිකඩක් සෑදිය හැකිය. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">ඔබ ලිපින තීරුවේ හෝ සෙවීම් පෙට්ටියේ ටයිප් කරන විට, අයිතම යෝජනා ලබා ගැනීමට Chromium ඔබ ටයිප් කරන දේ Google Drive වෙත යවයි. මෙය අප්රසිද්ධ තුළ ක්රියා විරහිතයි.</translation> <translation id="1911763535808217981">මෙය අක්රිය කිරීමෙන්, ඔබට Chromium වෙත පුරනය නොවී Gmail වැනි Google වෙබ් අඩවිවලට පුරනය විය හැක.</translation> <translation id="1929939181775079593">Chromium ප්රතිචාර නොදක්වයි. නැවත දියත් කරන්නද?</translation> <translation id="193439633299369377">යාවත්කාලීනය යෙදීමට ChromiumOS යළි ඇරඹිය යුතුය.</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index 3c877cb..d1c3ace 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">Upravljate lahko račune Google, v katere ste prijavljeni. Računi Google se uporabljajo za brskalnik Chromium, Trgovino Play, Gmail in drugo. Če želite dodati račun za nekoga drugega, na primer družinskega člana, v napravo <ph name="DEVICE_TYPE" /> dodajte novo osebo. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> <translation id="1863308913976887472">Spletna mesta lahko v Chromiumu shranjujejo podatke o vaših zanimanjih. Če na primer obiščete spletno mesto zaradi nakupa športnih copatov za maraton, bo spletno mesto morda določilo vaše zanimanje kot udeleževanje maratonov. Če pozneje obiščete drugo spletno mesto za registriranje za tek, vam lahko to spletno mesto glede na vaša zanimanja prikaže oglas za tekaško obutev.</translation> <translation id="1881322772814446296">Prijavljate se z upravljanim računom in s tem njegovemu skrbniku omogočate nadzor vašega profila v Chromiumu. Vaši podatki v Chromiumu, kot so aplikacije, zaznamki, zgodovina, gesla in druge nastavitve, bodo postali trajno povezani z uporabnikom <ph name="USER_NAME" />. Te podatke boste lahko izbrisali na nadzorni plošči za Google Račune, vendar jih ne boste mogli povezati z drugim računom. Če želite, lahko ustvarite nov profil, da bodo obstoječi podatki v Chromiumu ostali ločeni. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">Ko tipkate v naslovno vrstico ali iskalno polje, Chromium vaše vnose pošlje v Google Drive zaradi boljših predlogov za izdelke. V anonimnem načinu je to izklopljeno.</translation> <translation id="1911763535808217981">Če to izklopite, se lahko prijavite na Googlovih spletnih mestih, kot je Gmail, ne da bi se morali prijaviti v Chromium</translation> <translation id="1929939181775079593">Chromium se ne odziva. Ga želite znova zagnati?</translation> <translation id="193439633299369377">Če želite uveljaviti posodobitev, morate znova zagnati Chromium OS.</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb index 773fb63..fb2a984 100644 --- a/chrome/app/resources/chromium_strings_tr.xtb +++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -31,6 +31,7 @@ <translation id="185970820835152459">Oturum açılmış Google Hesaplarınızı yönetebilirsiniz. Google Hesaplarınız; Chromium tarayıcı, Play Store, Gmail ve daha başka yerlerde kullanılır. Aile üyesi gibi başka bir kullanıcı için hesap eklemek isterseniz bunun yerine <ph name="DEVICE_TYPE" /> cihazınıza yeni bir kişi ekleyin. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="1863308913976887472">Siteler, ilgi alanlarınız hakkındaki bilgileri Chromium'da saklayabilir. Örneğin, maraton ayakkabısı satın almak için ziyaret ettiğiniz bir site, maraton koşmayı ilgi alanınız olarak tanımlayabilir. Daha sonra bir yarışa kaydolmak için farklı bir siteyi ziyaret ettiğinizde o site ilgi alanlarınıza dayalı olarak size koşu ayakkabısı reklamı gösterebilir.</translation> <translation id="1881322772814446296">Yönetilen bir hesapla oturum açıyor ve hesabın yöneticisine Chromium profilinizi denetleme izni veriyorsunuz. Uygulamalarınız, yer işaretleriniz, geçmişiniz, şifreleriniz ve diğer ayarlarınız gibi Chromium verileriniz kalıcı olarak <ph name="USER_NAME" /> ile bağlantılandırılacaktır. Google Hesapları Hesap Özeti'ni kullanarak bu verileri silebilecek, ancak bu verileri başka bir hesapla ilişkilendiremeyeceksiniz. İsterseniz mevcut Chromium verilerinizi ayrı tutmak için yeni bir profil oluşturabilirsiniz. <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">Adres çubuğuna veya arama kutusuna yazdığınızda Chromium, yazdıklarınızı Google Drive'a göndererek öğe önerileri görmenizi sağlar. Bu ayar Gizli modda kapalıdır.</translation> <translation id="1911763535808217981">Bu özelliği kapatarak Chromium'da oturum açmadan Gmail gibi Google sitelerinde oturum açabilirsiniz</translation> <translation id="1929939181775079593">Chromium yanıt vermiyor. Şimdi yeniden başlatılsın mı?</translation> <translation id="193439633299369377">Güncellemenin uygulanması için ChromiumOS yeniden başlatılmalıdır.</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb index 14ebde3..dfaf2c92 100644 --- a/chrome/app/resources/chromium_strings_ur.xtb +++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">آپ اپنے سائن ان کردہ Google اکاؤنٹس کا نظم کر سکتے ہیں۔ آپ کے Google اکاؤنٹس Chromium براؤزر، Play اسٹور، Gmail اور مزید کے لیے استعمال ہوتے ہیں۔ اگر آپ کسی اور کے لیے کوئی اکاؤنٹ شامل کرنا چاہتے ہیں جیسے آپ کی فیملی کا کوئی ممبر تو اس کی بجائے اپنے <ph name="DEVICE_TYPE" /> میں ایک نیا شخص شامل کریں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="1863308913976887472">سائٹس Chromium کے ساتھ آپ کی دلچسپیوں کے بارے میں معلومات اسٹور کر سکتی ہیں۔ مثلاً اگر آپ میراتھن کے لئے جوتے خریدنے کی خاطر کوئی سائٹ ملاحظہ کرتے ہیں تو سائٹ دوڑ کے میراتھنز کے بطور آپ کی دلچسپی کا تعین کر سکتی ہے۔ بعد میں اگر آپ دوڑ میں رجسٹر کرنے کے لئے کوئی دوسری سائٹ ملاحظہ کرتے ہیں تو وہ سائٹ آپ کو آپ کی دلچسپیوں کی بنیاد پر دوڑنے کے جوتوں کا اشتہار دکھا سکتی ہے۔</translation> <translation id="1881322772814446296">آپ ایک منظم اکاؤنٹ کے ساتھ سائن ان کر رہے ہیں اور اپنے Chromium پروفائل پر اس کا انتظامی کنٹرول دے رہے ہیں۔ آپ کا Chromium ڈیٹا جیسے آپ کی ایپس، بُک مارکس، سرگزشت، پاس ورڈز اور دیگر ترتیبات <ph name="USER_NAME" /> سے مستقل طور پر جڑ جائیں گی۔ آپ اس ڈیٹا کو Google اکاؤنٹس ڈیش بورڈ کے ذریعے حذف کر سکیں گے لیکن آپ اس ڈیٹا کو دوسرے اکاؤنٹ کے ساتھ وابستہ نہیں کر سکیں گے۔ آپ اپنا موجودہ Chromium ڈیٹا الگ رکھنے کیلئے اختیاری طور پر ایک نیا پروفائل بنا سکتے ہیں۔ <ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">جب آپ ایڈریس بار یا تلاش کے خانے میں ٹائپ کرتے ہیں تو Chromium آئٹم کی تجاویز حاصل کرنے کے لیے جو آپ ٹائپ کرتے ہیں اسے Google Drive کو بھیجتا ہے۔ یہ پوشیدگی میں آف ہے۔</translation> <translation id="1911763535808217981">اسے آف کر کے، آپ Chromium میں سائن ان کیے بغیر Gmail جیسی Google سائٹس میں سائن ان کر سکتے ہیں</translation> <translation id="1929939181775079593">Chromium جواب نہیں دے رہا ہے۔ ابھی دوبارہ شروع کریں؟</translation> <translation id="193439633299369377">اپ ڈیٹ لاگو کرنے کیلئے ChromiumOS کو دوبارہ شروع کرنے کی ضرورت ہے۔</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb index 5f1879b..93dcc4f8 100644 --- a/chrome/app/resources/chromium_strings_zh-CN.xtb +++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -31,6 +31,7 @@ <translation id="185970820835152459">您可以管理您已登录的 Google 帐号。您可通过登录自己的 Google 帐号使用 Chromium 浏览器、Play 商店、Gmail 等产品。如果您想添加他人(比如某个家庭成员)的帐号,请改为将这个新人添加到您的 <ph name="DEVICE_TYPE" />。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="1863308913976887472">网站可以将您的兴趣信息存储在 Chromium 中。例如,如果您访问某个网站购买马拉松跑鞋,系统可能会根据该网站推测您对跑马拉松感兴趣。之后,如果您访问其他网站报名参加比赛,相应网站就可以根据您的兴趣向您展示跑鞋广告。</translation> <translation id="1881322772814446296">您目前登录的帐号是一个受管理帐号,该帐号的管理员将能够控制您的 Chromium 个人资料。您的 Chromium 数据(例如您的应用、书签、历史记录、密码和其他设置)将永远与 <ph name="USER_NAME" /> 相关联。您可以通过 Google 帐号信息中心删除这些数据,但无法将这些数据与其他帐号相关联。您可以选择创建新的个人资料来单独存储您现有的 Chromium 数据。<ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">当您在地址栏或搜索框中输入内容时,Chromium 会将您输入的内容发送至 Google 云端硬盘,以便获取内容建议。在无痕模式下,此设置处于关闭状态。</translation> <translation id="1911763535808217981">关闭此功能后,您无需登录 Chromium 即可登录 Gmail 等 Google 网站</translation> <translation id="1929939181775079593">Chromium 未响应。要立即重新启动吗?</translation> <translation id="193439633299369377">需要重新启动 Chromium 操作系统以应用更新。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb index d4ce29f..c54af1ee 100644 --- a/chrome/app/resources/chromium_strings_zh-HK.xtb +++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -33,6 +33,7 @@ <translation id="185970820835152459">您可管理已登入的 Google 帳戶。Google 帳戶可用於 Chromium 瀏覽器、Play 商店和 Gmail 等服務。如要新增其他人 (例如家庭成員) 的帳戶,請改為將使用者新增至您的 <ph name="DEVICE_TYPE" />。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="1863308913976887472">網站可將您的興趣相關資料儲存在 Chromium 中。例如,如果您瀏覽某個網站想購買適合馬拉松的跑步鞋,網站可能會判斷您的興趣為跑馬拉松。如果您日後瀏覽其他網站報名參加比賽,該網站就可以根據您的興趣向您顯示跑步鞋的廣告。</translation> <translation id="1881322772814446296">您已登入受管理的帳戶,並將管理控制權授予您的 Chromium 設定檔。您的 Chromium 數據 (例如應用程式、書籤、記錄、密碼和其他設定) 均將永久與 <ph name="USER_NAME" /> 建立關聯。您可以透過 Google 帳戶資訊主頁刪除這些數據,但您無法將這些數據與其他帳戶建立關聯。如要另行保留現有的 Chromium 數據,您可以選建立新的設定檔。<ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">在網址列或搜尋框中輸入內容時,Chromium 會將輸入的內容傳送至 Google 雲端硬碟,以便取得項目建議。此功能不會在無痕模式下啟用。</translation> <translation id="1911763535808217981">關閉此功能後,您無需登入 Chromium,即可登入 Gmail 等 Google 網站</translation> <translation id="1929939181775079593">Chromium 沒有回應,要立即重新啟動嗎?</translation> <translation id="193439633299369377">必須重新啟動 Chromium 作業系統,才能套用更新。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb index e432ae6..c04ce375 100644 --- a/chrome/app/resources/chromium_strings_zh-TW.xtb +++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -31,6 +31,7 @@ <translation id="185970820835152459">你可以管理已登入的 Google 帳戶。Google 帳戶可用於 Chromium 瀏覽器、Play 商店和 Gmail 等服務。如要添加他人 (例如家庭成員) 的帳戶,請改為將使用者新增至你的 <ph name="DEVICE_TYPE" />。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="1863308913976887472">網站可以將你的興趣喜好相關資訊儲存在 Chromium 中。舉例來說,如果你造訪某個網站想購買適合馬拉松活動的慢跑鞋,網站可能會判斷你的興趣是跑馬拉松。在此之後,如果你造訪另一個網站報名參加比賽,該網站就可以根據你的興趣喜好向你顯示慢跑鞋的廣告。</translation> <translation id="1881322772814446296">你已登入管理化環境下的帳戶,並將管理控制權授予你的 Chromium 設定檔。你的 Chromium 資料 (例如應用程式、書籤、記錄、密碼和其他設定) 均將永久與 <ph name="USER_NAME" /> 建立關聯。你可以透過 Google 帳戶資訊主頁刪除這些資料,但你無法將這些資料與其他帳戶建立關聯。如要另行保留現有的 Chromium 資料,你可以選擇建立新的設定檔。<ph name="LEARN_MORE" /></translation> +<translation id="1906696617298807388">Chromium 會將你在網址列或搜尋框中輸入的內容傳送至 Google 雲端硬碟,以提供項目建議。這項功能在無痕模式中為關閉狀態。</translation> <translation id="1911763535808217981">關閉這項功能後,你可以單獨登入 Gmail 等這類 Google 網站,不必同時登入 Chromium</translation> <translation id="1929939181775079593">Chromium 沒有回應,要立即重新啟動嗎?</translation> <translation id="193439633299369377">Chromium OS 必須重新啟動,才能套用更新。</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 5235ca77..955aa85 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -69,6 +69,7 @@ <translation id="1059484610606223931">Hiperteksoordragprotokol (HTTPS)</translation> <translation id="1059944192885972544">Het <ph name="NUM" /> oortjies vir "<ph name="SEARCH_TEXT" />" gekry</translation> <translation id="1060292118287751956">Bepaal die frekwensie waarteen die skerm opdateer</translation> +<translation id="1060570945511946595">Bestuur kaartjies</translation> <translation id="1061130374843955397">Welkom by jou <ph name="DEVICE_TYPE" /></translation> <translation id="1061373870045429865">Skep QR-kode vir hierdie skakel</translation> <translation id="1061904396131502319">Dis amper tyd vir 'n blaaskans</translation> @@ -1126,6 +1127,7 @@ <translation id="1975841812214822307">Verwyder …</translation> <translation id="1976150099241323601">Meld aan op sekuriteitstoestel</translation> <translation id="1977965994116744507">Bring jou foon nader om jou <ph name="DEVICE_TYPE" /> te ontsluit.</translation> +<translation id="1978666928180318515">Verwyder Bruschetta</translation> <translation id="1979095679518582070">As jy hierdie kenmerk afskakel, beïnvloed dit nie hierdie toestel se vermoë om die inligting te stuur wat nodig is vir noodsaaklike dienste soos stelselopdaterings en sekuriteit nie.</translation> <translation id="1979280758666859181">Jy verander tans na 'n kanaal met 'n ouer weergawe van <ph name="PRODUCT_NAME" />. Die kanaalverandering sal toegepas word wanneer die kanaalweergawe ooreenstem met die weergawe wat tans op jou toestel geïnstalleer is.</translation> <translation id="197989455406964291">KDC steun nie enkripsiesoort nie</translation> @@ -1593,7 +1595,6 @@ <translation id="2356070529366658676">Vra</translation> <translation id="2357330829548294574">Verwyder <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Werwe kan JavaScript gebruik</translation> -<translation id="2358703245148663432">’n Ander toestel</translation> <translation id="2358777858338503863">Klik om toe te laat op <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux-programme sal dalk nie reageer nie.</translation> <translation id="2359345697448000899">Bestuur jou uitbreidings deur Uitbreidings in die Nutsgoed-kieslys te klik.</translation> @@ -1933,6 +1934,7 @@ <translation id="2672142220933875349">Swak crx-lêer, kon nie uitpak nie.</translation> <translation id="2673135533890720193">Lees jou blaaigeskiedenis</translation> <translation id="2674764818721168631">Af</translation> +<translation id="2675570801872027281">Kon nie Bruschetta verwyder nie. Probeer weer.</translation> <translation id="2676492189600898281">Verskaf outovulterugvoer</translation> <translation id="2678063897982469759">Heraktiveer</translation> <translation id="2678100101831051676">Kan nie uitsaai nie.</translation> @@ -2931,6 +2933,7 @@ <translation id="3593965109698325041">Sertifikaatnaam-beperkings</translation> <translation id="3596012367874587041">Programinstellings</translation> <translation id="3596414637720633074">Blokkeer derdepartywebkoekies in Incognito</translation> +<translation id="3598010454707842106">Klik “Pasmaak Chrome”</translation> <translation id="3599221874935822507">Opgehewe</translation> <translation id="3600051066689725006">Webversoekinligting</translation> <translation id="360180734785106144">Nuwe kenmerke aanbied wanneer hulle beskikbaar is</translation> @@ -3929,6 +3932,7 @@ <translation id="4497145443434063861">Rekenaar en Chromecast in verskillende wi-fi-netwerke (byvoorbeeld 2,4 teenoor 5 GHz)</translation> <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> het omgeval</translation> +<translation id="4500647907053779331">&Vertaal keuse in <ph name="LANGUAGE" /></translation> <translation id="450099669180426158">Uitroepteken-ikoon</translation> <translation id="4501530680793980440">Bevestig verwydering</translation> <translation id="4502423230170890588">Verwyder van hierdie toestel</translation> @@ -5747,6 +5751,7 @@ <translation id="617213288191670920">Geen tale bygevoeg nie</translation> <translation id="6173623053897475761">Tik jou PIN weer in</translation> <translation id="6175314957787328458">Microsoft-domein se GUID</translation> +<translation id="6177412385419165772">Verwyder tans …</translation> <translation id="6178664161104547336">Kies 'n sertifikaat</translation> <translation id="6178682841350631965">Jou aanmelddata is opgedateer</translation> <translation id="6180510783007738939">Lynnutsding</translation> @@ -6223,6 +6228,7 @@ <translation id="6619801788773578757">Voeg kioskprogram by</translation> <translation id="6619990499523117484">Bevestig jou PIN</translation> <translation id="6620254580880484313">Houernaam</translation> +<translation id="6620927550847360014">Verwyder Bruschetta van jou <ph name="DEVICE_TYPE" />?</translation> <translation id="6621391692573306628">Om hierdie oortjie na ’n ander toestel toe te stuur, moet jy op albei toestelle by Chrome aanmeld</translation> <translation id="6622980291894852883">Hou aan om prente te blokkeer</translation> <translation id="6624036901798307345">Tik in tabletmodus op die oortjietellernutsbalkknoppie om die nuwe oortjiestrook oop te maak wat miniprente van elke oortjie wys.</translation> @@ -6440,6 +6446,7 @@ <translation id="6818547713623251698">Bekyk jou foon se foto's, media, kennisgewings en programme</translation> <translation id="6818802132960437751">Ingeboude virusbeskerming</translation> <translation id="6818920801736417483">Stoor wagwoorde?</translation> +<translation id="6820079682647046800">Kerberos-stawing het misluk</translation> <translation id="6823174134746916417">Raakpaneel – tik-om-te-klik</translation> <translation id="6824564591481349393">Kopieer e-posadres</translation> <translation id="6824584962142919697">&Ondersoek elemente</translation> @@ -6594,6 +6601,7 @@ <translation id="6955698182324067397">Jy aktiveer tans Chrome-bedryfstelselontfoutingkenmerke wat sshd daemon sal opstel en selflaai van USB-datastokkies af moontlik sal maak.</translation> <translation id="6955893174999506273">Wys nog 1 skakelaar toe</translation> <translation id="6957044667612803194">Die sekuriteitsleutel steun nie PIN'e nie</translation> +<translation id="6960133692707095572">Besoek sonder ’n kaartjie</translation> <translation id="6960507406838246615">Linux-opdatering word vereis</translation> <translation id="6960648667961844909">Kon nie <ph name="LANGUAGE" />-spraaklêers aflaai nie. Sal later probeer aflaai. Spraak word na Google toe gestuur vir verwerking totdat aflaai voltooi is.</translation> <translation id="696103774840402661">Alle lêers en plaaslike data vir alle gebruikers op hierdie <ph name="DEVICE_TYPE" /> is permanent uitgevee.</translation> @@ -8055,6 +8063,7 @@ <translation id="8272443605911821513">Bestuur jou uitbreidings deur Uitbreidings in die "Meer nutsgoed"-kieslys te klik.</translation> <translation id="8272786333453048167">Laat weer toe</translation> <translation id="8273905181216423293">Laai nou af</translation> +<translation id="827488840488530039">Die bladsy wat jy probeer besoek, kon nie jou Kerberos-kaartjies verifieer nie</translation> <translation id="8274921654076766238">Vergrootglas volg sleutelbordfokus</translation> <translation id="8274924778568117936">Moenie jou <ph name="DEVICE_TYPE" /> afskakel of toemaak voordat die opdatering afgehandel is nie. Jou <ph name="DEVICE_TYPE" /> sal herbegin wanneer die installering voltooi is.</translation> <translation id="8275038454117074363">Voer in</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 31323e26..563cfb5 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -378,6 +378,7 @@ <translation id="1339009753652684748">«Hey Google» ሲሉ ረዳትዎን ይድረሱ። ባትሪን ለመቆጠብ «በርቷል (የሚመከር።)»ን ይምረጡ። የእርስዎ ረዳት ምላሽ የሚሰጠው መሣሪያዎ ተሰክቶ ወይም ኃይል እየሞላ ከሆነ ብቻ ነው።</translation> <translation id="13392265090583506">A11y</translation> <translation id="1340527397989195812">የፋይሎች መተግበሪያውን በመጠቀም በመሣሪያው ውስጥ ያለ የማህደረመረጃ ምትኬ ያስቀምጡ።</translation> +<translation id="1341701348342335220">በጥሩ ሁኔታ ተከናውኗል!</translation> <translation id="1341871421050612057">ከ<ph name="USERNAME" /> ጋር ማስመር አልተቻለም</translation> <translation id="1343865611738742294">የዩኤስቢ መተግበሪያዎች እንዲደርስባቸው ለ Linux ፈቃድ ይስጡት። ከተወገደ በኋላ Linux የዩኤስቢ መሣሪያውን አያስታውሰውም።</translation> <translation id="1343920184519992513">ካቆሙበት ይቀጥሉ እና አንድ የተወሰነ የገጾች ስብስብን ክፈት</translation> @@ -1586,7 +1587,6 @@ <translation id="2356070529366658676">ጠይቅ</translation> <translation id="2357330829548294574"><ph name="USER_NAME" />ን ያስወግዱ</translation> <translation id="2358561147588818967">ጣቢያዎች ጃቫስክሪፕትን መጠቀም ይችላሉ</translation> -<translation id="2358703245148663432">የተለየ መሣሪያ</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> ላይ ለመፍቀድ ጠቅ ያድርጉ፦</translation> <translation id="2359071692152028734">የLinux መተግበሪያዎች ምላሽ የማይሰጡ ሊሆኑ ይችላሉ።</translation> <translation id="2359345697448000899">በመሣሪያዎች ምናሌ ውስጥ ቅጥያዎች የሚለውን ጠቅ በማድረግ ቅጥያዎችዎን ያቀናብሩ።</translation> @@ -3632,6 +3632,7 @@ <translation id="4232375817808480934">Kerberosን ያዋቅሩ</translation> <translation id="4235965441080806197">መግባትን ሰርዝ</translation> <translation id="4236163961381003811">ተጨማሪ ቅጥያዎችን ያግኙ</translation> +<translation id="4237282663517880406">የGoogle Drive ጥቆማዎችን አሳይ</translation> <translation id="4241182343707213132">የድርጅት መተግበሪያዎችን ለማዘመን ዳግም አስጀምር</translation> <translation id="4242145785130247982">በርካታ የደንበኛ ምስክርነቶች አይደገፉም</translation> <translation id="4242533952199664413">ቅንብሮችን ክፈት</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 6487559..bbeb069 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -69,6 +69,7 @@ <translation id="1059484610606223931">تأمين بروتوكول نقل الروابط النصية (HTTPS)</translation> <translation id="1059944192885972544">تم العثور على <ph name="NUM" /> علامات تبويب حول "<ph name="SEARCH_TEXT" />".</translation> <translation id="1060292118287751956">تحدّد معدّل تحديثات الشاشة</translation> +<translation id="1060570945511946595">إدارة التذاكر</translation> <translation id="1061130374843955397">مرحبًا بك في <ph name="DEVICE_TYPE" /></translation> <translation id="1061373870045429865">إنشاء رمز الاستجابة السريعة لهذا الرابط</translation> <translation id="1061904396131502319">سيتم قفل الجهاز بعد قليل</translation> @@ -1118,6 +1119,7 @@ <translation id="1975841812214822307">إزالة...</translation> <translation id="1976150099241323601">تسجيل الدخول إلى جهاز الأمان</translation> <translation id="1977965994116744507">اجعل هاتفك قريبًا منك لإلغاء قفل جهاز <ph name="DEVICE_TYPE" />.</translation> +<translation id="1978666928180318515">إزالة الجهاز الافتراضي Bruschetta</translation> <translation id="1979095679518582070">لن يؤثر إيقاف هذه الميزة في قدرة هذا الجهاز على إرسال المعلومات اللازمة للحصول على خدمات ضرورية مثل تحديثات النظام والأمان.</translation> <translation id="1979280758666859181">أنت الآن تُجري تغييرًا إلى قناة ذات إصدار سابق من <ph name="PRODUCT_NAME" />. وسيسري تغيير القناة عند تطابق إصدار القناة مع الإصدار المثبت حاليًا على الجهاز.</translation> <translation id="197989455406964291">لا يدعم KDC (مركز توزيع المفاتيح) نوع التشفير</translation> @@ -1582,7 +1584,6 @@ <translation id="2356070529366658676">طلب</translation> <translation id="2357330829548294574">إزالة <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">السماح للمواقع الإلكترونية باستخدام JavaScript</translation> -<translation id="2358703245148663432">جهاز مختلف</translation> <translation id="2358777858338503863">انقر للسماح بوصول الإضافة إلى الموقع الإلكتروني <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">قد لا تستجيب تطبيقات Linux.</translation> <translation id="2359345697448000899">يمكنك إدارة الإضافات من خلال النقر على "الإضافات" في قائمة "الأدوات".</translation> @@ -1923,6 +1924,7 @@ <translation id="2672142220933875349">ملف CRX غير صالح. تعذر فك الحزمة.</translation> <translation id="2673135533890720193">قراءة سجل التصفح التابع لك</translation> <translation id="2674764818721168631">غير مفعَّل</translation> +<translation id="2675570801872027281">حدث خطأ أثناء إزالة الجهاز الافتراضي Bruschetta. يُرجى إعادة المحاولة.</translation> <translation id="2676492189600898281">تقديم الملاحظات بشأن ميزة "الملء التلقائي"</translation> <translation id="2678063897982469759">إعادة تفعيل</translation> <translation id="2678100101831051676">تعذَّر البث</translation> @@ -2922,6 +2924,7 @@ <translation id="3593965109698325041">قيود اسم الشهادة</translation> <translation id="3596012367874587041">إعدادات التطبيق</translation> <translation id="3596414637720633074">حظر ملفات تعريف الارتباط التابعة لجهات خارجية في وضع التصفّح المتخفي</translation> +<translation id="3598010454707842106">انقر على "تخصيص Chrome"</translation> <translation id="3599221874935822507">مرتفعة</translation> <translation id="3600051066689725006">معلومات طلب الويب</translation> <translation id="360180734785106144">عرض ميزات جديدة عندما تصبح متاحة</translation> @@ -3917,6 +3920,7 @@ <translation id="4495419450179050807">عدم الظهور في هذه الصفحة</translation> <translation id="4497145443434063861">جهاز الكمبيوتر الشخصي وجهاز Chromecast متصلان بشبكتَي Wi-Fi مختلفتَين (على سبيل المثال، واحدة بتردد 2.4 غيغا هرتز والأخرى بتردد 5 غيغا هرتز)</translation> <translation id="4500114933761911433">تعطّل <ph name="PLUGIN_NAME" />.</translation> +<translation id="4500647907053779331">ترجمة النص المُحدَّد إلى اللغة <ph name="LANGUAGE" /></translation> <translation id="450099669180426158">رمز علامة التعجب</translation> <translation id="4501530680793980440">تأكيد الإزالة</translation> <translation id="4502423230170890588">إزالة من هذا الجهاز</translation> @@ -5734,6 +5738,7 @@ <translation id="617213288191670920">لم تتمّ إضافة أيّ لغة.</translation> <translation id="6173623053897475761">كتابة رقم التعريف الشخصي مرة أخرى</translation> <translation id="6175314957787328458">المعرّف الفريد العمومي لنطاق Microsoft</translation> +<translation id="6177412385419165772">جارٍ الإزالة…</translation> <translation id="6178664161104547336">تحديد شهادة</translation> <translation id="6178682841350631965">تم تعديل بيانات تسجيل الدخول.</translation> <translation id="6180510783007738939">أداة رسم الخطوط</translation> @@ -6218,6 +6223,7 @@ <translation id="6619801788773578757">إضافة تطبيق الكشك</translation> <translation id="6619990499523117484">تأكيد رقم التعريف الشخصي</translation> <translation id="6620254580880484313">اسم الحاوية</translation> +<translation id="6620927550847360014">هل تريد إزالة الجهاز الافتراضي Bruschetta من <ph name="DEVICE_TYPE" />؟</translation> <translation id="6621391692573306628">لإرسال علامة التبويب هذه إلى جهاز آخر، عليك تسجيل الدخول إلى Chrome على كلا الجهازين.</translation> <translation id="6622980291894852883">متابعة منع عرض الصور</translation> <translation id="6624036901798307345">في وضع الجهاز اللوحي، انقر على زر شريط أدوات عدّاد علامات التبويب لفتح شريط علامات التبويب الجديد الذي يعرض الصور المصغّرة لكل علامة تبويب.</translation> @@ -6435,6 +6441,7 @@ <translation id="6818547713623251698">عرض الصور والوسائط والإشعارات والتطبيقات من هاتفك</translation> <translation id="6818802132960437751">حماية مُدمَجة من الفيروسات</translation> <translation id="6818920801736417483">هل تريد حفظ كلمات المرور؟</translation> +<translation id="6820079682647046800">تعذّرت مصادقة Kerberos</translation> <translation id="6823174134746916417">الضغط للنقر على لوحة اللمس</translation> <translation id="6824564591481349393">نسخ عنوان البريد الإل&كتروني</translation> <translation id="6824584962142919697">وعناصر الفحص</translation> @@ -6589,6 +6596,7 @@ <translation id="6955698182324067397">يتم حاليًا تفعيل ميزات تصحيح الأخطاء لنظام التشغيل Chrome التي ستثبِّت البرنامج الخفي لبروتوكول النقل الآمن (SSHD) وتتيح تشغيل النظام من محرّكات أقراص USB.</translation> <translation id="6955893174999506273">تخصيص مفتاح تحكّم إضافي واحد</translation> <translation id="6957044667612803194">لا يوفّر مفتاح الأمان هذا أرقام التعريف الشخصية</translation> +<translation id="6960133692707095572">الانتقال إلى الصفحة بدون تذكرة</translation> <translation id="6960507406838246615">يجب تحديث نظام التشغيل Linux.</translation> <translation id="6960648667961844909">تعذّر تنزيل ملفات التعرّف على الكلام باللغة <ph name="LANGUAGE" />. ستتم إعادة محاولة التنزيل لاحقًا. ويتم إرسال ملفات التعرّف على الكلام إلى Google لمعالجتها إلى حين اكتمال عملية التنزيل.</translation> <translation id="696103774840402661">تم حذف جميع الملفات والبيانات المحلّية لكلّ المستخدمين على الجهاز <ph name="DEVICE_TYPE" /> نهائيًا.</translation> @@ -8053,6 +8061,7 @@ <translation id="8272443605911821513">يمكنك إدارة الإضافات من خلال النقر على "الإضافات" في قائمة "المزيد من الأدوات".</translation> <translation id="8272786333453048167">السماح مرة أخرى</translation> <translation id="8273905181216423293">تنزيل الآن</translation> +<translation id="827488840488530039">يتعذّر على الصفحة التي تحاول الانتقال إليها التحقّق من تذاكر Kerberos.</translation> <translation id="8274921654076766238">المكبِّر يتبع تركيز لوحة المفاتيح.</translation> <translation id="8274924778568117936">لا توقف تشغيل جهاز <ph name="DEVICE_TYPE" /> أو تُغلقه لحين الانتهاء من التحديث. ستتم إعادة تشغيل جهاز <ph name="DEVICE_TYPE" /> بعد اكتمال التثبيت.</translation> <translation id="8275038454117074363">الاستيراد</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index d6784d7..d150c09 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -1593,7 +1593,6 @@ <translation id="2356070529366658676">সোধক</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> আঁতৰাওক</translation> <translation id="2358561147588818967">ছাইটে Javascript ব্যৱহাৰ কৰিব পাৰে</translation> -<translation id="2358703245148663432">এটা পৃথক ডিভাইচ</translation> <translation id="2358777858338503863"><ph name="ORIGIN" />ত অনুমতি দিবলৈ ক্লিক কৰক:</translation> <translation id="2359071692152028734">Linux এপ্সমূহ অসমৰ্থিত হৈ পৰিব পাৰে।</translation> <translation id="2359345697448000899">সঁজুলি মেনুৰ এক্সটেনশ্বনত ক্লিক কৰি আপোনাৰ এক্সটেনশ্বনবোৰ পৰিচালনা কৰক।</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 4f571370..ec6b3780 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -375,6 +375,7 @@ <translation id="1339009753652684748">"Ok Google" dedikdə Assistentinizə daxil olun. Enerjiyə qənaət üçün “Aktiv (Tövsiyə olunur)” seçin. Assistentiniz yalnız cihazınız elektrik şəbəkəsinə qoşulduqda və ya batareya doldurulduqda cavab verəcək.</translation> <translation id="13392265090583506">A11y</translation> <translation id="1340527397989195812">Fayllar tətbiqini istifadə etməklə medianı cihazdan yedəkləyin.</translation> +<translation id="1341701348342335220">Hazırdır!</translation> <translation id="1341871421050612057"><ph name="USERNAME" /> ilə sinxronizasiya mümkün deyil</translation> <translation id="1343865611738742294">USB cihazlarına daxil olmaq üçün Linux tətbiqlərinə giriş icazəsi verin. Linux USB cihazı silindikdən sonra onu yadda saxlamayacaq.</translation> <translation id="1343920184519992513">Qaldığınız yerdən davam edin və xüsusi səhifələr dəstini açın</translation> @@ -1576,7 +1577,6 @@ <translation id="2356070529366658676">Soruşun</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> silin</translation> <translation id="2358561147588818967">Saytlar Javascript'i istifadə edə bilər</translation> -<translation id="2358703245148663432">Başqa cihaz</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> saytına girişə icazə vermək üçün klikləyin:</translation> <translation id="2359071692152028734">Linux tətbiqləri cavab verməyə bilər.</translation> <translation id="2359345697448000899">Alətlər menyusundan Artırmalara klikləyərək artırmaları idarə edin.</translation> @@ -3622,6 +3622,7 @@ <translation id="4232375817808480934">Kerberos'u konfiqurasiya edin</translation> <translation id="4235965441080806197">Daxilolmanı ləğv edin</translation> <translation id="4236163961381003811">Digər artırmaları kəşf edin</translation> +<translation id="4237282663517880406">Google Disk təkliflərini göstərin</translation> <translation id="4241182343707213132">Təşkilatın tətbiqlərini güncəlləmək üçün yenidən başladın</translation> <translation id="4242145785130247982">Çoxsaylı klient sertifikatları dəstəklənmir</translation> <translation id="4242533952199664413">Ayarları açın</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 232a163..d74a1aa 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -1580,7 +1580,6 @@ <translation id="2356070529366658676">Запытваць</translation> <translation id="2357330829548294574">Выдаліць карыстальніка <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Сайты могуць выкарыстоўваць змесціва JavaScript</translation> -<translation id="2358703245148663432">Іншая прылада</translation> <translation id="2358777858338503863">Націсніце, каб дазволіць пашырэнню доступ да сайта <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Праграмы Linux могуць перастаць адказваць на запыты.</translation> <translation id="2359345697448000899">Каб кіраваць пашырэннямі, націсніце "Пашырэнні" ў меню "Інструменты".</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 274e6a4..564e1a487 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1588,7 +1588,6 @@ <translation id="2356070529366658676">Попитайте ме</translation> <translation id="2357330829548294574">Премахване на <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Сайтовете могат да използват JavaScript</translation> -<translation id="2358703245148663432">Друго устройство</translation> <translation id="2358777858338503863">Кликнете, за да разрешите в(ъв) <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Приложенията за Linux може да блокират.</translation> <translation id="2359345697448000899">Управлявайте разширенията си, като кликнете върху „Разширения“ в менюто „Инструменти“.</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 3e84b154..0129e48d 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1594,7 +1594,6 @@ <translation id="2356070529366658676">জিজ্ঞাসা করুন</translation> <translation id="2357330829548294574"><ph name="USER_NAME" />-কে সরান</translation> <translation id="2358561147588818967">সাইট জাভাস্ক্রিপ্ট ব্যবহার করতে পারে</translation> -<translation id="2358703245148663432">একটি অন্য ডিভাইস</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> অ্যাক্সেসের অনুমতি দিতে ক্লিক করুন:</translation> <translation id="2359071692152028734">Linux অ্যাপ প্রতিক্রিয়া নাও জানাতে পারে।</translation> <translation id="2359345697448000899">টুল মেনুতে এক্সটেনশনে ক্লিক করে আপনার এক্সটেনশনগুলি পরিচালনা করুন৷</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 7b172ea..2912295b 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -1594,7 +1594,6 @@ <translation id="2356070529366658676">Pitaj</translation> <translation id="2357330829548294574">Uklanjanje korisnika <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Web lokacije mogu koristiti JavaScript</translation> -<translation id="2358703245148663432">Drugi uređaj</translation> <translation id="2358777858338503863">Kliknite da dozvolite na web lokaciji <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux aplikacije mogu prestati reagirati.</translation> <translation id="2359345697448000899">Upravljajte ekstenzijama klikom na Ekstenzije u meniju Alati.</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 839e5cf..31393368c 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -377,6 +377,7 @@ <translation id="1339009753652684748">Accedeix a l'Assistent dient "Hey Google". Per estalviar bateria, escull “Activat (opció recomanada)”. El teu Assistent respondrà només quan el dispositiu estigui connectat o s'estigui carregant.</translation> <translation id="13392265090583506">Accessibilitat</translation> <translation id="1340527397989195812">Feu una còpia de seguretat dels fitxers multimèdia del dispositiu mitjançant l'aplicació Fitxers.</translation> +<translation id="1341701348342335220">Ben fet!</translation> <translation id="1341871421050612057">No es pot sincronitzar amb <ph name="USERNAME" /></translation> <translation id="1343865611738742294">Concedeix permís a les aplicacions de Linux per accedir als dispositius USB. Linux no recordarà els dispositius USB després d'extreure'ls.</translation> <translation id="1343920184519992513">Continua des d'on ho vas deixar i obre un conjunt de pàgines específic</translation> @@ -1577,7 +1578,6 @@ <translation id="2356070529366658676">Pregunta-ho</translation> <translation id="2357330829548294574">Suprimeix <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Els llocs web poden utilitzar JavaScript</translation> -<translation id="2358703245148663432">Un altre dispositiu</translation> <translation id="2358777858338503863">Fes clic per permetre-ho a <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Pot ser que les aplicacions de Linux no responguin.</translation> <translation id="2359345697448000899">Per gestionar les extensions, feu clic a Extensions al menú Eines.</translation> @@ -3624,6 +3624,7 @@ <translation id="4232375817808480934">Configura Kerberos</translation> <translation id="4235965441080806197">Cancel·la l'inici de sessió</translation> <translation id="4236163961381003811">Descobreix més extensions</translation> +<translation id="4237282663517880406">Mostra suggeriments de Google Drive</translation> <translation id="4241182343707213132">Reinicia per actualitzar les aplicacions de l'organització</translation> <translation id="4242145785130247982">No s'admet l'ús de diversos certificats de client</translation> <translation id="4242533952199664413">Obre la configuració</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 7d2499c..753b114 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -379,6 +379,7 @@ <translation id="1339009753652684748">Aktivovat Asistenta, když řeknete „Ok Google“. Pokud chcete ušetřit baterii, vyberte výchozí možnost Zapnout (doporučeno). Asistent vám odpoví jen v případě, že je zařízení připojené ke zdroji napájení nebo se nabíjí.</translation> <translation id="13392265090583506">Přístupnost</translation> <translation id="1340527397989195812">Zálohujte média ze zařízení pomocí aplikace Soubory.</translation> +<translation id="1341701348342335220">Výborně!</translation> <translation id="1341871421050612057">Účet <ph name="USERNAME" /> nelze synchronizovat</translation> <translation id="1343865611738742294">Udělte linuxovým aplikacím oprávnění k používání zařízení USB. Po odebrání si Linux nebude zařízení USB pamatovat.</translation> <translation id="1343920184519992513">Pokračujte, kde jste skončili, a otevírejte vybrané stránky</translation> @@ -1579,7 +1580,6 @@ <translation id="2356070529366658676">Zeptat se</translation> <translation id="2357330829548294574">Odstranit uživatele <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Weby mohou používat JavaScript</translation> -<translation id="2358703245148663432">Jiné zařízení</translation> <translation id="2358777858338503863">Kliknutím povolíte přístup k webu <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Aplikace pro Linux mohou přestat reagovat.</translation> <translation id="2359345697448000899">Chcete-li spravovat rozšíření, klikněte v nabídce Nástroje na příkaz Rozšíření.</translation> @@ -3626,6 +3626,7 @@ <translation id="4232375817808480934">Nakonfigurovat Kerberos</translation> <translation id="4235965441080806197">Zrušit přihlášení</translation> <translation id="4236163961381003811">Objevit další rozšíření</translation> +<translation id="4237282663517880406">Zobrazovat návrhy z Disku Google</translation> <translation id="4241182343707213132">Pokud chcete aktualizovat aplikace organizace, restartujte zařízení</translation> <translation id="4242145785130247982">Více certifikátů klientů není podporováno</translation> <translation id="4242533952199664413">Otevřít Nastavení</translation> @@ -3942,6 +3943,7 @@ <translation id="4522890784888918985">Podřízené účty nejsou podporovány</translation> <translation id="4523876148417776526">Seznamy webů ve formátu XML zatím nebyly načteny.</translation> <translation id="4524832533047962394">Uvedený režim registrace v této verzi operačního systému není podporován. Zkontrolujte, zda máte spuštěnou nejnovější verzi.</translation> +<translation id="4526051299161934899">Skupiny uložených karet byly skryty</translation> <translation id="4526853756266614740">Pokud chcete okamžite použít motiv, vyberte obrázek</translation> <translation id="452750746583162491">Zkontrolovat synchronizovaná data</translation> <translation id="4527929807707405172">Zapnout opačné posouvání. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> @@ -4266,6 +4268,7 @@ <translation id="4824037980212326045">Zálohování a obnovení Linuxu</translation> <translation id="4824958205181053313">Zrušit synchronizaci?</translation> <translation id="4825532258163983651">Přístupový klíč nelze smazat</translation> +<translation id="4827283332383516812">Smazat kartu</translation> <translation id="4827675678516992122">Nelze se připojit</translation> <translation id="4827784381479890589">Vylepšená kontrola pravopisu v prohlížeči Chrome (text je odesílán do Googlu a zobrazují se návrhy)</translation> <translation id="4827904420700932487">Vytvořit QR kód pro tento obrázek</translation> @@ -5292,6 +5295,7 @@ <translation id="5792295754950501287">Další akce pro <ph name="CARD_DESCRIPTION" /></translation> <translation id="5792728279623964091">Klepněte na vypínač</translation> <translation id="5792874008054171483">Další akce pro <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">Tato platební metoda bude z tohoto zařízení smazána</translation> <translation id="5793339252089865437">Stažení této aktualizace prostřednictvím mobilní sítě může to vést k tomu, že vám budou naúčtovány poplatky za překročení limitu dat.</translation> <translation id="5793420564274426163">Potvrzení spárování</translation> <translation id="5793430094159150686">Heslo bylo změněno. Pokud chcete obnovit místní data, zadejte staré heslo.</translation> @@ -7269,6 +7273,7 @@ <translation id="7609148976235050828">Připojte se k internetu a zkuste to znovu</translation> <translation id="7612401678989660900">Povolit přístup pro aplikace a weby s oprávněním k mikrofonu</translation> <translation id="7612655942094160088">Aktivace funkcí připojeného telefonu.</translation> +<translation id="7612989789287281429">Přihlašování…</translation> <translation id="7614260613810441905">Zeptat se, když chce web upravit soubory nebo složky v zařízení (doporučeno)</translation> <translation id="761530003705945209">Zálohování na Disk Google. Snadno obnovte svá data nebo kdykoliv přejděte na jiné zařízení. Záloha zahrnuje data aplikací. Zálohy se nahrávají do Googlu a šifrují pomocí hesla účtu Google.</translation> <translation id="7615365294369022248">Při přidávání účtu došlo k chybě</translation> @@ -8485,6 +8490,7 @@ <translation id="869884720829132584">Nabídka Aplikace</translation> <translation id="869891660844655955">Datum vypršení platnosti</translation> <translation id="8699188901396699995">Soubor PPD pro: <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">Nabídka obsahuje skryté skupiny uložených karet</translation> <translation id="8702825062053163569">Zařízení <ph name="DEVICE_TYPE" /> bylo uzamknuto.</translation> <translation id="8703346390800944767">Přeskočit reklamu</translation> <translation id="8705331520020532516">Sériové číslo</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index 29dabe7..8b38542 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -1595,7 +1595,6 @@ <translation id="2356070529366658676">Gofyn</translation> <translation id="2357330829548294574">Tynnu <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Gall gwefannau ddefnyddio JavaScript</translation> -<translation id="2358703245148663432">Dyfais wahanol</translation> <translation id="2358777858338503863">Cliciwch i ganiatáu ar <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Gall apiau Linux ddod yn anymatebol.</translation> <translation id="2359345697448000899">Rheoli eich estyniadau drwy glicio Estyniadau yn y ddewislen Offer.</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 273ee09..2c636d4b 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -380,6 +380,7 @@ <translation id="1339009753652684748">Få adgang til Google Assistent, når du siger "Hey Google". Du kan spare på batteriet ved at vælge "Til (anbefales)". Google Assistent svarer kun, når din enhed oplader eller er sluttet til en strømkilde.</translation> <translation id="13392265090583506">A11y</translation> <translation id="1340527397989195812">Sikkerhedskopiér medier fra enheden ved hjælp af appen Filer.</translation> +<translation id="1341701348342335220">Sådan!</translation> <translation id="1341871421050612057">Synkroniseringen med <ph name="USERNAME" /> mislykkedes</translation> <translation id="1343865611738742294">Giv Linux-apps adgang til USB-enheder. Linux husker ikke en USB-enhed, når den er fjernet.</translation> <translation id="1343920184519992513">Fortsæt, hvor du slap, og åbn en bestemt række sider</translation> @@ -1593,7 +1594,6 @@ <translation id="2356070529366658676">Spørg</translation> <translation id="2357330829548294574">Fjern <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Websites kan bruge JavaScript</translation> -<translation id="2358703245148663432">En anden enhed</translation> <translation id="2358777858338503863">Klik for at tillade på <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux-apps reagerer muligvis ikke.</translation> <translation id="2359345697448000899">Administrer dine udvidelser ved at klikke på Udvidelser i værktøjsmenuen.</translation> @@ -3641,6 +3641,7 @@ <translation id="4232375817808480934">Konfigurer Kerberos</translation> <translation id="4235965441080806197">Annuller login</translation> <translation id="4236163961381003811">Se flere udvidelser</translation> +<translation id="4237282663517880406">Vis Google Drev-forslag</translation> <translation id="4241182343707213132">Genstart for at opdatere organisationens apps</translation> <translation id="4242145785130247982">Flere klientcertifikater understøttes ikke</translation> <translation id="4242533952199664413">Åbn Indstillinger</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index b30579a4..fd14f5d 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1574,7 +1574,6 @@ <translation id="2356070529366658676">Nachfragen</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> entfernen</translation> <translation id="2358561147588818967">Websites dürfen JavaScript verwenden</translation> -<translation id="2358703245148663432">Mit einem anderen Gerät</translation> <translation id="2358777858338503863">Klicken, um Zugriff auf <ph name="ORIGIN" /> zu erlauben:</translation> <translation id="2359071692152028734">Linux-Apps reagieren möglicherweise nicht mehr.</translation> <translation id="2359345697448000899">Klicke zum Verwalten deiner Erweiterungen im Menü „Tools“ auf „Erweiterungen“.</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 56aae07..c27bc06 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1595,7 +1595,6 @@ <translation id="2356070529366658676">Να γίνεται ερώτηση</translation> <translation id="2357330829548294574">Κατάργηση <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Οι ιστότοποι μπορούν να χρησιμοποιούν JavaScript</translation> -<translation id="2358703245148663432">Διαφορετική συσκευή</translation> <translation id="2358777858338503863">Κάντε κλικ για αποδοχή στον ιστότοπο <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Οι εφαρμογές Linux μπορεί να σταματήσουν να αποκρίνονται.</translation> <translation id="2359345697448000899">Διαχειριστείτε τις επεκτάσεις σας, κάνοντας κλικ στην επιλογή "Επεκτάσεις" στο μενού "Εργαλεία".</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 43ff80f0..52407d9 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1595,7 +1595,6 @@ <translation id="2356070529366658676">Ask</translation> <translation id="2357330829548294574">Remove <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Sites can use Javascript</translation> -<translation id="2358703245148663432">A different device</translation> <translation id="2358777858338503863">Click to allow on <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux apps may become unresponsive.</translation> <translation id="2359345697448000899">Manage your extensions by clicking Extensions in the Tools menu.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 1c63b94..1b1f935 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1574,7 +1574,6 @@ <translation id="2356070529366658676">Preguntar</translation> <translation id="2357330829548294574">Quitar <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Los sitios pueden usar JavaScript.</translation> -<translation id="2358703245148663432">Otro dispositivo</translation> <translation id="2358777858338503863">Haz clic para permitir en <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Es posible que las apps de Linux no respondan.</translation> <translation id="2359345697448000899">Para administrar tus extensiones, haz clic en la opción Extensiones en el menú Herramientas.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 8f7e3e3..d645e53 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1579,7 +1579,6 @@ <translation id="2356070529366658676">Preguntar</translation> <translation id="2357330829548294574">Quitar a <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Los sitios pueden usar JavaScript</translation> -<translation id="2358703245148663432">Un dispositivo diferente</translation> <translation id="2358777858338503863">Haz clic para permitirlo en <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Es posible que las aplicaciones Linux dejen de responder.</translation> <translation id="2359345697448000899">Para gestionar tus extensiones, haz clic en la opción Extensiones del menú Herramientas.</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 04d9c62..7e5e91e5 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1583,7 +1583,6 @@ <translation id="2356070529366658676">Küsi</translation> <translation id="2357330829548294574">Eemaldage <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Saidid saavad kasutada Javascripti</translation> -<translation id="2358703245148663432">Muu seade</translation> <translation id="2358777858338503863">Klõpsake saidil <ph name="ORIGIN" /> lubamiseks:</translation> <translation id="2359071692152028734">Linuxi rakendused ei pruugi reageerida.</translation> <translation id="2359345697448000899">Laienduste haldamiseks klõpsake menüüs Tööriistad valikul Laiendused.</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 4318437..fc4898b7 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -377,6 +377,7 @@ <translation id="1339009753652684748">Laguntzailea atzitzeko, esan "Hey Google". Bateria aurrezteko, aukeratu "Aktibatuta (gomendatua)". Gailua entxufatuta dagoenean eta kargatzen ari denean soilik erantzungo du Laguntzailea zerbitzuak.</translation> <translation id="13392265090583506">Erabilerraztasun-ezarpenak</translation> <translation id="1340527397989195812">Egin gailuko baliabideen babeskopiak Fitxategiak aplikazioa erabilita.</translation> +<translation id="1341701348342335220">Bikain!</translation> <translation id="1341871421050612057">Ezin da sinkronizatu <ph name="USERNAME" /> kontuarekin</translation> <translation id="1343865611738742294">Eman USB bidezko gailua erabiltzeko baimena Linux-eko aplikazioei. USB bidezko gailu bat kendu ondoren, Linux-ek ez du gogoratuko.</translation> <translation id="1343920184519992513">Jarraitu utzi zenuen tokitik eta ireki orri sorta jakin bat</translation> @@ -1577,7 +1578,6 @@ <translation id="2356070529366658676">Galdetu</translation> <translation id="2357330829548294574">Kendu <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Webguneek JavaScript erabil dezakete</translation> -<translation id="2358703245148663432">Beste gailu bat</translation> <translation id="2358777858338503863">Egin klik hemen <ph name="ORIGIN" /> erabiltzeko baimena emateko:</translation> <translation id="2359071692152028734">Baliteke Linux-eko aplikazioek ez erantzutea.</translation> <translation id="2359345697448000899">Luzapenak kudeatzeko, sakatu Tresnak menuaren Luzapenak aukera.</translation> @@ -3625,6 +3625,7 @@ <translation id="4232375817808480934">Konfiguratu Kerberos</translation> <translation id="4235965441080806197">Utzi bertan behera saio-hasiera</translation> <translation id="4236163961381003811">Ezagutu luzapen gehiago</translation> +<translation id="4237282663517880406">Erakutsi Google Drive-ko iradokizunak</translation> <translation id="4241182343707213132">Berrabiarazi gailua erakundearen aplikazioak eguneratzeko</translation> <translation id="4242145785130247982">Ezin dira erabili bezero-ziurtagiri bat baino gehiago</translation> <translation id="4242533952199664413">Ireki ezarpenak</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 4159d21..49aa1c5 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -380,6 +380,7 @@ <translation id="1339009753652684748">با گفتن «OK Google» به «دستیار» دسترسی یابید. برای صرفهجویی در مصرف باتری، «روشن (توصیه میشود)» را انتخاب کنید. «دستیار» تنها زمانی پاسخ میدهد که دستگاه شما به برق متصل باشد یا درحال شارژ شدن باشد.</translation> <translation id="13392265090583506">A11y</translation> <translation id="1340527397989195812">با استفاده از برنامه Files از رسانه دستگاه پشتیبان بگیرید.</translation> +<translation id="1341701348342335220">بسیار عالی!</translation> <translation id="1341871421050612057">نمیتوان با <ph name="USERNAME" /> همگامسازی کرد</translation> <translation id="1343865611738742294">ارائه مجوز به برنامههای Linux برای دسترسی به دستگاههای USB. Linux بعد از برداشتن دستگاه USB، آن را به خاطر نمیسپارد.</translation> <translation id="1343920184519992513">کار را از همانجایی که رها کردید ادامه دهید و مجموعه صفحات خاصی را باز کنید</translation> @@ -1589,7 +1590,6 @@ <translation id="2356070529366658676">سؤال شود</translation> <translation id="2357330829548294574">حذف <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">سایتها میتوانند از جاوا اسکریپت استفاده کنند</translation> -<translation id="2358703245148663432">دستگاهی دیگر</translation> <translation id="2358777858338503863">برای اجازه دادن در <ph name="ORIGIN" /> کلیک کنید:</translation> <translation id="2359071692152028734">ممکن است برنامههای Linux دیگر پاسخ ندهند.</translation> <translation id="2359345697448000899">با کلیک کردن روی افزونهها در منوی ابزار، برنامههای افزودنی خود را مدیریت کنید.</translation> @@ -3637,6 +3637,7 @@ <translation id="4232375817808480934">پیکربندی Kerberos</translation> <translation id="4235965441080806197">لغو ورود به سیستم</translation> <translation id="4236163961381003811">کاوش افزونههای بیشتر</translation> +<translation id="4237282663517880406">نمایش پیشنهادهای Google Drive</translation> <translation id="4241182343707213132">برای بهروزرسانی برنامههای سازمان، بازراهاندازی کنید</translation> <translation id="4242145785130247982">چند مورد از گواهینامههای کارخواه پشتیبانی نمیشوند</translation> <translation id="4242533952199664413">باز کردن تنظیمات</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index ac77a19..2c46072 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1591,7 +1591,6 @@ <translation id="2356070529366658676">Kysy</translation> <translation id="2357330829548294574">Poista <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Sivustot voivat käyttää JavaScriptiä</translation> -<translation id="2358703245148663432">Toinen laite</translation> <translation id="2358777858338503863">Salli sivustolla <ph name="ORIGIN" /> klikkaamalla:</translation> <translation id="2359071692152028734">Linux-sovellukset eivät välttämättä enää vastaa.</translation> <translation id="2359345697448000899">Hallinnoi laajennuksiasi valitsemalla Työkalut-valikosta Laajennukset.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index cd954a8..c76be82e4 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1594,7 +1594,6 @@ <translation id="2356070529366658676">Magtanong</translation> <translation id="2357330829548294574">Alisin si <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Puwedeng gumamit ng Javascript ang mga site</translation> -<translation id="2358703245148663432">Ibang device</translation> <translation id="2358777858338503863">I-click para payagan sa <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Posibleng hindi tumugon ang mga Linux app.</translation> <translation id="2359345697448000899">Pamahalaan ang iyong mga extension sa pamamagitan ng pag-click sa Mga Extension sa menu na Mga Tool.</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index c8094b8..fb0f16b9 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -1579,7 +1579,6 @@ <translation id="2356070529366658676">Demander</translation> <translation id="2357330829548294574">Supprimer <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Les sites peuvent utiliser JavaScript</translation> -<translation id="2358703245148663432">Un autre appareil</translation> <translation id="2358777858338503863">Cliquez pour autoriser sur <ph name="ORIGIN" /> :</translation> <translation id="2359071692152028734">Les applications Linux peuvent ne plus répondre.</translation> <translation id="2359345697448000899">Pour gérer les extensions, cliquer sur « Extensions » dans le menu « Outils ».</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index c6fc820..7700e9da 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1578,7 +1578,6 @@ <translation id="2356070529366658676">Demander</translation> <translation id="2357330829548294574">Supprimer <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Les sites peuvent utiliser JavaScript</translation> -<translation id="2358703245148663432">Un autre appareil</translation> <translation id="2358777858338503863">Cliquer pour l'autoriser sur <ph name="ORIGIN" /> :</translation> <translation id="2359071692152028734">Les applis Linux peuvent ne plus répondre.</translation> <translation id="2359345697448000899">Pour gérer les extensions, cliquer sur "Extensions" dans le menu "Outils"</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 8fbaa8a..ba267b9b 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -1576,7 +1576,6 @@ <translation id="2356070529366658676">Preguntar</translation> <translation id="2357330829548294574">Quitar <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Os sitios poden usar JavaScript</translation> -<translation id="2358703245148663432">Un dispositivo distinto</translation> <translation id="2358777858338503863">Fai clic para permitir en <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">As aplicacións de Linux poden deixar de responder.</translation> <translation id="2359345697448000899">Fai clic en Extensións no menú Ferramentas para xestionar as túas extensións.</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 2e722ba..c33be938 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -378,6 +378,7 @@ <translation id="1339009753652684748">તમે "Ok Google" બોલો છો, ત્યારે તમારા Assistantને ઍક્સેસ કરો છો. બૅટરીની બચત કરવા માટે, “ચાલુ (સુઝાવ આપવામાં આવે છે)” પસંદ કરો. જ્યારે તમારું ડિવાઇસ પ્લગ-ઇન કરેલું હશે અથવા ચાર્જ થઈ રહ્યું હશે, માત્ર ત્યારે જ Assistant જવાબ આપશે.</translation> <translation id="13392265090583506">ઍક્સેસિબિલિટી</translation> <translation id="1340527397989195812">Files ઍપનો ઉપયોગ કરીને ડિવાઇસથી મીડિયાનો બૅકઅપ લો.</translation> +<translation id="1341701348342335220">સરસ રીતે પૂર્ણ કર્યું!</translation> <translation id="1341871421050612057"><ph name="USERNAME" /> સાથે સિંક કરી શકાતું નથી</translation> <translation id="1343865611738742294">Linux ઍપ પરવાનગીને USB ડિવાઇસ ઍક્સેસ કરવાની પરવાનગી આપો. USB ડિવાઇસ કાઢી નાખવામાં આવે પછી Linux તેને યાદ રાખશે નહીં.</translation> <translation id="1343920184519992513">તમે જ્યાંથી છોડ્યું હોય, ત્યાંથી ફરી શરૂ કરો અને કોઈ ચોક્કસ પેજ ખોલો</translation> @@ -1575,7 +1576,6 @@ <translation id="2356070529366658676">કહો</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> કાઢી નાખો</translation> <translation id="2358561147588818967">સાઇટ Javascriptનો ઉપયોગ કરી શકે છે</translation> -<translation id="2358703245148663432">કોઈ અલગ ડિવાઇસ</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> પર મંજૂરી આપવા માટે ક્લિક કરો:</translation> <translation id="2359071692152028734">Linux ઍપ નિષ્ક્રિય બની શકે છે.</translation> <translation id="2359345697448000899">ટૂલ્સ મેનૂમાં એક્સટેંશનને ક્લિક કરીને તમારા એક્સ્ટેંશન્સને મેનેજ કરો.</translation> @@ -3623,6 +3623,7 @@ <translation id="4232375817808480934">Kerberosની ગોઠવણી કરો</translation> <translation id="4235965441080806197">સાઇન ઇન રદ કરો</translation> <translation id="4236163961381003811">વધુ એક્સ્ટેન્શન વિશે શોધખોળ કરો</translation> +<translation id="4237282663517880406">Google Driveના સૂચનો બતાવો</translation> <translation id="4241182343707213132">સંસ્થાની ઍપ અપડેટ કરવા માટે, ફરી શરૂ કરો</translation> <translation id="4242145785130247982">એકથી વધુ ક્લાયન્ટ પ્રમાણપત્રોને સપોર્ટ આપવામાં આવતો નથી</translation> <translation id="4242533952199664413">સેટિંગ ખોલો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 2465b473..ff4bcfe9 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1594,7 +1594,6 @@ <translation id="2356070529366658676">पूछें</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> हटाएं</translation> <translation id="2358561147588818967">साइटें JavaScript का इस्तेमाल कर सकती हैं</translation> -<translation id="2358703245148663432">कोई और डिवाइस</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> पर अनुमति देने के लिए क्लिक करें:</translation> <translation id="2359071692152028734">हो सकता है कि Linux ऐप्लिकेशन काम न करें.</translation> <translation id="2359345697448000899">टूल मेन्यू में 'एक्सटेंशन' पर क्लिक करके अपने एक्सटेंशन मैनेज करें.</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 0402ab2..2ca243ae 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1581,7 +1581,6 @@ <translation id="2356070529366658676">Upitaj</translation> <translation id="2357330829548294574">Ukloni korisnika <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Web-lokacije mogu upotrebljavati JavaScript</translation> -<translation id="2358703245148663432">Drugi uređaj</translation> <translation id="2358777858338503863">Kliknite da biste dopustili na web-lokaciji <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux aplikacije možda neće reagirati.</translation> <translation id="2359345697448000899">Upravljajte svojim proširenjima tako da u izborniku Alati kliknete Proširenja.</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index e786c88..318ae00 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -1592,7 +1592,6 @@ <translation id="2356070529366658676">Kérés</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> eltávolítása</translation> <translation id="2358561147588818967">A webhelyek használhatnak Javascriptet</translation> -<translation id="2358703245148663432">Egy másik eszköz</translation> <translation id="2358777858338503863">Kattintson, hogy engedélyezze a(z) <ph name="ORIGIN" /> webhelyen:</translation> <translation id="2359071692152028734">Előfordulhat, hogy a Linux-alkalmazások nem válaszolnak.</translation> <translation id="2359345697448000899">Bővítményeit az Eszközök menü Bővítmények elemére kattintva kezelheti.</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 72c2259..8be65235 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -1579,7 +1579,6 @@ <translation id="2356070529366658676">Հարցնել</translation> <translation id="2357330829548294574">Հեռացնել <ph name="USER_NAME" />-ին</translation> <translation id="2358561147588818967">Կայքերը կարող են JavaScript բովանդակություն օգտագործել</translation> -<translation id="2358703245148663432">Այլ սարք</translation> <translation id="2358777858338503863">Սեղմեք՝ <ph name="ORIGIN" /> կայքում թույլատրելու համար՝</translation> <translation id="2359071692152028734">Լինուքսի հավելվածները կարող են չարձագանքել։</translation> <translation id="2359345697448000899">Կառավարեք ձեր ընդլայնումները` Գործիքների ընտրացանկում սեղմելով Ընդլայնումներ:</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 312b65e..0dfa1b2 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -379,6 +379,7 @@ <translation id="1339009753652684748">Akses Asisten saat Anda mengucapkan "Ok Google". Untuk menghemat baterai, pilih "Aktif (Direkomendasikan)". Asisten Anda hanya akan merespons saat perangkat dicolokkan ke sumber listrik atau diisi daya.</translation> <translation id="13392265090583506">A11y</translation> <translation id="1340527397989195812">Cadangkan media dari perangkat menggunakan aplikasi File.</translation> +<translation id="1341701348342335220">Selamat!</translation> <translation id="1341871421050612057">Sinkronisasi tidak dapat digunakan dengan <ph name="USERNAME" /></translation> <translation id="1343865611738742294">Berikan izin aplikasi ke Linux untuk mengakses perangkat USB. Linux tidak akan mengingat perangkat USB setelah perangkat tersebut dilepas.</translation> <translation id="1343920184519992513">Lanjutkan dari halaman terakhir yang dibuka dan buka rangkaian halaman tertentu</translation> @@ -1592,7 +1593,6 @@ <translation id="2356070529366658676">Tanya</translation> <translation id="2357330829548294574">Hapus <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Situs dapat menggunakan JavaScript</translation> -<translation id="2358703245148663432">Perangkat lain</translation> <translation id="2358777858338503863">Klik untuk mengizinkan di <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Aplikasi Linux dapat menjadi tidak responsif.</translation> <translation id="2359345697448000899">Kelola ekstensi Anda dengan mengklik Ekstensi pada menu Alat.</translation> @@ -3640,6 +3640,7 @@ <translation id="4232375817808480934">Konfigurasikan Kerberos</translation> <translation id="4235965441080806197">Batalkan proses masuk</translation> <translation id="4236163961381003811">Temukan lebih banyak ekstensi</translation> +<translation id="4237282663517880406">Tampilkan saran Google Drive</translation> <translation id="4241182343707213132">Mulai ulang untuk mengupdate aplikasi organisasi</translation> <translation id="4242145785130247982">Beberapa sertifikat klien tidak didukung</translation> <translation id="4242533952199664413">Buka setelan</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 69f2e57c..f523564d 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -1593,7 +1593,6 @@ <translation id="2356070529366658676">Spyrja</translation> <translation id="2357330829548294574">Fjarlægja <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Vefsvæði geta notað JavaScript</translation> -<translation id="2358703245148663432">Annað tæki</translation> <translation id="2358777858338503863">Smelltu til að leyfa á <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux-forrit gætu hætt að virka.</translation> <translation id="2359345697448000899">Stjórnaðu viðbótunum þínum með því að smella á Viðbætur í valmyndinni Verkfæri.</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index c3969f3a4..361c635 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1577,7 +1577,6 @@ <translation id="2356070529366658676">Chiedi</translation> <translation id="2357330829548294574">Rimuovi <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">I siti possono utilizzare JavaScript</translation> -<translation id="2358703245148663432">Un altro dispositivo</translation> <translation id="2358777858338503863">Fai clic per consentire l'accesso su <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Le app Linux potrebbero non rispondere più.</translation> <translation id="2359345697448000899">Gestisci le tue estensioni facendo clic su Estensioni nel menu Strumenti.</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index b790ae9..f4bdb90 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1591,7 +1591,6 @@ <translation id="2356070529366658676">לשאול</translation> <translation id="2357330829548294574">הסרה של <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">אתרים יכולים להשתמש ב-JavaScript</translation> -<translation id="2358703245148663432">מכשיר אחר</translation> <translation id="2358777858338503863">יש ללחוץ כדי לתת גישה לתוסף בכתובת <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">ייתכן שאפליקציות Linux יפסיקו להגיב.</translation> <translation id="2359345697448000899">ניהול התוספים שלך על ידי לחיצה על 'תוספים' בתפריט כלים.</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index aff05c5..d33ea88 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -377,6 +377,7 @@ <translation id="1339009753652684748">「OK Google」と話すとアシスタントにアクセスできます。バッテリー消費を抑えるには [オン(推奨)] を選択してください。オンにすると、デバイスが電源または充電器に接続されている場合にのみアシスタントが反応します。</translation> <translation id="13392265090583506">ユーザー補助設定</translation> <translation id="1340527397989195812">ファイルアプリを使用してデバイスからメディアをバックアップします。</translation> +<translation id="1341701348342335220">おつかれさまでした!</translation> <translation id="1341871421050612057"><ph name="USERNAME" /> と同期できません</translation> <translation id="1343865611738742294">Linux アプリに USB デバイスへのアクセスを許可します。USB デバイスを取り外した後は、Linux にデバイスのデータは残りません。</translation> <translation id="1343920184519992513">前回中断したところから再開して、特定のページを開く</translation> @@ -1572,7 +1573,6 @@ <translation id="2356070529366658676">確認する</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> を削除</translation> <translation id="2358561147588818967">サイトが JavaScript を使用できるようにする</translation> -<translation id="2358703245148663432">別のデバイス</translation> <translation id="2358777858338503863">クリックして <ph name="ORIGIN" /> で許可:</translation> <translation id="2359071692152028734">Linux アプリが応答しなくなる可能性があります。</translation> <translation id="2359345697448000899">[ツール] メニューの [拡張機能] をクリックして拡張機能を管理できます。</translation> @@ -3618,6 +3618,7 @@ <translation id="4232375817808480934">Kerberos の設定</translation> <translation id="4235965441080806197">ログインをキャンセル</translation> <translation id="4236163961381003811">他の拡張機能を見る</translation> +<translation id="4237282663517880406">Google ドライブの検索候補を表示する</translation> <translation id="4241182343707213132">再起動して組織のアプリを更新してください</translation> <translation id="4242145785130247982">サポートされていないクライアント証明書が複数あります</translation> <translation id="4242533952199664413">設定を開く</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 16987407..474c924d 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -69,6 +69,7 @@ <translation id="1059484610606223931">ჰიპერტექსტის გადაცემის პროტოკოლი (HTTPS)</translation> <translation id="1059944192885972544">მოთხოვნაზე „<ph name="SEARCH_TEXT" />“ მოიძებნა <ph name="NUM" /> ჩანართი</translation> <translation id="1060292118287751956">განსაზღვრავს ეკრანის განახლების სიხშირეს</translation> +<translation id="1060570945511946595">ბილეთების მართვა</translation> <translation id="1061130374843955397">მოგესალმებათ თქვენი <ph name="DEVICE_TYPE" /></translation> <translation id="1061373870045429865">ამ ბმულისთვის QR კოდის შექმნა</translation> <translation id="1061904396131502319">შესვენების დრო ახლოვდება</translation> @@ -1114,6 +1115,7 @@ <translation id="1975841812214822307">ამოშლა…</translation> <translation id="1976150099241323601">შედით უსაფრთხოების მოწყობილობაში</translation> <translation id="1977965994116744507"><ph name="DEVICE_TYPE" />-ის განსაბლოკად მოაახლოვეთ თქვენი ტელეფონი.</translation> +<translation id="1978666928180318515">Bruschetta-ს ამოშლა</translation> <translation id="1979095679518582070">ამ ფუნქციის გამორთვა არ შეუშლის ხელს ამ მოწყობილობას, გააგზავნოს ის საჭირო ინფორმაცია, რომელიც ისეთი არსებითი სერვისებისთვის არის აუცილებელი, როგორიცაა სისტემის განახლებები და უსაფრთხოება.</translation> <translation id="1979280758666859181">მიმდინარეობს არხის შეცვლა <ph name="PRODUCT_NAME" />-ის ძველი ვერსიით. არხის ცვლილება გააქტიურდება, როდესაც არხის ვერსია დაემთხვევა მოწყობილობაში ამჟამად დაინსტალირებულ ვერსიას.</translation> <translation id="197989455406964291">დაშიფვრის ტიპი მხარდაუჭერელია KDC-ის მიერ</translation> @@ -1578,7 +1580,6 @@ <translation id="2356070529366658676">მკითხე</translation> <translation id="2357330829548294574">გსურთ <ph name="USER_NAME" />-ის ამოშლა?</translation> <translation id="2358561147588818967">საიტებს შეუძლია JavaScript-ის გამოყენება</translation> -<translation id="2358703245148663432">განსხვავებული მოწყობილობა</translation> <translation id="2358777858338503863">დააწკაპუნეთ, რომ <ph name="ORIGIN" />-ზე დაშვებული იყოს:</translation> <translation id="2359071692152028734">შესაძლოა, Linux აპებმა შეწყვიტოს რეაგირება.</translation> <translation id="2359345697448000899">მართეთ თქვენი გაფართოებები: დააწკაპუნეთ „გაფართოებებზე“ ხელსაწყოების მენიუში.</translation> @@ -1918,6 +1919,7 @@ <translation id="2672142220933875349">crx ფაილი დაზიანებულია, ამოღება ვერ მოხერხდა.</translation> <translation id="2673135533890720193">დათვალიერების ისტორიის წაკითხვა</translation> <translation id="2674764818721168631">გამორთული</translation> +<translation id="2675570801872027281">Bruschetta-ს ამოშლისას მოხდა შეცდომა. ცადეთ ხელახლა.</translation> <translation id="2676492189600898281">ავტომატურ შევსებასთან დაკავშირებით გამოხმაურება</translation> <translation id="2678063897982469759">ხელახლა ჩართვა</translation> <translation id="2678100101831051676">ტრანსლირება ვერ ხერხდება.</translation> @@ -2916,6 +2918,7 @@ <translation id="3593965109698325041">სერტიფიკატის სახელის შეზღუდვები</translation> <translation id="3596012367874587041">აპის პარამეტრები</translation> <translation id="3596414637720633074">მესამე მხარის ქუქი-ჩანაწერების დაბლოკვა ინკოგნიტო რეჟიმში</translation> +<translation id="3598010454707842106">დაწკაპუნებით აირჩიეთ „Chrome-ის მორგება“</translation> <translation id="3599221874935822507">ამოწეული</translation> <translation id="3600051066689725006">ვებ-მოთხოვნის ინფორმაცია</translation> <translation id="360180734785106144">ახალი ფუნქციების შემოთავაზება მათი ხელმისაწვდომობისთანავე</translation> @@ -3913,6 +3916,7 @@ <translation id="4495419450179050807">არ აჩვენო ამ გვერდზე</translation> <translation id="4497145443434063861">კომპიუტერი და Chromecast სხვადასხვა Wi-Fi ქსელშია (მაგ. 2,4 გჰც და 5 გჰც)</translation> <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ავარიულად გაითიშა</translation> +<translation id="4500647907053779331">არჩეულის <ph name="LANGUAGE" /> ვერსიაზე თა&რგმნა</translation> <translation id="450099669180426158">ძახილის ნიშნის ხატულა</translation> <translation id="4501530680793980440">დაადასტურეთ წაშლა</translation> <translation id="4502423230170890588">ამ მოწყობილობიდან ამოშლა</translation> @@ -3943,6 +3947,7 @@ <translation id="4522890784888918985">ბავშვის ანგარიშები მხარდაუჭერელია</translation> <translation id="4523876148417776526">საიტების XML სიები, რომლებიც ჯერ არ ჩატვირთულა.</translation> <translation id="4524832533047962394">რეგისტრაციის უზრუნველყოფილი რეჟიმი მხარდაუჭერელია ოპერაციული სისტემის ამ ვერსიაში. დარწმუნდით, რომ გაშვებული გაქვთ უახლესი ვერსია.</translation> +<translation id="4526051299161934899">დამალული შენახული ჩანართების ჯგუფები</translation> <translation id="4526853756266614740">თემის მყისიერად მისასადაგებლად აირჩიეთ სურათი</translation> <translation id="452750746583162491">სინქრონიზებული მონაცემების გადახედვა</translation> <translation id="4527929807707405172">უკუგადაადგილების ჩართვა. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> @@ -5730,6 +5735,7 @@ <translation id="617213288191670920">ენები დამატებული არ არის</translation> <translation id="6173623053897475761">ხელახლა აკრიფეთ PIN-კოდი</translation> <translation id="6175314957787328458">Microsoft დომენის GUID</translation> +<translation id="6177412385419165772">მიმდინარეობს ამოშლა…</translation> <translation id="6178664161104547336">აირჩიეთ სერტიფიკატი</translation> <translation id="6178682841350631965">თქვენი სისტემაში შესვლის მონაცემები განახლდა</translation> <translation id="6180510783007738939">ხაზის ხელსაწყო</translation> @@ -6206,6 +6212,7 @@ <translation id="6619801788773578757">kiosk აპლიკაციის დამატება</translation> <translation id="6619990499523117484">დაადასტურეთ თქვენი PIN-კოდი</translation> <translation id="6620254580880484313">კონტეინერის სახელი</translation> +<translation id="6620927550847360014">გსურთ, ამოშალოთ Bruschetta თქვენი <ph name="DEVICE_TYPE" />-იდან?</translation> <translation id="6621391692573306628">ეს ჩანართი სხვა მოწყობილობაზე რომ გაგზავნოთ, შედით Chrome-ში ორივე მოწყობილობიდან</translation> <translation id="6622980291894852883">გააგრძელეთ გამოსახულებების დაბლოკვა</translation> <translation id="6624036901798307345">ტაბლეტის რეჟიმში ხელსაწყოთა ზოლზე ჩანართების მთვლელის ღილაკზე შეხებისას გაიხსნება ჩანართების ახალი ზოლი, რომელზეც ნაჩვენები იქნება თითოეული ჩანართის მინიატურული ვერსია.</translation> @@ -6423,6 +6430,7 @@ <translation id="6818547713623251698">ნახეთ თქვენი ტელეფონის ფოტოები, მედია, შეტყობინებები და აპები</translation> <translation id="6818802132960437751">ვირუსებისგან ჩაშენებული დაცვა</translation> <translation id="6818920801736417483">გსურთ, შეინახოთ პაროლები?</translation> +<translation id="6820079682647046800">Kerberos ავტორიზაცია ვერ მოხერხდა</translation> <translation id="6823174134746916417">სენსორული პანელზე შეხებით დაწკაპუნება</translation> <translation id="6824564591481349393">&ელფოსტის მისამართის კოპირება</translation> <translation id="6824584962142919697">ელემენტების შ&ემოწმება</translation> @@ -6577,6 +6585,7 @@ <translation id="6955698182324067397">თქვენ აპირებთ, ჩართოთ ChromeOS-ის გამართვის ფუნქციები, რომელთა მიერაც დაყენდება sshd daemon და გააქტიურდება ჩატვირთვა USB დისკებიდან.</translation> <translation id="6955893174999506273">კიდევ 1 გადამრთველის მიკუთვნება</translation> <translation id="6957044667612803194">უსაფრთხოების ამ გასაღების მიერ მხარდაუჭერელია PIN-კოდები</translation> +<translation id="6960133692707095572">ბილეთის გარეშე მონახულება</translation> <translation id="6960507406838246615">საჭიროა Linux-ის განახლება</translation> <translation id="6960648667961844909"><ph name="LANGUAGE" /> მეტყველების ფაილები ვერ ჩამოიტვირთა. ჩამოტვირთვას მოგვიანებით შევეცდებით. ჩამოტვირთვის დასრულებამდე მეტყველება გაეგზავნება Google-ს დასამუშავებლად.</translation> <translation id="696103774840402661">ამ <ph name="DEVICE_TYPE" />-ზე შენახული ყველა მომხმარებლის ყველა ფაილი და ადგილობრივი მონაცემი სამუდამოდ წაიშალა.</translation> @@ -8038,6 +8047,7 @@ <translation id="8272443605911821513">მართეთ თქვენი გაფართოებები ღილაკზე „გაფართოებები“ დაწკაპუნებით მენიუში „სხვა ხელსაწყოები“.</translation> <translation id="8272786333453048167">ხელახლა დაშვება</translation> <translation id="8273905181216423293">ახლავე ჩამოტვირთვა</translation> +<translation id="827488840488530039">გვერდი, რომლის მონახულებასაც ცდილობთ, ვერ ახერხებს თქვენი Kerberos ბილეთების დადასტურებას</translation> <translation id="8274921654076766238">ლუპა იმეორებს კლავიატურით ფოკუსში მოქცეულს</translation> <translation id="8274924778568117936">არ გამორთოთ და არ დახუროთ თქვენი <ph name="DEVICE_TYPE" /> განახლების დასრულებამდე. ინსტალაციის დასრულების შემდეგ <ph name="DEVICE_TYPE" /> გადაიტვირთება.</translation> <translation id="8275038454117074363">იმპორტი</translation> @@ -8484,6 +8494,7 @@ <translation id="869884720829132584">პროგრამის მენიუ</translation> <translation id="869891660844655955">ვადის გასვლის თარიღი</translation> <translation id="8699188901396699995">PPD „<ph name="PRINTER_NAME" />“-ისთვის</translation> +<translation id="8702278591052316269">დამალული შენახული ჩანართების ჯგუფების შემცველი მენიუ</translation> <translation id="8702825062053163569">თქვენი <ph name="DEVICE_TYPE" /> ჩაიკეტა.</translation> <translation id="8703346390800944767">რეკლამის გამოტოვება</translation> <translation id="8705331520020532516">სერიული ნომერი</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index ce576bfe..4aeb2c3 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -69,6 +69,7 @@ <translation id="1059484610606223931">Hypertext Transport Protocol (HTTPS)</translation> <translation id="1059944192885972544">"<ph name="SEARCH_TEXT" />" үшін <ph name="NUM" /> қойынды табылды.</translation> <translation id="1060292118287751956">Экранның жаңару жиілігін анықтайды.</translation> +<translation id="1060570945511946595">Билеттерді басқару</translation> <translation id="1061130374843955397"><ph name="DEVICE_TYPE" /> құрылғысына қош келдіңіз!</translation> <translation id="1061373870045429865">Осы сілтемеге QR кодын жасау</translation> <translation id="1061904396131502319">Үзіліс уақыты келіп қалды</translation> @@ -1111,6 +1112,7 @@ <translation id="1975841812214822307">Жою…</translation> <translation id="1976150099241323601">Қауіпсіздік құрылғысына кіру</translation> <translation id="1977965994116744507"><ph name="DEVICE_TYPE" /> құрылғысының құлпын ашу үшін телефонды жақындатыңыз.</translation> +<translation id="1978666928180318515">Bruschetta-ны өшіру</translation> <translation id="1979095679518582070">Бұл мүмкіндікті өшіріп қойсаңыз, құрылғының маңызды қызметтерге (мысалы, жүйенің жаңа нұсқалары және қауіпсіздік) қажетті ақпаратты жіберу мүмкіндігіне әсер етпейді.</translation> <translation id="1979280758666859181"><ph name="PRODUCT_NAME" /> ескірек нұсқасы орнатылған арнаға ауысып жатырсыз. Арнаның нұсқасы құрылғыңызға орнатылған нұсқаға сәйкес келгенде ғана ауыса алады.</translation> <translation id="197989455406964291">KDC шифрлау түрін қолданбайды.</translation> @@ -1575,7 +1577,6 @@ <translation id="2356070529366658676">Сұрау</translation> <translation id="2357330829548294574">Пайдаланушыны (<ph name="USER_NAME" />) өшіру</translation> <translation id="2358561147588818967">Сайттар JavaScript контентін пайдалана алады.</translation> -<translation id="2358703245148663432">Басқа құрылғы</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> веб-сайтында рұқсат беру үшін түртіңіз:</translation> <translation id="2359071692152028734">Linux қолданбалары жауап бермеуі мүмкін.</translation> <translation id="2359345697448000899">Кеңейтімдерді реттеу үшін "Құралдар" мәзіріндегі "Кеңейтімдер" опциясын басыңыз.</translation> @@ -1915,6 +1916,7 @@ <translation id="2672142220933875349">CRX файлы жарамсыз, пакеттен шығару сәтсіз аяқталды.</translation> <translation id="2673135533890720193">Шолу журналыңызды оқу</translation> <translation id="2674764818721168631">Өшірулі</translation> +<translation id="2675570801872027281">Bruschetta-ны өшіру кезінде қате шықты. Қайталап көріңіз.</translation> <translation id="2676492189600898281">Автотолтыру туралы пікір қалдыру</translation> <translation id="2678063897982469759">Қайта қосу</translation> <translation id="2678100101831051676">Трансляциялау мүмкін емес.</translation> @@ -2913,6 +2915,7 @@ <translation id="3593965109698325041">Сертификат атауы шектеулері</translation> <translation id="3596012367874587041">Қолданба параметрлері</translation> <translation id="3596414637720633074">Инкогнито режимінде үшінші тарап cookie файлдарын бөгеу</translation> +<translation id="3598010454707842106">"Chrome-ды реттеу" түймесін басу</translation> <translation id="3599221874935822507">Көтеріңкі</translation> <translation id="3600051066689725006">Веб-сұрау туралы ақпарат</translation> <translation id="360180734785106144">Жаңа функцияларды бірден ұсыну</translation> @@ -3910,6 +3913,7 @@ <translation id="4495419450179050807">Бұл бетте көрсетпеу</translation> <translation id="4497145443434063861">Әртүрлі Wi-Fi желілеріндегі ДК және Chromecast (мысалы, 2,4 ГГц және 5 ГГц)</translation> <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> бұзылды</translation> +<translation id="4500647907053779331">&Таңдауды <ph name="LANGUAGE" /> тіліне аудару</translation> <translation id="450099669180426158">Леп белгі белгішесі</translation> <translation id="4501530680793980440">Жоюды растау</translation> <translation id="4502423230170890588">Осы құрылғыдан өшіру</translation> @@ -5724,6 +5728,7 @@ <translation id="617213288191670920">Ешқандай тіл қосылмаған</translation> <translation id="6173623053897475761">PIN кодын қайта теріңіз</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> +<translation id="6177412385419165772">Өшірілуде...</translation> <translation id="6178664161104547336">Сертификат таңдау</translation> <translation id="6178682841350631965">Кіру деректеріңіз жаңартылды.</translation> <translation id="6180510783007738939">Жол құралы</translation> @@ -6200,6 +6205,7 @@ <translation id="6619801788773578757">Киоск қолданбасын қосу</translation> <translation id="6619990499523117484">PIN кодын растаңыз</translation> <translation id="6620254580880484313">Контейнер атауы</translation> +<translation id="6620927550847360014"><ph name="DEVICE_TYPE" /> құрылғысынан Bruschetta-ны өшіру керек пе?</translation> <translation id="6621391692573306628">Бұл қойындыны басқа құрылғыға жіберу үшін екі құрылғыда Chrome-ға кіріңіз.</translation> <translation id="6622980291894852883">Кескін бөгеуді жалғастыру</translation> <translation id="6624036901798307345">Планшет режимінде әр қойындының нобайларын көрсететін жаңа қойындылар жолағын ашу үшін құралдар тақтасындағы қойынды саны түймесін түртіңіз.</translation> @@ -6417,6 +6423,7 @@ <translation id="6818547713623251698">Телефондағы фотосуреттерді, медиафайлдарды, хабарландырулар мен қолданбаларды көру</translation> <translation id="6818802132960437751">Ендірілген вирустан қорғау жүйесі</translation> <translation id="6818920801736417483">Құпия сөздер сақталсын ба?</translation> +<translation id="6820079682647046800">Kerberos аутентификациясы сәтсіз болды</translation> <translation id="6823174134746916417">Сенсорлық тақтаны басу үшін түрту</translation> <translation id="6824564591481349393">&Электрондық пошта мекенжайын көшіру</translation> <translation id="6824584962142919697">&Элементтерді тексеру</translation> @@ -6571,6 +6578,7 @@ <translation id="6955698182324067397">ChromeOS жүйесінің ақау түзету функцияларын қосқалы жатырсыз. Олар SSHD демонын орнатып, USB дискілерінен жүктеуге мүмкіндік береді.</translation> <translation id="6955893174999506273">Тағы 1 ауыстырғыш тағайындау</translation> <translation id="6957044667612803194">Қауіпсіздік кілті PIN кодтарын қолдамайды.</translation> +<translation id="6960133692707095572">Билетсіз көру</translation> <translation id="6960507406838246615">Linux жүйесін жаңарту қажет.</translation> <translation id="6960648667961844909">Тіл файлдары (<ph name="LANGUAGE" />) жүктеп алынбады. Жүктеп алу кейінірек қайталанады. Жүктеп алу аяқталғанша, айтылған сөз оны өңдеу үшін Google-ға жіберілді.</translation> <translation id="696103774840402661"><ph name="DEVICE_TYPE" /> құрылғысындағы барлық пайдаланушының файлдары мен жергілікті деректері біржола жойылды.</translation> @@ -8032,6 +8040,7 @@ <translation id="8272443605911821513">"Қосымша құралдар" мәзіріндегі кеңейтімдерді басу арқылы кеңейтімдерді басқарыңыз.</translation> <translation id="8272786333453048167">Қайта рұқсат беру</translation> <translation id="8273905181216423293">Қазір жүктеп алу</translation> +<translation id="827488840488530039">Сіз кіргіңіз келетін бет Kerberos билеттеріңізді растай алмады</translation> <translation id="8274921654076766238">Ұлғайтқышты пернетақта көмегімен қозғау</translation> <translation id="8274924778568117936">Жаңарту аяқталмайынша <ph name="DEVICE_TYPE" /> құрылғыңызды өшірмеңіз немесе жаппаңыз. <ph name="DEVICE_TYPE" /> құрылғыңыз орнату аяқталғаннан кейін қайта қосылады.</translation> <translation id="8275038454117074363">Импорттау</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 87efcf68..5fb73b3 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -69,6 +69,7 @@ <translation id="1059484610606223931">ប្រូតូកូលបញ្ជូនអត្ថបទតំណ (HTTPS)</translation> <translation id="1059944192885972544">បានរកឃើញផ្ទាំង <ph name="NUM" /> សម្រាប់ '<ph name="SEARCH_TEXT" />'</translation> <translation id="1060292118287751956">កំណត់ហ្វ្រេកង់ដែលអេក្រង់ធ្វើបច្ចុប្បន្នភាព</translation> +<translation id="1060570945511946595">គ្រប់គ្រងសំបុត្រ</translation> <translation id="1061130374843955397">សូមស្វាគមន៍មកកាន់ <ph name="DEVICE_TYPE" /> របស់អ្នក</translation> <translation id="1061373870045429865">បង្កើតកូដ QR សម្រាប់តំណនេះ</translation> <translation id="1061904396131502319">ជិតដល់ពេលសម្រាកហើយ</translation> @@ -1126,6 +1127,7 @@ <translation id="1975841812214822307">ដកចេញ...</translation> <translation id="1976150099241323601">ចូលទៅឧបករណ៍សុវត្ថិភាព</translation> <translation id="1977965994116744507">ដាក់ទូរសព្ទរបស់អ្នកឲ្យកាន់តែជិត ដើម្បីដោះសោ <ph name="DEVICE_TYPE" /> របស់អ្នក។</translation> +<translation id="1978666928180318515">លុប Bruschetta ចេញ</translation> <translation id="1979095679518582070">ការបិទមុខងារនេះមិនប៉ះពាល់ដល់សមត្ថភាពរបស់ឧបករណ៍នេះក្នុងការបញ្ជូនព័ត៌មាន ដែលចាំបាច់សម្រាប់សេវាកម្មសំខាន់ៗដូចជា បច្ចុប្បន្នភាពប្រព័ន្ធ និងសុវត្ថិភាពនោះទេ។</translation> <translation id="1979280758666859181">អ្នកកំពុងប្តូរទៅបណ្តាញដែលមានកំណែចាស់នៃ <ph name="PRODUCT_NAME" />។ ការប្តូរបណ្តាញនឹងត្រូវបានអនុវត្ត នៅពេលដែលកំណែបណ្តាញនោះត្រូវគ្នាជាមួយកំណែបច្ចុប្បន្នដែលបានតំឡើងនៅលើឧបករណ៍របស់អ្នក។</translation> <translation id="197989455406964291">KDC មិនស្គាល់ប្រភេទអ៊ីនគ្រីបទេ</translation> @@ -1593,7 +1595,6 @@ <translation id="2356070529366658676">សួរ</translation> <translation id="2357330829548294574">លុប <ph name="USER_NAME" /> ចេញ</translation> <translation id="2358561147588818967">គេហទំព័រអាចប្រើ JavaScript</translation> -<translation id="2358703245148663432">ឧបករណ៍ផ្សេង</translation> <translation id="2358777858338503863">ចុចដើម្បីអនុញ្ញាតនៅលើ <ph name="ORIGIN" />៖</translation> <translation id="2359071692152028734">កម្មវិធី Linux អាចនឹងមិនមានការឆ្លើយតប។</translation> <translation id="2359345697448000899">គ្រប់គ្រងកម្មវិធីបន្ថែមរបស់អ្នកដោយការចុចកម្មវិធីបន្ថែមនៅក្នុងម៉ឺនុយឧបករណ៍។</translation> @@ -1933,6 +1934,7 @@ <translation id="2672142220933875349">ឯកសារ crx មិនល្អ ការពន្លាបានបរាជ័យ។</translation> <translation id="2673135533890720193">អានប្រវត្តិរុករករបស់អ្នក</translation> <translation id="2674764818721168631">បិទ</translation> +<translation id="2675570801872027281">មានបញ្ហាក្នុងការលុប Bruschetta ចេញ។ សូមព្យាយាមម្ដងទៀត។</translation> <translation id="2676492189600898281">ផ្ដល់មតិកែលម្អមុខងារបំពេញស្វ័យប្រវត្តិ</translation> <translation id="2678063897982469759">បើកដំណើរការឡើងវិញ</translation> <translation id="2678100101831051676">មិនអាចភ្ជាប់បានទេ។</translation> @@ -2931,6 +2933,7 @@ <translation id="3593965109698325041">ឧបសគ្គឈ្មោះវិញ្ញាបនប័ត្រ</translation> <translation id="3596012367874587041">ការកំណត់កម្មវិធី</translation> <translation id="3596414637720633074">ទប់ស្កាត់ខូគីភាគីទីបីក្នុងមុខងារឯកជន</translation> +<translation id="3598010454707842106">ចុច “ប្ដូរ Chrome តាមបំណង”</translation> <translation id="3599221874935822507">លយឡើង</translation> <translation id="3600051066689725006">ព័ត៌មានអំពីសំណើបណ្ដាញ</translation> <translation id="360180734785106144">ផ្ដល់ជូនមុខងារថ្មីៗនៅពេលដែលមាន</translation> @@ -3929,6 +3932,7 @@ <translation id="4497145443434063861">កុំព្យូទ័រ និង Chromecast ភ្ជាប់បណ្តាញ Wi-Fi ផ្សេងគ្នា (ឧទាហរណ៍ 2.4GHz ប្រៀបធៀបនឹង 5GHz)</translation> <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> បានគាំង</translation> +<translation id="4500647907053779331">&បកប្រែការជ្រើសរើសទៅជាភាសា<ph name="LANGUAGE" /></translation> <translation id="450099669180426158">រូបតំណាងសញ្ញាឧទាន</translation> <translation id="4501530680793980440">អះអាងការដកចេញ</translation> <translation id="4502423230170890588">លុបចេញពីឧបករណ៍នេះ</translation> @@ -5747,6 +5751,7 @@ <translation id="617213288191670920">មិនបានបញ្ចូលភាសាទេ</translation> <translation id="6173623053897475761">វាយបញ្ចូលកូដ PIN របស់អ្នកម្ដងទៀត</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> +<translation id="6177412385419165772">កំពុងលុប...</translation> <translation id="6178664161104547336">ជ្រើសរើសវិញ្ញាបនប័ត្រមួយ</translation> <translation id="6178682841350631965">ទិន្នន័យសម្រាប់ចូលគណនីរបស់អ្នកត្រូវបានធ្វើបច្ចុប្បន្នភាពហើយ</translation> <translation id="6180510783007738939">ឧបករណ៍បញ្ចូលបន្ទាត់</translation> @@ -6223,6 +6228,7 @@ <translation id="6619801788773578757">បញ្ចូលកម្មវិធីបញ្ជរ</translation> <translation id="6619990499523117484">បញ្ជាក់កូដ PIN របស់អ្នក</translation> <translation id="6620254580880484313">ឈ្មោះទម្រង់ផ្ទុក</translation> +<translation id="6620927550847360014">លុប Bruschetta ចេញពី <ph name="DEVICE_TYPE" /> របស់អ្នកឬ?</translation> <translation id="6621391692573306628">ដើម្បីបញ្ជូនផ្ទាំងនេះទៅឧបករណ៍ផ្សេង សូមចូល Chrome នៅលើឧបករណ៍ទាំងពីរ</translation> <translation id="6622980291894852883">បន្តការរារាំងរូបភាព</translation> <translation id="6624036901798307345">នៅក្នុងមុខងារថេប្លេត សូមចុចលើប៊ូតុងរបារឧបករណ៍កម្មវិធីរាប់ផ្ទាំង ដើម្បីបើករបារផ្ទាំងថ្មី ដែលបង្ហាញរូបក្របតំណាងផ្ទាំងនីមួយៗ។</translation> @@ -6440,6 +6446,7 @@ <translation id="6818547713623251698">មើលរូបថត មេឌៀ ការជូនដំណឹង និងកម្មវិធីរបស់ទូរសព្ទអ្នក</translation> <translation id="6818802132960437751">ការការពារមេរោគដែលភ្ជាប់មកជាមួយ</translation> <translation id="6818920801736417483">រក្សាទុកពាក្យសម្ងាត់ឬ?</translation> +<translation id="6820079682647046800">ការផ្ទៀងផ្ទាត់ Kerberos មិនបានសម្រេចទេ</translation> <translation id="6823174134746916417">ការប៉ះដើម្បីចុចនៅលើផ្ទាំងប៉ះ</translation> <translation id="6824564591481349393">ចម្លងអាសយដ្ឋានអ៊ីម៉ែល</translation> <translation id="6824584962142919697">ត្រួតពិនិត្យធាតុ</translation> @@ -6594,6 +6601,7 @@ <translation id="6955698182324067397">អ្នកកំពុងបើកមុខងារជួសជុល ChromeOS ដែលនឹងរៀបចំ sshd daemon និងបើកការចាប់ផ្តើមពីឧបករណ៍ USB។</translation> <translation id="6955893174999506273">កំណត់ឧបករណ៍ចុច 1 ទៀត</translation> <translation id="6957044667612803194">សោសុវត្ថិភាពនេះមិនអាចប្រើកូដ PIN បានទេ</translation> +<translation id="6960133692707095572">ចូលមើលដោយគ្មានសំបុត្រ</translation> <translation id="6960507406838246615">តម្រូវឱ្យដំឡើងកំណែ Linux</translation> <translation id="6960648667961844909">មិនអាចទាញយកឯកសារនៃការនិយាយជាភាសា<ph name="LANGUAGE" />បានទេ។ នឹងព្យាយាមទាញយកនៅពេលក្រោយ។ ការនិយាយត្រូវបានផ្ញើទៅ Google ដើម្បីដំណើរការ រហូតដល់បញ្ចប់ការទាញយក។</translation> <translation id="696103774840402661">ឯកសារ និងទិន្នន័យមូលដ្ឋានទាំងអស់សម្រាប់អ្នកប្រើប្រាស់ទាំងអស់នៅលើ <ph name="DEVICE_TYPE" /> នេះត្រូវបានលុបជាអចិន្ត្រៃយ៍។</translation> @@ -8055,6 +8063,7 @@ <translation id="8272443605911821513">គ្រប់គ្រងកម្មវិធីបន្ថែមរបស់អ្នកដោយការចុចកម្មវិធីបន្ថែមនៅក្នុងម៉ឺនុយ "ឧបករណ៍ច្រើនទៀត"។</translation> <translation id="8272786333453048167">ផ្ដល់ការអនុញ្ញាតម្ដងទៀត</translation> <translation id="8273905181216423293">ទាញយកឥឡូវនេះ</translation> +<translation id="827488840488530039">ទំព័រដែលអ្នកកំពុងព្យាយាមចូលមើលមិនអាចផ្ទៀងផ្ទាត់សំបុត្រ Kerberos របស់អ្នកបានទេ</translation> <translation id="8274921654076766238">កែវពង្រីកគឺទៅតាមការផ្ដោតក្ដារចុច</translation> <translation id="8274924778568117936">កុំបិទ ឬបិទ <ph name="DEVICE_TYPE" /> របស់អ្នករហូតដល់ការដំឡើងកំណែបានបញ្ចប់។ <ph name="DEVICE_TYPE" /> របស់អ្នកនឹងចាប់ផ្តើមឡើងវិញក្រោយពេលការដំឡើងបានបញ្ចប់។</translation> <translation id="8275038454117074363">នាំចូល</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 330006b..5e43fbf 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -69,6 +69,7 @@ <translation id="1059484610606223931">ಹೈಪರ್ಟೆಕ್ಸ್ಟ್ ಟ್ರಾನ್ಸ್ಪೋರ್ಟ್ ಪ್ರೊಟೊಕಾಲ್ (HTTPS)</translation> <translation id="1059944192885972544">'<ph name="SEARCH_TEXT" />' ಗಾಗಿ <ph name="NUM" /> ಟ್ಯಾಬ್ಗಳು ಕಂಡುಬಂದಿವೆ</translation> <translation id="1060292118287751956">ಸ್ಕ್ರೀನ್ ಅಪ್ಡೇಟ್ಗಳ ಫ್ರೀಕ್ವೆನ್ಸಿ ಅನ್ನು ನಿರ್ಧರಿಸುತ್ತದೆ</translation> +<translation id="1060570945511946595">ಟಿಕೆಟ್ಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="1061130374843955397">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಗೆ ಸುಸ್ವಾಗತ</translation> <translation id="1061373870045429865">ಈ ಲಿಂಕ್ಗಾಗಿ QR ಕೋಡ್ ಅನ್ನು ರಚಿಸಿ</translation> <translation id="1061904396131502319">ಬಹುತೇಕ ವಿರಾಮದ ಸಮಯ</translation> @@ -1119,6 +1120,7 @@ <translation id="1975841812214822307">ತೆಗೆದುಹಾಕಿ...</translation> <translation id="1976150099241323601">ಭದ್ರತಾ ಸಾಧನಕ್ಕೆ ಸೈನ್ ಇನ್ ಆಗಿರಿ</translation> <translation id="1977965994116744507">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ಫೋನ್ ಅನ್ನು ಸಮೀಪಕ್ಕೆ ತನ್ನಿ.</translation> +<translation id="1978666928180318515">Bruschetta ಅನ್ನು ತೆಗೆದುಹಾಕಿ</translation> <translation id="1979095679518582070">ಈ ಫೀಚರ್ ಅನ್ನು ಆಫ್ ಮಾಡಿದರೆ, ಸಿಸ್ಟಂ ಅಪ್ಡೇಟ್ಗಳು ಮತ್ತು ಸುರಕ್ಷತೆಯಂತಹ ಅಗತ್ಯ ಸೇವೆಗಳಿಗೆ ಬೇಕಾದ ಮಾಹಿತಿಯನ್ನು ಕಳುಹಿಸುವುದಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಹಾಗೆ, ಈ ಸಾಧನದ ಸಾಮರ್ಥ್ಯದ ಮೇಲೆ ಇದು ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ.</translation> <translation id="1979280758666859181">ನೀವು <ph name="PRODUCT_NAME" /> ದ ಹಳೆಯ ಆವೃತ್ತಿಯೊಂದಿಗೆ ಚಾನಲ್ಗೆ ಬದಲಾಯಿಸುತ್ತಿರುವಿರಿ. ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪ್ರಸ್ತುತ ಸ್ಥಾಪನೆ ಮಾಡಲಾಗಿರುವ ಆವೃತ್ತಿಗೆ ಹೊಂದಾಣಿಕೆಯಾದಾಗ ಮಾತ್ರ ಚಾನಲ್ ಬದಲಾವಣೆಯನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="197989455406964291">KDC ಯು ಎನ್ಕ್ರಿಪ್ಶನ್ ಪ್ರಕಾರವನ್ನು ಬೆಂಬಲಿಸುತ್ತಿಲ್ಲ</translation> @@ -1586,7 +1588,6 @@ <translation id="2356070529366658676">ಕೇಳಿ</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> ಅನ್ನು ತೆಗೆದುಹಾಕಿ</translation> <translation id="2358561147588818967">ಸೈಟ್ಗಳು Javascript ಅನ್ನು ಬಳಸಬಹುದು</translation> -<translation id="2358703245148663432">ವಿಭಿನ್ನ ಸಾಧನ</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> ಮೂಲಕ ಅನುಮತಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ:</translation> <translation id="2359071692152028734">Linux ಆ್ಯಪ್ಗಳು ಪ್ರತಿಕ್ರಿಯೆ ರಹಿತವಾಗಬಹುದು.</translation> <translation id="2359345697448000899">ಪರಿಕರಗಳ ಮೆನುವಿನಲ್ಲಿರುವ ‘ವಿಸ್ತರಣೆಗಳು’ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡುವ ಮೂಲಕ ನಿಮ್ಮ ವಿಸ್ತರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ.</translation> @@ -1926,6 +1927,7 @@ <translation id="2672142220933875349">ತಪ್ಪಾದ crx ಫೈಲ್, ಅನ್ಪ್ಯಾಕಿಂಗ್ ವಿಫಲವಾಗಿದೆ.</translation> <translation id="2673135533890720193">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಓದಿ</translation> <translation id="2674764818721168631">ಆಫ್</translation> +<translation id="2675570801872027281">Bruschetta ಅನ್ನು ತೆಗೆದುಹಾಕುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="2676492189600898281">ಆಟೋಫಿಲ್ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಒದಗಿಸಿ</translation> <translation id="2678063897982469759">ಮರು-ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="2678100101831051676">ಕ್ಯಾಸ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.</translation> @@ -2924,6 +2926,7 @@ <translation id="3593965109698325041">ಪ್ರಮಾಣಪತ್ರ ಹೆಸರು ನಿರ್ಬಂಧಗಳು</translation> <translation id="3596012367874587041">ಆ್ಯಪ್ ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="3596414637720633074">ಅದೃಶ್ಯ ಮೋಡ್ನಲ್ಲಿ ಥರ್ಡ್-ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation> +<translation id="3598010454707842106">"Chrome ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ" ಎಂಬುದನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ</translation> <translation id="3599221874935822507">ಎತ್ತರಿಸಲಾಗಿದೆ</translation> <translation id="3600051066689725006">ವೆಬ್ ಕೋರಿಕೆ ಮಾಹಿತಿ</translation> <translation id="360180734785106144">ಲಭ್ಯವಿರುವಾಗ ಹೊಸ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆಫರ್ ಮಾಡುತ್ತದೆ</translation> @@ -3922,6 +3925,7 @@ <translation id="4495419450179050807">ಈ ಪುಟದಲ್ಲಿ ತೋರಿಸಬೇಡ</translation> <translation id="4497145443434063861">ವಿಭಿನ್ನ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗಳಿಗೆ ಕನೆಕ್ಟ್ ಆಗಿರುವ PC ಮತ್ತು Chromecast (ಉದಾ. 2.4GHz ವಿರುದ್ಧ 5GHz)</translation> <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ಕ್ರ್ಯಾಶ್ ಆಗಿದೆ</translation> +<translation id="4500647907053779331">&ಆಯ್ಕೆಯನ್ನು <ph name="LANGUAGE" /> ಗೆ ಅನುವಾದಿಸಿ</translation> <translation id="450099669180426158">ಆಶ್ಚರ್ಯಕರ ಚಿಹ್ನೆಯ ಐಕಾನ್</translation> <translation id="4501530680793980440">ತೆಗೆದುಹಾಕುವಿಕೆಯನ್ನು ದೃಢೀಕರಿಸಿ</translation> <translation id="4502423230170890588">ಈ ಸಾಧನದಿಂದ ತೆಗೆದುಹಾಕಿ</translation> @@ -5741,6 +5745,7 @@ <translation id="617213288191670920">ಯಾವುದೇ ಭಾಷೆಗಳನ್ನು ಸೇರಿಸಲಾಗಿಲ್ಲ</translation> <translation id="6173623053897475761">ನಿಮ್ಮ ಪಿನ್ ಅನ್ನು ಪುನಃ ಟೈಪ್ ಮಾಡಿ</translation> <translation id="6175314957787328458">Microsoft ಡೊಮೇನ್ GUID</translation> +<translation id="6177412385419165772">ತೆಗೆದುಹಾಕಲಾಗುತ್ತಿದೆ...</translation> <translation id="6178664161104547336">ಒಂದು ಪ್ರಮಾಣಪತ್ರವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ</translation> <translation id="6178682841350631965">ನಿಮ್ಮ ಸೈನ್-ಇನ್ ಡೇಟಾವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="6180510783007738939">ಲೈನ್ ಟೂಲ್</translation> @@ -6219,6 +6224,7 @@ <translation id="6619801788773578757">ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ ಸೇರಿಸಿ</translation> <translation id="6619990499523117484">ನಿಮ್ಮ ಪಿನ್ ದೃಢೀಕರಿಸಿ</translation> <translation id="6620254580880484313">ಕಂಟೇನರ್ನ ಹೆಸರು</translation> +<translation id="6620927550847360014">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ನಲ್ಲಿ Bruschetta ತೆಗೆದುಹಾಕುವುದೇ?</translation> <translation id="6621391692573306628">ಈ ಟ್ಯಾಬ್ ಅನ್ನು ಬೇರೊಂದು ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಲು, ಎರಡೂ ಸಾಧನಗಳಲ್ಲಿ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="6622980291894852883">ಚಿತ್ರಗಳನ್ನು ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation> <translation id="6624036901798307345">ಟ್ಯಾಬ್ಲೆಟ್ ಮೋಡ್ನಲ್ಲಿ, ಪ್ರತಿ ಟ್ಯಾಬ್ನ ಥಂಬ್ನೇಲ್ಗಳನ್ನು ತೋರಿಸುವ ಹೊಸ ಟ್ಯಾಬ್ ಸ್ಟ್ರೈಪ್ ತೆರೆಯಲು, ಟ್ಯಾಬ್ ಕೌಂಟರ್ ಪರಿಕರಪಟ್ಟಿಯ ಬಟನ್ ಮೇಲೆ ಟ್ಯಾಪ್ ಮಾಡಿ.</translation> @@ -6436,6 +6442,7 @@ <translation id="6818547713623251698">ನಿಮ್ಮ ಫೋನ್ನ ಫೋಟೋಗಳು, ಮಾಧ್ಯಮ, ಅಧಿಸೂಚನೆಗಳು ಮತ್ತು ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಿ</translation> <translation id="6818802132960437751">ಅಂತರ್ನಿರ್ಮಿತ ವೈರಸ್ನಿಂದ ರಕ್ಷಣೆ</translation> <translation id="6818920801736417483">ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಉಳಿಸುವುದೇ?</translation> +<translation id="6820079682647046800">Kerberos ಪ್ರಮಾಣೀಕರಣವು ವಿಫಲವಾಗಿದೆ</translation> <translation id="6823174134746916417">ಟಚ್ಪ್ಯಾಡ್ ಕ್ಲಿಕ್ - ಮಾಡಲು - ಟ್ಯಾಪ್ ಮಾಡಿ</translation> <translation id="6824564591481349393">ಇಮೇಲ್ &ವಿಳಾಸವನ್ನು ನಕಲು ಮಾಡಿ</translation> <translation id="6824584962142919697">&ಅಂಶಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation> @@ -6590,6 +6597,7 @@ <translation id="6955698182324067397">ನೀವು ChromeOS ಡೀಬಗ್ ಮಾಡುವಿಕೆಯ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತಿದ್ದು, ಅದು sshd daemon ಅನ್ನು ಸೆಟಪ್ ಮಾಡುತ್ತದೆ ಮತ್ತು USB ಡ್ರೈವ್ಗಳಿಂದ ಬೂಟ್ ಮಾಡುವಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation> <translation id="6955893174999506273">ಇನ್ನೂ 1 ಸ್ವಿಚ್ ಅನ್ನು ನಿಯೋಜಿಸಿ</translation> <translation id="6957044667612803194">ಈ ಭದ್ರತೆ ಕೀ, ಪಿನ್ಗಳನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ</translation> +<translation id="6960133692707095572">ಟಿಕೆಟ್ ಇಲ್ಲದೆ ಭೇಟಿ ನೀಡಿ</translation> <translation id="6960507406838246615">Linux ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬೇಕಾಗಿದೆ</translation> <translation id="6960648667961844909"><ph name="LANGUAGE" /> ಧ್ವನಿ ಫೈಲ್ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ ನಂತರ ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಲಾಗುವುದು. ಡೌನ್ಲೋಡ್ ಪೂರ್ಣಗೊಳ್ಳುವವರೆಗೆ, ಪ್ರಕ್ರಿಯೆಗಾಗಿ Google ಗೆ ಧ್ವನಿಯನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ.</translation> <translation id="696103774840402661">ಈ <ph name="DEVICE_TYPE" /> ದಲ್ಲಿ ಇರುವ ಎಲ್ಲಾ ಬಳಕೆದಾರರ ಎಲ್ಲಾ ಫೈಲ್ಗಳು ಮತ್ತು ಸ್ಥಳೀಯ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗಿದೆ.</translation> @@ -8049,6 +8057,7 @@ <translation id="8272443605911821513">"ಹೆಚ್ಚಿನ ಪರಿಕರಗಳು" ಮೆನುನಲ್ಲಿರುವ ‘ವಿಸ್ತರಣೆಗಳು’ಕ್ಲಿಕ್ ಮಾಡುವ ಮೂಲಕ ನಿಮ್ಮ ವಿಸ್ತರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ.</translation> <translation id="8272786333453048167">ಪುನಃ ಅನುಮತಿಸಿ</translation> <translation id="8273905181216423293">ಈಗಲೇ ಡೌನ್ಲೋಡ್ ಮಾಡಿ</translation> +<translation id="827488840488530039">ನೀವು ಭೇಟಿ ನೀಡಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಪುಟವು ನಿಮ್ಮ Kerberos ಟಿಕೆಟ್ಗಳನ್ನು ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation> <translation id="8274921654076766238">ಮ್ಯಾಗ್ನಿಫೈರ್, ಕೀಬೋರ್ಡ್ ಫೋಕಸ್ ಅನ್ನು ಅನುಸರಿಸುತ್ತದೆ</translation> <translation id="8274924778568117936">ಅಪ್ಡೇಟ್ ಮುಕ್ತಾಯಗೊಳ್ಳುವವರೆಗೆ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಆಫ್ ಮಾಡಬೇಡಿ. ಇನ್ಸ್ಟಾಲೇಶನ್ ಪ್ರಕ್ರಿಯೆ ಪೂರ್ಣಗೊಂಡ ನಂತರ ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಮರುಪ್ರಾರಂಭವಾಗುತ್ತದೆ.</translation> <translation id="8275038454117074363">ಆಮದು</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 1f15550a..2197d75 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1594,7 +1594,6 @@ <translation id="2356070529366658676">확인</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> 삭제</translation> <translation id="2358561147588818967">사이트에서 자바스크립트를 사용할 수 있음</translation> -<translation id="2358703245148663432">다른 기기</translation> <translation id="2358777858338503863">클릭하여 <ph name="ORIGIN" />에서 허용하세요.</translation> <translation id="2359071692152028734">Linux 앱이 응답하지 않을 수 있습니다.</translation> <translation id="2359345697448000899">도구 메뉴에서 확장 프로그램을 클릭하여 확장 프로그램을 관리할 수 있습니다.</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index f49fb57c..d2998e1 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -379,6 +379,7 @@ <translation id="1339009753652684748">"Окей, Google" деп айтып, Жардамчыңызга кайрылыңыз. Батареяны үнөмдөө үчүн "Күйүк (Сунушталат)" дегенди тандаңыз. Жардамчыңыз кубатталып жатканда гана жооп берет.</translation> <translation id="13392265090583506">Атайын мүмкүнчүлүктөр</translation> <translation id="1340527397989195812">Медиа файлдардын камдык көчүрмөсүн Файлдар колдонмосу аркылуу түзмөгүңүздөн алып сактаңыз.</translation> +<translation id="1341701348342335220">Абдан жакшы!</translation> <translation id="1341871421050612057"><ph name="USERNAME" /> менен шайкештирүүгө болбойт</translation> <translation id="1343865611738742294">Linux колдонмолоруна USB түзмөктөрүн колдонууга уруксат бериңиз. USB түзмөгү өчүрүлгөндөн кийин Linux аны эстеп калбайт.</translation> <translation id="1343920184519992513">Токтогон жериңизден улантып, барактардын белгилүү топтомун ачыңыз</translation> @@ -1592,7 +1593,6 @@ <translation id="2356070529366658676">Сураңыз</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> өчүрүү</translation> <translation id="2358561147588818967">Сайттар Javascript'ти колдоно алат</translation> -<translation id="2358703245148663432">Башка түзмөк</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> сайтында уруксат берүү үчүн басыңыз:</translation> <translation id="2359071692152028734">Linux колдонмолору жооп бербей калышы мүмкүн.</translation> <translation id="2359345697448000899">Куралдар менюсундагы Кеңейтүүлөрду чыкылдатып, өз кеңейтүүлөрүңүздү башкарыңыз.</translation> @@ -3640,6 +3640,7 @@ <translation id="4232375817808480934">Kerberos’ту конфигурациялоо</translation> <translation id="4235965441080806197">Аккаунтка кирүүнү жокко чыгаруу</translation> <translation id="4236163961381003811">Дагы башка кеңейтүүлөрдү карап көрүңүз</translation> +<translation id="4237282663517880406">Google Drive сунуштарын көрсөтүү</translation> <translation id="4241182343707213132">Уюмдун колдонмолорун жаңыртуу үчүн өчүрүп күйгүзүңүз</translation> <translation id="4242145785130247982">Бир нече кардарлардын сертификаттарын пайдалануу колдоого алынбайт</translation> <translation id="4242533952199664413">Жөндөөлөрдү ачуу</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 34ffc9d..9fc13a8 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -379,6 +379,7 @@ <translation id="1339009753652684748">ເຂົ້າເຖິງຜູ້ຊ່ວຍຂອງທ່ານເມື່ອທ່ານເວົ້າ "Ok Google." ເພື່ອປະຢັດແບັດເຕີຣີ, ກະລຸນາເລືອກ “ເປີດ (ແນະນຳ)”. ຜູ້ຊ່ວຍຂອງທ່ານຈະຕອບສະໜອງສະເພາະເມື່ອອຸປະກອນຂອງທ່ານສຽບໄຟ ຫຼື ກຳລັງສາກຢູ່ເທົ່ານັ້ນ.</translation> <translation id="13392265090583506">A11y</translation> <translation id="1340527397989195812">ສໍາຮອງມີເດຍຈາກອຸປະກອນດ້ວຍການໃຊ້ແອັບໄຟລ໌.</translation> +<translation id="1341701348342335220">ທ່ານເຮັດໄດ້ດີຫຼາຍ!</translation> <translation id="1341871421050612057">ບໍ່ສາມາດຊິ້ງກັບ <ph name="USERNAME" /> ໄດ້</translation> <translation id="1343865611738742294">ອະນຸຍາດໃຫ້ແອັບ Linux ເຂົ້າເຖິງອຸປະກອນ USB. Linux ຈະບໍ່ຈື່ອຸປະກອນ USB ຫຼັງຈາກທີ່ລຶບມັນອອກແລ້ວ.</translation> <translation id="1343920184519992513">ສືບຕໍ່ໜ້າເວັບທີ່ທ່ານເບິ່ງຄ້າງໄວ້ ແລະ ເປີດຊຸດໜ້າເວັບສະເພາະໃດໜຶ່ງ</translation> @@ -1591,7 +1592,6 @@ <translation id="2356070529366658676">ຖາມ</translation> <translation id="2357330829548294574">ລຶບ <ph name="USER_NAME" /> ອອກ</translation> <translation id="2358561147588818967">ເວັບໄຊສາມາດໃຊ້ JavaScript ໄດ້</translation> -<translation id="2358703245148663432">ອຸປະກອນອື່ນ</translation> <translation id="2358777858338503863">ຄລິກອະນຸຍາດຢູ່ <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">ແອັບ Linux ອາດບໍ່ຕອບສະໜອງ.</translation> <translation id="2359345697448000899">ຈັດການສ່ວນຂະຫຍາຍຂອງທ່ານໂດຍການຄລິກສ່ວນຂະຫຍາຍຢູ່ໃນເມນູເຄື່ອງມື.</translation> @@ -3639,6 +3639,7 @@ <translation id="4232375817808480934">ກຳນົດຄ່າ Kerberos</translation> <translation id="4235965441080806197">ຍົກເລີກການເຂົ້າສູ່ລະບົບ</translation> <translation id="4236163961381003811">ຄົ້ນພົບສ່ວນຂະຫຍາຍເພີ່ມເຕີມ</translation> +<translation id="4237282663517880406">ສະແດງການແນະນຳ Google Drive</translation> <translation id="4241182343707213132">ກະລຸນາຣີສະຕາດເພື່ອອັບເດດແອັບຂອງອົງການ</translation> <translation id="4242145785130247982">ບໍ່ຮອງຮັບຫຼາຍໃບຮັບຮອງລູກຂ່າຍ</translation> <translation id="4242533952199664413">ເປີດການຕັ້ງຄ່າ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 0898bc0..2149eb88 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -382,6 +382,7 @@ <translation id="1339009753652684748">Pasiekite Padėjėją pasakę „Ok Google“. Siekdami taupyti akumuliatoriaus energiją, pasirinkite „Įjungti (rekomenduojama)“. Padėjėjas reaguos tik tada, kai įrenginys bus prijungtas prie maitinimo šaltinio arba kraunamas.</translation> <translation id="13392265090583506">Pritaikomumas</translation> <translation id="1340527397989195812">Sukurkite atsarginę įrenginio medijos kopiją naudodami programą „Failai“.</translation> +<translation id="1341701348342335220">Puiku!</translation> <translation id="1341871421050612057">Negalima sinchronizuoti su <ph name="USERNAME" /></translation> <translation id="1343865611738742294">„Linux“ programoms suteikiamas leidimas pasiekti USB įrenginius. Pašalinto USB įrenginio „Linux“ neprisimins.</translation> <translation id="1343920184519992513">Tęskite ten, kur baigėte, ir atidarykite konkrečius puslapius</translation> @@ -1595,7 +1596,6 @@ <translation id="2356070529366658676">Paklausti</translation> <translation id="2357330829548294574">Pašalinti <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Svetainėse gali būti naudojama „JavaScript“</translation> -<translation id="2358703245148663432">Kitas įrenginys</translation> <translation id="2358777858338503863">Spustelėkite, kad leistumėte <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">„Linux“ programos gali nebeatsakyti.</translation> <translation id="2359345697448000899">„Įrankių“ meniu spustelėję „Plėtiniai“, tvarkykite plėtinius.</translation> @@ -3643,6 +3643,7 @@ <translation id="4232375817808480934">Konfigūruoti „Kerberos“</translation> <translation id="4235965441080806197">Atšaukti prisijungimą</translation> <translation id="4236163961381003811">Žr. daugiau plėtinių</translation> +<translation id="4237282663517880406">Rodyti „Google“ disko pasiūlymus</translation> <translation id="4241182343707213132">Paleiskite iš naujo, kad būtų atnaujintos organizacijos programos</translation> <translation id="4242145785130247982">Nepalaikomi keli klientų sertifikatai</translation> <translation id="4242533952199664413">Atidaryti nustatymus</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 1a37cb23..897581d 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1579,7 +1579,6 @@ <translation id="2356070529366658676">Vaicāt</translation> <translation id="2357330829548294574">Noņemt <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Atļaut vietnēm lietot JavaScript</translation> -<translation id="2358703245148663432">Cita ierīce</translation> <translation id="2358777858338503863">Noklikšķiniet, lai atļautu piekļuvi vietnei <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux lietotnes var nereaģēt.</translation> <translation id="2359345697448000899">Pārvaldiet savus paplašinājumus, izvēlnē Rīki noklikšķinot uz Paplašinājumi.</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index fa8620fa..1c819dd 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -1593,7 +1593,6 @@ <translation id="2356070529366658676">Прашај</translation> <translation id="2357330829548294574">Отстранете <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Сајтовите може да користат JavaScript</translation> -<translation id="2358703245148663432">Друг уред</translation> <translation id="2358777858338503863">Кликнете за да се дозволи на <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Апликациите на Linux може да не реагираат.</translation> <translation id="2359345697448000899">Уредувајте со наставки со кликнување на Наставки во менито Алатки.</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index e5c16f52..9c99750b 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -1579,7 +1579,6 @@ <translation id="2356070529366658676">ചോദിക്കുക</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> നീക്കം ചെയ്യുക</translation> <translation id="2358561147588818967">സൈറ്റുകൾക്ക് JavaScript ഉപയോഗിക്കാം</translation> -<translation id="2358703245148663432">മറ്റൊരു ഉപകരണം</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> എന്നതിൽ അനുവദിക്കാൻ ക്ലിക്ക് ചെയ്യുക:</translation> <translation id="2359071692152028734">Linux ആപ്പുകൾ പ്രതികരിക്കാതാവാം.</translation> <translation id="2359345697448000899">ഉപകരണങ്ങൾ മെനുവിലെ വിപുലീകരണങ്ങളിൽ ക്ലിക്ക് ചെയ്യുന്നതിലൂടെ നിങ്ങളുടെ വിപുലീകരണങ്ങൾ നിയന്ത്രിക്കുക.</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 85d9d74..d3a0484 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1589,7 +1589,6 @@ <translation id="2356070529366658676">Асуух</translation> <translation id="2357330829548294574"><ph name="USER_NAME" />-г хасах</translation> <translation id="2358561147588818967">Сайтууд JavaScript ашиглах боломжтой</translation> -<translation id="2358703245148663432">Өөр төхөөрөмж</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> дээр зөвшөөрөхийн тулд товшино уу:</translation> <translation id="2359071692152028734">Linux аппууд хариу өгөхгүй болсон байж болзошгүй.</translation> <translation id="2359345697448000899">Хэрэгслүүд цэснээс Өргөтгөлүүд хэсэг дээр дарж өргөтгөлүүдээ удирдаарай.</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 2890991..b36289e 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1591,7 +1591,6 @@ <translation id="2356070529366658676">विचारा</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> काढा</translation> <translation id="2358561147588818967">साइट JavaScript वापरू शकतात</translation> -<translation id="2358703245148663432">वेगळे डिव्हाइस</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> वर अनुमती देण्यासाठी क्लिक करा:</translation> <translation id="2359071692152028734">Linux अॅप्स कदाचित प्रतिसाद देणार नाहीत.</translation> <translation id="2359345697448000899">टूल मेनूमध्ये विस्तारांवर क्लिक करुन तुमचे विस्तार व्यवस्थापित करा.</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 7136e6b..af017de 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1593,7 +1593,6 @@ <translation id="2356070529366658676">Tanya</translation> <translation id="2357330829548294574">Alih keluar <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Laman boleh menggunakan JavaScript</translation> -<translation id="2358703245148663432">Peranti yang berbeza</translation> <translation id="2358777858338503863">Klik untuk membenarkan <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Apl Linux mungkin menjadi tidak responsif.</translation> <translation id="2359345697448000899">Uruskan sambungan anda dengan mengklik Sambungan dalam menu Alat.</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index a4b40a4..afc528c1 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -379,6 +379,7 @@ <translation id="1339009753652684748">"Ok Google" ဟုပြောသည့်အခါ သင်၏ Assistant ကို အသုံးပြုနိုင်သည်။ ဘက်ထရီချွေတာရန် “ဖွင့်ရန် (အကြံပြုထားသည်)" ကိုရွေးပါ။ သင့်စက်ကို ပလတ်ထိုးထားသည့်အခါ သို့မဟုတ် အားသွင်းသည့်အခါတွင်သာ Assistant က တုံ့ပြန်ပါမည်။</translation> <translation id="13392265090583506">A11y</translation> <translation id="1340527397989195812">ဖိုင်များ ဆိုသည့် အက်ပ် အားသုံးပြီး စက်ပစ္စည်းမှ မီဒီယာကို Back up လုပ်ပါ</translation> +<translation id="1341701348342335220">ကောင်းစွာပြီးသွားပြီ။</translation> <translation id="1341871421050612057"><ph name="USERNAME" /> ဖြင့် စင့်ခ်လုပ်၍ မရပါ</translation> <translation id="1343865611738742294">USB စက်ပစ္စည်းများကို Linux အက်ပ်များအား အသုံးပြုခွင့်ပေးပါ။ USB စက်ပစ္စည်းကို ဖယ်ရှားလိုက်ပါက Linux က ၎င်းကို မှတ်ထားတော့မည်မဟုတ်ပါ။</translation> <translation id="1343920184519992513">သင်ထားခဲ့သည့်နေရာမှ ပြန်စရန်နှင့် သီးသန့်စာမျက်နှာအုပ်စုတစ်ခု ဖွင့်ရန်</translation> @@ -1590,7 +1591,6 @@ <translation id="2356070529366658676">မေး</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> ကို ဖယ်ရှားရန်</translation> <translation id="2358561147588818967">ဝဘ်ဆိုက်များက Javascript ကို သုံးနိုင်သည်</translation> -<translation id="2358703245148663432">အခြားစက်</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> တွင်ခွင့်ပြုရန် နှိပ်ပါ-</translation> <translation id="2359071692152028734">Linux အက်ပ်များ တုံ့ပြန်မှုရပ်သွားနိုင်သည်။</translation> <translation id="2359345697448000899">Tools မီနျူးတွင်ရှိ အိတ်စတန်းရှင်းများကို နှိပ်ခြင်းဖြင့် သင့်အိတ်စတန်းရှင်းများကို စီမံပါ။</translation> @@ -3637,6 +3637,7 @@ <translation id="4232375817808480934">Kerberos ကို စီစဉ်သတ်မှတ်ပါ</translation> <translation id="4235965441080806197">လက်မှတ်ထိုးဝင်ခြင်းကို ပယ်ဖျက်ရန်</translation> <translation id="4236163961381003811">နောက်ထပ်နောက်ဆက်တွဲများ ရှာရန်</translation> +<translation id="4237282663517880406">Google Drive အကြံပြုချက်များ ပြပါ</translation> <translation id="4241182343707213132">အဖွဲ့အစည်း၏အက်ပ်များကို အပ်ဒိတ်လုပ်ရန် ပြန်စပါ</translation> <translation id="4242145785130247982">ကလိုင်းယင့် အသိအမှတ်ပြုလက်မှတ် အများအပြားကို ပံ့ပိုးမပေးပါ</translation> <translation id="4242533952199664413">ဆက်တင်များကို ဖွင့်ရန်</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 37e94750..50c23413 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -1575,7 +1575,6 @@ <translation id="2356070529366658676">सोध्नुहोस्</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> हटाउनुहोस्</translation> <translation id="2358561147588818967">साइटहरूले JavaScript प्रयोग गर्न सक्छन्</translation> -<translation id="2358703245148663432">कुनै अर्को डिभाइस</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> मा निम्न कार्य गर्ने अनुमति दिन क्लिक गर्नुहोस्:</translation> <translation id="2359071692152028734">Linux एपहरूले काम नगर्न सक्छन्।</translation> <translation id="2359345697448000899">उपकरण मेनुमा विस्तारहरू क्लिक गर्दै तपाइँका विस्तारहरूलाई व्वयस्थापन गर्नुहोस्।</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 258f013..ece8139 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -377,6 +377,7 @@ <translation id="1339009753652684748">Activeer je Assistent als je 'Hey Google' zegt. Als je de batterij wilt sparen, kies je Aan (aanbevolen). De Assistent reageert dan alleen als je apparaat is aangesloten op een voedingsbron of wordt opgeladen.</translation> <translation id="13392265090583506">A11y</translation> <translation id="1340527397989195812">Back-ups van media op het apparaat maken via de app Bestanden.</translation> +<translation id="1341701348342335220">Goed bezig!</translation> <translation id="1341871421050612057">Kan niet synchroniseren met <ph name="USERNAME" /></translation> <translation id="1343865611738742294">Geef Linux-apps rechten tot USB-apparaten. Linux onthoudt een USB-apparaat niet nadat dit is verwijderd.</translation> <translation id="1343920184519992513">Ga verder waar je gebleven was en open een specifieke set pagina's.</translation> @@ -1577,7 +1578,6 @@ <translation id="2356070529366658676">Vragen</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> verwijderen</translation> <translation id="2358561147588818967">Sites kunnen JavaScript gebruiken</translation> -<translation id="2358703245148663432">Een ander apparaat</translation> <translation id="2358777858338503863">Klik om toe te staan op <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux-apps reageren misschien niet meer.</translation> <translation id="2359345697448000899">Je kunt je extensies beheren door in het gereedschapsmenu te klikken op 'Extensies'.</translation> @@ -3624,6 +3624,7 @@ <translation id="4232375817808480934">Kerberos configureren</translation> <translation id="4235965441080806197">Inloggen annuleren</translation> <translation id="4236163961381003811">Meer extensies bekijken</translation> +<translation id="4237282663517880406">Google Drive-suggesties tonen</translation> <translation id="4241182343707213132">Start opnieuw op om de apps van je organisatie te updaten</translation> <translation id="4242145785130247982">Meerdere clientcertificaten worden niet ondersteund</translation> <translation id="4242533952199664413">Instellingen openen</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index b248c6d..c7c44386 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1587,7 +1587,6 @@ <translation id="2356070529366658676">Spør</translation> <translation id="2357330829548294574">Fjern <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Nettsteder kan bruke JavaScript</translation> -<translation id="2358703245148663432">En annen enhet</translation> <translation id="2358777858338503863">Klikk for å tillate på <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Det kan hende at Linux-apper slutter å svare.</translation> <translation id="2359345697448000899">Du kan administrere utvidelsene dine ved å klikke på Utvidelser i verktøymenyen.</translation> @@ -3950,6 +3949,7 @@ <translation id="4522890784888918985">Barnekontoer støttes ikke</translation> <translation id="4523876148417776526">XML-nettstedslister er ikke hentet ennå.</translation> <translation id="4524832533047962394">Denne versjonen av operativsystemet støtter ikke registreringsmodusen som ble angitt. Sørg for at du kjører den nyeste versjonen.</translation> +<translation id="4526051299161934899">Skjulte lagrede fanegrupper</translation> <translation id="4526853756266614740">Velg et bilde for å bruke temaet umiddelbart</translation> <translation id="452750746583162491">Gjennomgå de synkroniserte dataene dine</translation> <translation id="4527929807707405172">Slå på omvendt rulling. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> @@ -8491,6 +8491,7 @@ <translation id="869884720829132584">Programmeny</translation> <translation id="869891660844655955">Utløpsdato</translation> <translation id="8699188901396699995">PPD for <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">Meny med skjulte lagrede fanegrupper</translation> <translation id="8702825062053163569"><ph name="DEVICE_TYPE" /> er nå låst.</translation> <translation id="8703346390800944767">Hopp over annonsen</translation> <translation id="8705331520020532516">Serienummer</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index 83feff78..e96fe3ff 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -1576,7 +1576,6 @@ <translation id="2356070529366658676">ପଚାରନ୍ତୁ</translation> <translation id="2357330829548294574"><ph name="USER_NAME" />କୁ କାଢ଼ି ଦିଅନ୍ତୁ</translation> <translation id="2358561147588818967">ସାଇଟଗୁଡ଼ିକ JavaScript ବ୍ୟବହାର କରିପାରିବ</translation> -<translation id="2358703245148663432">ଏକ ଭିନ୍ନ ଡିଭାଇସ</translation> <translation id="2358777858338503863"><ph name="ORIGIN" />ରେ ଅନୁମତି ଦେବାକୁ କ୍ଲିକ କରନ୍ତୁ:</translation> <translation id="2359071692152028734">Linux ଆପଗୁଡ଼ିକ କୌଣସି ପ୍ରତିକ୍ରିୟା ଦେଇନପାରେ।</translation> <translation id="2359345697448000899">ଟୁଲ୍ସ ମେନୁରେ ଥିବା ଏକ୍ସଟେନ୍ସନ୍ କ୍ଲିକ୍ କରି ନିଜର ଏକ୍ସଟେନ୍ସନ୍ଗୁଡ଼ିକ ପରିଚାଳନା କରନ୍ତୁ।</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 44ab2666..cbd3468 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -380,6 +380,7 @@ <translation id="1339009753652684748">"Ok Google" ਕਹਿ ਕੇ ਆਪਣੀ Assistant ਤੱਕ ਪਹੁੰਚ ਕਰੋ। ਬੈਟਰੀ ਬਚਾਉਣ ਲਈ, “ਚਾਲੂ (ਸਿਫ਼ਾਰਸ਼ੀ)” ਨੂੰ ਚੁਣੋ। ਤੁਹਾਡੀ Assistant ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਪਲੱਗ-ਇਨ ਹੋਣ ਜਾਂ ਚਾਰਜ ਹੋਣ ਵੇਲੇ ਹੀ ਜਵਾਬ ਦੇਵੇਗੀ।</translation> <translation id="13392265090583506">A11y</translation> <translation id="1340527397989195812">Files ਐਪ ਵਰਤਦੇ ਹੋਏ ਡੀਵਾਈਸ ਤੋਂ ਮੀਡੀਆ ਦਾ ਬੈਕਅੱਪ ਲਓ।</translation> +<translation id="1341701348342335220">ਸ਼ਾਬਾਸ਼!</translation> <translation id="1341871421050612057"><ph name="USERNAME" /> ਨਾਲ ਸਿੰਕ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation> <translation id="1343865611738742294">USB ਡੀਵਾਈਸਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ Linux ਐਪਾਂ ਨੂੰ ਇਜਾਜ਼ਤ ਦਿਓ। Linux ਕਿਸੇ USB ਡੀਵਾਈਸ ਨੂੰ ਹਟਾਉਣ ਤੋਂ ਬਾਅਦ ਉਸਨੂੰ ਯਾਦ ਨਹੀਂ ਰੱਖੇਗਾ।</translation> <translation id="1343920184519992513">ਉੱਥੋਂ ਜਾਰੀ ਰੱਖੋ ਜਿੱਥੇ ਤੁਸੀਂ ਛੱਡਿਆ ਸੀ ਅਤੇ ਪੰਨਿਆਂ ਦਾ ਖਾਸ ਸੈੱਟ ਖੋਲ੍ਹੋ</translation> @@ -1593,7 +1594,6 @@ <translation id="2356070529366658676">ਪੁੱਛੋ</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> ਨੂੰ ਹਟਾਓ</translation> <translation id="2358561147588818967">ਸਾਈਟਾਂ JavaScript ਵਰਤ ਸਕਦੀਆਂ ਹਨ</translation> -<translation id="2358703245148663432">ਵੱਖਰਾ ਡੀਵਾਈਸ</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> 'ਤੇ ਆਗਿਆ ਦੇਣ ਲਈ ਕਲਿੱਕ ਕਰੋ:</translation> <translation id="2359071692152028734">Linux ਐਪਾਂ ਪ੍ਰਤੀਕਿਰਿਆਹੀਣ ਹੋ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="2359345697448000899">ਟੂਲ ਮੀਨੂ ਵਿੱਚ ਐਕਸਟੈਂਸ਼ਨਾਂ 'ਤੇ ਕਲਿੱਕ ਕਰਕੇ ਆਪਣੇ ਐਕਸਟੈਂਸ਼ਨ ਪ੍ਰਬੰਧਿਤ ਕਰੋ।</translation> @@ -3640,6 +3640,7 @@ <translation id="4232375817808480934">Kerberos ਦਾ ਸੰਰੂਪਣ ਕਰੋ</translation> <translation id="4235965441080806197">ਸਾਈਨ-ਇਨ ਰੱਦ ਕਰੋ</translation> <translation id="4236163961381003811">ਹੋਰ ਐਕਸਟੈਂਸ਼ਨਾਂ ਲੱਭੋ</translation> +<translation id="4237282663517880406">Google Drive ਸੰਬੰਧੀ ਸੁਝਾਅ ਦਿਖਾਓ</translation> <translation id="4241182343707213132">ਸੰਸਥਾ ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ</translation> <translation id="4242145785130247982">ਇੱਕ ਤੋਂ ਵੱਧ ਕਲਾਇੰਟ ਪ੍ਰਮਾਣ-ਪੱਤਰਾਂ ਦੀ ਸੁਵਿਧਾ ਨਹੀਂ ਹੈ</translation> <translation id="4242533952199664413">ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 454e673..130e163 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -69,6 +69,7 @@ <translation id="1059484610606223931">Hypertext Transport Protocol (HTTPS)</translation> <translation id="1059944192885972544">Znaleziono karty (<ph name="NUM" />) dla zapytania „<ph name="SEARCH_TEXT" />”</translation> <translation id="1060292118287751956">Określa częstotliwość aktualizacji ekranu</translation> +<translation id="1060570945511946595">Zarządzaj biletami</translation> <translation id="1061130374843955397"><ph name="DEVICE_TYPE" /> – witamy!</translation> <translation id="1061373870045429865">Utwórz kod QR powiązany z tym linkiem</translation> <translation id="1061904396131502319">Wielkimi krokami nadchodzi przerwa</translation> @@ -1112,6 +1113,7 @@ <translation id="1975841812214822307">Usuń...</translation> <translation id="1976150099241323601">Zaloguj się do urządzenia zabezpieczającego</translation> <translation id="1977965994116744507">Aby odblokować system, <ph name="DEVICE_TYPE" /> i telefon muszą być bliżej siebie.</translation> +<translation id="1978666928180318515">Usuń Bruschetta</translation> <translation id="1979095679518582070">Wyłączenie tej funkcji nie ogranicza wysyłania przez to urządzenie informacji potrzebnych do działania kluczowych usług, takich jak aktualizacje systemu czy zabezpieczenia.</translation> <translation id="1979280758666859181">Przechodzisz na kanał, w którym <ph name="PRODUCT_NAME" /> jest w starszej wersji. Zmiana nastąpi wtedy, gdy wersja na wybranym kanale będzie zgodna z tą zainstalowaną na Twoim urządzeniu.</translation> <translation id="197989455406964291">KDC nie obsługuje tego typu szyfrowania</translation> @@ -1565,7 +1567,6 @@ <translation id="2356070529366658676">Pytaj</translation> <translation id="2357330829548294574">Usuń: <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Strony mogą używać JavaScriptu</translation> -<translation id="2358703245148663432">Inne urządzenie</translation> <translation id="2358777858338503863">Kliknij, aby zezwolić na stronie <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Aplikacje na Linuksa mogą przestać reagować.</translation> <translation id="2359345697448000899">Aby zarządzać zainstalowanymi rozszerzeniami, kliknij Rozszerzenia w menu Narzędzia.</translation> @@ -1905,6 +1906,7 @@ <translation id="2672142220933875349">Nieprawidłowy plik CRX. Nie udało się go rozpakować.</translation> <translation id="2673135533890720193">Odczytywanie historii przeglądania</translation> <translation id="2674764818721168631">Wyłączono</translation> +<translation id="2675570801872027281">Błąd podczas usuwania Brukschetta. Spróbuj ponownie.</translation> <translation id="2676492189600898281">Prześlij opinię o autouzupełnianiu</translation> <translation id="2678063897982469759">Włącz ponownie</translation> <translation id="2678100101831051676">Nie udało się przesłać treści.</translation> @@ -2903,6 +2905,7 @@ <translation id="3593965109698325041">Ograniczenia nazwy certyfikatu</translation> <translation id="3596012367874587041">Ustawienia aplikacji</translation> <translation id="3596414637720633074">Blokuj pliki cookie innych firm w trybie incognito</translation> +<translation id="3598010454707842106">Kliknij „Dostosuj Chrome”.</translation> <translation id="3599221874935822507">Uniesiony</translation> <translation id="3600051066689725006">Informacje o żądaniu internetowym</translation> <translation id="360180734785106144">Dowiadujesz się o nowych funkcjach, gdy tylko są dostępne</translation> @@ -3900,6 +3903,7 @@ <translation id="4495419450179050807">Nie pokazuj na tej stronie</translation> <translation id="4497145443434063861">Komputer i Chromecast w różnych sieciach Wi-Fi (np. 2,4 GHz i 5 GHz)</translation> <translation id="4500114933761911433">We wtyczce <ph name="PLUGIN_NAME" /> wystąpił poważny błąd</translation> +<translation id="4500647907053779331">&Przetłumacz zaznaczony fragment na <ph name="LANGUAGE" /></translation> <translation id="450099669180426158">Ikona wykrzyknika</translation> <translation id="4501530680793980440">Potwierdź usunięcie</translation> <translation id="4502423230170890588">Usuń z tego urządzenia</translation> @@ -5716,6 +5720,7 @@ <translation id="617213288191670920">Nie dodano języków</translation> <translation id="6173623053897475761">Wpisz ponownie kod PIN</translation> <translation id="6175314957787328458">Identyfikator GUID domeny firmy Microsoft</translation> +<translation id="6177412385419165772">Usuwam…</translation> <translation id="6178664161104547336">Wybór certyfikatu</translation> <translation id="6178682841350631965">Twoje dane logowania zostały zaktualizowane</translation> <translation id="6180510783007738939">Narzędzie Linia</translation> @@ -6196,6 +6201,7 @@ <translation id="6619801788773578757">Dodaj aplikację kiosku</translation> <translation id="6619990499523117484">Potwierdź kod PIN</translation> <translation id="6620254580880484313">Nazwa kontenera</translation> +<translation id="6620927550847360014">Usunąć Bruschetta z urządzenia <ph name="DEVICE_TYPE" />?</translation> <translation id="6621391692573306628">Aby wysłać tę kartę na inne urządzenie, na obu urządzeniach zaloguj się w Chrome</translation> <translation id="6622980291894852883">Nadal blokuj pokazywanie grafik</translation> <translation id="6624036901798307345">W trybie tabletu kliknij przycisk licznika kart na pasku narzędzi, aby otworzyć nowy pasek kart z miniaturą każdej karty.</translation> @@ -6413,6 +6419,7 @@ <translation id="6818547713623251698">Wyświetlaj zdjęcia, pliki multimedialne, powiadomienia i aplikacje z telefonu</translation> <translation id="6818802132960437751">Wbudowana ochrona antywirusowa</translation> <translation id="6818920801736417483">Zapisać hasła?</translation> +<translation id="6820079682647046800">Nieudane uwierzytelnianie Kerberos</translation> <translation id="6823174134746916417">Kliknięcie przez dotknięcie touchpada</translation> <translation id="6824564591481349393">Kopiuj adres &e-mail</translation> <translation id="6824584962142919697">&Sprawdź elementy</translation> @@ -6565,6 +6572,7 @@ <translation id="6955698182324067397">Chcesz włączyć funkcje debugowania w Chrome OS. Spowoduje to włączenie demona sshd i umożliwi uruchamianie urządzenia z dysku USB.</translation> <translation id="6955893174999506273">Przypisz jeszcze 1 przełącznik</translation> <translation id="6957044667612803194">Ten klucz bezpieczeństwa nie obsługuje kodów PIN</translation> +<translation id="6960133692707095572">Wejdź bez biletu</translation> <translation id="6960507406838246615">Wymagana aktualizacja Linuksa</translation> <translation id="6960648667961844909">Nie udało się pobrać plików z mową w języku: <ph name="LANGUAGE" />. Spróbuję je pobrać później. Do momentu ukończenia pobierania mowa jest wysyłana do Google i tam przetwarzana.</translation> <translation id="696103774840402661">Wszystkie pliki i dane lokalne wszystkich użytkowników na tym urządzeniu <ph name="DEVICE_TYPE" /> zostały trwale usunięte.</translation> @@ -8027,6 +8035,7 @@ <translation id="8272443605911821513">Aby zarządzać zainstalowanymi rozszerzeniami, kliknij Rozszerzenia w menu Więcej narzędzi.</translation> <translation id="8272786333453048167">Zezwól ponownie</translation> <translation id="8273905181216423293">Pobierz</translation> +<translation id="827488840488530039">Strona, którą próbujesz odwiedzić, nie mogła zweryfikować Twoich biletów Kerberos</translation> <translation id="8274921654076766238">Lupa śledzi elementy wybrane za pomocą klawiatury</translation> <translation id="8274924778568117936">Nie wyłączaj ani nie zamykaj urządzenia <ph name="DEVICE_TYPE" /> do momentu ukończenia aktualizacji. Po zakończeniu instalacji <ph name="DEVICE_TYPE" /> uruchomi się ponownie.</translation> <translation id="8275038454117074363">Importuj</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 5950552..061c62af 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -1594,7 +1594,6 @@ <translation id="2356070529366658676">Perguntar</translation> <translation id="2357330829548294574">Remover <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Os sites podem usar o JavaScript</translation> -<translation id="2358703245148663432">Usar outro dispositivo</translation> <translation id="2358777858338503863">Clique para permitir em <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Os apps do Linux podem parar de responder.</translation> <translation id="2359345697448000899">Gerencie suas extensões clicando em Extensões no menu Ferramentas.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 19e4b905..0a6ee5b 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1580,7 +1580,6 @@ <translation id="2356070529366658676">Perguntar</translation> <translation id="2357330829548294574">Remover <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Os sites podem utilizar JavaScript</translation> -<translation id="2358703245148663432">Um dispositivo diferente</translation> <translation id="2358777858338503863">Clique para permitir em <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">As apps Linux podem deixar de responder.</translation> <translation id="2359345697448000899">Faça a gestão das suas extensões clicando em Extensões no menu Ferramentas.</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index ef0845b..d18a7cc1 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -69,6 +69,7 @@ <translation id="1059484610606223931">Hypertext Transport Protocol (HTTPS)</translation> <translation id="1059944192885972544">S-au găsit <ph name="NUM" /> file pentru „<ph name="SEARCH_TEXT" />”</translation> <translation id="1060292118287751956">Stabilește frecvența actualizării ecranului</translation> +<translation id="1060570945511946595">Gestionează certificatele</translation> <translation id="1061130374843955397">Bun venit la <ph name="DEVICE_TYPE" /></translation> <translation id="1061373870045429865">Creează un cod QR pentru acest link</translation> <translation id="1061904396131502319">Se apropie timpul pentru o pauză</translation> @@ -1115,6 +1116,7 @@ <translation id="1975841812214822307">Elimină...</translation> <translation id="1976150099241323601">Conectează-te la dispozitivul de securitate</translation> <translation id="1977965994116744507">Pentru a debloca dispozitivul <ph name="DEVICE_TYPE" />, apropie mai mult telefonul.</translation> +<translation id="1978666928180318515">Elimină Bruschetta</translation> <translation id="1979095679518582070">Dezactivarea acestei funcții nu afectează capacitatea dispozitivului de a trimite informațiile necesare pentru servicii esențiale, cum ar fi actualizările de sistem și securitate.</translation> <translation id="1979280758666859181">Treceți la un canal cu o versiune <ph name="PRODUCT_NAME" /> mai veche. Schimbarea canalului se va aplica atunci când versiunea canalului va corespunde cu versiunea instalată în prezent pe dispozitiv.</translation> <translation id="197989455406964291">KDC nu acceptă tipul de criptare</translation> @@ -1579,7 +1581,6 @@ <translation id="2356070529366658676">Întreabă-mă</translation> <translation id="2357330829548294574">Șterge utilizatorul <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Site-urile pot folosi JavaScript</translation> -<translation id="2358703245148663432">Alt dispozitiv</translation> <translation id="2358777858338503863">Dă clic pentru a permite pe <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Este posibil ca aplicațiile Linux să devină inactive.</translation> <translation id="2359345697448000899">Gestionați extensiile făcând clic pe Extensii în meniul Instrumente.</translation> @@ -1919,6 +1920,7 @@ <translation id="2672142220933875349">Fișier crx incorect. Despachetarea nu a reușit.</translation> <translation id="2673135533890720193">Citește istoricul de navigare</translation> <translation id="2674764818721168631">Dezactivat</translation> +<translation id="2675570801872027281">Eroare la eliminarea Bruschetta. Încearcă din nou.</translation> <translation id="2676492189600898281">Trimite feedback despre completarea automată</translation> <translation id="2678063897982469759">Reactivează</translation> <translation id="2678100101831051676">Nu se poate proiecta.</translation> @@ -2917,6 +2919,7 @@ <translation id="3593965109698325041">Limitări privind numele certificatului</translation> <translation id="3596012367874587041">Setările aplicației</translation> <translation id="3596414637720633074">Blochează cookie-urile terță parte în modul incognito</translation> +<translation id="3598010454707842106">Dă clic pe Personalizează Chrome</translation> <translation id="3599221874935822507">În relief</translation> <translation id="3600051066689725006">Informații despre solicitarea web</translation> <translation id="360180734785106144">să ofere noi caracteristici pe măsură ce devin disponibile;</translation> @@ -3914,6 +3917,7 @@ <translation id="4495419450179050807">Nu afișa pe această pagină</translation> <translation id="4497145443434063861">PC și Chromecast în rețele Wi-Fi diferite (de ex., 2,4 GHz și 5 GHz)</translation> <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> s-a blocat</translation> +<translation id="4500647907053779331">&Tradu selecția în <ph name="LANGUAGE" /></translation> <translation id="450099669180426158">Pictogramă semn de exclamare</translation> <translation id="4501530680793980440">Confirmați eliminarea</translation> <translation id="4502423230170890588">Elimină de pe acest dispozitiv</translation> @@ -5731,6 +5735,7 @@ <translation id="617213288191670920">Nu s-au adăugat limbi</translation> <translation id="6173623053897475761">Introdu din nou codul PIN</translation> <translation id="6175314957787328458">GUID domeniu Microsoft</translation> +<translation id="6177412385419165772">Se elimină...</translation> <translation id="6178664161104547336">Selectează un certificat</translation> <translation id="6178682841350631965">Datele de conectare au fost actualizate</translation> <translation id="6180510783007738939">Instrument pentru linii</translation> @@ -6209,6 +6214,7 @@ <translation id="6619801788773578757">Adaugă o aplicație de tip chioșc</translation> <translation id="6619990499523117484">Confirmă codul PIN</translation> <translation id="6620254580880484313">Numele containerului</translation> +<translation id="6620927550847360014">Elimini Bruschetta de pe <ph name="DEVICE_TYPE" />?</translation> <translation id="6621391692573306628">Pentru a trimite această filă pe alt dispozitiv, conectează-te la Chrome pe ambele dispozitive</translation> <translation id="6622980291894852883">Continuă blocarea imaginilor</translation> <translation id="6624036901798307345">În modul tabletă, atinge butonul contorului de file din bara de instrumente pentru a deschide noua bară de file care afișează miniaturi pentru fiecare filă.</translation> @@ -6426,6 +6432,7 @@ <translation id="6818547713623251698">Afișează fotografiile, conținutul media, notificările și aplicațiile de pe telefon</translation> <translation id="6818802132960437751">Protecție antivirus încorporată</translation> <translation id="6818920801736417483">Salvezi parolele?</translation> +<translation id="6820079682647046800">Autentificarea Kerberos nu a reușit</translation> <translation id="6823174134746916417">Atingerea pentru clic pe touchpad</translation> <translation id="6824564591481349393">Copiază adresa de &e-mail</translation> <translation id="6824584962142919697">&Inspectează elementele</translation> @@ -6580,6 +6587,7 @@ <translation id="6955698182324067397">Activezi funcțiile de remediere a erorilor în sistemul de operare Chrome, care vor configura SSH daemon și vor activa pornirea de pe unități USB.</translation> <translation id="6955893174999506273">Atribuie încă un comutator</translation> <translation id="6957044667612803194">Această cheie de securitate nu acceptă coduri PIN</translation> +<translation id="6960133692707095572">Accesează fără certificat</translation> <translation id="6960507406838246615">Este necesară o actualizare Linux</translation> <translation id="6960648667961844909">Nu s-au putut descărca fișierele de redare în scris a vorbirii în <ph name="LANGUAGE" />. Se va încerca descărcarea mai târziu. Fișierele de redare în scris a vorbirii sunt trimise la Google pentru procesare până la finalizarea descărcării.</translation> <translation id="696103774840402661">Toate fișierele și datele locale pentru utilizatorii de pe acest <ph name="DEVICE_TYPE" /> au fost șterse definitiv.</translation> @@ -8042,6 +8050,7 @@ <translation id="8272443605911821513">Gestionați extensiile dând clic pe Extensii în meniul „Mai multe instrumente”.</translation> <translation id="8272786333453048167">Permite din nou</translation> <translation id="8273905181216423293">Descarcă acum</translation> +<translation id="827488840488530039">Pagina pe care încerci să o accesezi nu a putut verifica certificatele Kerberos</translation> <translation id="8274921654076766238">Lupa urmează după focalizarea de la tastatură</translation> <translation id="8274924778568117936">Nu închide și nu opri dispozitivul <ph name="DEVICE_TYPE" /> înainte să se finalizeze actualizarea. Dispozitivul <ph name="DEVICE_TYPE" /> va reporni după ce se finalizează instalarea.</translation> <translation id="8275038454117074363">Importă</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index fcac18d..d79d3e9 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1580,7 +1580,6 @@ <translation id="2356070529366658676">Спрашивать</translation> <translation id="2357330829548294574">Удалить пользователя <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Разрешить сайтам использовать JavaScript</translation> -<translation id="2358703245148663432">Другое устройство</translation> <translation id="2358777858338503863">Нажмите, чтобы разрешить расширению доступ к сайту <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Приложения Linux могут перестать отвечать.</translation> <translation id="2359345697448000899">Управлять расширениями можно на вкладке "Расширения" в меню "Инструменты".</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 244b01d..110610c 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -380,6 +380,7 @@ <translation id="1339009753652684748">ඔබ "Hey Google" යැයි කියන විට ඔබගේ සහායක වෙත ප්රවේශ වන්න බැටරිය සුරැකීමට, “ක්රියාත්මකයි (නිර්දේශිතයි)” තෝරන්න. ඔබගේ සහායක ඔබගේ උපාංගය පේනුගත කර ඇති විට හෝ ආරෝපණ වන විට පමණක් ප්රතිචාර දක්වයි.</translation> <translation id="13392265090583506">A11y</translation> <translation id="1340527397989195812">ගොනු යෙදුම භාවිතයෙන් උපාංගයේ මාධ්යය උපස්ථ කරන්න.</translation> +<translation id="1341701348342335220">හොඳින් නිම කළා!</translation> <translation id="1341871421050612057"><ph name="USERNAME" /> සමග සමමුහුර්ත කළ නොහැක</translation> <translation id="1343865611738742294">USB උපාංගවලට ප්රවේශ වීමට ලිනක්ස් යෙදුම්වලට අවසර දෙන්න. USB උපාංගයක් ඉවත් කළ පසු ලිනක්ස් එය මතක තබා ගන්නේ නැත.</translation> <translation id="1343920184519992513">ඔබ නතර කළ තැනින් ඉදිරියට ගොස් නිශ්චිත පිටු කට්ටලයක් විවෘත කරන්න</translation> @@ -1581,7 +1582,6 @@ <translation id="2356070529366658676">විමසන්න</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> ඉවත් කරන්න</translation> <translation id="2358561147588818967">අඩවිවලට ජාවාස්ක්රිප්ට් භාවිත කළ හැකිය</translation> -<translation id="2358703245148663432">වෙනස් උපාංගයක්</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> මත ඉඩ දීමට ක්ලික් කරන්න:</translation> <translation id="2359071692152028734">Linux යෙදුම් ප්රතිචාරාත්මක නොවිය හැකිය.</translation> <translation id="2359345697448000899">මෙවලම් මෙනුවේ දිගු ක්ලික් කර ඔබේ දිගු කළමණාකරණය කරන්න.</translation> @@ -3630,6 +3630,7 @@ <translation id="4232375817808480934">Kerberos වින්යාස කරන්න</translation> <translation id="4235965441080806197">පිරීම අවලංගු කරන්න</translation> <translation id="4236163961381003811">තවත් දිගු සොයා ගන්න</translation> +<translation id="4237282663517880406">Google Drive යෝජනා පෙන්වන්න</translation> <translation id="4241182343707213132">සංවිධානයේ යෙදුම් යාවත්කාලීන කිරීමට යළි අරඹන්න</translation> <translation id="4242145785130247982">බහුවිධ සේවාලාභී සහතිකවලට සහය නොදැක්වේ</translation> <translation id="4242533952199664413">සැකසීම් විවෘත කරන්න</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 60bd8d6..00b7756 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1580,7 +1580,6 @@ <translation id="2356070529366658676">Opýtať sa</translation> <translation id="2357330829548294574">Odobrať používateľa <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Weby môžu používať JavaScript</translation> -<translation id="2358703245148663432">Iné zariadenie</translation> <translation id="2358777858338503863">Kliknutím povolíte prístup na <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Aplikácie pre Linux nemusia reagovať.</translation> <translation id="2359345697448000899">Ak chcete spravovať rozšírenia, kliknite na možnosť Rozšírenia v ponuke Nástroje.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 811029d..7995de32 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -69,6 +69,7 @@ <translation id="1059484610606223931">Protokol HTTPS</translation> <translation id="1059944192885972544">Najdeno je bilo toliko zavihkov za »<ph name="SEARCH_TEXT" />«: <ph name="NUM" />.</translation> <translation id="1060292118287751956">Določi hitrost osveževanja zaslona</translation> +<translation id="1060570945511946595">Upravljanje vstopnic</translation> <translation id="1061130374843955397">Pozdravljeni v napravi <ph name="DEVICE_TYPE" /></translation> <translation id="1061373870045429865">Ustvari kodo QR za to povezavo</translation> <translation id="1061904396131502319">Skoraj je že čas za odmor</translation> @@ -382,6 +383,7 @@ <translation id="1339009753652684748">Dostopajte do Pomočnika, ko izgovorite »Hey Google«. Zaradi varčevanja z energijo akumulatorja izberite »Vklopljeno (priporočeno)«. Pomočnik se bo odzval samo, ko je naprava priklopljena ali se polni njen akumulator.</translation> <translation id="13392265090583506">Funkcije za ljudi s posebnimi potrebami</translation> <translation id="1340527397989195812">Varnostno kopiranje predstavnosti v napravi z aplikacijo Datoteke.</translation> +<translation id="1341701348342335220">Dobro ste opravili.</translation> <translation id="1341871421050612057">Ni mogoče sinhronizirati z uporabnikom <ph name="USERNAME" /></translation> <translation id="1343865611738742294">Omogočanje, da aplikacije za Linux dostopajo do naprav USB. Linux si ne zapomni naprave USB, ko jo odstranite.</translation> <translation id="1343920184519992513">Nadaljuj prejšnjo sejo in odprti določen nabor strani</translation> @@ -1128,6 +1130,7 @@ <translation id="1975841812214822307">Odstrani ...</translation> <translation id="1976150099241323601">Prijava v varnostno napravo</translation> <translation id="1977965994116744507">Približajte telefon, če želite odkleniti napravo <ph name="DEVICE_TYPE" />.</translation> +<translation id="1978666928180318515">Odstranitev Bruschette</translation> <translation id="1979095679518582070">Izklop te funkcije ne vpliva na zmožnost te naprave, da pošilja podatke, potrebne za ključne storitve, kot so posodobitve in varnost sistema.</translation> <translation id="1979280758666859181">Preklapljate na kanal s starejšo različico brskalnika <ph name="PRODUCT_NAME" />. Sprememba kanala bo uporabljena, ko se različica kanala ujema z različico, ki je trenutno nameščena v vaši napravi.</translation> <translation id="197989455406964291">KDC ne podpira vrste šifriranja</translation> @@ -1595,7 +1598,6 @@ <translation id="2356070529366658676">Vprašaj</translation> <translation id="2357330829548294574">Odstranitev uporabnika <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Spletna mesta lahko uporabljajo JavaScript.</translation> -<translation id="2358703245148663432">Druga naprava</translation> <translation id="2358777858338503863">Kliknite, da omogočite v »<ph name="ORIGIN" />«:</translation> <translation id="2359071692152028734">Aplikacije za Linux lahko postanejo neodzivne.</translation> <translation id="2359345697448000899">Razširitve lahko upravljate tako, da v meniju z orodji kliknete »Razširitve«.</translation> @@ -1935,6 +1937,7 @@ <translation id="2672142220933875349">Poškodovana datoteka crx. Odpakiranje ni uspelo.</translation> <translation id="2673135533890720193">Branje zgodovine brskanja</translation> <translation id="2674764818721168631">Izklopljeno</translation> +<translation id="2675570801872027281">Napaka pri odstranjevanju Bruschette. Poskusite znova.</translation> <translation id="2676492189600898281">Pošlji povratne informacije glede samodejnega izpolnjevanja</translation> <translation id="2678063897982469759">Znova omogoči</translation> <translation id="2678100101831051676">Ni mogoče predvajati.</translation> @@ -2933,6 +2936,7 @@ <translation id="3593965109698325041">Omejitve imena potrdila</translation> <translation id="3596012367874587041">Nastavitve aplikacije</translation> <translation id="3596414637720633074">Blokiranje piškotkov drugih mest v anonimnem načinu</translation> +<translation id="3598010454707842106">Kliknite »Prilagajanje Chroma«.</translation> <translation id="3599221874935822507">Dvignjeno</translation> <translation id="3600051066689725006">Podatki o spletni zahtevi</translation> <translation id="360180734785106144">Ponujanje novih funkcij, ko so na voljo</translation> @@ -3643,6 +3647,7 @@ <translation id="4232375817808480934">Konfiguriranje storitve Kerberos</translation> <translation id="4235965441080806197">Prekliči prijavo</translation> <translation id="4236163961381003811">Odkrijte več razširitev</translation> +<translation id="4237282663517880406">Pokaži predloge v Googlu Drive</translation> <translation id="4241182343707213132">Znova zaženite, če želite posodobiti aplikacije organizacije</translation> <translation id="4242145785130247982">Več potrdil odjemalca ni podprtih</translation> <translation id="4242533952199664413">Odpri nastavitve</translation> @@ -3930,6 +3935,7 @@ <translation id="4497145443434063861">Računalnik in Chromecast v različnih omrežjih Wi-Fi (npr. 2,4 GHz in 5 GHz)</translation> <translation id="4500114933761911433">Vtičnik <ph name="PLUGIN_NAME" /> se je zrušil</translation> +<translation id="4500647907053779331">&Prevedi izbor v jezik <ph name="LANGUAGE" /></translation> <translation id="450099669180426158">Ikona klicaja</translation> <translation id="4501530680793980440">Potrditev odstranitve</translation> <translation id="4502423230170890588">Odstrani iz naprave</translation> @@ -3960,6 +3966,7 @@ <translation id="4522890784888918985">Podrejeni računi niso podprti.</translation> <translation id="4523876148417776526">Seznami spletnih mest XML še niso bili pridobljeni.</translation> <translation id="4524832533047962394">Ta različica operacijskega sistema ne podpira navedenega načina včlanitve. Poskrbite, da imate nameščeno najnovejšo različico.</translation> +<translation id="4526051299161934899">Skrite skupine shranjenih zavihkov</translation> <translation id="4526853756266614740">Izberite sliko, če želite takoj uporabiti temo.</translation> <translation id="452750746583162491">Pregled sinhroniziranih podatkov</translation> <translation id="4527929807707405172">Omogoči obratno pomikanje. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> @@ -5749,6 +5756,7 @@ <translation id="617213288191670920">Noben jezik ni dodan</translation> <translation id="6173623053897475761">Znova vnesite kodo PIN</translation> <translation id="6175314957787328458">GUID Microsoftove domene</translation> +<translation id="6177412385419165772">Odstranjevanje …</translation> <translation id="6178664161104547336">Izberite potrdilo</translation> <translation id="6178682841350631965">Podatki za prijavo so bili posodobljeni</translation> <translation id="6180510783007738939">Orodje za črte</translation> @@ -6231,6 +6239,7 @@ <translation id="6619801788773578757">Dodaj aplikacijo za kiosk</translation> <translation id="6619990499523117484">Potrdite kodo PIN</translation> <translation id="6620254580880484313">Ime vsebnika</translation> +<translation id="6620927550847360014">Ali želite odstraniti Bruschetto iz naprave <ph name="DEVICE_TYPE" />?</translation> <translation id="6621391692573306628">Če želite ta zavihek poslati v drugo napravo, se v obeh napravah prijavite v Chrome.</translation> <translation id="6622980291894852883">Še naprej blokiraj slike</translation> <translation id="6624036901798307345">V načinu tabličnega računalnika se dotaknite gumba za štetje zavihkov v orodni vrstici, če želite odpreti nov trak z zavihki, ki prikazuje sličice posameznih zavihkov.</translation> @@ -6448,6 +6457,7 @@ <translation id="6818547713623251698">Ogled fotografij, predstavnosti, obvestil in aplikacij telefona.</translation> <translation id="6818802132960437751">Vgrajena protivirusna zaščita</translation> <translation id="6818920801736417483">Želite shraniti gesla?</translation> +<translation id="6820079682647046800">Preverjanje pristnosti za Kerberos ni uspelo</translation> <translation id="6823174134746916417">Klikanje z dotikom sledilne ploščice</translation> <translation id="6824564591481349393">Kopiraj &e-poštni naslov</translation> <translation id="6824584962142919697">&Pregled elementov</translation> @@ -6602,6 +6612,7 @@ <translation id="6955698182324067397">Omogočili boste funkcije za odpravljanje napak sistema Chrome OS, tako da boste nastavili sshd daemon in omogočili zagon prek pogonov USB.</translation> <translation id="6955893174999506273">Dodelitev še enega stikala</translation> <translation id="6957044667612803194">Ta varnostni ključ ne podpira kod PIN</translation> +<translation id="6960133692707095572">Obisk brez kartončka</translation> <translation id="6960507406838246615">Potrebna je posodobitev Linuxa</translation> <translation id="6960648667961844909">Ni bilo mogoče prenesti datotek za govor za jezik <ph name="LANGUAGE" />. Poskus prenosa bo izveden pozneje. Govor je poslan Googlu v obdelavo, dokler prenos ni dokončan.</translation> <translation id="696103774840402661">Vse datoteke in lokalni podatki za vse uporabnike v tej napravi <ph name="DEVICE_TYPE" /> so bili trajno izbrisani.</translation> @@ -8064,6 +8075,7 @@ <translation id="8272443605911821513">Razširitve lahko upravljate tako, da v meniju »Več orodij« kliknete »Razširitve«.</translation> <translation id="8272786333453048167">Znova omogoči</translation> <translation id="8273905181216423293">Prenos</translation> +<translation id="827488840488530039">Stran, ki jo poskušate obiskati, ni mogla preveriti kartončkov za Kerberos.</translation> <translation id="8274921654076766238">Lupa spremlja izbiro na tipkovnici</translation> <translation id="8274924778568117936">Ne izklopite ali zaprite naprave <ph name="DEVICE_TYPE" />, dokler se posodobitev ne konča. Naprava <ph name="DEVICE_TYPE" /> se bo po končani namestitvi znova zagnala.</translation> <translation id="8275038454117074363">Uvozi</translation> @@ -8510,6 +8522,7 @@ <translation id="869884720829132584">Meni programov</translation> <translation id="869891660844655955">Datum izteka</translation> <translation id="8699188901396699995">PPD za <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">Meni s skritimi skupinami shranjenih zavihkov</translation> <translation id="8702825062053163569">Vaša naprava <ph name="DEVICE_TYPE" /> je bila zaklenjena.</translation> <translation id="8703346390800944767">Preskoči oglas</translation> <translation id="8705331520020532516">Serijska številka</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 53d0d04..bd73067 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -1575,7 +1575,6 @@ <translation id="2356070529366658676">Pyet</translation> <translation id="2357330829548294574">Hiqe <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Sajtet mund të përdorin JavaScript</translation> -<translation id="2358703245148663432">Një pajisje tjetër</translation> <translation id="2358777858338503863">Kliko për të lejuar në <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Aplikacionet e Linux mund të bëhen joreaguese.</translation> <translation id="2359345697448000899">Menaxho shtesat duke klikuar "Shtesat" në menynë e "Veglave".</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 5856774f..d77e537 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -1577,7 +1577,6 @@ <translation id="2356070529366658676">Pitaj</translation> <translation id="2357330829548294574">Uklonite korisnika <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Sajtovi mogu da koriste JavaScript</translation> -<translation id="2358703245148663432">Drugi uređaj</translation> <translation id="2358777858338503863">Kliknite da biste dozvolili na <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux aplikacije mogu da prestanu da reaguju.</translation> <translation id="2359345697448000899">Upravljajte dodacima klikom na stavku Dodaci u meniju Alatke.</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index fd331fb..f92987c 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1577,7 +1577,6 @@ <translation id="2356070529366658676">Питај</translation> <translation id="2357330829548294574">Уклоните корисника <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Сајтови могу да користе JavaScript</translation> -<translation id="2358703245148663432">Други уређај</translation> <translation id="2358777858338503863">Кликните да бисте дозволили на <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux апликације могу да престану да реагују.</translation> <translation id="2359345697448000899">Управљајте додацима кликом на ставку Додаци у менију Алатке.</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 3067849..63b78a5f 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1592,7 +1592,6 @@ <translation id="2356070529366658676">Fråga</translation> <translation id="2357330829548294574">Ta bort <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Webbplatser får använda JavaScript</translation> -<translation id="2358703245148663432">En annan enhet</translation> <translation id="2358777858338503863">Klicka för att tillåta på <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux-appar kan sluta att svara.</translation> <translation id="2359345697448000899">Hantera tillägg genom att klicka på Tillägg på menyn Verktyg.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 3300f93..be72bff 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1589,7 +1589,6 @@ <translation id="2356070529366658676">Uliza</translation> <translation id="2357330829548294574">Ondoa <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Tovuti zinaweza kutumia JavaScript</translation> -<translation id="2358703245148663432">Kifaa tofauti</translation> <translation id="2358777858338503863">Bofya ili uruhusu kwenye <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Huenda programu za Linux zikaacha kufanya kazi.</translation> <translation id="2359345697448000899">Dhibiti viendelezi vyako kwa kubofya Viendelezi katika menyu ya Zana.</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 6137fa3..f1ae52f2 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1592,7 +1592,6 @@ <translation id="2356070529366658676">கேள்</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> ஐ அகற்றும்</translation> <translation id="2358561147588818967">Javascriptடைப் பயன்படுத்த தளங்கள் அனுமதி கேட்க வேண்டும்</translation> -<translation id="2358703245148663432">வேறொரு சாதனம்</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> தளத்தில் அனுமதிக்க கிளிக் செய்யவும்:</translation> <translation id="2359071692152028734">Linux ஆப்ஸ் செயல்படாமல் போகக்கூடும்.</translation> <translation id="2359345697448000899">கருவிகள் மெனுவில் நீட்டிப்புகள் என்பதைக் கிளிக் செய்து நீட்டிப்புகளை நிர்வகிக்கவும்.</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 619038c..09141130 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1593,7 +1593,6 @@ <translation id="2356070529366658676">అడుగు</translation> <translation id="2357330829548294574"><ph name="USER_NAME" />ను తీసివేయండి</translation> <translation id="2358561147588818967">సైట్లు JavaScriptను ఉపయోగించగలవు</translation> -<translation id="2358703245148663432">వేరే పరికరం</translation> <translation id="2358777858338503863"><ph name="ORIGIN" />లో అనుమతించడానికి క్లిక్ చేయండి:</translation> <translation id="2359071692152028734">Linux యాప్లు ప్రతిస్పందించకపోవచ్చు.</translation> <translation id="2359345697448000899">'సాధనాలు' మెనూలోని ఎక్స్టెన్షన్లను క్లిక్ చేయడం ద్వారా మీ ఎక్స్టెన్షన్లను నిర్వహించండి.</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 35aa01e..35ffa2e 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1580,7 +1580,6 @@ <translation id="2356070529366658676">ถาม</translation> <translation id="2357330829548294574">นำ <ph name="USER_NAME" /> ออก</translation> <translation id="2358561147588818967">เว็บไซต์ใช้ JavaScript ได้</translation> -<translation id="2358703245148663432">อุปกรณ์อื่น</translation> <translation id="2358777858338503863">คลิกเพื่ออนุญาตบน <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">แอป Linux อาจไม่ตอบสนอง</translation> <translation id="2359345697448000899">จัดการส่วนขยายของคุณโดยคลิกที่ "ส่วนขยาย" ในเมนู "เครื่องมือ"</translation> @@ -3948,6 +3947,7 @@ <translation id="4522890784888918985">ไม่รองรับบัญชีย่อย</translation> <translation id="4523876148417776526">ยังไม่ได้ดึงข้อมูลรายการเว็บไซต์ XML</translation> <translation id="4524832533047962394">ระบบปฏิบัติการเวอร์ชันนี้ไม่รองรับโหมดการลงทะเบียนที่กำหนด โปรดตรวจสอบว่าคุณใช้เวอร์ชันล่าสุดอยู่</translation> +<translation id="4526051299161934899">กลุ่มแท็บที่บันทึกไว้ซึ่งซ่อนอยู่</translation> <translation id="4526853756266614740">เลือกรูปภาพเพื่อใช้ธีมในทันที</translation> <translation id="452750746583162491">ตรวจสอบข้อมูลที่ซิงค์</translation> <translation id="4527929807707405172">เปิดใช้การเลื่อนแบบ "กลับด้าน" <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> @@ -4272,6 +4272,7 @@ <translation id="4824037980212326045">การสำรองและกู้คืนข้อมูลใน Linux</translation> <translation id="4824958205181053313">ยกเลิกการซิงค์ใช่ไหม</translation> <translation id="4825532258163983651">ลบพาสคีย์ไม่ได้</translation> +<translation id="4827283332383516812">ลบบัตร</translation> <translation id="4827675678516992122">เชื่อมต่อไม่ได้</translation> <translation id="4827784381479890589">การตรวจตัวสะกดที่ผ่านการเพิ่มประสิทธิภาพในเบราว์เซอร์ Chrome (ระบบจะส่งข้อความไปยัง Google เพื่อรับคำแนะนำในการสะกด)</translation> <translation id="4827904420700932487">สร้างคิวอาร์โค้ดสำหรับรูปภาพนี้</translation> @@ -5298,6 +5299,7 @@ <translation id="5792295754950501287">การดำเนินการเพิ่มเติมสำหรับ<ph name="CARD_DESCRIPTION" /></translation> <translation id="5792728279623964091">โปรดแตะปุ่มเปิด/ปิด</translation> <translation id="5792874008054171483">การดำเนินการเพิ่มเติมสำหรับ <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">ระบบจะลบวิธีการชำระเงินนี้ออกจากอุปกรณ์</translation> <translation id="5793339252089865437">หากดาวน์โหลดอัปเดตผ่านเครือข่ายมือถือ อาจทำให้มีค่าบริการเน็ตมือถือเพิ่มเติม</translation> <translation id="5793420564274426163">การยืนยันการจับคู่</translation> <translation id="5793430094159150686">เปลี่ยนรหัสผ่านแล้ว คุณต้องป้อนรหัสผ่านเก่าหากต้องการกู้คืนข้อมูลในเครื่อง</translation> @@ -7275,6 +7277,7 @@ <translation id="7609148976235050828">โปรดเชื่อมต่ออินเทอร์เน็ตและลองอีกครั้ง</translation> <translation id="7612401678989660900">อนุญาตให้เข้าถึงสำหรับแอปและเว็บไซต์ที่มีสิทธิ์เข้าถึงไมโครโฟน</translation> <translation id="7612655942094160088">เปิดใช้ฟีเจอร์ของโทรศัพท์ที่เชื่อมต่ออยู่</translation> +<translation id="7612989789287281429">กำลังลงชื่อเข้าใช้…</translation> <translation id="7614260613810441905">ถามเมื่อเว็บไซต์ต้องการแก้ไขไฟล์หรือโฟลเดอร์ในอุปกรณ์ (แนะนำ)</translation> <translation id="761530003705945209">สำรองข้อมูลไปที่ Google ไดรฟ์ กู้คืนข้อมูลหรือเปลี่ยนอุปกรณ์ได้ง่ายๆ ทุกเมื่อ ข้อมูลสำรองจะมีข้อมูลแอปอยู่ด้วย ข้อมูลสำรองดังกล่าวจะอัปโหลดขึ้น Google และเข้ารหัสโดยใช้รหัสผ่านบัญชี Google</translation> <translation id="7615365294369022248">เกิดข้อผิดพลาดในการเพิ่มบัญชี</translation> @@ -8492,6 +8495,7 @@ <translation id="869884720829132584">เมนูของแอปพลิเคชัน</translation> <translation id="869891660844655955">วันหมดอายุ</translation> <translation id="8699188901396699995">PPD ของ <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">เมนูมีกลุ่มแท็บที่บันทึกไว้ซึ่งซ่อนอยู่</translation> <translation id="8702825062053163569">ล็อก <ph name="DEVICE_TYPE" /> แล้ว</translation> <translation id="8703346390800944767">ข้ามโฆษณา</translation> <translation id="8705331520020532516">หมายเลขซีเรียล</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 187279e..618f20f7 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -69,6 +69,7 @@ <translation id="1059484610606223931">HyperText Aktarım Protokolü (HTTPS)</translation> <translation id="1059944192885972544">"<ph name="SEARCH_TEXT" />" İçin <ph name="NUM" /> Sekme Bulundu</translation> <translation id="1060292118287751956">Ekranın güncellenme sıklığını belirler</translation> +<translation id="1060570945511946595">Biletleri yönetin</translation> <translation id="1061130374843955397"><ph name="DEVICE_TYPE" /> cihazınıza hoş geldiniz</translation> <translation id="1061373870045429865">Bu bağlantı için QR kodu oluştur</translation> <translation id="1061904396131502319">Mola verme zamanı yaklaştı</translation> @@ -377,6 +378,7 @@ <translation id="1339009753652684748">Asistanınıza "Ok Google" diyerek erişin. Pilden tasarruf etmek için “Açık (Önerilen)” seçeneğini belirleyin. Asistanınız, yalnızca cihazınız güç kaynağına bağlıyken veya şarj olurken yanıt verir.</translation> <translation id="13392265090583506">A11y</translation> <translation id="1340527397989195812">Dosyalar uygulamasını kullanarak cihazdaki medyayı yedekleyin.</translation> +<translation id="1341701348342335220">Tebrikler!</translation> <translation id="1341871421050612057"><ph name="USERNAME" /> ile senkronize edilemiyor</translation> <translation id="1343865611738742294">Linux uygulamalarına USB cihazlarına erişim izni verin. Linux, kaldırılan USB cihazları daha sonra hatırlamaz.</translation> <translation id="1343920184519992513">Kaldığım yerden devam et ve belirli bir sayfa grubunu aç</translation> @@ -1113,6 +1115,7 @@ <translation id="1975841812214822307">Kaldır...</translation> <translation id="1976150099241323601">Güvenlik Cihazında oturum açın</translation> <translation id="1977965994116744507"><ph name="DEVICE_TYPE" /> cihazınızın kilidini açmak için telefonunuzu cihaza yaklaştırın.</translation> +<translation id="1978666928180318515">Bruschetta'yı kaldırın</translation> <translation id="1979095679518582070">Bu özelliğin kapatılması, bu cihazın sistem güncellemeleri ve güvenlik gibi önemli hizmetler için gereken bilgileri gönderme özelliğini etkilemez.</translation> <translation id="1979280758666859181"><ph name="PRODUCT_NAME" /> ürününün eski sürümünü destekleyen bir kanala geçiyorsunuz. Kanal değişikliği, kanalın sürümü cihazınızda şu an yüklenmiş olan sürümle eşleştiğinde uygulanacak.</translation> <translation id="197989455406964291">KDC, şifreleme türünü desteklemiyor</translation> @@ -1575,7 +1578,6 @@ <translation id="2356070529366658676">Sor</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> adlı kullanıcıyı kaldır</translation> <translation id="2358561147588818967">Siteler JavaScript kullanabilir</translation> -<translation id="2358703245148663432">Farklı bir cihaz</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> sitesinde izin vermek için tıklayın:</translation> <translation id="2359071692152028734">Linux uygulamaları yanıt vermeyebilir.</translation> <translation id="2359345697448000899">Araçlar menüsünden Uzantılar'ı tıklayarak uzantılarınızı yönetin.</translation> @@ -1915,6 +1917,7 @@ <translation id="2672142220933875349">Crx dosyası bozuk, paket açma işlemi başarısız oldu.</translation> <translation id="2673135533890720193">Göz atma geçmişinizi okuma</translation> <translation id="2674764818721168631">Kapalı</translation> +<translation id="2675570801872027281">Bruschetta kaldırılırken hata oluştu. Lütfen tekrar deneyin.</translation> <translation id="2676492189600898281">Otomatik doldurmayla ilgili geri bildirim verin</translation> <translation id="2678063897982469759">Tekrar etkinleştir</translation> <translation id="2678100101831051676">Yayınlayamıyor.</translation> @@ -2913,6 +2916,7 @@ <translation id="3593965109698325041">Sertifika Adı Kısıtlamaları</translation> <translation id="3596012367874587041">Uygulama ayarları</translation> <translation id="3596414637720633074">Gizli modda üçüncü taraf çerezlerini engelle</translation> +<translation id="3598010454707842106">"Chrome'u özelleştir"i tıklayın</translation> <translation id="3599221874935822507">Yükseltilmiş</translation> <translation id="3600051066689725006">Web istek bilgisi</translation> <translation id="360180734785106144">Kullanıma sunuldukça yeni özellikleri teklif etme</translation> @@ -3623,6 +3627,7 @@ <translation id="4232375817808480934">Kerberos'u yapılandırın</translation> <translation id="4235965441080806197">Oturum açmayı iptal et</translation> <translation id="4236163961381003811">Daha fazla uzantı keşfedin</translation> +<translation id="4237282663517880406">Google Drive önerilerini göster</translation> <translation id="4241182343707213132">Kuruluşun uygulamalarını güncellemek için yeniden başlatın</translation> <translation id="4242145785130247982">Birden fazla istemci sertifikası desteklenmiyor</translation> <translation id="4242533952199664413">Ayarları aç</translation> @@ -3909,6 +3914,7 @@ <translation id="4495419450179050807">Bu sayfada gösterme</translation> <translation id="4497145443434063861">PC ve Chromecast farklı kablosuz ağlar üzerinde (ör. 2,4 GHz ile 5 GHz)</translation> <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> eklentisi kilitlendi</translation> +<translation id="4500647907053779331">Seçimi <ph name="LANGUAGE" /> diline çevir</translation> <translation id="450099669180426158">Ünlem işareti simgesi</translation> <translation id="4501530680793980440">Kaldırmayı Onaylayın</translation> <translation id="4502423230170890588">Bu cihazdan kaldır</translation> @@ -5727,6 +5733,7 @@ <translation id="617213288191670920">Dil eklenmedi</translation> <translation id="6173623053897475761">PIN'inizi tekrar yazın</translation> <translation id="6175314957787328458">Microsoft Etki Alanı GUID'si</translation> +<translation id="6177412385419165772">Kaldırılıyor...</translation> <translation id="6178664161104547336">Sertifika seç</translation> <translation id="6178682841350631965">Oturum açma verileriniz güncellendi</translation> <translation id="6180510783007738939">Çizgi Aracı</translation> @@ -6203,6 +6210,7 @@ <translation id="6619801788773578757">Kiosk uygulaması ekle</translation> <translation id="6619990499523117484">PIN'inizi onaylayın</translation> <translation id="6620254580880484313">Kapsayıcı adı</translation> +<translation id="6620927550847360014">Bruschetta, <ph name="DEVICE_TYPE" /> cihazınızdan kaldırılsın mı?</translation> <translation id="6621391692573306628">Bu sekmeyi başka bir cihaza göndermek için her iki cihazda da Chrome'da oturum açın.</translation> <translation id="6622980291894852883">Görselleri engellemeye devam et</translation> <translation id="6624036901798307345">Tablet modunda, her sekmenin küçük resimlerini gösteren yeni sekme şeridini açmak için sekme sayacı araç çubuğu düğmesine dokunun.</translation> @@ -6420,6 +6428,7 @@ <translation id="6818547713623251698">Telefonunuzdaki fotoğrafları, medya içeriklerini, bildirimleri ve uygulamaları görün</translation> <translation id="6818802132960437751">Virüse karşı yerleşik koruma</translation> <translation id="6818920801736417483">Şifreler kaydedilsin mi?</translation> +<translation id="6820079682647046800">Kerberos kimlik doğrulaması başarısız oldu</translation> <translation id="6823174134746916417">Dokunmatik alanda tıklamak için dokun</translation> <translation id="6824564591481349393">&E-posta Adresini Kopyala</translation> <translation id="6824584962142919697">Öğeleri &incele</translation> @@ -6574,6 +6583,7 @@ <translation id="6955698182324067397">sshd yardımcı programını ayarlayacak ve USB sürücülerinden önyüklemeyi etkinleştirecek ChromeOS hata ayıklama özelliklerini etkinleştiriyorsunuz.</translation> <translation id="6955893174999506273">1 anahtar daha ata</translation> <translation id="6957044667612803194">Bu güvenlik anahtarı PIN’leri desteklemiyor</translation> +<translation id="6960133692707095572">Bilet olmadan ziyaret et</translation> <translation id="6960507406838246615">Linux'un güncellenmesi gerekiyor</translation> <translation id="6960648667961844909"><ph name="LANGUAGE" /> konuşma dosyaları indirilemedi. İndirme işlemi daha sonra tekrar denenecek. Konuşma, indirme işlemi tamamlanana kadar işlenmek üzere Google'a gönderilir.</translation> <translation id="696103774840402661">Bu <ph name="DEVICE_TYPE" /> üzerindeki tüm kullanıcıların dosyaları ve yerel verileri kalıcı olarak silindi.</translation> @@ -8036,6 +8046,7 @@ <translation id="8272443605911821513">"Diğer araçlar" menüsündeki Uzantılar'ı tıklayarak uzantılarınızı yönetin.</translation> <translation id="8272786333453048167">Tekrar izin ver</translation> <translation id="8273905181216423293">Şimdi indir</translation> +<translation id="827488840488530039">Ziyaret etmeye çalıştığınız sayfa Kerberos biletlerinizi doğrulayamadı</translation> <translation id="8274921654076766238">Büyüteç, klavye odağını takip eder</translation> <translation id="8274924778568117936">Güncelleme bitene kadar <ph name="DEVICE_TYPE" /> cihazınızı kapatmayın. Yükleme işlemi tamamlandıktan sonra <ph name="DEVICE_TYPE" /> cihazınız yeniden başlatılacaktır.</translation> <translation id="8275038454117074363">İçe aktar</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 614f316..59f2a7da 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1595,7 +1595,6 @@ <translation id="2356070529366658676">Запитати</translation> <translation id="2357330829548294574">Видалити користувача <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Сайти можуть використовувати JavaScript</translation> -<translation id="2358703245148663432">Інший пристрій</translation> <translation id="2358777858338503863">Натисніть, щоб надати розширенню доступ до сайту <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Додатки Linux можуть перестати відповідати.</translation> <translation id="2359345697448000899">Керуйте своїми розширеннями, натиснувши вкладку "Розширення" в меню "Інструменти".</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 6efba8fc..736bfe3 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -377,6 +377,7 @@ <translation id="1339009753652684748">"Ok Google" بول کر اپنی اسسٹنٹ تک رسائی حاصل کریں۔ بیٹری بچانے کے لیے، "آن (تجویز کردہ)" منتخب کریں۔ آپ کی اسسٹنٹ صرف آپ کا آلہ پلگ ان ہوتے یا چارج ہوتے وقت جواب دے گی۔</translation> <translation id="13392265090583506">A11y</translation> <translation id="1340527397989195812">فائلز ایپ کا استعمال کر کے آلے سے میڈیا کا بیک اپ لیں۔</translation> +<translation id="1341701348342335220">بہت اچھا!</translation> <translation id="1341871421050612057"><ph name="USERNAME" /> کے ساتھ مطابقت پذیر نہیں کر سکتے</translation> <translation id="1343865611738742294">Linux ایپس کو USB آلات تک رسائی کی اجازت دیں۔ USB آلہ کو ہٹا دیے جانے کے بعد Linux اسے یاد نہیں رکھے گا۔</translation> <translation id="1343920184519992513">وہیں سے جاری رکھیں جہاں آپ نے چھوڑا تھا اور صفحات کا ایک مخصوص سیٹ کھولیں</translation> @@ -1579,7 +1580,6 @@ <translation id="2356070529366658676">پوچھیں</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> ہٹائیں</translation> <translation id="2358561147588818967">سائٹس JavaScript کا استعمال کر سکتی ہیں</translation> -<translation id="2358703245148663432">ایک مختلف آلہ</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> پر اجازت دینے کے لیے کلک کریں:</translation> <translation id="2359071692152028734">Linux ایپس غیر اثر پذیر ہو سکتی ہیں۔</translation> <translation id="2359345697448000899">ٹولز مینو میں ایکسٹینشنز پر کلک کر کے اپنے ایکسٹینشنز کا نظم کریں۔</translation> @@ -3627,6 +3627,7 @@ <translation id="4232375817808480934">Kerberos کنفیگر کریں</translation> <translation id="4235965441080806197">سائن ان کو منسوخ کریں</translation> <translation id="4236163961381003811">مزید ایکسٹینشنز دریافت کریں</translation> +<translation id="4237282663517880406">Google Drive کی تجاویز دکھائیں</translation> <translation id="4241182343707213132">تنظیم کی ایپس کو اپ ڈیٹ کرنے کے لیے ری سٹارٹ کریں</translation> <translation id="4242145785130247982">متعدد کلائنٹ سرٹیفکیٹس تعاون یافتہ نہیں ہیں</translation> <translation id="4242533952199664413">ترتیبات کھولیں</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 29eb800..c310640 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -1582,7 +1582,6 @@ <translation id="2356070529366658676">So‘ralsin</translation> <translation id="2357330829548294574">Olib tashlash: <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Saytlar JavasSript ishlatishi mumkin</translation> -<translation id="2358703245148663432">Boshqa qurilma</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> saytida ruxsat berish uchun bosing:</translation> <translation id="2359071692152028734">Linux ilovalari ishlamay qolishi mumkin.</translation> <translation id="2359345697448000899">Kengaytmalarni “Asbob va vositalar” menyusidagi “Kengaytmalar” bo‘limidan boshqarish mumkin.</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index ae34894..70f96eeaa2 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1595,7 +1595,6 @@ <translation id="2356070529366658676">Yêu cầu</translation> <translation id="2357330829548294574">Xóa <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Các trang web có thể dùng JavaScript</translation> -<translation id="2358703245148663432">Một thiết bị khác</translation> <translation id="2358777858338503863">Nhấp để cho phép trên <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Các ứng dụng Linux có thể sẽ không phản hồi.</translation> <translation id="2359345697448000899">Quản lý tiện ích của bạn bằng cách nhấp vào Tiện ích trong menu Công cụ.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 0e493197c..05fe1e9 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -377,6 +377,7 @@ <translation id="1339009753652684748">只需说“Ok Google”即可使用您的 Google 助理。为了省电,请选择“开启(推荐)”。选择这一选项后,只有当您的设备已接通电源或正在充电时,Google 助理才会做出响应。</translation> <translation id="13392265090583506">无障碍设置</translation> <translation id="1340527397989195812">使用“文件”应用备份设备上的媒体。</translation> +<translation id="1341701348342335220">太棒了,全部完成!</translation> <translation id="1341871421050612057">无法与 <ph name="USERNAME" /> 同步</translation> <translation id="1343865611738742294">授权 Linux 应用访问 USB 设备。Linux 不会记住已被拔出的 USB 设备。</translation> <translation id="1343920184519992513">继续浏览上次打开的网页并打开一组特定网页</translation> @@ -1570,7 +1571,6 @@ <translation id="2356070529366658676">询问</translation> <translation id="2357330829548294574">移除<ph name="USER_NAME" /></translation> <translation id="2358561147588818967">网站可以使用 JavaScript</translation> -<translation id="2358703245148663432">另一部设备</translation> <translation id="2358777858338503863">点击即可允许访问 <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux 应用可能会变得无响应。</translation> <translation id="2359345697448000899">您可以通过点击“工具”菜单中的“扩展程序”,管理您的扩展程序。</translation> @@ -3616,6 +3616,7 @@ <translation id="4232375817808480934">配置 Kerberos</translation> <translation id="4235965441080806197">取消登录</translation> <translation id="4236163961381003811">探索更多扩展程序</translation> +<translation id="4237282663517880406">显示 Google 云端硬盘建议</translation> <translation id="4241182343707213132">重启即可更新贵单位的应用</translation> <translation id="4242145785130247982">有多个客户端证书不受支持</translation> <translation id="4242533952199664413">打开“设置”</translation> @@ -3930,6 +3931,7 @@ <translation id="4522890784888918985">子帐号不受支持</translation> <translation id="4523876148417776526">尚未提取 XML 站点列表。</translation> <translation id="4524832533047962394">此版本的操作系统不支持所提供的注册模式。请确保您运行的是最新版本。</translation> +<translation id="4526051299161934899">隐藏的已存标签页分组</translation> <translation id="4526853756266614740">只需选择一张图片,便可立即将它作为主题付诸应用</translation> <translation id="452750746583162491">查看您已同步的数据</translation> <translation id="4527929807707405172">启用反向滚动。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> @@ -8469,6 +8471,7 @@ <translation id="869884720829132584">应用菜单</translation> <translation id="869891660844655955">截止日期</translation> <translation id="8699188901396699995">“<ph name="PRINTER_NAME" />”的 PPD</translation> +<translation id="8702278591052316269">包含隐藏的已存标签页分组的菜单</translation> <translation id="8702825062053163569">您的 <ph name="DEVICE_TYPE" /> 已锁定。</translation> <translation id="8703346390800944767">跳过广告</translation> <translation id="8705331520020532516">序列号</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 1c6189a..0a37abc 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -379,6 +379,7 @@ <translation id="1339009753652684748">只要說出「Ok Google」,就能存取「Google 助理」。如要節省電力,請選擇「啟用 (建議設定)」。這樣,「Google 助理」只會在裝置連接電源或充電時才會回應。</translation> <translation id="13392265090583506">無障礙設定</translation> <translation id="1340527397989195812">透過「檔案」應用程式備份裝置中的媒體。</translation> +<translation id="1341701348342335220">做得好!</translation> <translation id="1341871421050612057">無法與 <ph name="USERNAME" /> 同步</translation> <translation id="1343865611738742294">請授權 Linux 應用程式存取 USB 裝置。移除後,Linux 將不會記住 USB 裝置。</translation> <translation id="1343920184519992513">繼續瀏覽上次開啟的網頁並開啟某組特定網頁</translation> @@ -1592,7 +1593,6 @@ <translation id="2356070529366658676">詢問</translation> <translation id="2357330829548294574">移除「<ph name="USER_NAME" />」</translation> <translation id="2358561147588818967">網站可使用 JavaScript</translation> -<translation id="2358703245148663432">不同的裝置</translation> <translation id="2358777858338503863">按一下即可允許存取 <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux 應用程式可能會無法回應。</translation> <translation id="2359345697448000899">如要管理擴充功能,只需按一下 [工具] 選單裡的 [擴充功能] 即可。</translation> @@ -3640,6 +3640,7 @@ <translation id="4232375817808480934">設定 Kerberos</translation> <translation id="4235965441080806197">取消登入</translation> <translation id="4236163961381003811">探索更多擴充程式</translation> +<translation id="4237282663517880406">顯示「Google 雲端硬碟」建議</translation> <translation id="4241182343707213132">重新啟動即可更新機構的應用程式</translation> <translation id="4242145785130247982">不支援多個用戶端憑證</translation> <translation id="4242533952199664413">開啟設定</translation> @@ -3957,6 +3958,7 @@ <translation id="4522890784888918985">不支援子帳戶</translation> <translation id="4523876148417776526">尚未擷取的 XML 網站清單。</translation> <translation id="4524832533047962394">此版本的作業系統不支援目前提供的註冊模式。請確保您使用的是最新版本。</translation> +<translation id="4526051299161934899">已隱藏的已儲存分頁群組</translation> <translation id="4526853756266614740">選取圖片以立即套用主題</translation> <translation id="452750746583162491">查看您已同步的資料</translation> <translation id="4527929807707405172">啟用反向捲動功能。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> @@ -8497,6 +8499,7 @@ <translation id="869884720829132584">應用程式選單</translation> <translation id="869891660844655955">到期日</translation> <translation id="8699188901396699995">「<ph name="PRINTER_NAME" />」的 PPD</translation> +<translation id="8702278591052316269">選單包含已隱藏的已儲存分頁群組</translation> <translation id="8702825062053163569">系統已鎖定您的 <ph name="DEVICE_TYPE" />。</translation> <translation id="8703346390800944767">略過廣告</translation> <translation id="8705331520020532516">序號</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 64d51f2..59a3b0ff 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -377,6 +377,7 @@ <translation id="1339009753652684748">只要說出「Ok Google」就能存取 Google 助理。如要節省電力,請選擇「啟用 (建議設定)」。這樣一來,你的 Google 助理就只會在裝置插上電源或充電時回應你的指令。</translation> <translation id="13392265090583506">無障礙設定</translation> <translation id="1340527397989195812">使用「檔案」應用程式備份裝置上的媒體。</translation> +<translation id="1341701348342335220">太厲害了!</translation> <translation id="1341871421050612057">無法與 <ph name="USERNAME" /> 同步</translation> <translation id="1343865611738742294">請授權 Linux 應用程式存取 USB 裝置。移除後,Linux 將不會記住這部 USB 裝置。</translation> <translation id="1343920184519992513">繼續瀏覽上次開啟的網頁並開啟某組特定網頁</translation> @@ -1577,7 +1578,6 @@ <translation id="2356070529366658676">詢問</translation> <translation id="2357330829548294574">移除「<ph name="USER_NAME" />」</translation> <translation id="2358561147588818967">網站可以使用 JavaScript</translation> -<translation id="2358703245148663432">不同裝置</translation> <translation id="2358777858338503863">按一下即可允許存取 <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux 應用程式可能會沒有回應。</translation> <translation id="2359345697448000899">如要管理擴充功能,只要按一下 [工具] 選單裡的 [擴充功能] 即可。</translation> @@ -3624,6 +3624,7 @@ <translation id="4232375817808480934">設定 Kerberos</translation> <translation id="4235965441080806197">取消登入</translation> <translation id="4236163961381003811">探索其他擴充功能</translation> +<translation id="4237282663517880406">顯示 Google 雲端硬碟建議</translation> <translation id="4241182343707213132">重新啟動即可更新機構的應用程式</translation> <translation id="4242145785130247982">不支援多個用戶端憑證</translation> <translation id="4242533952199664413">開啟設定</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 3e789ad..c586545 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -1594,7 +1594,6 @@ <translation id="2356070529366658676">Buza</translation> <translation id="2357330829548294574">Susa u-<ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Amasayithi angasebenzisa i-JavaScript</translation> -<translation id="2358703245148663432">Idivayisi ehlukile</translation> <translation id="2358777858338503863">Chofoza ukuze uvule i-<ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Ama-Linux app kungenzeka angasaphenduli.</translation> <translation id="2359345697448000899">Phatha izandiso zakho ngokuchofoza izandiso kumenyu yamathuluzi.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb index 9903339..dcd9308e8 100644 --- a/chrome/app/resources/google_chrome_strings_am.xtb +++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -254,6 +254,7 @@ <translation id="5895138241574237353">እንደገና ጀምር</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - በአውታረ መረብ ወደ መለያ መግባት</translation> <translation id="5924017743176219022">ከበይነመረቡ ጋር በመገናኘት ላይ...</translation> +<translation id="5932997892801542621">የአድራሻ አሞሌ ወይም የፍለጋ ሳጥን ውስጥ ሲተይቡ Chrome የንጥል ጥቆማዎችን ለማግኘት የሚተይቡትን ወደ Google Drive ይልካል። ይህ ማንነት የማያሳውቅ ውስጥ ጠፍቷል።</translation> <translation id="5940385492829620908">የእርስዎ ድር፣ ዕልባቶች እና ሌሎች የChrome ነገሮች እዚህ ይኖራሉ።</translation> <translation id="5941711191222866238">አሳንስ</translation> <translation id="5941830788786076944">Google Chromeን መነሻ ማሰሻ አድርግ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb index 69cfac6..07eb276c 100644 --- a/chrome/app/resources/google_chrome_strings_az.xtb +++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -250,6 +250,7 @@ <translation id="5895138241574237353">Yenidən başladın</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Şəbəkəyə Giriş</translation> <translation id="5924017743176219022">İnternetə qoşulur...</translation> +<translation id="5932997892801542621">Ünvan panelinə, yaxud axtarış xanasına yazdıqda element təklifləri almaq üçün Chrome yazdıqlarınızı Google Diskə göndərir. Bu, Anonim rejimdə deaktivdir.</translation> <translation id="5940385492829620908">Veb, əlfəcinlər və Chrome'a aid hər şeyiniz buradadır.</translation> <translation id="5941711191222866238">Minimallaşdırın</translation> <translation id="5941830788786076944">Google Chrome'u defolt brauzer edin</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index 6074730..105c9fc 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -247,6 +247,7 @@ <translation id="5895138241574237353">Reinicia</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Inici de sessió a la xarxa</translation> <translation id="5924017743176219022">S'està connectant a Internet...</translation> +<translation id="5932997892801542621">Quan escrius a la barra d'adreces o al quadre de cerca, Chrome envia el que escrius a Google Drive per obtenir suggeriments d'elements. Aquesta opció està desactivada en mode d'incògnit.</translation> <translation id="5940385492829620908">El vostre web, les adreces d'interès i altres coses de Chrome resideixen aquí.</translation> <translation id="5941711191222866238">Minimitza</translation> <translation id="5941830788786076944">Estableix Google Chrome com el navegador predeterminat</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb index 488e8c655..dbf0c29f8 100644 --- a/chrome/app/resources/google_chrome_strings_cs.xtb +++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -255,6 +255,7 @@ <translation id="5895138241574237353">Restartovat</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> – přihlášení k síti</translation> <translation id="5924017743176219022">Připojování k internetu…</translation> +<translation id="5932997892801542621">Při psaní do adresního řádku nebo vyhledávacího pole odesílá Chrome zadaný text na Disk Google, aby vám mohl nabízet návrhy. V anonymním režimu je tato funkce vypnutá.</translation> <translation id="5940385492829620908">Zde jsou k dispozici vaše weby, záložky a další obsah Chromu.</translation> <translation id="5941711191222866238">Minimalizovat</translation> <translation id="5941830788786076944">Nastavit Google Chrome jako výchozí prohlížeč</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb index 4e59069..338c2c2 100644 --- a/chrome/app/resources/google_chrome_strings_da.xtb +++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -247,6 +247,7 @@ <translation id="5895138241574237353">Genstart</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> – Login på netværk</translation> <translation id="5924017743176219022">Opretter forbindelse til internettet…</translation> +<translation id="5932997892801542621">Når du indtaster noget i adresselinjen eller søgefeltet, sender Chrome det, du skriver, til Google Drev for at få forslag til elementer. Dette er deaktiveret i inkognito.</translation> <translation id="5940385492829620908">Dit webindhold, dine bogmærker og andre Chrome-ting kan findes her.</translation> <translation id="5941711191222866238">Minimer</translation> <translation id="5941830788786076944">Gør Google Chrome til din standardbrowser</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb index 5e44fa7..be815ef 100644 --- a/chrome/app/resources/google_chrome_strings_eu.xtb +++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -254,6 +254,7 @@ <translation id="5895138241574237353">Berrabiarazi</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Hasi saioa sarean</translation> <translation id="5924017743176219022">Internetera konektatzen…</translation> +<translation id="5932997892801542621">Helbide-barran edo bilaketa-koadroan zerbait idazten duzunean, Chrome-k Google Drive-ra bidaltzen du, elementuen iradokizunak lortzeko. Ezkutuko moduan, aukera hori desaktibatuta dago.</translation> <translation id="5940385492829620908">Zure weba, laster-markak eta Chrome-n dituzun beste gauzak hemen bizi dira.</translation> <translation id="5941711191222866238">Minimizatu</translation> <translation id="5941830788786076944">Ezarri Google Chrome arakatzaile lehenetsi gisa</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb index 45efaa75..0e38c0b 100644 --- a/chrome/app/resources/google_chrome_strings_fa.xtb +++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -247,6 +247,7 @@ <translation id="5895138241574237353">راهاندازی مجدد</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - ورود به سیستم شبکه</translation> <translation id="5924017743176219022">درحال اتصال به اینترنت…</translation> +<translation id="5932997892801542621">وقتی در نوار نشانی یا چارگوش جستجو تایپ میکنید، Chrome آنچه را تایپ میکنید به Google Drive ارسال میکند تا مواردی برای پیشنهاد دریافت کند. این ویژگی در «حالت ناشناس» خاموش است.</translation> <translation id="5940385492829620908">وب، نشانکها و موارد دیگر Chrome شما در اینجا هستند.</translation> <translation id="5941711191222866238">کوچک کردن</translation> <translation id="5941830788786076944">Google Chrome مرورگر پیشفرض شود</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb index f6b5e8a..c8bcdb7 100644 --- a/chrome/app/resources/google_chrome_strings_gu.xtb +++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -255,6 +255,7 @@ <translation id="5895138241574237353">પુનઃપ્રારંભ કરો</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - નેટવર્ક સાઇન ઇન</translation> <translation id="5924017743176219022">ઇન્ટરનેટ સાથે કનેક્ટ કરી રહ્યાં છીએ...</translation> +<translation id="5932997892801542621">જ્યારે તમે ઍડ્રેસ બાર અથવા શોધ બૉક્સમાં ટાઇપ કરો છો, ત્યારે આઇટમના સૂચનો મેળવવા માટે Chrome તમે જે ટાઇપ કરો છો, તે Google Driveને મોકલે છે. આ સુવિધા છૂપા મોડમાં બંધ હોય છે.</translation> <translation id="5940385492829620908">તમારું વેબ, બુકમાર્ક અને અન્ય Chrome સામગ્રી અહીં હોય છે.</translation> <translation id="5941711191222866238">નાનું કરો</translation> <translation id="5941830788786076944">Google Chrome ને ડિફૉલ્ટ બ્રાઉઝર બનાવો</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb index efb5280e..0abcbc3 100644 --- a/chrome/app/resources/google_chrome_strings_id.xtb +++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -247,6 +247,7 @@ <translation id="5895138241574237353">Mulai Ulang</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Login Jaringan</translation> <translation id="5924017743176219022">Menghubungkan ke internet...</translation> +<translation id="5932997892801542621">Saat Anda mengetik di kolom URL atau kotak penelusuran, Chrome akan mengirimkan hal yang Anda ketik ke Google Drive untuk mendapatkan saran item. Fitur ini nonaktif dalam mode Samaran.</translation> <translation id="5940385492829620908">Web, bookmark, dan file Chrome Anda lainnya tersedia di sini.</translation> <translation id="5941711191222866238">Perkecil</translation> <translation id="5941830788786076944">Jadikan Google Chrome sebagai browser default</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb index 8c358264..65f01f13 100644 --- a/chrome/app/resources/google_chrome_strings_ja.xtb +++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -246,6 +246,7 @@ <translation id="5895138241574237353">再起動</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - ネットワークにログイン</translation> <translation id="5924017743176219022">インターネットに接続しています…</translation> +<translation id="5932997892801542621">Chrome でアドレスバーや検索ボックスに入力を始めると、入力内容が Google ドライブに送信され、検索候補が表示されます。シークレット モードの場合、この設定はオフになっています。</translation> <translation id="5940385492829620908">ウェブ、ブックマーク、その他の Chrome データを好みに設定できます。</translation> <translation id="5941711191222866238">最小化</translation> <translation id="5941830788786076944">Google Chrome を既定のブラウザにする</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ky.xtb b/chrome/app/resources/google_chrome_strings_ky.xtb index 8c15ace..c6784178 100644 --- a/chrome/app/resources/google_chrome_strings_ky.xtb +++ b/chrome/app/resources/google_chrome_strings_ky.xtb
@@ -255,6 +255,7 @@ <translation id="5895138241574237353">Өчүрүп күйгүзүү</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> – Тармакка кирүү</translation> <translation id="5924017743176219022">Интернетке туташууда...</translation> +<translation id="5932997892801542621">Дарек тилкесине же издөө кутучасына жазганыңызда, Chrome сизге ылайыктуу нерселерди сунуштоо максатында сурамды Google Drive'га жөнөтөт. Бул параметр Жашыруун режимде өчүк болот.</translation> <translation id="5940385492829620908">Веб, кыстармалар жана башка Chrome жеке дайын-даректериңиз ушул жерде жайгашкан.</translation> <translation id="5941711191222866238">Кичирейтүү</translation> <translation id="5941830788786076944">Google Chrome'ду демейки серепчи кылуу</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lo.xtb b/chrome/app/resources/google_chrome_strings_lo.xtb index 19a7682..48137a6 100644 --- a/chrome/app/resources/google_chrome_strings_lo.xtb +++ b/chrome/app/resources/google_chrome_strings_lo.xtb
@@ -255,6 +255,7 @@ <translation id="5895138241574237353">ເລີ່ມຕົ້ນໃໝ່</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - ການເຂົ້າສູ່ລະບົບເຄືອຂ່າຍ</translation> <translation id="5924017743176219022">ກຳລັງເຊື່ອມຕໍ່ອິນເຕີເນັດ...</translation> +<translation id="5932997892801542621">ເມື່ອທ່ານພິມໃນແຖບທີ່ຢູ່ ຫຼື ກ່ອງຊອກຫາ, Chrome ຈະສົ່ງສິ່ງທີ່ທ່ານພິມໄປຫາ Google Drive ເພື່ອຮັບການແນະນຳລາຍການ. ສິ່ງນີ້ຖືກປິດໃນໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ.</translation> <translation id="5940385492829620908">ເວັບຂອງທ່ານ, ບຸກມາກສ໌, ແລະ Chrome ອື່ນສົດຢູ່ທີ່ນີ້.</translation> <translation id="5941711191222866238">ຫຍໍ້ລົງ</translation> <translation id="5941830788786076944">ເຮັດ Google Chrome ເປັນບຣາວເຊີມາດຕະຖານ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb index 92c07c0c..4285013 100644 --- a/chrome/app/resources/google_chrome_strings_lt.xtb +++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -255,6 +255,7 @@ <translation id="5895138241574237353">Paleisti iš naujo</translation> <translation id="5903106910045431592">„<ph name="PAGE_TITLE" />“ – prisijungimas prie tinklo</translation> <translation id="5924017743176219022">Prisijungiama prie interneto...</translation> +<translation id="5932997892801542621">Kai vedate tekstą adreso juostoje ar paieškos laukelyje, „Chrome“ siunčia tai, ką įvedate, į „Google“ diską, kad gautų elementų pasiūlymų. Ši funkcija inkognito režimu išjungta.</translation> <translation id="5940385492829620908">Čia saugoma žiniatinklio informacija, žymės ir kiti „Chrome“ duomenys.</translation> <translation id="5941711191222866238">Sumažinti</translation> <translation id="5941830788786076944">Padarykite „Google Chrome“ numatytąja naršykle</translation>
diff --git a/chrome/app/resources/google_chrome_strings_my.xtb b/chrome/app/resources/google_chrome_strings_my.xtb index 27f8fa20..5f18f8d 100644 --- a/chrome/app/resources/google_chrome_strings_my.xtb +++ b/chrome/app/resources/google_chrome_strings_my.xtb
@@ -255,6 +255,7 @@ <translation id="5895138241574237353">ပြန်စတင်မည</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - ကွန်ရက် လက်မှတ်ထိုးဝင်ခြင်း</translation> <translation id="5924017743176219022">အင်တာနက် ချိတ်ဆက်နေသည်…</translation> +<translation id="5932997892801542621">လိပ်စာဘား (သို့) ရှာဖွေစာလုံးဖြည့်ကွက်လပ်တွင် စာရိုက်သောအခါ ဖိုင်အကြံပြုချက်များ ရယူရန်အတွက် Chrome သည် သင်ရိုက်ထည့်သောအရာကို Google Drive သို့ ပို့သည်။ ၎င်းသည် ‘ရုပ်ဖျက်’ တွင် ပိတ်နေမည်။</translation> <translation id="5940385492829620908">သင်၏ ဝဘ်၊ စာညှပ်များ၊ နှင့် အခြားသော Chrome အရာများဟာ ဒီမှာ နေထိုင်ကြပါသည်။</translation> <translation id="5941711191222866238">အနည်းဆုံး လုပ်ရန်</translation> <translation id="5941830788786076944">Google Chrome ကို ပုံသေ ဘရောင်ဇာ ပြုလုပ်ပါ။</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb index a91bd21..87f306b 100644 --- a/chrome/app/resources/google_chrome_strings_nl.xtb +++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -252,6 +252,7 @@ <translation id="5895138241574237353">Opnieuw starten</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Inloggen bij netwerk</translation> <translation id="5924017743176219022">Verbinding maken met internet...</translation> +<translation id="5932997892801542621">Als je in de adresbalk of het zoekvak typt, stuurt Chrome wat je typt naar Google Drive om itemsuggesties te krijgen. Dit staat uit in de incognitomodus.</translation> <translation id="5940385492829620908">Hier vind je internet, bookmarks en andere Chrome-instellingen.</translation> <translation id="5941711191222866238">Minimaliseren</translation> <translation id="5941830788786076944">Google Chrome instellen als mijn standaardbrowser</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pa.xtb b/chrome/app/resources/google_chrome_strings_pa.xtb index a3281bb..471db07c 100644 --- a/chrome/app/resources/google_chrome_strings_pa.xtb +++ b/chrome/app/resources/google_chrome_strings_pa.xtb
@@ -255,6 +255,7 @@ <translation id="5895138241574237353">ਰੀਸਟਾਰਟ ਕਰੋ</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - ਨੈੱਟਵਰਕ ਸਾਈਨ-ਇਨ</translation> <translation id="5924017743176219022">ਇੰਟਰਨੈੱਟ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> +<translation id="5932997892801542621">ਤੁਹਾਡੇ ਵੱਲੋਂ ਪਤਾ ਬਾਰ ਜਾਂ ਖੋਜ ਬਾਕਸ ਵਿੱਚ ਟਾਈਪ ਕਰਨ ਵੇਲੇ, Chrome ਉਸਨੂੰ Google Drive 'ਤੇ ਭੇਜਦਾ ਹੈ, ਤਾਂ ਜੋ ਆਈਟਮਾਂ ਸੰਬੰਧੀ ਸੁਝਾਅ ਪ੍ਰਾਪਤ ਕੀਤੇ ਜਾ ਸਕਣ। ਇਹ ਇਨਕੋਗਨਿਟੋ ਵਿੱਚ ਬੰਦ ਹੈ।</translation> <translation id="5940385492829620908">ਤੁਹਾਡੀ ਵੈੱਬ, ਬੁੱਕਮਾਰਕ ਅਤੇ ਹੋਰ Chrome ਸਮੱਗਰੀ ਇੱਥੇ ਲਾਈਵ ਹੈ।</translation> <translation id="5941711191222866238">ਨਿਊਨਤਮ</translation> <translation id="5941830788786076944">Google Chrome ਨੂੰ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਬ੍ਰਾਊਜ਼ਰ ਬਣਾਓ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_si.xtb b/chrome/app/resources/google_chrome_strings_si.xtb index 13315233..8e79628 100644 --- a/chrome/app/resources/google_chrome_strings_si.xtb +++ b/chrome/app/resources/google_chrome_strings_si.xtb
@@ -254,6 +254,7 @@ <translation id="5895138241574237353">යළි අරඹන්න</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - ජාල පුරනය</translation> <translation id="5924017743176219022">අන්තර්ජාලය වෙත සම්බන්ධ වෙමින්...</translation> +<translation id="5932997892801542621">ඔබ ලිපින තීරුවේ හෝ සෙවීම් පෙට්ටියේ ටයිප් කරන විට, අයිතම යෝජනා ලබා ගැනීමට Chrome ඔබ ටයිප් කරන දේ Google Drive වෙත යවයි. මෙය අප්රසිද්ධ තුළ ක්රියා විරහිතයි.</translation> <translation id="5940385492829620908">ඔබේ වෙබ් අඩවි, පිටු සලකුණු සහ වෙනත් Chrome උපකරණ මෙහි ඇත.</translation> <translation id="5941711191222866238">කුඩා කරන්න</translation> <translation id="5941830788786076944">Google Chrome පෙරනිමි බ්රව්සරය කරන්න</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb index e6bf5ab..1db1e8b 100644 --- a/chrome/app/resources/google_chrome_strings_sl.xtb +++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -255,6 +255,7 @@ <translation id="5895138241574237353">Znova zaženi</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> – Prijava v omrežje</translation> <translation id="5924017743176219022">Vzpostavljanje povezave z internetom …</translation> +<translation id="5932997892801542621">Ko tipkate v naslovno vrstico ali iskalno polje, Chrome vaše vnose pošlje v Google Drive zaradi boljših predlogov za izdelke. V anonimnem načinu je to izklopljeno.</translation> <translation id="5940385492829620908">Tu so shranjeni vaš splet, zaznamki in druge stvari v Chromu.</translation> <translation id="5941711191222866238">Minimiziraj</translation> <translation id="5941830788786076944">Nastavi Google Chrome kot privzeti brskalnik</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb index dcea8161..8d0d6c60 100644 --- a/chrome/app/resources/google_chrome_strings_tr.xtb +++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -248,6 +248,7 @@ <translation id="5895138241574237353">Yeniden başlat</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Ağda Oturum Açın</translation> <translation id="5924017743176219022">İnternete bağlanılıyor...</translation> +<translation id="5932997892801542621">Adres çubuğuna veya arama kutusuna yazdığınızda Chrome, yazdıklarınızı Google Drive'a göndererek öğe önerileri görmenizi sağlar. Bu ayar Gizli modda kapalıdır.</translation> <translation id="5940385492829620908">Web, yer işaretleri ve diğer Chrome öğeleriniz burada bulunur.</translation> <translation id="5941711191222866238">Küçült</translation> <translation id="5941830788786076944">Google Chrome varsayılan tarayıcı olsun</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb index 8500d32..8acb22f 100644 --- a/chrome/app/resources/google_chrome_strings_ur.xtb +++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -254,6 +254,7 @@ <translation id="5895138241574237353">دوبارہ شروع کریں</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - نیٹ ورک سائن ان</translation> <translation id="5924017743176219022">انٹرنیٹ سے منسلک کیا جا رہا ہے…</translation> +<translation id="5932997892801542621">جب آپ ایڈریس بار یا تلاش کے خانے میں ٹائپ کرتے ہیں تو Chrome آئٹم کی تجاویز حاصل کرنے کے لیے آپ جو ٹائپ کرتے ہیں اسے Google Drive کو بھیجتا ہے۔ یہ پوشیدگی میں آف ہے۔</translation> <translation id="5940385492829620908">آپ کا ویب، بُک مارکس اور دیگر Chrome مواد یہاں رہتے ہیں۔</translation> <translation id="5941711191222866238">چھوٹا کریں</translation> <translation id="5941830788786076944">Google Chrome کو ڈیفالٹ براؤزر بنائیں</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb index b3a439a..fce4ec9 100644 --- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -246,6 +246,7 @@ <translation id="5895138241574237353">重新启动</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - 网络登录</translation> <translation id="5924017743176219022">正在连接到互联网…</translation> +<translation id="5932997892801542621">当您在地址栏或搜索框中输入内容时,Chrome 会将您输入的内容发送至 Google 云端硬盘,以便获取内容建议。在无痕模式下,此设置处于关闭状态。</translation> <translation id="5940385492829620908">您的上网记录、书签和其他Chrome资料和数据都保存在此处。</translation> <translation id="5941711191222866238">最小化</translation> <translation id="5941830788786076944">将 Google Chrome 浏览器设为默认浏览器</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb index b848f71..4e3b5f2c 100644 --- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -254,6 +254,7 @@ <translation id="5895138241574237353">重新啟動</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - 網絡登入</translation> <translation id="5924017743176219022">正在連線至互聯網…</translation> +<translation id="5932997892801542621">在網址列或搜尋框中輸入內容時,Chrome 會將輸入的內容傳送至 Google 雲端硬碟,以便取得項目建議。此功能不會在無痕模式下啟用。</translation> <translation id="5940385492829620908">您的網頁、書籤和其他 Chrome 資料在這裡直播。</translation> <translation id="5941711191222866238">最小化</translation> <translation id="5941830788786076944">將 Google Chrome 設為預設瀏覽器</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb index 11cfcbb..0f41bc39 100644 --- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -249,6 +249,7 @@ <translation id="5895138241574237353">重新啟動</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - 網路登入</translation> <translation id="5924017743176219022">正在連線至網際網路...</translation> +<translation id="5932997892801542621">Chrome 會將你在網址列或搜尋框中輸入的內容傳送至 Google 雲端硬碟,以提供項目建議。這項功能在無痕模式中為關閉狀態。</translation> <translation id="5940385492829620908">你瀏覽的網頁、書籤和其他 Chrome 設定都在這裡。</translation> <translation id="5941711191222866238">最小化</translation> <translation id="5941830788786076944">使用 Google Chrome 做為我的預設瀏覽器</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 0a96817c..5b9130cb 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -5084,6 +5084,7 @@ "//chrome/browser/ui/webui/ash/parent_access:mojo_bindings", "//chrome/browser/ui/webui/ash/vm:mojo_bindings", "//chrome/browser/ui/webui/nearby_share:mojom", + "//chrome/browser/ui/webui/settings/ash/input_device_settings:mojom", "//chrome/browser/ui/webui/settings/ash/os_apps_page/mojom", "//chrome/browser/ui/webui/settings/ash/search:mojo_bindings", "//chrome/services/sharing/public/cpp",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 62dcd88..2e07c1a 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -9390,6 +9390,13 @@ flag_descriptions::kPolicyMergeMultiSourceDescription, kOsAll, FEATURE_VALUE_TYPE(policy::features::kPolicyMergeMultiSource)}, +#if BUILDFLAG(IS_CHROMEOS_ASH) + {"enable-notification-image-drag", + flag_descriptions::kEnableNotificationImageDragName, + flag_descriptions::kEnableNotificationImageDragDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kNotificationImageDrag)}, +#endif + // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/apps/app_preload_service/web_app_preload_installer.cc b/chrome/browser/apps/app_preload_service/web_app_preload_installer.cc index 00a8ec3..b4a16c7 100644 --- a/chrome/browser/apps/app_preload_service/web_app_preload_installer.cc +++ b/chrome/browser/apps/app_preload_service/web_app_preload_installer.cc
@@ -11,6 +11,7 @@ #include "chrome/browser/web_applications/web_app_command_manager.h" #include "chrome/browser/web_applications/web_app_helpers.h" #include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/browser/web_applications/web_app_utils.h" #include "components/webapps/browser/install_result_code.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/resource_request.h" @@ -68,6 +69,14 @@ WebAppPreloadInstalledCallback callback) { DCHECK_EQ(app.GetPlatform(), AppType::kWeb); + if (web_app::IsWebAppsCrosapiEnabled()) { + // Installation in Lacros is not implemented yet. Report the installation as + // successful to prevent useless retries. + // TODO(b/267667215): Support web app installation for Lacros web apps. + std::move(callback).Run(/*success=*/true); + return; + } + auto* provider = web_app::WebAppProvider::GetForWebApps(profile_); DCHECK(provider);
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index ce6d9cb..c5afc286 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn
@@ -4706,6 +4706,7 @@ "../ui/webui/settings/ash/device_storage_handler_unittest.cc", "../ui/webui/settings/ash/fast_pair_saved_devices_handler_unittest.cc", "../ui/webui/settings/ash/hierarchy_unittest.cc", + "../ui/webui/settings/ash/input_device_settings/input_device_settings_provider_unittest.cc", "../ui/webui/settings/ash/internet_handler_unittest.cc", "../ui/webui/settings/ash/metrics_consent_handler_unittest.cc", "../ui/webui/settings/ash/multidevice_handler_unittest.cc",
diff --git a/chrome/browser/ash/app_list/app_context_menu_unittest.cc b/chrome/browser/ash/app_list/app_context_menu_unittest.cc index 65e517c..7242261f 100644 --- a/chrome/browser/ash/app_list/app_context_menu_unittest.cc +++ b/chrome/browser/ash/app_list/app_context_menu_unittest.cc
@@ -51,7 +51,6 @@ #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/ui_base_features.h" -#include "ui/display/test/scoped_screen_override.h" #include "ui/display/test/test_screen.h" namespace app_list { @@ -191,10 +190,12 @@ class AppContextMenuTest : public AppListTestBase { public: - AppContextMenuTest() : screen_override_(&test_screen_) {} + AppContextMenuTest() { display::Screen::SetScreenInstance(&test_screen_); } AppContextMenuTest(const AppContextMenuTest&) = delete; AppContextMenuTest& operator=(const AppContextMenuTest&) = delete; - ~AppContextMenuTest() override = default; + ~AppContextMenuTest() override { + display::Screen::SetScreenInstance(nullptr); + } void SetUp() override { AppListTestBase::SetUp(); @@ -370,7 +371,6 @@ private: data_decoder::test::InProcessDataDecoder in_process_data_decoder_; display::test::TestScreen test_screen_; - display::test::ScopedScreenOverride screen_override_; std::unique_ptr<KeyedService> menu_manager_; std::unique_ptr<FakeAppListControllerDelegate> controller_; std::unique_ptr<FakeAppContextMenuDelegate> menu_delegate_;
diff --git a/chrome/browser/ash/app_list/app_service/app_service_app_model_builder_unittest.cc b/chrome/browser/ash/app_list/app_service/app_service_app_model_builder_unittest.cc index 96a4cb4..2dc3a41 100644 --- a/chrome/browser/ash/app_list/app_service/app_service_app_model_builder_unittest.cc +++ b/chrome/browser/ash/app_list/app_service/app_service_app_model_builder_unittest.cc
@@ -76,14 +76,12 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/l10n/l10n_util.h" -#include "ui/display/test/scoped_screen_override.h" #include "ui/display/test/test_screen.h" #include "ui/gfx/codec/png_codec.h" #include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/image/image_unittest_util.h" using crostini::CrostiniTestHelper; -using display::test::ScopedScreenOverride; using extensions::AppSorting; using extensions::ExtensionSystem; using plugin_vm::PluginVmTestHelper; @@ -194,11 +192,12 @@ class AppServiceAppModelBuilderTest : public AppListTestBase { public: AppServiceAppModelBuilderTest() { - scoped_screen_override_ = - std::make_unique<ScopedScreenOverride>(&test_screen_); + display::Screen::SetScreenInstance(&test_screen_); } - ~AppServiceAppModelBuilderTest() override {} + ~AppServiceAppModelBuilderTest() override { + display::Screen::SetScreenInstance(nullptr); + } AppServiceAppModelBuilderTest(const AppServiceAppModelBuilderTest&) = delete; AppServiceAppModelBuilderTest& operator=( @@ -244,7 +243,6 @@ std::unique_ptr<FakeAppListModelUpdater> model_updater_; std::unique_ptr<test::TestAppListControllerDelegate> controller_; display::test::TestScreen test_screen_; - std::unique_ptr<ScopedScreenOverride> scoped_screen_override_; }; class BuiltInAppTest : public AppServiceAppModelBuilderTest {
diff --git a/chrome/browser/ash/app_list/search/system_info/system_info_card_provider.cc b/chrome/browser/ash/app_list/search/system_info/system_info_card_provider.cc index c135cb34..9ecc565b 100644 --- a/chrome/browser/ash/app_list/search/system_info/system_info_card_provider.cc +++ b/chrome/browser/ash/app_list/search/system_info/system_info_card_provider.cc
@@ -51,16 +51,6 @@ constexpr double kRelevanceThreshold = 0.64; -// TODO(b/263994165): Replace with actual icon before feature is released. -// This is currently blocked by b/267948410, to manually load the settings and -// diagnostics icons in search. -gfx::ImageSkia GetTestIcon() { - SkBitmap bitmap; - bitmap.allocN32Pixels(50, 50); - bitmap.eraseColor(SK_ColorYELLOW); - return gfx::ImageSkia::CreateFrom1xBitmap(bitmap); -} - } // namespace SystemInfoCardProvider::SystemInfoCardProvider(Profile* profile) @@ -270,8 +260,9 @@ 100)); SearchProvider::Results new_results; new_results.emplace_back(std::make_unique<SystemInfoAnswerResult>( - profile_, last_query_, /*url_path=*/"", GetTestIcon(), relevance_, title, - description, SystemInfoAnswerResult::AnswerCardDisplayType::kTextCard, + profile_, last_query_, /*url_path=*/"", diagnostics_icon_, relevance_, + title, description, + SystemInfoAnswerResult::AnswerCardDisplayType::kTextCard, SystemInfoAnswerResult::SystemInfoCategory::kDiagnostics)); SwapResults(&new_results); } @@ -351,7 +342,7 @@ l10n_util::GetStringUTF16(IDS_SETTINGS_ABOUT_PAGE_CHECK_FOR_UPDATES); SearchProvider::Results new_results; new_results.emplace_back(std::make_unique<SystemInfoAnswerResult>( - profile_, last_query_, kAboutChromeOsSectionPath, GetTestIcon(), + profile_, last_query_, kAboutChromeOsSectionPath, os_settings_icon_, relevance_, version_string, description, SystemInfoAnswerResult::AnswerCardDisplayType::kTextCard, SystemInfoAnswerResult::SystemInfoCategory::kSettings));
diff --git a/chrome/browser/ash/crosapi/browser_data_back_migrator.cc b/chrome/browser/ash/crosapi/browser_data_back_migrator.cc index 9ff3612..0cde90fb 100644 --- a/chrome/browser/ash/crosapi/browser_data_back_migrator.cc +++ b/chrome/browser/ash/crosapi/browser_data_back_migrator.cc
@@ -20,6 +20,7 @@ #include "base/logging.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" +#include "base/metrics/histogram_functions.h" #include "base/path_service.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" @@ -172,7 +173,7 @@ BrowserDataBackMigrator::TaskResult result) { if (result.status != TaskStatus::kSucceeded) { LOG(ERROR) << "PreMigrationCleanup() failed."; - std::move(finished_callback_).Run(ToResult(result)); + InvokeCallback(result); return; } @@ -312,7 +313,7 @@ BrowserDataBackMigrator::TaskResult result) { if (result.status != TaskStatus::kSucceeded) { LOG(ERROR) << "MergeSplitItems() failed."; - std::move(finished_callback_).Run(ToResult(result)); + InvokeCallback(result); return; } @@ -368,7 +369,7 @@ void BrowserDataBackMigrator::OnDeleteAshItems(TaskResult result) { if (result.status != TaskStatus::kSucceeded) { LOG(ERROR) << "DeleteAshItems() failed."; - std::move(finished_callback_).Run(ToResult(result)); + InvokeCallback(result); return; } @@ -422,7 +423,7 @@ BrowserDataBackMigrator::TaskResult result) { if (result.status != TaskStatus::kSucceeded) { LOG(ERROR) << "MoveLacrosItemsToAshDir() failed."; - std::move(finished_callback_).Run(ToResult(result)); + InvokeCallback(result); return; } @@ -521,7 +522,7 @@ BrowserDataBackMigrator::TaskResult result) { if (result.status != TaskStatus::kSucceeded) { LOG(ERROR) << "MoveMergedItemsBackToAsh() failed."; - std::move(finished_callback_).Run(ToResult(result)); + InvokeCallback(result); return; } @@ -558,7 +559,7 @@ BrowserDataBackMigrator::TaskResult result) { if (result.status != TaskStatus::kSucceeded) { LOG(ERROR) << "DeleteLacrosDir() failed."; - std::move(finished_callback_).Run(ToResult(result)); + InvokeCallback(result); return; } @@ -593,7 +594,7 @@ BrowserDataBackMigrator::TaskResult result) { if (result.status != TaskStatus::kSucceeded) { LOG(ERROR) << "DeleteTmpDir() failed."; - std::move(finished_callback_).Run(ToResult(result)); + InvokeCallback(result); return; } @@ -620,7 +621,7 @@ void BrowserDataBackMigrator::OnMarkMigrationComplete() { LOG(WARNING) << "Backward migration completed successfully."; SetProgress(MigrationStep::kDone); - std::move(finished_callback_).Run(ToResult({TaskStatus::kSucceeded})); + InvokeCallback({TaskStatus::kSucceeded}); } // static @@ -1077,33 +1078,6 @@ } // static -BrowserDataBackMigrator::Result BrowserDataBackMigrator::ToResult( - TaskResult result) { - switch (result.status) { - case TaskStatus::kSucceeded: - return Result::kSucceeded; - case TaskStatus::kPreMigrationCleanUpDeleteTmpDirFailed: - case TaskStatus::kMergeSplitItemsCreateTmpDirFailed: - case TaskStatus::kMergeSplitItemsCopyExtensionsFailed: - case TaskStatus::kMergeSplitItemsCopyExtensionStorageFailed: - case TaskStatus::kMergeSplitItemsCreateDirFailed: - case TaskStatus::kMergeSplitItemsMergeIndexedDBFailed: - case TaskStatus::kMergeSplitItemsMergePrefsFailed: - case TaskStatus::kMergeSplitItemsMergeLocalStorageLevelDBFailed: - case TaskStatus::kMergeSplitItemsMergeStateStoreLevelDBFailed: - case TaskStatus::kMergeSplitItemsMergeSyncDataFailed: - case TaskStatus::kDeleteAshItemsDeleteExtensionsFailed: - case TaskStatus::kDeleteAshItemsDeleteLacrosItemFailed: - case TaskStatus::kDeleteLacrosDirDeleteFailed: - case TaskStatus::kDeleteTmpDirDeleteFailed: - case TaskStatus::kMoveLacrosItemsToAshDirFailed: - case TaskStatus::kMoveMergedItemsBackToAshCopyDirectoryFailed: - case TaskStatus::kMoveMergedItemsBackToAshMoveFileFailed: - return Result::kFailed; - } -} - -// static bool BrowserDataBackMigrator::IsBackMigrationForceEnabled() { const std::string force_migration_switch = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( @@ -1262,4 +1236,87 @@ return RestartToMigrateBack(account_id); } +// static +BrowserDataBackMigrator::Result BrowserDataBackMigrator::ToResult( + TaskResult result) { + switch (result.status) { + case TaskStatus::kSucceeded: + return Result::kSucceeded; + case TaskStatus::kPreMigrationCleanUpDeleteTmpDirFailed: + case TaskStatus::kMergeSplitItemsCreateTmpDirFailed: + case TaskStatus::kMergeSplitItemsCopyExtensionsFailed: + case TaskStatus::kMergeSplitItemsCopyExtensionStorageFailed: + case TaskStatus::kMergeSplitItemsCreateDirFailed: + case TaskStatus::kMergeSplitItemsMergeIndexedDBFailed: + case TaskStatus::kMergeSplitItemsMergePrefsFailed: + case TaskStatus::kMergeSplitItemsMergeLocalStorageLevelDBFailed: + case TaskStatus::kMergeSplitItemsMergeStateStoreLevelDBFailed: + case TaskStatus::kMergeSplitItemsMergeSyncDataFailed: + case TaskStatus::kDeleteAshItemsDeleteExtensionsFailed: + case TaskStatus::kDeleteAshItemsDeleteLacrosItemFailed: + case TaskStatus::kDeleteLacrosDirDeleteFailed: + case TaskStatus::kDeleteTmpDirDeleteFailed: + case TaskStatus::kMoveLacrosItemsToAshDirFailed: + case TaskStatus::kMoveMergedItemsBackToAshCopyDirectoryFailed: + case TaskStatus::kMoveMergedItemsBackToAshMoveFileFailed: + return Result::kFailed; + } +} + +void BrowserDataBackMigrator::InvokeCallback(TaskResult result) { + RecordFinalStatus(result); + RecordPosixErrnoIfAvailable(result); + std::move(finished_callback_).Run(ToResult(result)); +} + +// static +void BrowserDataBackMigrator::RecordFinalStatus(TaskResult result) { + base::UmaHistogramEnumeration(kFinalStatusUMA, result.status); +} + +// static +void BrowserDataBackMigrator::RecordPosixErrnoIfAvailable(TaskResult result) { + if (result.status == TaskStatus::kSucceeded || + !result.posix_errno.has_value()) { + return; + } + + const int posix_errno = result.posix_errno.value(); + if (posix_errno == 0) { + return; + } + + std::string uma_name = kPosixErrnoUMA + TaskStatusToString(result.status); + base::UmaHistogramSparse(uma_name, posix_errno); +} + +// static +std::string BrowserDataBackMigrator::TaskStatusToString( + TaskStatus task_status) { + switch (task_status) { +#define MAPPING(name) \ + case TaskStatus::k##name: \ + return #name + MAPPING(Succeeded); + MAPPING(PreMigrationCleanUpDeleteTmpDirFailed); + MAPPING(MergeSplitItemsCreateTmpDirFailed); + MAPPING(MergeSplitItemsCopyExtensionsFailed); + MAPPING(MergeSplitItemsCopyExtensionStorageFailed); + MAPPING(MergeSplitItemsCreateDirFailed); + MAPPING(MergeSplitItemsMergeIndexedDBFailed); + MAPPING(MergeSplitItemsMergePrefsFailed); + MAPPING(MergeSplitItemsMergeLocalStorageLevelDBFailed); + MAPPING(MergeSplitItemsMergeStateStoreLevelDBFailed); + MAPPING(MergeSplitItemsMergeSyncDataFailed); + MAPPING(DeleteAshItemsDeleteExtensionsFailed); + MAPPING(DeleteAshItemsDeleteLacrosItemFailed); + MAPPING(DeleteLacrosDirDeleteFailed); + MAPPING(DeleteTmpDirDeleteFailed); + MAPPING(MoveLacrosItemsToAshDirFailed); + MAPPING(MoveMergedItemsBackToAshCopyDirectoryFailed); + MAPPING(MoveMergedItemsBackToAshMoveFileFailed); +#undef MAPPING + } +} + } // namespace ash
diff --git a/chrome/browser/ash/crosapi/browser_data_back_migrator.h b/chrome/browser/ash/crosapi/browser_data_back_migrator.h index 3096fc1..a1631ef 100644 --- a/chrome/browser/ash/crosapi/browser_data_back_migrator.h +++ b/chrome/browser/ash/crosapi/browser_data_back_migrator.h
@@ -23,6 +23,9 @@ constexpr char kTmpDir[] = "back_migrator_tmp"; } // namespace browser_data_back_migrator +constexpr char kFinalStatusUMA[] = "Ash.BrowserDataBackMigrator.FinalStatus"; +constexpr char kPosixErrnoUMA[] = "Ash.BrowserDataBackMigrator.PosixErrno."; + // Injects the restart function called from // `BrowserDataBackMigrator::AttemptRestart()` in RAII manner. class ScopedBackMigratorRestartAttemptForTesting { @@ -97,12 +100,23 @@ DeletesLacrosItemsFromAshDirCorrectly); FRIEND_TEST_ALL_PREFIXES(BrowserDataBackMigratorFilesSetupTest, MovesLacrosItemsToAshDirCorrectly); + FRIEND_TEST_ALL_PREFIXES(BrowserDataBackMigratorUMATest, RecordFinalStatus); + FRIEND_TEST_ALL_PREFIXES(BrowserDataBackMigratorUMATest, + RecordPosixErrnoIfAvailable); + FRIEND_TEST_ALL_PREFIXES(BrowserDataBackMigratorUMATest, TaskStatusToString); // A list of all the possible results of migration, including success and all // failure types in each step of the migration. // // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. + // + // When adding new cases to this enum, also update the following: + // - `BrowserDataBackMigrator::ToResult()` + // - `BrowserDataBackMigrator::TaskStatusToString()` + // - `BrowserDataBackMigratorUMATest.TaskStatusToString` + // - `Ash.BrowserDataBackMigrator.PosixErrno.{TaskStatus}` histogram + // - `BrowserDataBackMigratorFinalStatus` histogram enum enum class TaskStatus { kSucceeded = 0, kPreMigrationCleanUpDeleteTmpDirFailed = 1, @@ -269,9 +283,6 @@ const base::FilePath& dest_dir, unsigned int recursion_depth); - // Transforms `TaskResult` to `Result`, which is then returned to the caller. - static Result ToResult(TaskResult result); - // IsBackMigrationForceEnabled checks if backward migration has been force // enabled using the kLacrosProfileBackwardMigration flag. static bool IsBackMigrationForceEnabled(); @@ -288,6 +299,23 @@ // Called by MaybeRestartToMigrateBack. static bool RestartToMigrateBack(const AccountId& account_id); + // Transforms `TaskResult` to `Result`, which is then returned to the caller. + static Result ToResult(TaskResult result); + + // Records UMA metrics and calls `finished_callback_`. This function gets + // called once regardless of whether the migration succeeded or not. + void InvokeCallback(TaskResult); + + // Records the final status of the migration in `kFinalStatusUMA`. + static void RecordFinalStatus(TaskResult result); + + // Record Ash.BrowserDataBackMigrator.PosixErrno.{result.status} UMA with the + // value of `result.posix_errno` if the migration failed. + static void RecordPosixErrnoIfAvailable(TaskResult result); + + // Convert `TaskStatus` to string. + static std::string TaskStatusToString(TaskStatus task_status); + // Path to the ash profile directory. const base::FilePath ash_profile_dir_;
diff --git a/chrome/browser/ash/crosapi/browser_data_back_migrator_unittest.cc b/chrome/browser/ash/crosapi/browser_data_back_migrator_unittest.cc index f1d25fb..a9e14731 100644 --- a/chrome/browser/ash/crosapi/browser_data_back_migrator_unittest.cc +++ b/chrome/browser/ash/crosapi/browser_data_back_migrator_unittest.cc
@@ -4,10 +4,13 @@ #include "chrome/browser/ash/crosapi/browser_data_back_migrator.h" +#include <errno.h> + #include "ash/constants/ash_features.h" #include "base/files/file_enumerator.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/ash/crosapi/browser_data_migrator_util.h" #include "chrome/browser/ash/crosapi/browser_util.h" @@ -753,4 +756,53 @@ crosapi::browser_util::PolicyInitState::kAfterInit)); } +TEST(BrowserDataBackMigratorUMATest, RecordFinalStatus) { + base::HistogramTester histogram_tester; + + BrowserDataBackMigrator::TaskResult success = { + BrowserDataBackMigrator::TaskStatus::kSucceeded}; + BrowserDataBackMigrator::RecordFinalStatus(success); + + histogram_tester.ExpectUniqueSample( + kFinalStatusUMA, + static_cast<base::HistogramBase::Sample>( + BrowserDataBackMigrator::TaskStatus::kSucceeded), + 1); + histogram_tester.ExpectTotalCount(kFinalStatusUMA, 1); + + BrowserDataBackMigrator::TaskResult failure = { + BrowserDataBackMigrator::TaskStatus::kDeleteTmpDirDeleteFailed, EPERM}; + BrowserDataBackMigrator::RecordFinalStatus(failure); + + histogram_tester.ExpectBucketCount( + kFinalStatusUMA, + static_cast<base::HistogramBase::Sample>( + BrowserDataBackMigrator::TaskStatus::kDeleteTmpDirDeleteFailed), + 1); + histogram_tester.ExpectTotalCount(kFinalStatusUMA, 2); +} + +TEST(BrowserDataBackMigratorUMATest, RecordPosixErrnoIfAvailable) { + base::HistogramTester histogram_tester; + auto task_status = + BrowserDataBackMigrator::TaskStatus::kDeleteTmpDirDeleteFailed; + std::string uma_name = + kPosixErrnoUMA + BrowserDataBackMigrator::TaskStatusToString(task_status); + + BrowserDataBackMigrator::TaskResult failure_without_errno = {task_status}; + BrowserDataBackMigrator::RecordPosixErrnoIfAvailable(failure_without_errno); + histogram_tester.ExpectTotalCount(uma_name, 0); + + BrowserDataBackMigrator::TaskResult failure_with_errno = {task_status, EPERM}; + BrowserDataBackMigrator::RecordPosixErrnoIfAvailable(failure_with_errno); + histogram_tester.ExpectTotalCount(uma_name, 1); + histogram_tester.ExpectUniqueSample(uma_name, EPERM, 1); +} + +TEST(BrowserDataBackMigratorUMATest, TaskStatusToString) { + EXPECT_EQ(BrowserDataBackMigrator::TaskStatusToString( + BrowserDataBackMigrator::TaskStatus::kSucceeded), + "Succeeded"); +} + } // namespace ash
diff --git a/chrome/browser/ash/crosapi/browser_manager.cc b/chrome/browser/ash/crosapi/browser_manager.cc index 7a3b1e2..2b14823 100644 --- a/chrome/browser/ash/crosapi/browser_manager.cc +++ b/chrome/browser/ash/crosapi/browser_manager.cc
@@ -172,8 +172,9 @@ // being moved, and false if no log file was found. bool RotateLacrosLogs() { base::FilePath log_path = LacrosLogPath(); - if (!base::PathExists(log_path)) + if (!base::PathExists(log_path)) { return false; + } if (!logging::RotateLogFile(log_path)) { PLOG(ERROR) << "Failed to rotate the log file: " << log_path.value() @@ -252,8 +253,9 @@ bool clear_shared_resource_file, base::FilePath shared_resource_path) { // If shared resource pak doesn't exit, do nothing. - if (!base::PathExists(shared_resource_path)) + if (!base::PathExists(shared_resource_path)) { return ResourcesFileSharingMode::kDefault; + } // Clear shared resource file cache if `clear_shared_resource_file` is true. if (clear_shared_resource_file) { @@ -341,15 +343,17 @@ base::FeatureList::IsEnabled(features::kLacrosResourcesFileSharing); // If resource file sharing feature is disabled, clear the cached shared // resource file anyway. - if (!params.enable_resource_file_sharing) + if (!params.enable_resource_file_sharing) { clear_shared_resource_file = true; + } // Clear shared resource file cache if it's initial lacros launch after ash // reboot. If not, rename shared resource file cache to temporal name on // Lacros launch. if (ClearOrMoveSharedResourceFile(clear_shared_resource_file) == - ResourcesFileSharingMode::kError) + ResourcesFileSharingMode::kError) { params.enable_resource_file_sharing = false; + } if (base::CommandLine::ForCurrentProcess()->HasSwitch( ash::switches::kLacrosChromeAdditionalArgsFile)) { @@ -366,8 +370,9 @@ base::SPLIT_WANT_NONEMPTY); for (const auto& flag : delimited_flags) { - if (flag[0] != '#') + if (flag[0] != '#') { params.lacros_additional_args.emplace_back(flag); + } } } @@ -375,8 +380,9 @@ // the user inputs the password and logs in to preload Lacros-related files. // This speeds up the perceived startup time, as they will be loaded anyway // in the later stages of Lacros's lifetime. - if (launching_at_login_screen) + if (launching_at_login_screen) { PreloadLacrosFiles(lacros_dir); + } return params; } @@ -385,8 +391,9 @@ // If ash-chrome was given an environment variable, use it. std::unique_ptr<base::Environment> env = base::Environment::Create(); std::string xdg_runtime_dir; - if (env->GetVar("XDG_RUNTIME_DIR", &xdg_runtime_dir)) + if (env->GetVar("XDG_RUNTIME_DIR", &xdg_runtime_dir)) { return xdg_runtime_dir; + } // Otherwise provide the default for Chrome OS devices. return "/run/chrome"; @@ -396,8 +403,9 @@ // Here, lacros-chrome process may crashed, or be in the shutdown procedure. // Give some amount of time for the collection. In most cases, // this wait captures the process termination. - if (process.WaitForExitWithTimeout(timeout, nullptr)) + if (process.WaitForExitWithTimeout(timeout, nullptr)) { return; + } // Here, the process is not yet terminated. // This happens if some critical error happens on the mojo connection, @@ -489,8 +497,9 @@ bool IsNewerBrowserAvailable() const override { // If the browser loader is not able to load newer stateful component builds // signal there is no update available. - if (!BrowserLoader::WillLoadStatefulComponentBuilds()) + if (!BrowserLoader::WillLoadStatefulComponentBuilds()) { return false; + } const auto component_version_number = browser_util::GetInstalledLacrosComponentVersion( @@ -567,11 +576,13 @@ // Wait to query the flag until the user has entered the session. Enterprise // devices restart Chrome during login to apply flags. We don't want to run // the flag-off cleanup logic until we know we have the final flag state. - if (session_manager::SessionManager::Get()) + if (session_manager::SessionManager::Get()) { session_manager::SessionManager::Get()->AddObserver(this); + } - if (ash::SessionManagerClient::Get()) + if (ash::SessionManagerClient::Get()) { ash::SessionManagerClient::Get()->AddObserver(this); + } if (CrosapiManager::IsInitialized()) { CrosapiManager::Get() @@ -602,12 +613,14 @@ // Unregister, just in case the manager is destroyed before // OnUserSessionStarted() is called. - if (session_manager::SessionManager::Get()) + if (session_manager::SessionManager::Get()) { session_manager::SessionManager::Get()->RemoveObserver(this); + } // Try to kill the lacros-chrome binary. - if (lacros_process_.IsValid()) + if (lacros_process_.IsValid()) { lacros_process_.Terminate(/*exit_code=*/0, /*wait=*/false); + } DCHECK_EQ(g_instance, this); g_instance = nullptr; @@ -858,8 +871,9 @@ } void BrowserManager::SetState(State state) { - if (state_ == state) + if (state_ == state) { return; + } state_ = state; for (auto& observer : observers_) { @@ -957,8 +971,9 @@ // call |RecordDataverForPrimaryUser| now. // Otherwise, if we're pre-launching at login screen, this will be // done later, once the user logs in and the session is started. - if (user_manager::UserManager::Get()->IsUserLoggedIn()) + if (user_manager::UserManager::Get()->IsUserLoggedIn()) { RecordDataVerForPrimaryUser(); + } std::string chrome_path = lacros_path_.MaybeAsASCII() + "/chrome"; LOG(WARNING) << "Launching lacros-chrome at " << chrome_path; @@ -972,8 +987,9 @@ update_channel = browser_util::GetLacrosSelectionUpdateChannel( lacros_selection_.value()); // If we don't have channel information, we default to the "dev" channel. - if (update_channel == version_info::Channel::UNKNOWN) + if (update_channel == version_info::Channel::UNKNOWN) { update_channel = browser_util::kLacrosDefaultChannel; + } } base::LaunchOptions options; @@ -1034,8 +1050,9 @@ "--breakpad-dump-location=" + crash_dir}; // CrAS is the default audio server in Chrome OS. - if (base::SysInfo::IsRunningOnChromeOS()) + if (base::SysInfo::IsRunningOnChromeOS()) { argv.push_back("--use-cras"); + } #if BUILDFLAG(ENABLE_NACL) // This switch is forwarded to nacl_helper and is needed before zygote fork. @@ -1054,8 +1071,9 @@ base::SplitStringPieceUsingSubstr(additional_flags, "####", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); - for (const auto& flag : delimited_flags) + for (const auto& flag : delimited_flags) { argv.emplace_back(flag); + } argv.insert(argv.end(), params.lacros_additional_args.begin(), params.lacros_additional_args.end()); @@ -1230,13 +1248,15 @@ mojo::RemoteSetElementId mojo_id) { // No need to check CrosapiId here, because |mojo_id| is unique within // a process. - if (browser_service_.has_value() && browser_service_->mojo_id == mojo_id) + if (browser_service_.has_value() && browser_service_->mojo_id == mojo_id) { browser_service_.reset(); + } } void BrowserManager::OnBrowserRelaunchRequested(CrosapiId id) { - if (id != crosapi_id_) + if (id != crosapi_id_) { return; + } relaunch_requested_ = true; } @@ -1262,8 +1282,9 @@ // This may be called following a synchronous termination in `Shutdown()` or // when the mojo pipe with the lacros-chrome process has disconnected. Early // return if already handling lacros-chrome termination. - if (!lacros_process_.IsValid()) + if (!lacros_process_.IsValid()) { return; + } DCHECK(state_ == State::STARTING || state_ == State::RUNNING); DCHECK(lacros_process_.IsValid()); @@ -1294,9 +1315,10 @@ // Note that this only matters for side-by-side lacros. SetLaunchOnLoginPref(shutdown_requested_); - if (relaunch_requested_) + if (relaunch_requested_) { pending_actions_.Push( BrowserAction::OpenForFullRestore(/*skip_crash_restore=*/true)); + } StartIfNeeded(); if (unload_requested_) { @@ -1383,8 +1405,9 @@ policy::CloudPolicyRefreshScheduler* scheduler) { environment_provider_->SetLastPolicyFetchAttemptTimestamp( scheduler->last_refresh()); - if (browser_service_.has_value()) + if (browser_service_.has_value()) { browser_service_->service->NotifyPolicyFetchAttempt(); + } } void BrowserManager::OnRefreshSchedulerDestruction( @@ -1408,8 +1431,9 @@ SetState(success ? State::STOPPED : State::UNAVAILABLE); // TODO(crbug.com/1266010): In the event the load operation failed, we should // launch the last successfully loaded image. - for (auto& observer : observers_) + for (auto& observer : observers_) { observer.OnLoadComplete(success, version); + } StartIfNeeded(launching_at_login_screen); } @@ -1511,6 +1535,7 @@ } break; } + case user_manager::USER_TYPE_KIOSK_APP: case user_manager::USER_TYPE_PUBLIC_ACCOUNT: case user_manager::USER_TYPE_WEB_KIOSK_APP: { policy::DeviceLocalAccountPolicyBroker* broker = @@ -1524,8 +1549,12 @@ } break; } - default: + case user_manager::USER_TYPE_GUEST: + case user_manager::USER_TYPE_ACTIVE_DIRECTORY: + case user_manager::USER_TYPE_ARC_KIOSK_APP: break; + case user_manager::NUM_USER_TYPES: + NOTREACHED(); } // The lifetime of `BrowserManager` is longer than lifetime of various @@ -1534,8 +1563,9 @@ // and not in the destructor. if (core) { core->AddObserver(this); - if (core->refresh_scheduler()) + if (core->refresh_scheduler()) { core->refresh_scheduler()->AddObserver(this); + } policy::CloudPolicyStore* store = core->store(); if (store && store->policy_fetch_response()) { @@ -1546,8 +1576,9 @@ } } - if (component_policy_service) + if (component_policy_service) { component_policy_service->AddObserver(this); + } } void BrowserManager::SetDeviceAccountPolicy(const std::string& policy_blob) { @@ -1566,23 +1597,26 @@ void BrowserManager::StartKeepAlive(Feature feature) { DCHECK(browser_util::IsLacrosEnabled()); - if (IsKeepAliveDisabledForTesting()) + if (IsKeepAliveDisabledForTesting()) { return; + } DCHECK(keep_alive_features_.find(feature) == keep_alive_features_.end()) << "Features should never be double registered."; keep_alive_features_.insert(feature); // If this is first KeepAlive instance, update the keep-alive in the browser. - if (keep_alive_features_.size() == 1) + if (keep_alive_features_.size() == 1) { UpdateKeepAliveInBrowserIfNecessary(true); + } StartIfNeeded(); } void BrowserManager::StopKeepAlive(Feature feature) { keep_alive_features_.erase(feature); - if (!IsKeepAliveEnabled()) + if (!IsKeepAliveEnabled()) { UpdateKeepAliveInBrowserIfNecessary(false); + } } bool BrowserManager::IsKeepAliveEnabled() const {
diff --git a/chrome/browser/ash/crosapi/structured_metrics_service_ash.cc b/chrome/browser/ash/crosapi/structured_metrics_service_ash.cc index 44b5f8a..db6ddb0 100644 --- a/chrome/browser/ash/crosapi/structured_metrics_service_ash.cc +++ b/chrome/browser/ash/crosapi/structured_metrics_service_ash.cc
@@ -21,9 +21,9 @@ } void StructuredMetricsServiceAsh::Record( - const std::vector<::metrics::structured::Event>& events) { - for (const auto& event : events) { - metrics::structured::Recorder::GetInstance()->RecordEvent(event.Clone()); + std::vector<::metrics::structured::Event> events) { + for (auto& event : events) { + metrics::structured::Recorder::GetInstance()->RecordEvent(std::move(event)); } }
diff --git a/chrome/browser/ash/crosapi/structured_metrics_service_ash.h b/chrome/browser/ash/crosapi/structured_metrics_service_ash.h index 7a3fbe6b..32a4ba8b 100644 --- a/chrome/browser/ash/crosapi/structured_metrics_service_ash.h +++ b/chrome/browser/ash/crosapi/structured_metrics_service_ash.h
@@ -28,7 +28,7 @@ mojo::PendingReceiver<mojom::StructuredMetricsService> receiver); // crosapi::mojom::StructuredMetricsService - void Record(const std::vector<::metrics::structured::Event>& events) override; + void Record(std::vector<::metrics::structured::Event> events) override; private: mojo::ReceiverSet<mojom::StructuredMetricsService> receivers_;
diff --git a/chrome/browser/ash/crosapi/web_app_provider_bridge_browsertest.cc b/chrome/browser/ash/crosapi/web_app_provider_bridge_browsertest.cc new file mode 100644 index 0000000..1375df2 --- /dev/null +++ b/chrome/browser/ash/crosapi/web_app_provider_bridge_browsertest.cc
@@ -0,0 +1,79 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "base/test/bind.h" +#include "base/test/test_future.h" +#include "chrome/browser/ash/crosapi/ash_requires_lacros_browsertestbase.h" +#include "chrome/browser/ash/crosapi/crosapi_manager.h" +#include "chrome/browser/ash/crosapi/web_app_service_ash.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/web_applications/test/app_registry_cache_waiter.h" +#include "chrome/browser/web_applications/web_app_id.h" +#include "chromeos/crosapi/mojom/test_controller.mojom-test-utils.h" +#include "content/public/test/browser_test.h" + +namespace crosapi { +namespace { +class WebAppProviderBridgeBrowserTest + : public AshRequiresLacrosBrowserTestBase { + protected: + web_app::AppId InstallWebApp(const std::string& start_url, + apps::WindowMode mode) { + crosapi::mojom::StandaloneBrowserTestControllerAsyncWaiter waiter( + GetStandaloneBrowserTestController()); + std::string app_id; + waiter.InstallWebApp(start_url, mode, &app_id); + CHECK(!app_id.empty()); + web_app::AppReadinessWaiter(profile(), app_id).Await(); + return app_id; + } + + web_app::AppId InstallSubApp(const web_app::AppId& parent_app_id, + std::string sub_app_start_url) { + crosapi::mojom::StandaloneBrowserTestControllerAsyncWaiter waiter( + GetStandaloneBrowserTestController()); + std::string sub_app_id; + waiter.InstallSubApp(parent_app_id, sub_app_start_url, &sub_app_id); + CHECK(!sub_app_id.empty()); + web_app::AppReadinessWaiter(profile(), sub_app_id).Await(); + return sub_app_id; + } + + Profile* profile() { return browser()->profile(); } +}; + +IN_PROC_BROWSER_TEST_F(WebAppProviderBridgeBrowserTest, GetSubAppIds) { + if (!HasLacrosArgument()) { + return; + } + + web_app::AppId parent_app_id = + InstallWebApp("https://www.parent-app.com", apps::WindowMode::kWindow); + web_app::AppId sub_app_id_1 = + InstallSubApp(parent_app_id, "https://www.parent-app.com/sub-app-1"); + web_app::AppId sub_app_id_2 = + InstallSubApp(parent_app_id, "https://www.parent-app.com/sub-app-2"); + + base::flat_set<web_app::AppId> expected; + expected.emplace(sub_app_id_1); + expected.emplace(sub_app_id_2); + + crosapi::mojom::WebAppProviderBridge* web_app_provider_bridge = + crosapi::CrosapiManager::Get() + ->crosapi_ash() + ->web_app_service_ash() + ->GetWebAppProviderBridge(); + ASSERT_TRUE(web_app_provider_bridge); + + base::test::TestFuture<const std::vector<web_app::AppId>&> + get_sub_apps_future; + + web_app_provider_bridge->GetSubAppIds(parent_app_id, + get_sub_apps_future.GetCallback()); + + base::flat_set<web_app::AppId> results_set{get_sub_apps_future.Get()}; + EXPECT_EQ(2u, results_set.size()); + EXPECT_EQ(results_set, expected); +} +} // namespace +} // namespace crosapi
diff --git a/chrome/browser/ash/drive/fileapi/drivefs_async_file_util.cc b/chrome/browser/ash/drive/fileapi/drivefs_async_file_util.cc index bd96edf..3979253 100644 --- a/chrome/browser/ash/drive/fileapi/drivefs_async_file_util.cc +++ b/chrome/browser/ash/drive/fileapi/drivefs_async_file_util.cc
@@ -146,6 +146,9 @@ // Drive cloud Trash. class DeleteOperation { public: + using PinManager = drivefs::pinning::PinManager; + using Id = PinManager::Id; + DeleteOperation(Profile* profile, const base::FilePath& path, storage::AsyncFileUtil::StatusCallback callback, @@ -165,11 +168,10 @@ void Start() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - auto* drive_integration_service = - drive::util::GetIntegrationServiceByProfile(profile_); + DCHECK(!drive_); + drive_ = drive::util::GetIntegrationServiceByProfile(profile_); base::FilePath relative_path; - if (!drive_integration_service || - !drive_integration_service->GetMountPointPath().IsParent(path_)) { + if (!drive_ || !drive_->GetMountPointPath().IsParent(path_)) { origin_task_runner_->PostTask( FROM_HERE, base::BindOnce(std::move(callback_), base::File::FILE_ERROR_FAILED)); @@ -177,8 +179,6 @@ return; } - drive_ = drive_integration_service; - if (ash::features::IsDriveFsBulkPinningEnabled()) { if (drive_->GetRelativeDrivePath(path_, &drive_path_)) { // TODO(b/266168982): In the case this is a folder, only the folder will @@ -197,20 +197,22 @@ base::BindOnce(&DeleteOperation::Delete, base::Unretained(this))); } - void OnGotMetadata(drive::FileError error, - drivefs::mojom::FileMetadataPtr metadata) { - LOG_IF(ERROR, error != drive::FILE_ERROR_OK) - << "Failed to get metadata: " << drive::FileErrorToString(error); - - if (metadata) { - stable_id_ = metadata->stable_id; - if (error == drive::FILE_ERROR_OK && metadata->pinned && drive_) { + void OnGotMetadata(const drive::FileError error, + const drivefs::mojom::FileMetadataPtr metadata) { + if (error == drive::FILE_ERROR_OK) { + DCHECK(metadata); + id_ = Id(metadata->stable_id); + VLOG(1) << "Got metadata of " << id_ << " '" << drive_path_ << "'"; + if (metadata->pinned) { + DCHECK(drive_); drive_->GetDriveFsInterface()->SetPinnedByStableId( metadata->stable_id, /*pinned=*/false, base::BindOnce(&DeleteOperation::OnUnpinFile, base::Unretained(this))); return; } + } else { + LOG(ERROR) << "Cannot get metadata of '" << drive_path_ << "': " << error; } blocking_task_runner_->PostTask( @@ -218,46 +220,50 @@ base::BindOnce(&DeleteOperation::Delete, base::Unretained(this))); } - void OnUnpinFile(drive::FileError error) { + void OnUnpinFile(const drive::FileError error) { LOG_IF(ERROR, error != drive::FILE_ERROR_OK) - << "Failed to unpin file before deleting it: " - << drive::FileErrorToString(error); + << "Cannot unpin " << id_ << " '" << drive_path_ + << "' before deleting it: " << error; blocking_task_runner_->PostTask( FROM_HERE, base::BindOnce(&DeleteOperation::Delete, base::Unretained(this))); } void Delete() { - base::File::Error error = base::DeletePathRecursively(path_) - ? base::File::FILE_OK - : base::File::FILE_ERROR_FAILED; - if (error == base::File::FILE_OK && drive_) { - using drivefs::pinning::PinManager; + VLOG(1) << "Deleting '" << path_ << "'..."; + const bool deleted = base::DeletePathRecursively(path_); + + if (deleted) { + VLOG(1) << "Deleted '" << path_ << "'"; + DCHECK(drive_); if (PinManager* const pin_manager = drive_->GetPinManager()) { // TODO(b/267225898): Local delete events are currently not sent via // DriveFS, so for now notify the `PinManager` for local deletes. content::GetUIThreadTaskRunner({})->PostTask( - FROM_HERE, base::BindOnce(&PinManager::NotifyDelete, - base::Unretained(pin_manager), - PinManager::Id(stable_id_), drive_path_)); + FROM_HERE, + base::BindOnce(&PinManager::NotifyDelete, pin_manager->GetWeakPtr(), + id_, drive_path_)); } + } else { + LOG(ERROR) << "Cannot delete '" << path_ << "'"; } - origin_task_runner_->PostTask(FROM_HERE, - base::BindOnce(std::move(callback_), error)); + + origin_task_runner_->PostTask( + FROM_HERE, base::BindOnce(std::move(callback_), + deleted ? base::File::FILE_OK + : base::File::FILE_ERROR_FAILED)); origin_task_runner_->DeleteSoon(FROM_HERE, this); } Profile* const profile_; const base::FilePath path_; base::FilePath drive_path_; - int64_t stable_id_ = -1; + Id id_ = Id::kNone; storage::AsyncFileUtil::StatusCallback callback_; - scoped_refptr<base::SequencedTaskRunner> origin_task_runner_; - scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; + const scoped_refptr<base::SequencedTaskRunner> origin_task_runner_; + const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; raw_ptr<drive::DriveIntegrationService> drive_ = nullptr; - - base::FilePath path_in_trash_; }; } // namespace
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest.cc b/chrome/browser/ash/file_manager/file_manager_browsertest.cc index 4dcd4387..fe91dfc 100644 --- a/chrome/browser/ash/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
@@ -316,7 +316,7 @@ case kChild: full_name += "_AccountTypeChild"; break; - case kNonManged: + case kNonManaged: full_name += "_AccountTypeNonManaged"; break; case kNonManagedNonOwner: @@ -402,7 +402,7 @@ case kTestAccountTypeNotSet: case kEnterprise: case kChild: - case kNonManged: + case kNonManaged: owner_email = logged_in_user_mixin_->GetAccountId().GetUserEmail(); break; case kNonManagedNonOwner: @@ -439,45 +439,6 @@ } } - ash::LoggedInUserMixin::LogInType LogInTypeFor( - TestAccountType test_account_type) { - switch (test_account_type) { - case kTestAccountTypeNotSet: - CHECK(false) << "test_account_type option must be set for " - "LoggedInUserFilesAppBrowserTest"; - // TODO(crbug.com/1061742): `base::ImmediateCrash` is necessary. - base::ImmediateCrash(); - case kEnterprise: - return ash::LoggedInUserMixin::LogInType::kRegular; - case kChild: - return ash::LoggedInUserMixin::LogInType::kChild; - case kNonManged: - case kNonManagedNonOwner: - return ash::LoggedInUserMixin::LogInType::kRegular; - } - } - - absl::optional<AccountId> AccountIdFor(TestAccountType test_account_type) { - switch (test_account_type) { - case kTestAccountTypeNotSet: - CHECK(false) << "test_account_type option must be set for " - "LoggedInUserFilesAppBrowserTest"; - // `base::ImmediateCrash` is necessary for https://crbug.com/1061742. - base::ImmediateCrash(); - case kEnterprise: - return AccountId::FromUserEmailGaiaId( - FakeGaiaMixin::kEnterpriseUser1, - FakeGaiaMixin::kEnterpriseUser1GaiaId); - case kChild: - // Use the default account provided by `LoggedInUserMixin`. - return absl::nullopt; - case kNonManged: - case kNonManagedNonOwner: - // Use the default account provided by `LoggedInUserMixin`. - return absl::nullopt; - } - } - std::unique_ptr<ash::LoggedInUserMixin> logged_in_user_mixin_; std::unique_ptr<ash::DeviceStateMixin> device_state_mixin_; @@ -1718,15 +1679,15 @@ // `FilesAppBrowserTest`. TestCase("driveGoogleOneOfferBannerEnabled") .SetDeviceMode(DeviceMode::kConsumerOwned) - .SetTestAccountType(TestAccountType::kNonManged) + .SetTestAccountType(TestAccountType::kNonManaged) .EnableGoogleOneOfferFilesBanner(), // Google One offer banner is disabled by default. TestCase("driveGoogleOneOfferBannerDisabled") .SetDeviceMode(DeviceMode::kConsumerOwned) - .SetTestAccountType(TestAccountType::kNonManged), + .SetTestAccountType(TestAccountType::kNonManaged), TestCase("driveGoogleOneOfferBannerDismiss") .SetDeviceMode(DeviceMode::kConsumerOwned) - .SetTestAccountType(TestAccountType::kNonManged) + .SetTestAccountType(TestAccountType::kNonManaged) .EnableGoogleOneOfferFilesBanner(), TestCase("driveGoogleOneOfferBannerDisabled") .EnableGoogleOneOfferFilesBanner() @@ -1741,7 +1702,7 @@ TestCase("driveGoogleOneOfferBannerDisabled") .EnableGoogleOneOfferFilesBanner() .SetDeviceMode(DeviceMode::kEnrolled) - .SetTestAccountType(TestAccountType::kNonManged), + .SetTestAccountType(TestAccountType::kNonManaged), // We do not show a banner if a profile is not an owner profile. TestCase("driveGoogleOneOfferBannerDisabled") .EnableGoogleOneOfferFilesBanner()
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc index 2e53f231..281053c 100644 --- a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc +++ b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
@@ -822,6 +822,45 @@ } // anonymous namespace +ash::LoggedInUserMixin::LogInType LogInTypeFor( + TestAccountType test_account_type) { + switch (test_account_type) { + case kTestAccountTypeNotSet: + CHECK(false) << "test_account_type option must be set for " + "LoggedInUserFilesAppBrowserTest"; + // TODO(crbug.com/1061742): `base::ImmediateCrash` is necessary. + base::ImmediateCrash(); + case kEnterprise: + return ash::LoggedInUserMixin::LogInType::kRegular; + case kChild: + return ash::LoggedInUserMixin::LogInType::kChild; + case kNonManaged: + case kNonManagedNonOwner: + return ash::LoggedInUserMixin::LogInType::kRegular; + } +} + +absl::optional<AccountId> AccountIdFor(TestAccountType test_account_type) { + switch (test_account_type) { + case kTestAccountTypeNotSet: + CHECK(false) << "test_account_type option must be set for " + "LoggedInUserFilesAppBrowserTest"; + // `base::ImmediateCrash` is necessary for https://crbug.com/1061742. + base::ImmediateCrash(); + case kEnterprise: + return AccountId::FromUserEmailGaiaId( + FakeGaiaMixin::kEnterpriseUser1, + FakeGaiaMixin::kEnterpriseUser1GaiaId); + case kChild: + // Use the default account provided by `LoggedInUserMixin`. + return absl::nullopt; + case kNonManaged: + case kNonManagedNonOwner: + // Use the default account provided by `LoggedInUserMixin`. + return absl::nullopt; + } +} + std::ostream& operator<<(std::ostream& out, const GuestMode mode) { switch (mode) { case NOT_IN_GUEST_MODE:
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest_base.h b/chrome/browser/ash/file_manager/file_manager_browsertest_base.h index b59feb4..022e827 100644 --- a/chrome/browser/ash/file_manager/file_manager_browsertest_base.h +++ b/chrome/browser/ash/file_manager/file_manager_browsertest_base.h
@@ -16,6 +16,7 @@ #include "base/test/scoped_feature_list.h" #include "chrome/browser/ash/crostini/fake_crostini_features.h" #include "chrome/browser/ash/drive/drive_integration_service.h" +#include "chrome/browser/ash/login/test/logged_in_user_mixin.h" #include "chrome/browser/extensions/mixin_based_extension_apitest.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/web_app_id.h" @@ -44,7 +45,7 @@ kTestAccountTypeNotSet, kEnterprise, kChild, - kNonManged, + kNonManaged, // Non-managed account as a non owner profile on a device. kNonManagedNonOwner, }; @@ -62,6 +63,11 @@ class HiddenTestVolume; class GuestOsTestVolume; +ash::LoggedInUserMixin::LogInType LogInTypeFor( + TestAccountType test_account_type); + +absl::optional<AccountId> AccountIdFor(TestAccountType test_account_type); + class FileManagerBrowserTestBase : public content::DevToolsAgentHostObserver, public extensions::MixinBasedExtensionApiTest {
diff --git a/chrome/browser/ash/file_manager/file_tasks_browsertest.cc b/chrome/browser/ash/file_manager/file_tasks_browsertest.cc index 20eabdbd..ff3816a 100644 --- a/chrome/browser/ash/file_manager/file_tasks_browsertest.cc +++ b/chrome/browser/ash/file_manager/file_tasks_browsertest.cc
@@ -1146,8 +1146,10 @@ RegisterPublisher(apps::AppType::kWeb); std::vector<apps::AppPtr> apps; - apps.push_back(std::make_unique<apps::App>(apps::AppType::kWeb, - web_app::kMicrosoftOfficeAppId)); + auto ms_web_app = std::make_unique<apps::App>( + apps::AppType::kWeb, web_app::kMicrosoftOfficeAppId); + ms_web_app->readiness = apps::Readiness::kReady; + apps.push_back(std::move(ms_web_app)); Publish(std::move(apps), apps::AppType::kWeb, /*should_notify_initialized=*/true); }
diff --git a/chrome/browser/ash/input_method/assistive_window_controller.cc b/chrome/browser/ash/input_method/assistive_window_controller.cc index e0f3b72..0439c7f 100644 --- a/chrome/browser/ash/input_method/assistive_window_controller.cc +++ b/chrome/browser/ash/input_method/assistive_window_controller.cc
@@ -204,6 +204,7 @@ if (highlighted) Announce(button.announce_string); break; + case ash::ime::AssistiveWindowType::kLearnMore: case ash::ime::AssistiveWindowType::kUndoWindow: if (!undo_window_) return; @@ -237,6 +238,7 @@ ash::ime::AssistiveWindowType window_type) { switch (window_type) { case ash::ime::AssistiveWindowType::kLongpressDiacriticsSuggestion: + case ash::ime::AssistiveWindowType::kLearnMore: return ui::ime::SuggestionWindowView::Orientation::kHorizontal; case ash::ime::AssistiveWindowType::kUndoWindow: case ash::ime::AssistiveWindowType::kEmojiSuggestion: @@ -269,11 +271,12 @@ bounds_.autocorrect.IsEmpty() ? bounds_.caret : bounds_.autocorrect; anchor_rect.Inset(-4); undo_window_->SetAnchorRect(anchor_rect); - undo_window_->Show(); + undo_window_->Show(window.show_setting_link); } else { undo_window_->Hide(); } break; + case ash::ime::AssistiveWindowType::kLearnMore: case ash::ime::AssistiveWindowType::kEmojiSuggestion: case ash::ime::AssistiveWindowType::kPersonalInfoSuggestion: case ash::ime::AssistiveWindowType::kMultiWordSuggestion:
diff --git a/chrome/browser/ash/input_method/autocorrect_manager.cc b/chrome/browser/ash/input_method/autocorrect_manager.cc index ee0c2aa..dbca8c21 100644 --- a/chrome/browser/ash/input_method/autocorrect_manager.cc +++ b/chrome/browser/ash/input_method/autocorrect_manager.cc
@@ -23,6 +23,7 @@ #include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" +#include "components/strings/grit/components_strings.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "ui/base/ime/ash/extension_ime_util.h" #include "ui/base/ime/ash/ime_bridge.h" @@ -374,7 +375,14 @@ AutocorrectManager::AutocorrectManager( SuggestionHandlerInterface* suggestion_handler, Profile* profile) - : suggestion_handler_(suggestion_handler), profile_(profile) {} + : suggestion_handler_(suggestion_handler), profile_(profile) { + undo_button_.id = ui::ime::ButtonId::kUndo; + undo_button_.window_type = ash::ime::AssistiveWindowType::kUndoWindow; + learn_more_button_.id = ui::ime::ButtonId::kLearnMore; + learn_more_button_.announce_string = + l10n_util::GetStringUTF16(IDS_LEARN_MORE); + learn_more_button_.window_type = ash::ime::AssistiveWindowType::kLearnMore; +} AutocorrectManager::~AutocorrectManager() = default; @@ -736,17 +744,34 @@ return false; } - if (event.code() == ui::DomCode::ARROW_UP || - event.code() == ui::DomCode::TAB) { - HighlightUndoButton(); + if (event.code() == ui::DomCode::ARROW_UP) { + HighlightButtons(/*should_highlight_undo=*/true, + /*should_highlight_learn_more=*/false); return true; } - if (event.code() == ui::DomCode::ENTER && - pending_autocorrect_->undo_button_highlighted) { - UndoAutocorrect(); - return true; + if (event.code() == ui::DomCode::TAB) { + if (!pending_autocorrect_->undo_button_highlighted) { + HighlightButtons(/*should_highlight_undo=*/true, + /*should_highlight_learn_more=*/false); + return true; + } + if (pending_autocorrect_->learn_more_button_visible) { + HighlightButtons(/*should_highlight_undo=*/false, + /*should_highlight_learn_more=*/true); + return true; + } } - + if (event.code() == ui::DomCode::ENTER) { + if (pending_autocorrect_->undo_button_highlighted) { + UndoAutocorrect(); + return true; + } + if (pending_autocorrect_->learn_more_button_highlighted) { + HideUndoWindow(); + suggestion_handler_->ClickButton(learn_more_button_); + return true; + } + } return false; } @@ -979,6 +1004,8 @@ AssistiveWindowProperties properties; properties.type = ash::ime::AssistiveWindowType::kUndoWindow; properties.visible = true; + properties.show_setting_link = + pending_autocorrect_->learn_more_button_visible; properties.announce_string = l10n_util::GetStringFUTF16( IDS_SUGGESTION_AUTOCORRECT_UNDO_WINDOW_SHOWN, pending_autocorrect_->original_text, @@ -1039,36 +1066,39 @@ if (pending_autocorrect_.has_value()) { pending_autocorrect_->undo_button_highlighted = false; + pending_autocorrect_->learn_more_button_highlighted = false; pending_autocorrect_->undo_window_visible = false; } } -void AutocorrectManager::HighlightUndoButton() { +void AutocorrectManager::HighlightButtons( + const bool should_highlight_undo, + const bool should_highlight_learn_more) { if (!pending_autocorrect_.has_value() || - !pending_autocorrect_->undo_window_visible || - pending_autocorrect_->undo_button_highlighted) { + !pending_autocorrect_->undo_window_visible) { return; } std::string error; - ui::ime::AssistiveWindowButton button = ui::ime::AssistiveWindowButton(); - button.id = ui::ime::ButtonId::kUndo; - button.window_type = ash::ime::AssistiveWindowType::kUndoWindow; - button.announce_string = l10n_util::GetStringFUTF16( - IDS_SUGGESTION_AUTOCORRECT_UNDO_BUTTON, - pending_autocorrect_->original_text); - suggestion_handler_->SetButtonHighlighted(context_id_, button, true, - &error); - - LogAssistiveAutocorrectInternalState( - AutocorrectInternalStates::kHighlightUndoWindow); - + undo_button_.announce_string = + l10n_util::GetStringFUTF16(IDS_SUGGESTION_AUTOCORRECT_UNDO_BUTTON, + pending_autocorrect_->original_text); + suggestion_handler_->SetButtonHighlighted(context_id_, undo_button_, + should_highlight_undo, &error); if (!error.empty()) { LOG(ERROR) << "Failed to highlight undo button."; return; } + suggestion_handler_->SetButtonHighlighted( + context_id_, learn_more_button_, should_highlight_learn_more, &error); + if (!error.empty()) { + LOG(ERROR) << "Failed to highlight learn more button."; + return; + } - pending_autocorrect_->undo_button_highlighted = true; + pending_autocorrect_->undo_button_highlighted = should_highlight_undo; + pending_autocorrect_->learn_more_button_highlighted = + should_highlight_learn_more; } void AutocorrectManager::AcceptOrClearPendingAutocorrect() {
diff --git a/chrome/browser/ash/input_method/autocorrect_manager.h b/chrome/browser/ash/input_method/autocorrect_manager.h index 736c1bd..a63703a 100644 --- a/chrome/browser/ash/input_method/autocorrect_manager.h +++ b/chrome/browser/ash/input_method/autocorrect_manager.h
@@ -182,6 +182,9 @@ void OnSurroundingTextChanged(const std::u16string& text, gfx::Range selection_range); + // Hides undo window if there is any visible. + void HideUndoWindow(); + void UndoAutocorrect(); // Whether auto correction is disabled by some rule. @@ -211,15 +214,13 @@ // set to empty. void AcceptOrClearPendingAutocorrect(); - // Hides undo window if there is any visible. - void HideUndoWindow(); - // Shows undo window and record the relevant metric if undo window is // not already visible. void ShowUndoWindow(gfx::Range range, const std::u16string& text); - // Highlights undo button of undo window if it is visible. - void HighlightUndoButton(); + // Highlights the appropriate undo or learn more buttons in the undo window + void HighlightButtons(bool should_highlight_undo, + bool should_highlight_learn_more); // Processes the result of a set autocorrect range call. An unsuccessful // result could mean that autocorrect was not supported by the text input @@ -270,6 +271,13 @@ // Specifies if undo button is highlighted or not. bool undo_button_highlighted = false; + // Specifies if learn more button is visible or not. + // TODO(b/259856275): Calculate when to activate learn_more_button_visible + bool learn_more_button_visible = false; + + // Specifies if learn more button is highlighted or not. + bool learn_more_button_highlighted = false; + // Specifies if window_shown metric is already incremented for the pending // autocorrect or not. bool window_shown_logged = false; @@ -335,6 +343,9 @@ diacritics_insensitive_string_comparator_; bool in_diacritical_autocorrect_session_ = false; + ui::ime::AssistiveWindowButton undo_button_; + ui::ime::AssistiveWindowButton learn_more_button_; + bool disabled_by_rule_ = false; base::WeakPtrFactory<AutocorrectManager> weak_ptr_factory_{this};
diff --git a/chrome/browser/ash/input_method/autocorrect_manager_unittest.cc b/chrome/browser/ash/input_method/autocorrect_manager_unittest.cc index a56daac..59f35e1a 100644 --- a/chrome/browser/ash/input_method/autocorrect_manager_unittest.cc +++ b/chrome/browser/ash/input_method/autocorrect_manager_unittest.cc
@@ -16,6 +16,7 @@ #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" #include "chrome/test/base/testing_profile.h" +#include "components/strings/grit/components_strings.h" #include "components/ukm/test_ukm_recorder.h" #include "content/public/test/browser_task_environment.h" #include "services/metrics/public/cpp/ukm_builders.h" @@ -370,6 +371,15 @@ return button; } +// A helper to create highlighted learn more button in assistive window. +ui::ime::AssistiveWindowButton CreateHighlightedLearnMoreButton() { + ui::ime::AssistiveWindowButton button = ui::ime::AssistiveWindowButton(); + button.id = ui::ime::ButtonId::kLearnMore; + button.announce_string = l10n_util::GetStringUTF16(IDS_LEARN_MORE); + button.window_type = ash::ime::AssistiveWindowType::kLearnMore; + return button; +} + // A helper for creating key event. ui::KeyEvent CreateKeyEvent(ui::DomKey key, ui::DomCode code) { return ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_UNKNOWN, code, ui::EF_NONE, @@ -892,10 +902,15 @@ EXPECT_CALL(mock_suggestion_handler_, SetAssistiveWindowProperties(_, shown_properties, _)); - ui::ime::AssistiveWindowButton button = - CreateHighlightedUndoButton(u"teh"); + ui::ime::AssistiveWindowButton undo_button = + CreateHighlightedUndoButton(u"teh"); EXPECT_CALL(mock_suggestion_handler_, - SetButtonHighlighted(_, button, true, _)); + SetButtonHighlighted(_, undo_button, true, _)); + + ui::ime::AssistiveWindowButton learn_more_button = + CreateHighlightedLearnMoreButton(); + EXPECT_CALL(mock_suggestion_handler_, + SetButtonHighlighted(_, learn_more_button, false, _)); } manager_.OnSurroundingTextChanged(u"the ", gfx::Range(1)); @@ -916,9 +931,15 @@ EXPECT_CALL(mock_suggestion_handler_, SetAssistiveWindowProperties(_, shown_properties, _)); - ui::ime::AssistiveWindowButton button = CreateHighlightedUndoButton(u"teh"); + ui::ime::AssistiveWindowButton undo_button = + CreateHighlightedUndoButton(u"teh"); EXPECT_CALL(mock_suggestion_handler_, - SetButtonHighlighted(_, button, true, _)); + SetButtonHighlighted(_, undo_button, true, _)); + + ui::ime::AssistiveWindowButton learn_more_button = + CreateHighlightedLearnMoreButton(); + EXPECT_CALL(mock_suggestion_handler_, + SetButtonHighlighted(_, learn_more_button, false, _)); } manager_.OnSurroundingTextChanged(u"the ", gfx::Range(1)); @@ -939,10 +960,15 @@ EXPECT_CALL(mock_suggestion_handler_, SetAssistiveWindowProperties(_, shown_properties, _)); - ui::ime::AssistiveWindowButton button = + ui::ime::AssistiveWindowButton undo_button = CreateHighlightedUndoButton(u"teh"); EXPECT_CALL(mock_suggestion_handler_, - SetButtonHighlighted(_, button, true, _)); + SetButtonHighlighted(_, undo_button, true, _)); + + ui::ime::AssistiveWindowButton learn_more_button = + CreateHighlightedLearnMoreButton(); + EXPECT_CALL(mock_suggestion_handler_, + SetButtonHighlighted(_, learn_more_button, false, _)); AssistiveWindowProperties hidden_properties = CreateHiddenUndoWindowProperties(); @@ -2487,9 +2513,15 @@ EXPECT_CALL(mock_suggestion_handler_, SetAssistiveWindowProperties(_, shown_properties, _)); - ui::ime::AssistiveWindowButton button = CreateHighlightedUndoButton(u"teh"); + ui::ime::AssistiveWindowButton undo_button = + CreateHighlightedUndoButton(u"teh"); EXPECT_CALL(mock_suggestion_handler_, - SetButtonHighlighted(_, button, true, _)); + SetButtonHighlighted(_, undo_button, true, _)); + + ui::ime::AssistiveWindowButton learn_more_button = + CreateHighlightedLearnMoreButton(); + EXPECT_CALL(mock_suggestion_handler_, + SetButtonHighlighted(_, learn_more_button, false, _)); AssistiveWindowProperties hidden_properties = CreateHiddenUndoWindowProperties();
diff --git a/chrome/browser/ash/input_method/native_input_method_engine_observer.cc b/chrome/browser/ash/input_method/native_input_method_engine_observer.cc index 712babb..e4d73df 100644 --- a/chrome/browser/ash/input_method/native_input_method_engine_observer.cc +++ b/chrome/browser/ash/input_method/native_input_method_engine_observer.cc
@@ -1039,6 +1039,14 @@ ProfileManager::GetActiveUserProfile(), chromeos::settings::mojom::kSmartInputsSubpagePath); } + if (button.window_type == ash::ime::AssistiveWindowType::kLearnMore) { + autocorrect_manager_->HideUndoWindow(); + base::RecordAction(base::UserMetricsAction( + "ChromeOS.Settings.InputMethod.Autocorrect.Open")); + chrome::SettingsWindowManager::GetInstance()->ShowOSSettings( + ProfileManager::GetActiveUserProfile(), + chromeos::settings::mojom::kInputMethodOptionsSubpagePath); + } break; case ui::ime::ButtonId::kSuggestion: if (assistive_suggester_->IsAssistiveFeatureEnabled()) {
diff --git a/chrome/browser/ash/input_method/ui/undo_window.cc b/chrome/browser/ash/input_method/ui/undo_window.cc index bc808f2..1e2aee9 100644 --- a/chrome/browser/ash/input_method/ui/undo_window.cc +++ b/chrome/browser/ash/input_method/ui/undo_window.cc
@@ -7,9 +7,12 @@ #include "ash/public/cpp/style/color_provider.h" #include "ash/public/cpp/style/scoped_light_mode_as_default.h" #include "chrome/app/vector_icons/vector_icons.h" +#include "chrome/browser/ash/input_method/assistive_window_properties.h" #include "chrome/browser/ash/input_method/ui/border_factory.h" #include "chrome/browser/ash/input_method/ui/colors.h" #include "chrome/grit/generated_resources.h" +#include "components/strings/grit/components_strings.h" +#include "components/vector_icons/vector_icons.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/gfx/paint_vector_icon.h" @@ -31,6 +34,15 @@ constexpr cros_styles::ColorName kButtonHighlightColor = cros_styles::ColorName::kRippleColor; +void SetHighlighted(views::View& view, bool highlighted) { + if (!!view.background() != highlighted) { + view.SetBackground(highlighted + ? views::CreateRoundedRectBackground( + ResolveSemanticColor(kButtonHighlightColor), 2) + : nullptr); + } +} + } // namespace UndoWindow::UndoWindow(gfx::NativeView parent, AssistiveDelegate* delegate) @@ -59,6 +71,20 @@ undo_button_->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY); undo_button_->SetMaxSize( gfx::Size(std::numeric_limits<int>::max(), kHeight - 2 * kPadding)); + + learn_more_button_ = + AddChildView(std::make_unique<views::ImageButton>(base::BindRepeating( + &AssistiveDelegate::AssistiveWindowButtonClicked, + base::Unretained(delegate_), + AssistiveWindowButton{ + .id = ui::ime::ButtonId::kLearnMore, + .window_type = ash::ime::AssistiveWindowType::kLearnMore}))); + learn_more_button_->SetImageHorizontalAlignment( + views::ImageButton::ALIGN_CENTER); + learn_more_button_->SetImageVerticalAlignment( + views::ImageButton::ALIGN_MIDDLE); + learn_more_button_->SetTooltipText(l10n_util::GetStringUTF16(IDS_LEARN_MORE)); + learn_more_button_->SetVisible(false); } void UndoWindow::OnThemeChanged() { @@ -74,6 +100,21 @@ undo_button_->SetEnabledTextColors( ash::ColorProvider::Get()->GetContentLayerColor( ash::ColorProvider::ContentLayerType::kTextColorSecondary)); + + const auto* const color_provider = GetColorProvider(); + learn_more_button_->SetBorder(views::CreatePaddedBorder( + views::CreateSolidSidedBorder( + gfx::Insets::TLBR(1, 0, 0, 0), + color_provider->GetColor(ui::kColorBubbleFooterBorder)), + views::LayoutProvider::Get()->GetInsetsMetric( + views::INSETS_VECTOR_IMAGE_BUTTON))); + + // TODO(crbug.com/1099044): Update and use cros colors. + learn_more_button_->SetImageModel( + views::Button::ButtonState::STATE_NORMAL, + ui::ImageModel::FromVectorIcon(vector_icons::kHelpOutlineIcon, + ui::kColorIconSecondary)); + BubbleDialogDelegateView::OnThemeChanged(); } @@ -95,8 +136,10 @@ GetWidget()->Close(); } -void UndoWindow::Show() { +void UndoWindow::Show(const bool show_setting_link) { + learn_more_button_->SetVisible(show_setting_link); GetWidget()->Show(); + SizeToContents(); } void UndoWindow::SetBounds(const gfx::Rect& word_bounds) { @@ -105,17 +148,11 @@ void UndoWindow::SetButtonHighlighted(const AssistiveWindowButton& button, bool highlighted) { - if (button.id != ButtonId::kUndo) - return; - - bool currently_hightlighted = undo_button_->background() != nullptr; - if (highlighted == currently_hightlighted) - return; - - undo_button_->SetBackground( - highlighted ? views::CreateSolidBackground( - ResolveSemanticColor(kButtonHighlightColor)) - : nullptr); + if (button.id == ButtonId::kUndo) { + SetHighlighted(*undo_button_, highlighted); + } else if (button.id == ButtonId::kLearnMore) { + SetHighlighted(*learn_more_button_, highlighted); + } } views::Button* UndoWindow::GetUndoButtonForTesting() {
diff --git a/chrome/browser/ash/input_method/ui/undo_window.h b/chrome/browser/ash/input_method/ui/undo_window.h index 44157a08..307be6a 100644 --- a/chrome/browser/ash/input_method/ui/undo_window.h +++ b/chrome/browser/ash/input_method/ui/undo_window.h
@@ -5,11 +5,14 @@ #ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_UNDO_WINDOW_H_ #define CHROME_BROWSER_ASH_INPUT_METHOD_UI_UNDO_WINDOW_H_ +#include "chrome/browser/ash/input_method/assistive_window_properties.h" #include "chrome/browser/ash/input_method/ui/assistive_delegate.h" #include "ui/base/metadata/metadata_header_macros.h" #include "ui/chromeos/ui_chromeos_export.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" +#include "ui/views/controls/button/image_button.h" #include "ui/views/controls/button/label_button.h" +#include "ui/views/controls/link.h" #include "ui/views/metadata/view_factory.h" namespace ui { @@ -26,7 +29,7 @@ views::Widget* InitWidget(); void Hide(); - void Show(); + void Show(bool show_setting_link); // Set the position of the undo window at the start of the autocorrected word. void SetBounds(const gfx::Rect& word_bounds); @@ -45,6 +48,7 @@ AssistiveDelegate* delegate_; views::LabelButton* undo_button_; + views::ImageButton* learn_more_button_; }; BEGIN_VIEW_BUILDER(UI_CHROMEOS_EXPORT,
diff --git a/chrome/browser/ash/input_method/ui/undo_window_unittest.cc b/chrome/browser/ash/input_method/ui/undo_window_unittest.cc index ea1912c..679f7f06 100644 --- a/chrome/browser/ash/input_method/ui/undo_window_unittest.cc +++ b/chrome/browser/ash/input_method/ui/undo_window_unittest.cc
@@ -51,14 +51,14 @@ }; TEST_F(UndoWindowTest, HighlightsUndoButtonWhenNotHighlighted) { - undo_window_->Show(); + undo_window_->Show(false); undo_window_->SetButtonHighlighted(undo_button_, true); EXPECT_TRUE(undo_window_->GetUndoButtonForTesting()->background() != nullptr); } TEST_F(UndoWindowTest, KeepsHighlightingUndoButtonWhenAlreadyHighlighted) { - undo_window_->Show(); + undo_window_->Show(false); undo_window_->SetButtonHighlighted(undo_button_, true); undo_window_->SetButtonHighlighted(undo_button_, true); @@ -66,7 +66,7 @@ } TEST_F(UndoWindowTest, UnhighlightsUndoButtonWhenHighlighted) { - undo_window_->Show(); + undo_window_->Show(false); undo_window_->SetButtonHighlighted(undo_button_, true); undo_window_->SetButtonHighlighted(undo_button_, false); @@ -75,7 +75,7 @@ TEST_F(UndoWindowTest, UnhighlightsKeepUndoButtonUnhighlightedWhenAlreadyNotHighlighted) { - undo_window_->Show(); + undo_window_->Show(false); undo_window_->SetButtonHighlighted(undo_button_, false); undo_window_->SetButtonHighlighted(undo_button_, false);
diff --git a/chrome/browser/ash/login/app_mode/test/kiosk_update_browsertest.cc b/chrome/browser/ash/login/app_mode/test/kiosk_update_browsertest.cc index 727b965b..6eaa6dbd 100644 --- a/chrome/browser/ash/login/app_mode/test/kiosk_update_browsertest.cc +++ b/chrome/browser/ash/login/app_mode/test/kiosk_update_browsertest.cc
@@ -912,9 +912,7 @@ EXPECT_TRUE(IsAppInstalled(kTestSecondaryApp3, "1.0.0")); } -// TODO(crbug.com/1415928): Flaky. -IN_PROC_BROWSER_TEST_F(KioskUpdateTest, - DISABLED_LaunchKioskAppWithSecondaryExtension) { +IN_PROC_BROWSER_TEST_F(KioskUpdateTest, LaunchKioskAppWithSecondaryExtension) { base::AddFeatureIdTagToTestResult( "screenplay-22a4b826-851a-4065-a32b-273a0e261bf3");
diff --git a/chrome/browser/ash/login/password_change_browsertest.cc b/chrome/browser/ash/login/password_change_browsertest.cc index 6b298b9..25f006fb 100644 --- a/chrome/browser/ash/login/password_change_browsertest.cc +++ b/chrome/browser/ash/login/password_change_browsertest.cc
@@ -6,6 +6,7 @@ #include <string> #include <utility> +#include "ash/constants/ash_features.h" #include "ash/public/cpp/login_screen_test_api.h" #include "base/auto_reset.h" #include "base/files/file_path.h" @@ -68,14 +69,23 @@ constexpr char kTestingFileName[] = "testing-file.txt"; const test::UIPath kPasswordStep = {"gaia-password-changed", "passwordStep"}; +const test::UIPath kForgotPasswordStep = {"gaia-password-changed", + "forgotPassword"}; const test::UIPath kOldPasswordInput = {"gaia-password-changed", "oldPasswordInput"}; const test::UIPath kSendPasswordButton = {"gaia-password-changed", "next"}; const test::UIPath kForgotPassword = {"gaia-password-changed", "forgotPasswordLink"}; +const test::UIPath kForgotPasswordButton = {"gaia-password-changed", + "forgotPasswordButton"}; const test::UIPath kTryAgain = {"gaia-password-changed", "tryAgain"}; const test::UIPath kProceedAnyway = {"gaia-password-changed", "proceedAnyway"}; const test::UIPath kCancel = {"gaia-password-changed", "cancel"}; +const test::UIPath kForgotCancel = {"gaia-password-changed", "cancelForgot"}; + +const test::UIPath kFirstOnboardingScreen = {"consolidated-consent"}; + +using AuthOp = FakeUserDataAuthClient::Operation; } // namespace @@ -85,10 +95,6 @@ ~PasswordChangeTestBase() override = default; protected: - virtual UserContext GetTestUserContext() { - return login_mixin_.CreateDefaultUserContext(test_user_info_); - } - void OpenGaiaDialog(const AccountId& account_id) { EXPECT_FALSE(LoginScreenTestApi::IsOobeDialogVisible()); EXPECT_TRUE(LoginScreenTestApi::IsForcedOnlineSignin(account_id)); @@ -112,42 +118,6 @@ const LoginManagerMixin::TestUserInfo test_user_info_{ test_account_id_, user_manager::UserType::USER_TYPE_REGULAR, user_manager::User::OAuthTokenStatus::OAUTH2_TOKEN_STATUS_INVALID}; - LoginManagerMixin login_mixin_{&mixin_host_, {test_user_info_}}; -}; - -// Test fixture that uses a stub authenticator. -// -// Prefer using `PasswordChangeTest` for new tests instead. -class PasswordChangeStubAuthTest : public PasswordChangeTestBase { - protected: - // Sets up UserSessionManager to use stub authenticator that reports a - // password change, and attempts login. - // Password changed OOBE dialog is expected to show up after calling this. - void SetUpStubAuthenticatorAndAttemptLogin(const std::string& old_password) { - EXPECT_TRUE(LoginScreenTestApi::IsOobeDialogVisible()); - UserContext user_context = GetTestUserContext(); - - auto authenticator_builder = - std::make_unique<StubAuthenticatorBuilder>(user_context); - authenticator_builder->SetUpPasswordChange( - old_password, - base::BindRepeating( - &PasswordChangeStubAuthTest::HandleDataRecoveryStatusChange, - base::Unretained(this))); - login_mixin_.AttemptLoginUsingAuthenticator( - user_context, std::move(authenticator_builder)); - } - - StubAuthenticator::DataRecoveryStatus data_recovery_status_ = - StubAuthenticator::DataRecoveryStatus::kNone; - - private: - void HandleDataRecoveryStatusChange( - StubAuthenticator::DataRecoveryStatus status) { - EXPECT_EQ(StubAuthenticator::DataRecoveryStatus::kNone, - data_recovery_status_); - data_recovery_status_ = status; - } }; // Test fixture that uses a fake UserDataAuth in order to simulate password @@ -184,6 +154,13 @@ FakeGaiaMixin::kEmptyUserServices); } + CryptohomeMixin cryptohome_{&mixin_host_}; + FakeGaiaMixin fake_gaia_{&mixin_host_}; + LoginManagerMixin login_mixin_{&mixin_host_, + {test_user_info_}, + &fake_gaia_, + &cryptohome_}; + private: base::FilePath GetTestingFilePath() const { auto account_identifier = @@ -202,9 +179,6 @@ base::ScopedAllowBlockingForTesting allow_blocking; EXPECT_TRUE(base::WriteFile(GetTestingFilePath(), /*data=*/"")); } - - CryptohomeMixin cryptohome_{&mixin_host_}; - FakeGaiaMixin fake_gaia_{&mixin_host_}; }; IN_PROC_BROWSER_TEST_F(PasswordChangeTest, MigrateOldCryptohome) { @@ -219,7 +193,7 @@ test::OobeJS().CreateVisibilityWaiter(true, kPasswordStep)->Wait(); - // Fill out and submit the old password passed to the userdataauth. + // Fill out and submit the old password. test::OobeJS().TypeIntoPath("old user password", kOldPasswordInput); test::OobeJS().ClickOnPath(kSendPasswordButton); @@ -230,18 +204,19 @@ EXPECT_TRUE(TestingFileExists()); } -IN_PROC_BROWSER_TEST_F(PasswordChangeStubAuthTest, SubmitOnEnterKeyPressed) { +IN_PROC_BROWSER_TEST_F(PasswordChangeTest, SubmitOnEnterKeyPressed) { + AddFakeUser("old user password"); OpenGaiaDialog(test_account_id_); base::HistogramTester histogram_tester; - SetUpStubAuthenticatorAndAttemptLogin("old user password"); + SetGaiaScreenCredentials(test_account_id_, "new user password"); WaitForPasswordChangeScreen(); histogram_tester.ExpectBucketCount("Login.PasswordChanged.ReauthReason", ReauthReason::kOther, 1); test::OobeJS().CreateVisibilityWaiter(true, kPasswordStep)->Wait(); - // Fill out and submit the old password passed to the stub authenticator. + // Fill out and submit the old password, using "ENTER" key. test::OobeJS().TypeIntoPath("old user password", kOldPasswordInput); ASSERT_TRUE(ui_test_utils::SendKeyPressToWindowSync( nullptr, ui::VKEY_RETURN, false /* control */, false /* shift */, @@ -249,8 +224,8 @@ // User session should start, and whole OOBE screen is expected to be hidden, OobeWindowVisibilityWaiter(false).Wait(); - EXPECT_EQ(StubAuthenticator::DataRecoveryStatus::kRecovered, - data_recovery_status_); + EXPECT_TRUE( + FakeUserDataAuthClient::Get()->WasCalled<AuthOp::kUpdateAuthFactor>()); login_mixin_.WaitForActiveSession(); } @@ -301,21 +276,29 @@ // Click "Proceed anyway". test::OobeJS().ClickOnPath(kProceedAnyway); - // User session should start, and whole OOBE screen is expected to be hidden. - OobeWindowVisibilityWaiter(false).Wait(); + if (features::IsCryptohomeRecoveryEnabled()) { + // With cryptohome recovery we re-create session and re-run onboarding. + OobeWindowVisibilityWaiter(true).Wait(); + test::OobeJS().CreateVisibilityWaiter(true, kFirstOnboardingScreen)->Wait(); + } else { + // User session should start, and whole OOBE screen is expected to be + // hidden. + OobeWindowVisibilityWaiter(false).Wait(); - login_mixin_.WaitForActiveSession(); + login_mixin_.WaitForActiveSession(); + } EXPECT_FALSE(TestingFileExists()); } -IN_PROC_BROWSER_TEST_F(PasswordChangeStubAuthTest, - TryAgainAfterForgetLinkClick) { +IN_PROC_BROWSER_TEST_F(PasswordChangeTest, TryAgainAfterForgetLinkClick) { + AddFakeUser("old user password"); OpenGaiaDialog(test_account_id_); - SetUpStubAuthenticatorAndAttemptLogin("old user password"); + SetGaiaScreenCredentials(test_account_id_, "new password"); WaitForPasswordChangeScreen(); + test::OobeJS().CreateDisplayedWaiter(true, kPasswordStep)->Wait(); - // Click forgot password link. + // Click forgot password button. test::OobeJS().ClickOnPath(kForgotPassword); test::OobeJS().CreateDisplayedWaiter(false, kPasswordStep)->Wait(); @@ -334,33 +317,45 @@ // User session should start, and whole OOBE screen is expected to be hidden, OobeWindowVisibilityWaiter(false).Wait(); - EXPECT_EQ(StubAuthenticator::DataRecoveryStatus::kRecovered, - data_recovery_status_); + EXPECT_TRUE( + FakeUserDataAuthClient::Get()->WasCalled<AuthOp::kUpdateAuthFactor>()); login_mixin_.WaitForActiveSession(); } -IN_PROC_BROWSER_TEST_F(PasswordChangeStubAuthTest, ClosePasswordChangedDialog) { +IN_PROC_BROWSER_TEST_F(PasswordChangeTest, ClosePasswordChangedDialog) { + AddFakeUser("old user password"); OpenGaiaDialog(test_account_id_); - SetUpStubAuthenticatorAndAttemptLogin("old user password"); + SetGaiaScreenCredentials(test_account_id_, "new password"); WaitForPasswordChangeScreen(); + test::OobeJS().CreateVisibilityWaiter(true, kPasswordStep)->Wait(); test::OobeJS().TypeIntoPath("old user password", kOldPasswordInput); - // Click the close button. - test::OobeJS().ClickOnPath(kCancel); + + if (features::IsCryptohomeRecoveryEnabled()) { + // Switch to "Forgot password" step. + test::OobeJS().ClickOnPath(kForgotPasswordButton); + test::OobeJS().CreateDisplayedWaiter(true, kForgotPasswordStep)->Wait(); + // Click the close button. + test::OobeJS().ClickOnPath(kForgotCancel); + } else { + // Click the close button. + test::OobeJS().ClickOnPath(kCancel); + } OobeWindowVisibilityWaiter(false).Wait(); - EXPECT_EQ(StubAuthenticator::DataRecoveryStatus::kNone, - data_recovery_status_); + EXPECT_FALSE( + FakeUserDataAuthClient::Get()->WasCalled<AuthOp::kUpdateAuthFactor>()); - ExistingUserController::current_controller()->Login(GetTestUserContext(), - SigninSpecifics()); + OpenGaiaDialog(test_account_id_); + SetGaiaScreenCredentials(test_account_id_, "new password"); + OobeWindowVisibilityWaiter(true).Wait(); OobeScreenWaiter(GaiaPasswordChangedView::kScreenId).Wait(); } -class PasswordChangeTokenCheck : public PasswordChangeStubAuthTest { +class PasswordChangeTokenCheck : public PasswordChangeTest { public: PasswordChangeTokenCheck() { login_mixin_.AppendRegularUsers(1); @@ -370,21 +365,14 @@ } protected: - // PasswordChangeStubAuthTest: + // PasswordChangeTest: void SetUpInProcessBrowserTestFixture() override { - PasswordChangeStubAuthTest::SetUpInProcessBrowserTestFixture(); + PasswordChangeTest::SetUpInProcessBrowserTestFixture(); TokenHandleUtil::SetInvalidTokenForTesting(kTokenHandle); } void TearDownInProcessBrowserTestFixture() override { TokenHandleUtil::SetInvalidTokenForTesting(nullptr); - PasswordChangeStubAuthTest::TearDownInProcessBrowserTestFixture(); - } - - UserContext GetTestUserContext() override { - return login_mixin_.CreateDefaultUserContext( - LoginManagerMixin::TestUserInfo( - user_with_invalid_token_, - user_manager::UserType::USER_TYPE_REGULAR)); + PasswordChangeTest::TearDownInProcessBrowserTestFixture(); } AccountId user_with_invalid_token_; @@ -392,14 +380,24 @@ }; IN_PROC_BROWSER_TEST_F(PasswordChangeTokenCheck, LoginScreenPasswordChange) { + cryptohome_.MarkUserAsExisting(user_with_invalid_token_); + cryptohome_.AddGaiaPassword(user_with_invalid_token_, "old user password"); TokenHandleUtil::StoreTokenHandle(user_with_invalid_token_, kTokenHandle); + + EXPECT_FALSE( + LoginScreenTestApi::IsForcedOnlineSignin(user_with_invalid_token_)); // Focus triggers token check. LoginScreenTestApi::FocusUser(user_with_invalid_token_); + EXPECT_TRUE( + LoginScreenTestApi::IsForcedOnlineSignin(user_with_invalid_token_)); OpenGaiaDialog(user_with_invalid_token_); + base::HistogramTester histogram_tester; - SetUpStubAuthenticatorAndAttemptLogin("old user password"); + + SetGaiaScreenCredentials(user_with_invalid_token_, "new password"); WaitForPasswordChangeScreen(); + histogram_tester.ExpectBucketCount("Login.PasswordChanged.ReauthReason", ReauthReason::kInvalidTokenHandle, 1); } @@ -480,13 +478,16 @@ } IN_PROC_BROWSER_TEST_F(PasswordChangeTokenCheck, Session) { + cryptohome_.AddGaiaPassword(user_with_invalid_token_, "old user password"); ASSERT_TRUE( LoginScreenTestApi::IsForcedOnlineSignin(user_with_invalid_token_)); OpenGaiaDialog(user_with_invalid_token_); base::HistogramTester histogram_tester; - SetUpStubAuthenticatorAndAttemptLogin("old user password"); + + SetGaiaScreenCredentials(user_with_invalid_token_, "new password"); WaitForPasswordChangeScreen(); + histogram_tester.ExpectBucketCount("Login.PasswordChanged.ReauthReason", ReauthReason::kInvalidTokenHandle, 1); } @@ -494,8 +495,11 @@ // Notification should not be triggered because token was checked on the login // screen - recently. IN_PROC_BROWSER_TEST_F(PasswordChangeTokenCheck, TokenRecentlyChecked) { + cryptohome_.MarkUserAsExisting(user_with_invalid_token_); + cryptohome_.AddGaiaPassword(user_with_invalid_token_, "old user password"); TokenHandleUtil::StoreTokenHandle(user_with_invalid_token_, kTokenHandle); - // Focus triggers token check. + + // Focus triggers token check and opens online LoginScreenTestApi::FocusUser(user_with_invalid_token_); OpenGaiaDialog(user_with_invalid_token_);
diff --git a/chrome/browser/ash/login/screens/gaia_password_changed_screen.cc b/chrome/browser/ash/login/screens/gaia_password_changed_screen.cc index 40eaa6a..20357b4 100644 --- a/chrome/browser/ash/login/screens/gaia_password_changed_screen.cc +++ b/chrome/browser/ash/login/screens/gaia_password_changed_screen.cc
@@ -211,7 +211,12 @@ } // Force user to go through onboarding again, so that they have // consistent experience. - user_manager::UserManager::Get()->RemoveUserFromList( + // Do not notify about removal, as we are still inside the login + // flow. Otherwise, GAIA screen might be shown (if this user was + // the only user on the device). + // TODO(b/270040728): Use `RemoveUserFromList` once internal architecture + // allows better solution. + user_manager::UserManager::Get()->RemoveUserFromListForRecreation( context()->user_context->GetAccountId()); // Now that user is deleted, reset everything in UserContext // related to cryptohome state.
diff --git a/chrome/browser/ash/login/test/cryptohome_mixin.cc b/chrome/browser/ash/login/test/cryptohome_mixin.cc index 9fa48e4..5e01320 100644 --- a/chrome/browser/ash/login/test/cryptohome_mixin.cc +++ b/chrome/browser/ash/login/test/cryptohome_mixin.cc
@@ -22,6 +22,10 @@ CryptohomeMixin::~CryptohomeMixin() = default; +void CryptohomeMixin::SetUpOnMainThread() { + FakeUserDataAuthClient::TestApi::Get()->CreatePostponedDirectories(); +} + void CryptohomeMixin::MarkUserAsExisting(const AccountId& user) { auto account_id = cryptohome::CreateAccountIdentifierFromAccountId(user); FakeUserDataAuthClient::TestApi::Get()->AddExistingUser(
diff --git a/chrome/browser/ash/login/test/cryptohome_mixin.h b/chrome/browser/ash/login/test/cryptohome_mixin.h index e7660dd..92b6a674 100644 --- a/chrome/browser/ash/login/test/cryptohome_mixin.h +++ b/chrome/browser/ash/login/test/cryptohome_mixin.h
@@ -25,6 +25,8 @@ CryptohomeMixin& operator=(const CryptohomeMixin&) = delete; ~CryptohomeMixin() override; + void SetUpOnMainThread() override; + void MarkUserAsExisting(const AccountId& user); std::string AddSession(const AccountId& user, bool authenticated); void AddGaiaPassword(const AccountId& user, std::string password);
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc index 34a9741f..bb1ec7e7 100644 --- a/chrome/browser/ash/login/wizard_controller.cc +++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -284,16 +284,18 @@ bool IsResumableOobeScreen(OobeScreenId screen_id) { for (const auto& resumable_screen : kResumableOobeScreens) { - if (screen_id == resumable_screen) + if (screen_id == resumable_screen) { return true; + } } return false; } bool ShouldHideStatusArea(OobeScreenId screen_id) { for (const auto& s : kScreensWithHiddenStatusArea) { - if (screen_id == s) + if (screen_id == s) { return true; + } } return false; } @@ -368,8 +370,9 @@ } OobeScreenId PrefToScreenId(const std::string& pref_value) { - if (pref_value == kLegacyUpdateScreenName) + if (pref_value == kLegacyUpdateScreenName) { return UpdateView::kScreenId; + } return OobeScreenId(pref_value); } @@ -426,8 +429,9 @@ } WizardController::~WizardController() { - for (ScreenObserver& obs : screen_observers_) + for (ScreenObserver& obs : screen_observers_) { obs.OnShutdown(); + } previous_screens_.clear(); screen_manager_.reset(); @@ -517,10 +521,11 @@ // Use the saved screen preference from Local State. const std::string screen_pref = GetLocalState()->GetString(prefs::kOobeScreenPending); - if (!screen_pref.empty() && HasScreen(PrefToScreenId(screen_pref))) + if (!screen_pref.empty() && HasScreen(PrefToScreenId(screen_pref))) { actual_first_screen = PrefToScreenId(screen_pref); - else + } else { actual_first_screen = WelcomeView::kScreenId; + } } first_screen_for_testing_ = actual_first_screen; @@ -546,9 +551,15 @@ return screen_manager_->HasScreen(screen_id); } +// static +bool WizardController::IsErrorScreen(OobeScreenId screen_id) { + return screen_id == ErrorScreenView::kScreenId; +} + BaseScreen* WizardController::GetScreen(OobeScreenId screen_id) { - if (screen_id == ErrorScreenView::kScreenId) + if (WizardController::IsErrorScreen(screen_id)) { return GetErrorScreen(); + } return screen_manager_->GetScreen(screen_id); } @@ -892,10 +903,11 @@ void WizardController::OnOwnershipStatusCheckDone( DeviceSettingsService::OwnershipStatus status) { - if (status == DeviceSettingsService::OWNERSHIP_NONE) + if (status == DeviceSettingsService::OWNERSHIP_NONE) { ShowPackagedLicenseScreen(); - else + } else { ShowLoginScreen(); + } } void WizardController::ShowSignInFatalErrorScreen( @@ -1037,8 +1049,9 @@ void WizardController::ShowAutoEnrollmentCheckScreen() { AutoEnrollmentCheckScreen* screen = GetScreen<AutoEnrollmentCheckScreen>(); - if (retry_auto_enrollment_check_) + if (retry_auto_enrollment_check_) { screen->ClearState(); + } screen->set_auto_enrollment_controller(GetAutoEnrollmentController()); SetCurrentScreen(screen); } @@ -1424,14 +1437,17 @@ SigninSpecifics()); break; case GuestTosScreen::Result::BACK: - if (MaybeSetToPreviousScreen()) + if (MaybeSetToPreviousScreen()) { break; - if (LoginDisplayHost::default_host()->HasUserPods()) + } + if (LoginDisplayHost::default_host()->HasUserPods()) { LoginDisplayHost::default_host()->HideOobeDialog(); + } break; case GuestTosScreen::Result::CANCEL: - if (LoginDisplayHost::default_host()->HasUserPods()) + if (LoginDisplayHost::default_host()->HasUserPods()) { LoginDisplayHost::default_host()->HideOobeDialog(); + } } } @@ -1503,8 +1519,9 @@ void WizardController::SkipToLoginForTesting() { VLOG(1) << "WizardController::SkipToLoginForTesting()"; - if (current_screen_ && current_screen_->screen_id() == GaiaView::kScreenId) + if (current_screen_ && current_screen_->screen_id() == GaiaView::kScreenId) { return; + } wizard_context_->skip_to_login_for_tests = true; PerformPostNetworkScreenActions(); @@ -1516,8 +1533,9 @@ VLOG(1) << "Wizard screen " << screen << " exited with reason: " << exit_reason; // Do not perform checks and record stats for the skipped screen. - if (exit_reason == BaseScreen::kNotApplicable) + if (exit_reason == BaseScreen::kNotApplicable) { return; + } DCHECK(current_screen_->screen_id() == screen); RecordUMAHistogramForOOBEStepCompletionTime( @@ -1962,10 +1980,11 @@ GestureNavigationScreen::Result result) { OnScreenExit(GestureNavigationScreenView::kScreenId, GestureNavigationScreen::GetResultString(result)); - if (features::IsOobeChoobeEnabled()) + if (features::IsOobeChoobeEnabled()) { ShowChoobeScreen(); - else + } else { ShowThemeSelectionScreen(); + } } void WizardController::OnMarketingOptInScreenExit( @@ -1988,8 +2007,9 @@ void WizardController::OnDeviceModificationCanceled() { BaseScreen* previous_screen = nullptr; - if (base::Contains(previous_screens_, current_screen_)) + if (base::Contains(previous_screens_, current_screen_)) { previous_screen = previous_screens_[current_screen_]; + } current_screen_->Hide(); current_screen_ = nullptr; @@ -2049,8 +2069,9 @@ void WizardController::OnOobeFlowFinished() { if (GetLoginDisplayHost() ->GetWizardContext() - ->defer_oobe_flow_finished_for_tests) + ->defer_oobe_flow_finished_for_tests) { return; + } SetCurrentScreen(nullptr); user_manager::KnownUser known_user(GetLocalState()); @@ -2188,8 +2209,9 @@ return; } - if (current_screen_ == new_current || GetOobeUI() == nullptr) + if (current_screen_ == new_current || GetOobeUI() == nullptr) { return; + } // Check if we didn't come here via the previous screen logic. if (current_screen_ && new_current && @@ -2251,8 +2273,9 @@ } void WizardController::OnHIDScreenNecessityCheck(bool screen_needed) { - if (!GetOobeUI()) + if (!GetOobeUI()) { return; + } // Check for tests configurations. if (wizard_context_->skip_to_update_for_tests || @@ -2260,10 +2283,11 @@ return; } - if (screen_needed) + if (screen_needed) { ShowHIDDetectionScreen(); - else + } else { AdvanceToScreenAfterHIDDetection(ash::OOBE_SCREEN_UNKNOWN); + } } void WizardController::UpdateOobeConfiguration() { @@ -2298,8 +2322,9 @@ } bool WizardController::CanNavigateTo(OobeScreenId screen_id) { - if (!current_screen_) + if (!current_screen_) { return true; + } if (wizard_context_->skip_to_login_for_tests) { VLOG(1) << "CanNavigateTo to screen " << screen_id @@ -2423,8 +2448,9 @@ bool WizardController::HandleAccelerator(LoginAcceleratorAction action) { if (current_screen_) { - if (current_screen_->HandleAccelerator(action)) + if (current_screen_->HandleAccelerator(action)) { return true; + } } return false; } @@ -2438,10 +2464,12 @@ void WizardController::SimulateDemoModeSetupForTesting( absl::optional<DemoSession::DemoModeConfig> demo_config) { - if (!demo_setup_controller_) + if (!demo_setup_controller_) { demo_setup_controller_ = std::make_unique<DemoSetupController>(); - if (demo_config.has_value()) + } + if (demo_config.has_value()) { demo_setup_controller_->set_demo_config(*demo_config); + } } void WizardController::OnAccessibilityStatusChanged( @@ -2493,8 +2521,9 @@ CrosSettings::Get()->PrepareTrustedValues( base::BindOnce(&WizardController::AutoLaunchKioskApp, weak_factory_.GetWeakPtr(), app_type)); - if (status == CrosSettingsProvider::TEMPORARILY_UNTRUSTED) + if (status == CrosSettingsProvider::TEMPORARILY_UNTRUSTED) { return; + } if (status == CrosSettingsProvider::PERMANENTLY_UNTRUSTED) { // If the `cros_settings_` are permanently untrusted, show an error message @@ -2535,8 +2564,9 @@ // statis bool WizardController::IsResumablePostLoginScreen(OobeScreenId screen_id) { for (const auto& resumable_screen : kResumablePostLoginScreens) { - if (screen_id == resumable_screen) + if (screen_id == resumable_screen) { return true; + } } return false; } @@ -2587,8 +2617,9 @@ } PrefService* WizardController::GetLocalState() { - if (local_state_for_testing_) + if (local_state_for_testing_) { return local_state_for_testing_; + } return g_browser_process->local_state(); } @@ -2648,8 +2679,9 @@ const base::TimeDelta timeout = base::Seconds(kResolveTimeZoneTimeoutSeconds); // Ignore invalid position. - if (!position.Valid()) + if (!position.Valid()) { return; + } if (elapsed >= timeout) { LOG(WARNING) << "Resolve TimeZone: got location after timeout (" @@ -2673,8 +2705,9 @@ bool WizardController::SetOnTimeZoneResolvedForTesting( base::OnceClosure callback) { - if (timezone_resolved_) + if (timezone_resolved_) { return false; + } on_timezone_resolved_for_testing_ = std::move(callback); return true; @@ -2715,35 +2748,40 @@ bool WizardController::MaybeSetToPreviousScreen() { DCHECK(current_screen_); - if (!base::Contains(previous_screens_, current_screen_)) + if (!base::Contains(previous_screens_, current_screen_)) { return false; + } auto* old_current_screen = current_screen_; SetCurrentScreen(previous_screens_[current_screen_]); return old_current_screen != current_screen_; } void WizardController::NotifyScreenChanged() { - for (ScreenObserver& obs : screen_observers_) + for (ScreenObserver& obs : screen_observers_) { obs.OnCurrentScreenChanged(current_screen_); + } } policy::AutoEnrollmentController* WizardController::GetAutoEnrollmentController() { - if (!auto_enrollment_controller_) + if (!auto_enrollment_controller_) { auto_enrollment_controller_ = std::make_unique<policy::AutoEnrollmentController>(); + } return auto_enrollment_controller_.get(); } ChoobeFlowController* WizardController::GetChoobeFlowController() { - if (!choobe_flow_controller_) + if (!choobe_flow_controller_) { choobe_flow_controller_ = std::make_unique<ChoobeFlowController>(); + } return choobe_flow_controller_.get(); } void WizardController::MaybeTakeTPMOwnership() { - if (wizard_context_->is_branded_build || switches::IsTpmDynamic()) + if (wizard_context_->is_branded_build || switches::IsTpmDynamic()) { return; + } DCHECK(features::IsOobeConsolidatedConsentEnabled()); chromeos::TpmManagerClient::Get()->TakeOwnership(
diff --git a/chrome/browser/ash/login/wizard_controller.h b/chrome/browser/ash/login/wizard_controller.h index d5dad1ec..1580369 100644 --- a/chrome/browser/ash/login/wizard_controller.h +++ b/chrome/browser/ash/login/wizard_controller.h
@@ -269,6 +269,9 @@ return GetAutoEnrollmentController(); } + // Returns whether the screen id belongs to the `ErrorScreen` + static bool IsErrorScreen(OobeScreenId); + private: // Create BaseScreen instances. These are owned by `screen_manager_`. std::vector<std::pair<OobeScreenId, std::unique_ptr<BaseScreen>>>
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc index 13ac22c..f2521182 100644 --- a/chrome/browser/chrome_browser_interface_binders.cc +++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -290,6 +290,7 @@ #include "chrome/browser/ui/webui/ash/vm/vm_ui.h" #include "chrome/browser/ui/webui/nearby_share/nearby_share.mojom.h" #include "chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.h" +#include "chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.mojom.h" #include "chrome/browser/ui/webui/settings/ash/os_apps_page/mojom/app_notification_handler.mojom.h" #include "chrome/browser/ui/webui/settings/ash/os_settings_ui.h" #include "chrome/browser/ui/webui/settings/ash/search/search.mojom.h" @@ -1142,6 +1143,10 @@ ash::settings::OSSettingsUI>(map); RegisterWebUIControllerInterfaceBinder< + ash::settings::mojom::InputDeviceSettingsProvider, + ash::settings::OSSettingsUI>(map); + + RegisterWebUIControllerInterfaceBinder< ash::cellular_setup::mojom::CellularSetup, ash::settings::OSSettingsUI>( map);
diff --git a/chrome/browser/chrome_service_worker_browsertest.cc b/chrome/browser/chrome_service_worker_browsertest.cc index 07f1f682..4ddfd68d 100644 --- a/chrome/browser/chrome_service_worker_browsertest.cc +++ b/chrome/browser/chrome_service_worker_browsertest.cc
@@ -322,7 +322,13 @@ kInstallAndWaitForActivatedPageWithModuleScript); } -IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerTest, SubresourceCountUKM) { +// TODO(crbug.com/1395715): The test is flaky. Re-enable it. +#if BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) +#define MAYBE_SubresourceCountUKM DISABLED_SubresourceCountUKM +#else +#define MAYBE_SubresourceCountUKM SubresourceCountUKM +#endif +IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerTest, MAYBE_SubresourceCountUKM) { base::RunLoop ukm_loop; ukm::TestAutoSetUkmRecorder test_recorder; test_recorder.SetOnAddEntryCallback(
diff --git a/chrome/browser/enterprise/platform_auth/platform_auth_navigation_throttle.cc b/chrome/browser/enterprise/platform_auth/platform_auth_navigation_throttle.cc index 7d3e6f4..cd6902a 100644 --- a/chrome/browser/enterprise/platform_auth/platform_auth_navigation_throttle.cc +++ b/chrome/browser/enterprise/platform_auth/platform_auth_navigation_throttle.cc
@@ -88,13 +88,15 @@ attached_headers_.push_back(it.name()); navigation_handle()->SetRequestHeader(it.name(), it.value()); } + fetch_headers_callback_ran_ = true; // Resume the deferred request. if (is_deferred_) { - Resume(); is_deferred_ = false; + // `Resume()` can synchronously delete this navigation throttle, so no code + // after it should reference a throttle instance. + Resume(); } - fetch_headers_callback_ran_ = true; } } // namespace enterprise_auth
diff --git a/chrome/browser/extensions/api/browsing_data/browsing_data_unittest.cc b/chrome/browser/extensions/api/browsing_data/browsing_data_unittest.cc index 4f0b75c..0225453 100644 --- a/chrome/browser/extensions/api/browsing_data/browsing_data_unittest.cc +++ b/chrome/browser/extensions/api/browsing_data/browsing_data_unittest.cc
@@ -136,8 +136,11 @@ void SetSinceAndVerify(browsing_data::TimePeriod since_pref) { PrefService* prefs = browser()->profile()->GetPrefs(); - prefs->SetInteger(browsing_data::prefs::kDeleteTimePeriod, - static_cast<int>(since_pref)); + browsing_data::ClearBrowsingDataTab tab = + static_cast<browsing_data::ClearBrowsingDataTab>( + prefs->GetInteger(browsing_data::prefs::kLastClearBrowsingDataTab)); + auto* time_period_pref = browsing_data::GetTimePeriodPreferenceName(tab); + prefs->SetInteger(time_period_pref, static_cast<int>(since_pref)); scoped_refptr<BrowsingDataSettingsFunction> function = new BrowsingDataSettingsFunction(); @@ -519,6 +522,7 @@ // Test the processing of the 'delete since' preference. TEST_F(BrowsingDataApiTest, SettingsFunctionSince) { SetSinceAndVerify(browsing_data::TimePeriod::ALL_TIME); + SetSinceAndVerify(browsing_data::TimePeriod::LAST_15_MINUTES); SetSinceAndVerify(browsing_data::TimePeriod::LAST_HOUR); SetSinceAndVerify(browsing_data::TimePeriod::LAST_DAY); SetSinceAndVerify(browsing_data::TimePeriod::LAST_WEEK);
diff --git a/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc b/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc index 09eefd0..2a15a28 100644 --- a/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc +++ b/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc
@@ -141,6 +141,7 @@ case ash::ime::AssistiveWindowType::kGrammarSuggestion: case ash::ime::AssistiveWindowType::kMultiWordSuggestion: case ash::ime::AssistiveWindowType::kLongpressDiacriticsSuggestion: + case ash::ime::AssistiveWindowType::kLearnMore: return input_ime::AssistiveWindowType::ASSISTIVE_WINDOW_TYPE_NONE; case ash::ime::AssistiveWindowType::kUndoWindow: return input_ime::AssistiveWindowType::ASSISTIVE_WINDOW_TYPE_UNDO;
diff --git a/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc b/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc index 8a55e71..356a6f06 100644 --- a/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc +++ b/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
@@ -23,10 +23,10 @@ #include "chrome/browser/extensions/updater/extension_updater.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profiles_state.h" +#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator_params.h" -#include "chrome/browser/ui/browser_window.h" #include "components/update_client/update_query_params.h" #include "content/public/browser/notification_service.h" #include "extensions/browser/extension_system.h" @@ -104,7 +104,7 @@ }; } -BackoffPolicy::~BackoffPolicy() {} +BackoffPolicy::~BackoffPolicy() = default; // static const net::BackoffEntry::Policy* BackoffPolicy::Get() { @@ -128,8 +128,7 @@ extensions::ExtensionRegistry::Get(browser_context_)); } -ChromeRuntimeAPIDelegate::~ChromeRuntimeAPIDelegate() { -} +ChromeRuntimeAPIDelegate::~ChromeRuntimeAPIDelegate() = default; // static void ChromeRuntimeAPIDelegate::set_tick_clock_for_tests( @@ -203,8 +202,7 @@ service->AsExtensionServiceWeakPtr(), extension_id)); extensions::WarningSet warnings; warnings.insert( - extensions::Warning::CreateReloadTooFrequentWarning( - extension_id)); + extensions::Warning::CreateReloadTooFrequentWarning(extension_id)); base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(&extensions::WarningService::NotifyWarningsOnUI, @@ -257,10 +255,12 @@ void ChromeRuntimeAPIDelegate::OpenURL(const GURL& uninstall_url) { Profile* profile = Profile::FromBrowserContext(browser_context_); Browser* browser = chrome::FindLastActiveWithProfile(profile); - if (!browser) + if (!browser) { browser = Browser::Create(Browser::CreateParams(profile, false)); - if (!browser) + } + if (!browser) { return; + } NavigateParams params(browser, uninstall_url, ui::PAGE_TRANSITION_CLIENT_REDIRECT); @@ -360,8 +360,9 @@ content::BrowserContext* browser_context, const Extension* extension, bool is_update) { - if (!is_update) + if (!is_update) { return; + } auto info = update_check_info_.find(extension->id()); if (info != update_check_info_.end()) { info->second.backoff->Reset(); @@ -397,8 +398,9 @@ const std::string& extension_id, const UpdateCheckResult& result) { auto it = update_check_info_.find(extension_id); - if (it == update_check_info_.end()) + if (it == update_check_info_.end()) { return; + } std::vector<UpdateCheckCallback> callbacks; it->second.callbacks.swap(callbacks); for (auto& callback : callbacks) {
diff --git a/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h b/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h index 73bd4d6..bcf334cd 100644 --- a/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h +++ b/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h
@@ -19,16 +19,16 @@ namespace base { class TickClock; class TimeTicks; -} +} // namespace base namespace content { class BrowserContext; -} +} // namespace content namespace extensions { class RuntimeAPI; class UpdateObserver; -} +} // namespace extensions class ChromeRuntimeAPIDelegate : public extensions::RuntimeAPIDelegate, public extensions::ExtensionRegistryObserver { @@ -78,7 +78,7 @@ // Map to prevent extensions from getting stuck in reload loops. Maps // extension id to the last time it was reloaded and the number of times // it was reloaded with not enough time in between reloads. - std::map<std::string, std::pair<base::TimeTicks, int> > last_reload_time_; + std::map<std::string, std::pair<base::TimeTicks, int>> last_reload_time_; // Information about update checks, keyed by extension id. struct UpdateCheckInfo;
diff --git a/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc b/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc index 4547183..92c2f27 100644 --- a/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc +++ b/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc
@@ -12,7 +12,6 @@ #include "base/functional/callback.h" #include "base/location.h" #include "base/memory/raw_ptr.h" -#include "base/memory/ref_counted.h" #include "base/run_loop.h" #include "base/scoped_observation.h" #include "base/task/single_thread_task_runner.h" @@ -48,7 +47,7 @@ TestEventRouter(const TestEventRouter&) = delete; TestEventRouter& operator=(const TestEventRouter&) = delete; - ~TestEventRouter() override {} + ~TestEventRouter() override = default; // An entry in our fake event registry. using Entry = std::pair<std::string, std::string>; @@ -77,7 +76,7 @@ // either no update was found, or one was (and it was downloaded). class DownloaderTestDelegate : public ExtensionDownloaderTestDelegate { public: - DownloaderTestDelegate() {} + DownloaderTestDelegate() = default; DownloaderTestDelegate(const DownloaderTestDelegate&) = delete; DownloaderTestDelegate& operator=(const DownloaderTestDelegate&) = delete; @@ -86,8 +85,9 @@ // is available. void AddNoUpdateResponse(const std::string& id) { no_updates_.insert(id); - if (updates_.find(id) != updates_.end()) + if (updates_.find(id) != updates_.end()) { updates_.erase(id); + } } // On the next update check for extension |id|, pretend that an update to @@ -95,8 +95,9 @@ void AddUpdateResponse(const std::string& id, const base::FilePath& path, const std::string& version) { - if (no_updates_.find(id) != no_updates_.end()) + if (no_updates_.find(id) != no_updates_.end()) { no_updates_.erase(id); + } DownloadFinishedArgs args; args.path = path; args.version = base::Version(version); @@ -107,8 +108,9 @@ ExtensionDownloaderDelegate* delegate, std::vector<ExtensionDownloaderTask> tasks) override { std::set<int> request_ids; - for (const ExtensionDownloaderTask& task : tasks) + for (const ExtensionDownloaderTask& task : tasks) { request_ids.insert(task.request_id); + } // Instead of immediately firing callbacks to the delegate in matching // cases below, we instead post a task since the delegate typically isn't // expecting a synchronous reply (the real code has to go do at least one @@ -166,7 +168,7 @@ // Helper to let test code wait for and return an update check result. class UpdateCheckResultCatcher { public: - UpdateCheckResultCatcher() {} + UpdateCheckResultCatcher() = default; UpdateCheckResultCatcher(const UpdateCheckResultCatcher&) = delete; UpdateCheckResultCatcher& operator=(const UpdateCheckResultCatcher&) = delete; @@ -175,8 +177,9 @@ EXPECT_EQ(nullptr, result_.get()); result_ = std::make_unique<RuntimeAPIDelegate::UpdateCheckResult>( result.status, result.version); - if (run_loop_) + if (run_loop_) { run_loop_->Quit(); + } } std::unique_ptr<RuntimeAPIDelegate::UpdateCheckResult> WaitForResult() { @@ -194,7 +197,7 @@ class ChromeRuntimeAPIDelegateTest : public ExtensionServiceTestWithInstall { public: - ChromeRuntimeAPIDelegateTest() {} + ChromeRuntimeAPIDelegateTest() = default; ChromeRuntimeAPIDelegateTest(const ChromeRuntimeAPIDelegateTest&) = delete; ChromeRuntimeAPIDelegateTest& operator=(const ChromeRuntimeAPIDelegateTest&) = @@ -383,7 +386,7 @@ class ChromeRuntimeAPIDelegateReloadTest : public ChromeRuntimeAPIDelegateTest { public: - ChromeRuntimeAPIDelegateReloadTest() {} + ChromeRuntimeAPIDelegateReloadTest() = default; ChromeRuntimeAPIDelegateReloadTest( const ChromeRuntimeAPIDelegateReloadTest&) = delete;
diff --git a/chrome/browser/extensions/api/runtime/runtime_apitest.cc b/chrome/browser/extensions/api/runtime/runtime_apitest.cc index b9e7de3..c583918b1 100644 --- a/chrome/browser/extensions/api/runtime/runtime_apitest.cc +++ b/chrome/browser/extensions/api/runtime/runtime_apitest.cc
@@ -100,7 +100,7 @@ class RuntimeAPIUpdateTest : public ExtensionApiTest { public: - RuntimeAPIUpdateTest() {} + RuntimeAPIUpdateTest() = default; RuntimeAPIUpdateTest(const RuntimeAPIUpdateTest&) = delete; RuntimeAPIUpdateTest& operator=(const RuntimeAPIUpdateTest&) = delete; @@ -136,8 +136,9 @@ ExtensionHost* background_host = ProcessManager::Get(browser()->profile()) ->GetBackgroundHostForExtension(extension_id); - if (!background_host) + if (!background_host) { return false; + } content::CrashTab(background_host->host_contents()); return true; }
diff --git a/chrome/browser/fast_checkout/fast_checkout_client_impl.cc b/chrome/browser/fast_checkout/fast_checkout_client_impl.cc index 186a187..93a4e57b 100644 --- a/chrome/browser/fast_checkout/fast_checkout_client_impl.cc +++ b/chrome/browser/fast_checkout/fast_checkout_client_impl.cc
@@ -344,14 +344,24 @@ GetFieldToFill(form->fields(), /*is_credit_card_form=*/true); autofill::CreditCard* credit_card = GetSelectedCreditCard(); if (field && !credit_card_form_global_id_ && credit_card) { - autofill::CreditCardCvcAuthenticator* cvc_authenticator = - autofill_client_->GetCvcAuthenticator(); - DCHECK(cvc_authenticator); - credit_card_form_global_id_ = form_global_id; - cvc_authenticator->GetFullCardRequest()->GetFullCard( - *credit_card, autofill::AutofillClient::UnmaskCardReason::kAutofill, - weak_ptr_factory_.GetWeakPtr(), - cvc_authenticator->GetAsFullCardRequestUIDelegate()); + if (autofill::CreditCard::IsLocalCard(credit_card)) { + static_cast<autofill::BrowserAutofillManager*>( + autofill_manager_.get()) + ->SetFastCheckoutRunId(autofill::FieldTypeGroup::kCreditCard, + run_id_); + autofill_manager_->FillCreditCardForm(form->ToFormData(), *field, + *credit_card, u""); + } else { + autofill::CreditCardCvcAuthenticator* cvc_authenticator = + autofill_client_->GetCvcAuthenticator(); + DCHECK(cvc_authenticator); + credit_card_form_global_id_ = form_global_id; + cvc_authenticator->GetFullCardRequest()->GetFullCard( + *credit_card, + autofill::AutofillClient::UnmaskCardReason::kAutofill, + weak_ptr_factory_.GetWeakPtr(), + cvc_authenticator->GetAsFullCardRequestUIDelegate()); + } } } }
diff --git a/chrome/browser/fast_checkout/fast_checkout_client_impl.h b/chrome/browser/fast_checkout/fast_checkout_client_impl.h index 8fee89e1..3804183 100644 --- a/chrome/browser/fast_checkout/fast_checkout_client_impl.h +++ b/chrome/browser/fast_checkout/fast_checkout_client_impl.h
@@ -112,6 +112,9 @@ FRIEND_TEST_ALL_PREFIXES( FastCheckoutClientImplTest, OnFullCardRequestSucceeded_InvokesCreditCardFormFill); + FRIEND_TEST_ALL_PREFIXES( + FastCheckoutClientImplTest, + TryToFillForms_LocalCreditCard_ImmediatelyFillsCreditCardForm); // From autofill::PersonalDataManagerObserver. void OnPersonalDataChanged() override;
diff --git a/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc b/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc index 603bf77c..86af02c 100644 --- a/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc +++ b/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc
@@ -39,6 +39,7 @@ using ::autofill::CreditCard; using ::testing::_; using ::testing::Eq; +using ::testing::Ne; using ::testing::NiceMock; using ::testing::Pair; using ::testing::Pointee; @@ -296,15 +297,17 @@ // Sets up test data, calls `TryToStart(..)` and `OnOptionsSelected(..)`. std::tuple<autofill::AutofillProfile*, autofill::CreditCard*> StartRunAndSelectOptions( - const base::flat_set<autofill::FormSignature>& forms_to_fill) { + const base::flat_set<autofill::FormSignature>& forms_to_fill, + bool local_card = false) { auto autofill_profile_unique_ptr = std::make_unique<autofill::AutofillProfile>( autofill::test::GetFullProfile()); autofill_profile_unique_ptr->set_profile_label( base::UTF16ToUTF8(kAutofillProfileLabel)); personal_data_manager()->AddProfile(*autofill_profile_unique_ptr); - auto credit_card_unique_ptr = - std::make_unique<autofill::CreditCard>(autofill::test::GetCreditCard()); + auto credit_card_unique_ptr = std::make_unique<autofill::CreditCard>( + local_card ? autofill::test::GetCreditCard() + : autofill::test::GetMaskedServerCard()); credit_card_unique_ptr->SetNickname(kCreditCardNickname); personal_data_manager()->AddCreditCard(*credit_card_unique_ptr); @@ -914,3 +917,20 @@ EXPECT_FALSE(fast_checkout_client()->IsRunning()); } + +TEST_F(FastCheckoutClientImplTest, + TryToFillForms_LocalCreditCard_ImmediatelyFillsCreditCardForm) { + autofill::FormStructure* credit_card_form = + AddFormToAutofillManagerCache(SetUpCreditCardForm()); + const autofill::FormFieldData& field = *credit_card_form->field(0); + + EXPECT_CALL( + *autofill_manager(), + SetFastCheckoutRunId(autofill::FieldTypeGroup::kCreditCard, Ne(0))); + EXPECT_CALL( + *autofill_manager(), + FillCreditCardFormImpl(FormDataEqualTo(credit_card_form->ToFormData()), + FormFieldDataEqualTo(field), _, Eq(u""))); + StartRunAndSelectOptions({credit_card_form->form_signature()}, + /*local_card=*/true); +}
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 98aa380d..73d505f1 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -2780,6 +2780,11 @@ "expiry_milestone": 98 }, { + "name": "enable-notification-image-drag", + "owners": ["andrewxu", "dmblack"], + "expiry_milestone": 116 + }, + { "name": "enable-notifications-revamp", "owners": [ "amehfooz", "newcomer" ], "expiry_milestone": 106 @@ -3758,6 +3763,11 @@ "expiry_milestone": 115 }, { + "name": "feed-experiment-tagging-ios", + "owners": ["//ios/chrome/browser/discover_feed/OWNERS", "edchin@google.com"], + "expiry_milestone": 115 + }, + { "name": "feed-foreground-refresh-ios", "owners": ["//ios/chrome/browser/discover_feed/OWNERS", "edchin@google.com"], "expiry_milestone": 115
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 5581f12f..4b7e6fb 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -5390,6 +5390,12 @@ "Allows CrOS to analyze Android network information to provide more " "context on connection errors"; +const char kEnableNotificationImageDragName[] = + "Enable notification image drag"; +const char kEnableNotificationImageDragDescription[] = + "Enable users to drag the image shown on the notification and drop it to " + "directly paste or share"; + const char kEnableOAuthIppName[] = "Enable OAuth when printing via the IPP protocol"; const char kEnableOAuthIppDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 66d0de6..f5c20dc6 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -3079,6 +3079,9 @@ extern const char kEcheSWACheckAndroidNetworkInfoName[]; extern const char kEcheSWACheckAndroidNetworkInfoDescription[]; +extern const char kEnableNotificationImageDragName[]; +extern const char kEnableNotificationImageDragDescription[]; + extern const char kEnableOAuthIppName[]; extern const char kEnableOAuthIppDescription[];
diff --git a/chrome/browser/lacros/standalone_browser_test_controller.cc b/chrome/browser/lacros/standalone_browser_test_controller.cc index daa81617..7b85174 100644 --- a/chrome/browser/lacros/standalone_browser_test_controller.cc +++ b/chrome/browser/lacros/standalone_browser_test_controller.cc
@@ -173,6 +173,24 @@ tts_crosapi_util::SpeakForTesting(std::move(lacros_utterance)); } +void StandaloneBrowserTestController::InstallSubApp( + const web_app::AppId& parent_app_id, + const std::string& sub_app_start_url, + InstallSubAppCallback callback) { + auto info = std::make_unique<WebAppInstallInfo>(); + info->start_url = GURL(sub_app_start_url); + info->parent_app_id = parent_app_id; + + Profile* profile = ProfileManager::GetPrimaryUserProfile(); + auto* provider = web_app::WebAppProvider::GetForWebApps(profile); + provider->scheduler().InstallFromInfo( + std::move(info), + /*overwrite_existing_manifest_fields=*/false, + webapps::WebappInstallSource::SUB_APP, + base::BindOnce(&StandaloneBrowserTestController::WebAppInstallationDone, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); +} + void StandaloneBrowserTestController::OnUtteranceFinished(int utterance_id) { // Delete the utterace event delegate object when the utterance is finished. lacros_utterance_event_delegates_.erase(utterance_id);
diff --git a/chrome/browser/lacros/standalone_browser_test_controller.h b/chrome/browser/lacros/standalone_browser_test_controller.h index f37958a..4a3ac9b 100644 --- a/chrome/browser/lacros/standalone_browser_test_controller.h +++ b/chrome/browser/lacros/standalone_browser_test_controller.h
@@ -42,6 +42,10 @@ mojo::PendingRemote<crosapi::mojom::TtsUtteranceClient> utterance_client) override; + void InstallSubApp(const web_app::AppId& parent_app_id, + const std::string& sub_app_start_url, + InstallSubAppCallback callback) override; + private: class LacrosUtteranceEventDelegate;
diff --git a/chrome/browser/lacros/web_app_provider_bridge_lacros.cc b/chrome/browser/lacros/web_app_provider_bridge_lacros.cc index b88214b..2225aa0 100644 --- a/chrome/browser/lacros/web_app_provider_bridge_lacros.cc +++ b/chrome/browser/lacros/web_app_provider_bridge_lacros.cc
@@ -9,6 +9,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/office_web_app/office_web_app.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/web_applications/locks/app_lock.h" #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h" #include "chrome/browser/web_applications/web_app_command_scheduler.h" #include "chrome/browser/web_applications/web_app_constants.h" @@ -75,6 +76,15 @@ std::move(callback))); } +void WebAppProviderBridgeLacros::GetSubAppIds(const web_app::AppId& app_id, + GetSubAppIdsCallback callback) { + g_browser_process->profile_manager()->LoadProfileByPath( + ProfileManager::GetPrimaryUserProfilePath(), + /*incognito=*/false, + base::BindOnce(&WebAppProviderBridgeLacros::GetSubAppIdsImpl, app_id, + std::move(callback))); +} + // static void WebAppProviderBridgeLacros::WebAppInstalledInArcImpl( mojom::ArcWebAppInstallInfoPtr arc_install_info, @@ -125,4 +135,22 @@ chromeos::InstallMicrosoft365(profile, std::move(callback)); } +// static +void WebAppProviderBridgeLacros::GetSubAppIdsImpl(const web_app::AppId& app_id, + GetSubAppIdsCallback callback, + Profile* profile) { + DCHECK(profile); + auto* provider = web_app::WebAppProvider::GetForWebApps(profile); + + provider->scheduler().ScheduleCallbackWithLock<web_app::AppLock>( + "WebAppServiceAsh::GetSubApps", + std::make_unique<web_app::AppLockDescription>(app_id), + base::BindOnce( + [](web_app::AppId app_id, web_app::AppLock& lock) { + return lock.registrar().GetAllSubAppIds(app_id); + }, + app_id) + .Then(std::move(callback))); +} + } // namespace crosapi
diff --git a/chrome/browser/lacros/web_app_provider_bridge_lacros.h b/chrome/browser/lacros/web_app_provider_bridge_lacros.h index c8506e1..38299885 100644 --- a/chrome/browser/lacros/web_app_provider_bridge_lacros.h +++ b/chrome/browser/lacros/web_app_provider_bridge_lacros.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_LACROS_WEB_APP_PROVIDER_BRIDGE_LACROS_H_ #define CHROME_BROWSER_LACROS_WEB_APP_PROVIDER_BRIDGE_LACROS_H_ +#include "chrome/browser/web_applications/web_app_id.h" #include "chromeos/crosapi/mojom/web_app_service.mojom.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -31,6 +32,8 @@ const std::string& app_id, GetWebApkCreationParamsCallback callback) override; void InstallMicrosoft365(InstallMicrosoft365Callback callback) override; + void GetSubAppIds(const web_app::AppId& app_id, + GetSubAppIdsCallback callback) override; private: static void WebAppInstalledInArcImpl( @@ -47,6 +50,9 @@ Profile* profile); static void InstallMicrosoft365Impl(InstallMicrosoft365Callback callback, Profile* profile); + static void GetSubAppIdsImpl(const web_app::AppId& app_id, + GetSubAppIdsCallback callback, + Profile* profile); mojo::Receiver<mojom::WebAppProviderBridge> receiver_{this}; };
diff --git a/chrome/browser/media/webrtc/webrtc_interactive_uitest.cc b/chrome/browser/media/webrtc/webrtc_interactive_uitest.cc index 2cfb716..ac0d8244 100644 --- a/chrome/browser/media/webrtc/webrtc_interactive_uitest.cc +++ b/chrome/browser/media/webrtc/webrtc_interactive_uitest.cc
@@ -6,6 +6,7 @@ #include "base/memory/raw_ptr.h" #include "base/task/deferred_sequenced_task_runner.h" #include "base/test/bind.h" +#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chrome/browser/media/webrtc/webrtc_browsertest_base.h" #include "chrome/browser/media/webrtc/webrtc_browsertest_common.h" @@ -299,10 +300,40 @@ for (const std::string& type : VerifyStatsGeneratedPromise(left_tab_)) { missing_expected_stats.erase(type); } - for (const std::string& type : missing_expected_stats) { - EXPECT_TRUE(false) << "Expected stats dictionary is missing: " << type; + EXPECT_THAT(missing_expected_stats, ::testing::IsEmpty()); + + DetectVideoAndHangUp(); +} + +class WebRtcBrowserTestIdl : public WebRtcBrowserTest { + public: + WebRtcBrowserTestIdl() { + scoped_features_.InitAndEnableFeature( + blink::features::kWebRtcStatsReportIdl); } + private: + base::test::ScopedFeatureList scoped_features_; +}; + +IN_PROC_BROWSER_TEST_F(WebRtcBrowserTestIdl, + RunsAudioVideoWebRTCCallInTwoTabsGetStatsPromiseIDL) { + StartServerAndOpenTabs(); + SetupPeerconnectionWithLocalStream(left_tab_); + SetupPeerconnectionWithLocalStream(right_tab_); + CreateDataChannel(left_tab_, "data"); + CreateDataChannel(right_tab_, "data"); + NegotiateCall(left_tab_, right_tab_); + + std::set<std::string> missing_expected_stats; + for (const std::string& type : GetMandatoryStatsTypes(left_tab_)) { + missing_expected_stats.insert(type); + } + for (const std::string& type : VerifyStatsGeneratedPromise(left_tab_)) { + missing_expected_stats.erase(type); + } + EXPECT_THAT(missing_expected_stats, ::testing::IsEmpty()); + DetectVideoAndHangUp(); }
diff --git a/chrome/browser/metrics/structured/ash_structured_metrics_recorder.cc b/chrome/browser/metrics/structured/ash_structured_metrics_recorder.cc index bfeed0bd..310400ba 100644 --- a/chrome/browser/metrics/structured/ash_structured_metrics_recorder.cc +++ b/chrome/browser/metrics/structured/ash_structured_metrics_recorder.cc
@@ -47,8 +47,8 @@ void AshStructuredMetricsRecorder::RecordEvent(Event&& event) { // It is OK not to check whether the remote is bound or not yet. std::vector<Event> events; - events.push_back(std::move(event)); - remote_->Record(events); + events.emplace_back(std::move(event)); + remote_->Record(std::move(events)); } bool AshStructuredMetricsRecorder::IsReadyToRecord() const {
diff --git a/chrome/browser/metrics/structured/lacros_structured_metrics_recorder.cc b/chrome/browser/metrics/structured/lacros_structured_metrics_recorder.cc index cdc81c98..221a831 100644 --- a/chrome/browser/metrics/structured/lacros_structured_metrics_recorder.cc +++ b/chrome/browser/metrics/structured/lacros_structured_metrics_recorder.cc
@@ -64,7 +64,7 @@ for (auto& observer : observers_) observer.OnFlush(); - remote->Record(enqueued_events_); + remote->Record(std::move(enqueued_events_)); enqueued_events_.clear(); } @@ -73,8 +73,8 @@ observer.OnRecord(event); std::vector<Event> events; - events.push_back(std::move(event)); - remote->Record(events); + events.emplace_back(std::move(event)); + remote->Record(std::move(events)); } bool LacrosStructuredMetricsRecorder::IsReadyToRecord() const {
diff --git a/chrome/browser/password_manager/multi_profile_credentials_filter_unittest.cc b/chrome/browser/password_manager/multi_profile_credentials_filter_unittest.cc index 585650c..8bcfa52 100644 --- a/chrome/browser/password_manager/multi_profile_credentials_filter_unittest.cc +++ b/chrome/browser/password_manager/multi_profile_credentials_filter_unittest.cc
@@ -36,6 +36,11 @@ class TestDiceWebSigninInterceptorDelegate : public DiceWebSigninInterceptor::Delegate { public: + bool IsSigninInterceptionSupported( + const content::WebContents& web_contents) override { + return true; + } + std::unique_ptr<ScopedDiceWebSigninInterceptionBubbleHandle> ShowSigninInterceptionBubble( content::WebContents* web_contents,
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_preload_test_response_utils.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_test_response_utils.cc index 5569fce..53ae4da 100644 --- a/chrome/browser/preloading/prefetch/search_prefetch/search_preload_test_response_utils.cc +++ b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_test_response_utils.cc
@@ -64,6 +64,25 @@ &net::test_server::HttpResponseDelegate::SendContentsAndFinish, delegate, body_)); break; + case SearchPreloadTestResponseDeferralType::kDeferChunkedResponseBody: + size_t body_size = body_.size(); + ASSERT_GE(body_size, size_t(2)); + // This task will send the first part. + test_harness_->AddDelayedResponseTask( + base::SingleThreadTaskRunner::GetCurrentDefault(), + base::BindOnce(&net::test_server::HttpResponseDelegate::SendContents, + delegate, body_.substr(0, body_size / 2), + base::DoNothing())); + // This task will send the remaining part of the content. + test_harness_->AddDelayedResponseTask( + base::SingleThreadTaskRunner::GetCurrentDefault(), + base::BindOnce( + &net::test_server::HttpResponseDelegate::SendContentsAndFinish, + delegate, body_.substr(body_size / 2))); + delegate->SendResponseHeaders(code(), net::GetHttpReasonPhrase(code()), + headers_); + + break; } }
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_preload_test_response_utils.h b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_test_response_utils.h index 07d9687..a3535e57 100644 --- a/chrome/browser/preloading/prefetch/search_prefetch/search_preload_test_response_utils.h +++ b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_test_response_utils.h
@@ -23,6 +23,11 @@ // Defer dispatching response head until a explicit signal, and then block // the response until receiving the next signal. kDeferHeaderThenBody = 3, + // Send headers immediately, but defer dispatching the first part of response + // body and then the remaining part with the complete signal. Note: Callers + // should guarantee it has provided a valid response content whose size is + // greater than 1, so that server can split the body. + kDeferChunkedResponseBody = 4 }; // A test base that allows test fixtures to control when and what to respond.
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc index fd5feca1..c2de7e3 100644 --- a/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc +++ b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc
@@ -299,8 +299,15 @@ } } - void NavigateToPrerenderedResult(const GURL& expected_prerender_url) { + // `WaitEvent::kLoadStopped` is the default value for a + // TestNavigationObserver. Pass another event type to not wait until it + // finishes loading. + void NavigateToPrerenderedResult( + const GURL& expected_prerender_url, + content::TestNavigationObserver::WaitEvent wait_event = + content::TestNavigationObserver::WaitEvent::kLoadStopped) { content::TestNavigationObserver observer(GetActiveWebContents()); + observer.set_wait_event(wait_event); GetActiveWebContents()->OpenURL(content::OpenURLParams( expected_prerender_url, content::Referrer(), WindowOpenDisposition::CURRENT_TAB, @@ -900,6 +907,90 @@ EXPECT_EQ(1, prerender_helper().GetRequestCount(expected_prefetch_url)); } +// Tests the prerender works well when running in the +// `StreamingSearchPrefetchURLLoader::serving_from_data_` mode, even if the +// server is slow. +IN_PROC_BROWSER_TEST_F(SearchPreloadUnifiedBrowserTest, ChunkedResponseBody) { + base::HistogramTester histogram_tester; + set_service_deferral_type( + SearchPreloadTestResponseDeferralType::kDeferChunkedResponseBody); + + const GURL kInitialUrl = embedded_test_server()->GetURL("/empty.html"); + const GURL kNavigatedUrl = embedded_test_server()->GetURL("/title1.html"); + + ASSERT_TRUE(GetActiveWebContents()); + ASSERT_TRUE(content::NavigateToURL(GetActiveWebContents(), kInitialUrl)); + SetUpContext(); + + // 1. Type the first query. + std::string search_query = "prer"; + std::string prerender_query = "prerender"; + + GURL expected_prefetch_url = + GetSearchUrl(prerender_query, UrlType::kPrefetch); + GURL expected_prerender_url = + GetSearchUrl(prerender_query, UrlType::kPrerender); + + content::test::PrerenderHostRegistryObserver registry_observer( + *GetActiveWebContents()); + ChangeAutocompleteResult(search_query.substr(0, search_query.size() - 1), + prerender_query, PrerenderHint::kDisabled, + PrefetchHint::kEnabled); + + // 2. Trigger prefetch and serve the first part of response body. + WaitUntilStatusChangesTo(GetCanonicalSearchURL(expected_prerender_url), + {SearchPrefetchStatus::kCanBeServed}); + DispatchDelayedResponseTask(); + + // 3. Trigger prerender. + ChangeAutocompleteResult(search_query, prerender_query, + PrerenderHint::kEnabled, PrefetchHint::kEnabled); + registry_observer.WaitForTrigger(expected_prerender_url); + WaitUntilStatusChangesTo(GetCanonicalSearchURL(expected_prerender_url), + {SearchPrefetchStatus::kPrerendered}); + content::test::PrerenderHostObserver prerender_observer( + *GetActiveWebContents(), expected_prerender_url); + + // 4. Activate the prerendered page. + NavigateToPrerenderedResult( + expected_prerender_url, + content::TestNavigationObserver::WaitEvent::kNavigationFinished); + + // To commit a navigation, we only need a valid header. So the prerendering + // navigation is ready for activation. + prerender_observer.WaitForActivation(); + + DispatchDelayedResponseTask(); + content::WaitForLoadStop(GetActiveWebContents()); + + // TODO(https://crbug.com/1415185): + // `content::WaitForLoadStop(GetActiveWebContents())` would end before the + // page actually finishes loading. This is the workaround to ensure that the + // page is fully loaded. + std::string script_string = R"( + function get_inner_html () { + if(document.documentElement){ + return document.documentElement.innerHTML; + } + return ""; + } + get_inner_html(); + )"; + while (true) { + std::string inner_html = + content::EvalJs(GetActiveWebContents(), script_string).ExtractString(); + if (base::Contains(inner_html, "PREFETCH")) { + break; + } + base::RunLoop run_loop; + run_loop.RunUntilIdle(); + } + + // Prerender should not retry the request. + EXPECT_EQ(0, prerender_helper().GetRequestCount(expected_prerender_url)); + EXPECT_EQ(1, prerender_helper().GetRequestCount(expected_prefetch_url)); +} + // Tests prerender is cancelled after SearchPrefetchService cancels prefetch // requests. IN_PROC_BROWSER_TEST_F(SearchPreloadUnifiedBrowserTest, DoNotRefetchSameTerms) {
diff --git a/chrome/browser/resources/new_tab_page/BUILD.gn b/chrome/browser/resources/new_tab_page/BUILD.gn index a767172..9887d35 100644 --- a/chrome/browser/resources/new_tab_page/BUILD.gn +++ b/chrome/browser/resources/new_tab_page/BUILD.gn
@@ -3,48 +3,54 @@ # found in the LICENSE file. import("//chrome/common/features.gni") -import("//tools/grit/grit_rule.gni") -import("//tools/polymer/html_to_wrapper.gni") -import("//ui/webui/resources/tools/generate_grd.gni") -import("//ui/webui/resources/tools/optimize_webui.gni") import("//ui/webui/webui_features.gni") import("./new_tab_page.gni") -import("./preprocess_if_expr_sourcemaps.gni") -import("./ts_library_sourcemaps.gni") + +import("//ui/webui/resources/tools/build_webui.gni") assert(!is_android) grd_prefix = "new_tab_page" -preprocess_folder = "preprocessed" -if (optimize_webui) { - build_manifest = "build_manifest.json" -} +build_webui("build") { + static_files = [ + "new_tab_page.html", + "shared_vars.css", + "modules/chromefetti.svg", + "untrusted/background_image.html", + "untrusted/background_image.js", + "untrusted/image.html", + "untrusted/one_google_bar.html", + "untrusted/one_google_bar.js", + ] -preprocess_if_expr_sourcemaps("preprocess") { - defines = [ "is_official_build=$is_official_build" ] - out_folder = "$target_gen_dir/$preprocess_folder" - in_files = ts_files -} + extra_grdp_files = [ + "$target_gen_dir/icons/resources.grdp", + "$target_gen_dir/modules/cart/icons/resources.grdp", + "$target_gen_dir/modules/feed/icons/resources.grdp", + "$target_gen_dir/modules/photos/icons/resources.grdp", + "$target_gen_dir/modules/photos/images/resources.grdp", + "$target_gen_dir/modules/recipes_v2/icons/resources.grdp", + ] -preprocess_if_expr("preprocess_html") { - defines = [ "is_official_build=$is_official_build" ] - out_folder = "$target_gen_dir/$preprocess_folder" - in_files = html_files -} + extra_grdp_deps = [ + "icons:build_grdp", + "modules/cart/icons:build_grdp", + "modules/feed/icons:build_grdp", + "modules/photos/icons:build_grdp", + "modules/photos/images:build_grdp", + "modules/recipes_v2/icons:build_grdp", + ] -html_to_wrapper("html_wrapper_files") { - deps = [ ":preprocess_html" ] - in_folder = "$target_gen_dir/$preprocess_folder" - out_folder = "$target_gen_dir/$preprocess_folder" - in_files = html_files - minify = optimize_webui -} + if (optimize_webui) { + extra_grdp_files += [ "$target_gen_dir/mojo_resources.grdp" ] + extra_grdp_deps += [ ":build_mojo_grdp" ] + } -# Copy all Mojom generated JS files used by the NTP to a common location so that -# TS compiler can find them when resolving relative paths. -copy("copy_mojom") { - deps = [ + web_component_files = all_web_component_files + non_web_component_files = all_non_web_component_files + + mojo_files_deps = [ "//chrome/browser/cart:mojo_bindings_ts__generator", "//chrome/browser/new_tab_page/modules/drive:mojo_bindings_ts__generator", "//chrome/browser/new_tab_page/modules/feed:mojo_bindings_ts__generator", @@ -52,7 +58,7 @@ "//chrome/browser/new_tab_page/modules/recipes:mojo_bindings_ts__generator", "//chrome/browser/ui/webui/new_tab_page:mojo_bindings_ts__generator", ] - sources = [ + mojo_files = [ "$root_gen_dir/chrome/browser/cart/chrome_cart.mojom-webui.ts", "$root_gen_dir/chrome/browser/new_tab_page/modules/drive/drive.mojom-webui.ts", "$root_gen_dir/chrome/browser/new_tab_page/modules/feed/feed.mojom-webui.ts", @@ -62,80 +68,18 @@ ] if (!is_official_build) { - deps += [ + mojo_files_deps += [ "//chrome/browser/ui/webui/new_tab_page/foo:mojo_bindings_ts__generator", ] - sources += [ "$root_gen_dir/chrome/browser/ui/webui/new_tab_page/foo/foo.mojom-webui.ts" ] + mojo_files += [ "$root_gen_dir/chrome/browser/ui/webui/new_tab_page/foo/foo.mojom-webui.ts" ] } - outputs = [ "$target_gen_dir/$preprocess_folder/{{source_file_part}}" ] -} - -if (optimize_webui) { - # Register all mojo files to their own grdp, since they are excluded from the - # bundle on optimized builds and need to be registered separately. - generate_grd("build_mojo_grdp") { - grd_prefix = grd_prefix - out_grd = "$target_gen_dir/mojo_resources.grdp" - input_files = mojo_js_files - input_files_base_dir = rebase_path("$target_gen_dir/tsc", root_build_dir) - deps = [ ":build_ts" ] - } -} - -grit("resources") { - defines = chrome_grit_defines + [ "is_official_build=$is_official_build" ] - - enable_input_discovery_for_gn_analyze = false - source = "$target_gen_dir/resources.grd" - - deps = [ ":build_grd" ] - - outputs = [ - "grit/new_tab_page_resources.h", - "grit/new_tab_page_resources_map.cc", - "grit/new_tab_page_resources_map.h", - "new_tab_page_resources.pak", + ts_composite = true + ts_definitions = [ + "//tools/typescript/definitions/metrics_private.d.ts", + "//tools/typescript/definitions/pending.d.ts", ] - output_dir = "$root_gen_dir/chrome" -} - -if (optimize_webui) { - optimize_webui("optimized_js") { - host = "new-tab-page" - input = rebase_path("$target_gen_dir/tsc", root_build_dir) - deps = [ ":build_ts" ] - js_module_in_files = [ - "new_tab_page.js", - "lazy_load.js", - ] - out_manifest = "$target_gen_dir/$build_manifest" - excludes = [ - "chrome://resources/cr_components/color_change_listener/color_change_listener.mojom-webui.js", - "chrome://resources/cr_components/customize_themes/customize_themes.mojom-webui.js", - "chrome://resources/cr_components/history_clusters/history_clusters.mojom-webui.js", - "chrome://resources/cr_components/most_visited/most_visited.mojom-webui.js", - "chrome://resources/cr_components/omnibox/omnibox.mojom-webui.js", - "chrome://resources/js/browser_command/browser_command.mojom-webui.js", - "chrome://resources/js/metrics_reporter/metrics_reporter.mojom-webui.js", - "chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js", - "chrome://resources/mojo/mojo/public/mojom/base/text_direction.mojom-webui.js", - "chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js", - "chrome://resources/mojo/skia/public/mojom/skcolor.mojom-webui.js", - "chrome://resources/mojo/url/mojom/url.mojom-webui.js", - ] + mojo_js_files - } -} - -ts_library_sourcemaps("build_ts") { - root_dir = "$target_gen_dir/$preprocess_folder" - out_dir = "$target_gen_dir/tsc" - composite = true - tsconfig_base = "tsconfig_base.json" - enable_source_maps = enable_webui_inline_sourcemaps - in_files = ts_files + html_wrapper_files + mojo_ts_files - - deps = [ + ts_deps = [ "//third_party/polymer/v3_0:library", "//ui/webui/resources/cr_components/color_change_listener:build_ts", "//ui/webui/resources/cr_components/customize_themes:build_ts", @@ -148,65 +92,40 @@ "//ui/webui/resources/mojo:library", ] - definitions = [ - "//tools/typescript/definitions/metrics_private.d.ts", - "//tools/typescript/definitions/pending.d.ts", - ] + optimize = optimize_webui + if (optimize) { + optimize_webui_host = "new-tab-page" + optimize_webui_in_files = [ + "new_tab_page.js", + "lazy_load.js", + ] + optimize_webui_excludes = [ + "chrome://resources/cr_components/color_change_listener/color_change_listener.mojom-webui.js", + "chrome://resources/cr_components/customize_themes/customize_themes.mojom-webui.js", + "chrome://resources/cr_components/history_clusters/history_clusters.mojom-webui.js", + "chrome://resources/cr_components/most_visited/most_visited.mojom-webui.js", + "chrome://resources/cr_components/omnibox/omnibox.mojom-webui.js", + "chrome://resources/js/browser_command/browser_command.mojom-webui.js", + "chrome://resources/js/metrics_reporter/metrics_reporter.mojom-webui.js", + "chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js", + "chrome://resources/mojo/mojo/public/mojom/base/text_direction.mojom-webui.js", + "chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js", + "chrome://resources/mojo/skia/public/mojom/skcolor.mojom-webui.js", + "chrome://resources/mojo/url/mojom/url.mojom-webui.js", + ] + mojo_js_files + } - extra_deps = [ - ":copy_mojom", - ":html_wrapper_files", - ":preprocess", - ] + enable_source_maps = enable_webui_inline_sourcemaps } -generate_grd("build_grd") { - grd_prefix = grd_prefix - out_grd = "$target_gen_dir/resources.grd" - input_files = [ - "new_tab_page.html", - "shared_vars.css", - "modules/chromefetti.svg", - "untrusted/background_image.html", - "untrusted/background_image.js", - "untrusted/image.html", - "untrusted/one_google_bar.html", - "untrusted/one_google_bar.js", - ] - input_files_base_dir = rebase_path(".", "//") - - grdp_files = [ - "$target_gen_dir/icons/resources.grdp", - "$target_gen_dir/modules/cart/icons/resources.grdp", - "$target_gen_dir/modules/feed/icons/resources.grdp", - "$target_gen_dir/modules/photos/icons/resources.grdp", - "$target_gen_dir/modules/photos/images/resources.grdp", - "$target_gen_dir/modules/recipes_v2/icons/resources.grdp", - ] - - deps = [ - "icons:build_grdp", - "modules/cart/icons:build_grdp", - "modules/feed/icons:build_grdp", - "modules/photos/icons:build_grdp", - "modules/photos/images:build_grdp", - "modules/recipes_v2/icons:build_grdp", - ] - - if (optimize_webui) { - deps += [ - ":build_mojo_grdp", - ":optimized_js", - ] - resource_path_rewrites = [ - "new_tab_page.rollup.js|new_tab_page.js", - "lazy_load.rollup.js|lazy_load.js", - ] - manifest_files = [ "$target_gen_dir/$build_manifest" ] - grdp_files += [ "$target_gen_dir/mojo_resources.grdp" ] - } else { - deps += [ ":build_ts" ] - manifest_files = - filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ]) +if (optimize_webui) { + # Register all mojo files to their own grdp, since they are excluded from the + # bundle on optimized builds and need to be registered separately. + generate_grd("build_mojo_grdp") { + grd_prefix = grd_prefix + out_grd = "$target_gen_dir/mojo_resources.grdp" + input_files = mojo_js_files + input_files_base_dir = rebase_path("$target_gen_dir/tsc", root_build_dir) + deps = [ ":build_ts" ] } }
diff --git a/chrome/browser/resources/new_tab_page/new_tab_page.gni b/chrome/browser/resources/new_tab_page/new_tab_page.gni index 0819b077..7925149 100644 --- a/chrome/browser/resources/new_tab_page/new_tab_page.gni +++ b/chrome/browser/resources/new_tab_page/new_tab_page.gni
@@ -2,67 +2,52 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//ui/webui/webui_features.gni") import("./modules/modules.gni") # List of files that don't need to be passed to html_to_wrapper(). -non_web_component_files = [ - "background_manager.ts", - "customize_dialog_types.ts", - "i18n_setup.ts", - "lazy_load.ts", - "metrics_utils.ts", - "new_tab_page_proxy.ts", - "new_tab_page.ts", - "utils.ts", - "window_proxy.ts", - ] + modules_non_web_component_files +all_non_web_component_files = [ + "background_manager.ts", + "customize_dialog_types.ts", + "i18n_setup.ts", + "lazy_load.ts", + "metrics_utils.ts", + "new_tab_page_proxy.ts", + "new_tab_page.ts", + "utils.ts", + "window_proxy.ts", + ] + modules_non_web_component_files # Files holding a Polymer element definition and have an equivalent .html file. -web_component_files = [ - "app.ts", - "customize_backgrounds.ts", - "customize_dialog.ts", - "customize_modules.ts", - "customize_shortcuts.ts", - "doodle_share_dialog.ts", - "iframe.ts", - "lens_form.ts", - "lens_upload_dialog.ts", - "logo.ts", - "middle_slot_promo.ts", - "mini_page.ts", - "realbox/realbox.ts", - "voice_search_overlay.ts", - ] + modules_web_component_files +all_web_component_files = [ + "app.ts", + "customize_backgrounds.ts", + "customize_dialog.ts", + "customize_modules.ts", + "customize_shortcuts.ts", + "doodle_share_dialog.ts", + "iframe.ts", + "lens_form.ts", + "lens_upload_dialog.ts", + "logo.ts", + "middle_slot_promo.ts", + "mini_page.ts", + "realbox/realbox.ts", + "voice_search_overlay.ts", + ] + modules_web_component_files -# Files that are passed as input to html_to_wrapper(). -html_files = [] -foreach(f, web_component_files) { - html_files += [ string_replace(f, ".ts", ".html") ] -} +if (optimize_webui) { + # Transpiled Mojo JS files to be excluded from the bundle in optimized builds. + mojo_js_files = [ + "chrome_cart.mojom-webui.js", + "drive.mojom-webui.js", + "feed.mojom-webui.js", + "new_tab_page.mojom-webui.js", + "photos.mojom-webui.js", + "recipes.mojom-webui.js", + ] -# Files that are generated by html_to_wrapper(). -html_wrapper_files = [] -foreach(f, html_files) { - html_wrapper_files += [ f + ".ts" ] -} - -ts_files = web_component_files + non_web_component_files - -mojo_ts_files = [ - "chrome_cart.mojom-webui.ts", - "drive.mojom-webui.ts", - "feed.mojom-webui.ts", - "new_tab_page.mojom-webui.ts", - "photos.mojom-webui.ts", - "recipes.mojom-webui.ts", -] - -if (!is_official_build) { - mojo_ts_files += [ "foo.mojom-webui.ts" ] -} - -mojo_js_files = [] -foreach(f, mojo_ts_files) { - mojo_js_files += [ string_replace(f, ".ts", ".js") ] + if (!is_official_build) { + mojo_js_files += [ "foo.mojom-webui.js" ] + } }
diff --git a/chrome/browser/resources/settings/autofill_page/autofill_page.html b/chrome/browser/resources/settings/autofill_page/autofill_page.html index 1eb7935..74e0827 100644 --- a/chrome/browser/resources/settings/autofill_page/autofill_page.html +++ b/chrome/browser/resources/settings/autofill_page/autofill_page.html
@@ -12,7 +12,8 @@ <div route-path="default"> <cr-link-row id="passwordManagerButton" start-icon="settings20:vpn-key" label="$i18n{passwords}" on-click="onPasswordsClick_" - role-description="$i18n{subpageArrowRoleDescription}"> + role-description="$i18n{subpageArrowRoleDescription}" + external="[[enableNewPasswordManagerPage_]]"> <span id="passwordManagerSubLabel" slot="sub-label"> [[passwordManagerSubLabel_]]</span> </cr-link-row>
diff --git a/chrome/browser/resources/settings/autofill_page/autofill_page.ts b/chrome/browser/resources/settings/autofill_page/autofill_page.ts index f1deffc..cfeb6dc6 100644 --- a/chrome/browser/resources/settings/autofill_page/autofill_page.ts +++ b/chrome/browser/resources/settings/autofill_page/autofill_page.ts
@@ -17,6 +17,8 @@ import '../settings_page/settings_subpage.js'; import '../settings_shared.css.js'; +import {CrLinkRowElement} from 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js'; +import {OpenWindowProxyImpl} from 'chrome://resources/js/open_window_proxy.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {BaseMixin} from '../base_mixin.js'; @@ -34,6 +36,12 @@ const SettingsAutofillPageElementBase = PrefsMixin( PasswordCheckMixin(PasswordRequestorMixin(BaseMixin(PolymerElement)))); +export interface SettingsAutofillPageElement { + $: { + passwordManagerButton: CrLinkRowElement, + }; +} + export class SettingsAutofillPageElement extends SettingsAutofillPageElementBase { static get is() { @@ -79,6 +87,13 @@ }, }, + enableNewPasswordManagerPage_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('enableNewPasswordManagerPage'); + }, + }, + // The credential is only used to pass the credential from password-view // to settings-subpage credential: { @@ -93,6 +108,7 @@ private focusConfig_: Map<string, string>; private passwordManagerSubLabel_: string; private enablePasswordViewPage_: string; + private enableNewPasswordManagerPage_: boolean; credential: chrome.passwordsPrivate.PasswordUiEntry|null; // <if expr="is_chromeos"> @@ -124,6 +140,12 @@ */ private onPasswordsClick_() { PasswordManagerImpl.getInstance().recordPasswordsPageAccessInSettings(); + if (this.enableNewPasswordManagerPage_) { + // TODO(crbug.com/1416887): It will always open a new tab with Password + // Manager. Find a way to use chrome::ShowPasswordManager instead. + OpenWindowProxyImpl.getInstance().openUrl('chrome://password-manager'); + return; + } Router.getInstance().navigateTo(routes.PASSWORDS); } @@ -131,6 +153,9 @@ * @return The sub-title message indicating the result of password check. */ private computePasswordManagerSubLabel_(): string { + if (this.enableNewPasswordManagerPage_) { + return ''; + } return this.leakedPasswords.length > 0 ? this.compromisedPasswordsCount : ''; }
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 b1397b00..8ea58b6 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
@@ -7,12 +7,14 @@ * 'settings-safety-passwords-child' is the settings page containing the * safety check child showing the password status. */ -import {assertNotReached} from 'chrome://resources/js/assert_ts.js'; import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js'; +import {assertNotReached} from 'chrome://resources/js/assert_ts.js'; +import {OpenWindowProxyImpl} from 'chrome://resources/js/open_window_proxy.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {PasswordCheckReferrer, PasswordManagerImpl} from '../autofill_page/password_manager_proxy.js'; +import {loadTimeData} from '../i18n_setup.js'; import {MetricsBrowserProxy, MetricsBrowserProxyImpl, SafetyCheckInteractions} from '../metrics_browser_proxy.js'; import {routes} from '../route.js'; import {Router} from '../router.js'; @@ -67,6 +69,13 @@ SafetyCheckPasswordsStatus.WEAK_PASSWORDS_EXIST, ]), }, + + enableNewPasswordManagerPage_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('enableNewPasswordManagerPage'); + }, + }, }; } @@ -75,6 +84,7 @@ private rowClickableStatuses: Set<SafetyCheckPasswordsStatus>; private metricsBrowserProxy_: MetricsBrowserProxy = MetricsBrowserProxyImpl.getInstance(); + private enableNewPasswordManagerPage_: boolean; override connectedCallback() { super.connectedCallback(); @@ -149,11 +159,18 @@ } private openPasswordCheckPage_() { + PasswordManagerImpl.getInstance().recordPasswordCheckReferrer( + PasswordCheckReferrer.SAFETY_CHECK); + if (this.enableNewPasswordManagerPage_) { + // TODO(crbug.com/1416887): It will always open a new tab with Password + // Manager. Find a way to use chrome::ShowPasswordCheck instead. + OpenWindowProxyImpl.getInstance().openUrl( + 'chrome://password-manager/checkup'); + return; + } Router.getInstance().navigateTo( routes.CHECK_PASSWORDS, /* dynamicParams= */ undefined, /* removeSearch= */ true); - PasswordManagerImpl.getInstance().recordPasswordCheckReferrer( - PasswordCheckReferrer.SAFETY_CHECK); } }
diff --git a/chrome/browser/signin/dice_web_signin_interceptor.cc b/chrome/browser/signin/dice_web_signin_interceptor.cc index 1259d9a06..4cb11d85 100644 --- a/chrome/browser/signin/dice_web_signin_interceptor.cc +++ b/chrome/browser/signin/dice_web_signin_interceptor.cc
@@ -96,10 +96,6 @@ return account_info; } -bool HasNoBrowser(content::WebContents* web_contents) { - return chrome::FindBrowserWithWebContents(web_contents) == nullptr; -} - } // namespace ScopedDiceWebSigninInterceptionBubbleHandle:: @@ -267,10 +263,9 @@ return; } - if (HasNoBrowser(web_contents)) { - // Do not intercept from the profile creation flow. + if (!delegate_->IsSigninInterceptionSupported(*web_contents)) { RecordSigninInterceptionHeuristicOutcome( - SigninInterceptionHeuristicOutcome::kAbortNoBrowser); + SigninInterceptionHeuristicOutcome::kAbortNoSupportedBrowser); return; }
diff --git a/chrome/browser/signin/dice_web_signin_interceptor.h b/chrome/browser/signin/dice_web_signin_interceptor.h index 6392e9c..ef5266a3 100644 --- a/chrome/browser/signin/dice_web_signin_interceptor.h +++ b/chrome/browser/signin/dice_web_signin_interceptor.h
@@ -72,8 +72,9 @@ kAbortProfileCreationDisallowed = 9, // The interceptor was shut down before the heuristic completed. kAbortShutdown = 10, - // The interceptor is not offered when WebContents has no browser associated. - kAbortNoBrowser = 11, + // The interceptor is not offered when the `WebContents` has no browser + // associated, or its browser does not support displaying the interception UI. + kAbortNoSupportedBrowser = 11, // A password update is required for the account, and this takes priority over // signin interception. kAbortPasswordUpdate = 12, @@ -189,6 +190,10 @@ virtual ~Delegate() = default; + // Returns whether the `web_contents` supports signin interception. + virtual bool IsSigninInterceptionSupported( + const content::WebContents& web_contents) = 0; + // Shows the signin interception bubble and calls |callback| to indicate // whether the user should continue in a new profile. // The callback is never called if the delegate is deleted before it
diff --git a/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc b/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc index 16c3df3..0e48648 100644 --- a/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc +++ b/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc
@@ -31,6 +31,9 @@ #include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" +#include "chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.h" +#include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h" +#include "chrome/browser/web_applications/test/web_app_install_test_utils.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/profile_waiter.h" @@ -82,7 +85,7 @@ // Dummy interception delegate that automatically accepts multi user // interception. class FakeDiceWebSigninInterceptorDelegate - : public DiceWebSigninInterceptor::Delegate { + : public DiceWebSigninInterceptorDelegate { public: std::unique_ptr<ScopedDiceWebSigninInterceptionBubbleHandle> ShowSigninInterceptionBubble( @@ -587,6 +590,58 @@ GURL("chrome://newtab/")); } +// WebApps do not trigger interception. Regression test for +// https://crbug.com/1414988 +IN_PROC_BROWSER_TEST_F(DiceWebSigninInterceptorBrowserTest, + WebAppNoInterception) { + base::HistogramTester histogram_tester; + // Setup profile for interception. + identity_test_env()->MakeAccountAvailable("alice@example.com"); + AccountInfo account_info = + identity_test_env()->MakeAccountAvailable("bob@example.com"); + // Fill the account info, in particular for the hosted_domain field. + account_info.full_name = "fullname"; + account_info.given_name = "givenname"; + account_info.hosted_domain = kNoHostedDomainFound; + account_info.locale = "en"; + account_info.picture_url = "https://example.com"; + DCHECK(account_info.IsValid()); + identity_test_env()->UpdateAccountInfoForAccount(account_info); + + SetupGaiaResponses(); + + // Install web app + Profile* profile = browser()->profile(); + const GURL kWebAppURL("http://www.webapp.com"); + auto web_app_info = std::make_unique<WebAppInstallInfo>(); + web_app_info->start_url = kWebAppURL; + web_app_info->scope = kWebAppURL.GetWithoutFilename(); + web_app_info->user_display_mode = + web_app::mojom::UserDisplayMode::kStandalone; + web_app_info->title = u"A Web App"; + web_app::AppId app_id = + web_app::test::InstallWebApp(profile, std::move(web_app_info)); + + Browser* app_browser = web_app::LaunchWebAppBrowserAndWait(profile, app_id); + + ASSERT_NE(app_browser, nullptr); + ASSERT_EQ(app_browser->type(), Browser::Type::TYPE_APP); + + // Trigger signin interception in the web app. + DiceWebSigninInterceptor* interceptor = + DiceWebSigninInterceptorFactory::GetForProfile(profile); + interceptor->MaybeInterceptWebSignin( + app_browser->tab_strip_model()->GetActiveWebContents(), + account_info.account_id, + /*is_new_account=*/true, + /*is_sync_signin=*/false); + + // Check that the interception was aborted. + histogram_tester.ExpectUniqueSample( + "Signin.Intercept.HeuristicOutcome", + SigninInterceptionHeuristicOutcome::kAbortNoSupportedBrowser, 1); +} + class DiceWebSigninInterceptorEnterpriseBrowserTest : public DiceWebSigninInterceptorBrowserTest { public:
diff --git a/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc b/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc index 6a44b53..0e099f1 100644 --- a/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc +++ b/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc
@@ -43,12 +43,18 @@ class MockDiceWebSigninInterceptorDelegate : public DiceWebSigninInterceptor::Delegate { public: + bool IsSigninInterceptionSupported( + const content::WebContents& web_contents) override { + return true; + } + MOCK_METHOD(std::unique_ptr<ScopedDiceWebSigninInterceptionBubbleHandle>, ShowSigninInterceptionBubble, (content::WebContents * web_contents, const BubbleParameters& bubble_parameters, base::OnceCallback<void(SigninInterceptionResult)> callback), (override)); + void ShowFirstRunExperienceInNewProfile( Browser* browser, const CoreAccountId& account_id,
diff --git a/chrome/browser/signin/process_dice_header_delegate_impl_unittest.cc b/chrome/browser/signin/process_dice_header_delegate_impl_unittest.cc index 8f78c01..229e8af 100644 --- a/chrome/browser/signin/process_dice_header_delegate_impl_unittest.cc +++ b/chrome/browser/signin/process_dice_header_delegate_impl_unittest.cc
@@ -42,6 +42,12 @@ : public DiceWebSigninInterceptor::Delegate { public: ~TestDiceWebSigninInterceptorDelegate() override = default; + + bool IsSigninInterceptionSupported( + const content::WebContents& web_contents) override { + return false; + } + std::unique_ptr<ScopedDiceWebSigninInterceptionBubbleHandle> ShowSigninInterceptionBubble( content::WebContents* web_contents,
diff --git a/chrome/browser/signin/signin_features.cc b/chrome/browser/signin/signin_features.cc index 9d8155b..3d493dda 100644 --- a/chrome/browser/signin/signin_features.cc +++ b/chrome/browser/signin/signin_features.cc
@@ -17,6 +17,19 @@ // the next process launch. const base::FeatureParam<bool> kForYouFreCloseShouldProceed{ &kForYouFre, /*name=*/"close_should_proceed", /*default_value=*/true}; + +constexpr base::FeatureParam<SigninPromoVariant>::Option + kSignInPromoVariantOptions[] = { + {SigninPromoVariant::kSignIn, "sign-in"}, + {SigninPromoVariant::kDoMore, "do-more"}, + {SigninPromoVariant::kMakeYourOwn, "make-your-own"}, +}; + +// Indicates the combination of strings to use on the sign-in promo page. +const base::FeatureParam<SigninPromoVariant> kForYouFreSignInPromoVariant{ + &kForYouFre, /*name=*/"signin_promo_variant", + /*default_value=*/SigninPromoVariant::kSignIn, + /*options=*/&kSignInPromoVariantOptions}; #endif #endif
diff --git a/chrome/browser/signin/signin_features.h b/chrome/browser/signin/signin_features.h index b75217b9..dd1d61b 100644 --- a/chrome/browser/signin/signin_features.h +++ b/chrome/browser/signin/signin_features.h
@@ -10,7 +10,14 @@ #if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_ANDROID) BASE_DECLARE_FEATURE(kForYouFre); + +#if !BUILDFLAG(IS_CHROMEOS_LACROS) extern const base::FeatureParam<bool> kForYouFreCloseShouldProceed; + +enum class SigninPromoVariant { kSignIn, kMakeYourOwn, kDoMore }; +extern const base::FeatureParam<SigninPromoVariant> + kForYouFreSignInPromoVariant; +#endif #endif BASE_DECLARE_FEATURE(kProcessGaiaRemoveLocalAccountHeader);
diff --git a/chrome/browser/supervised_user/android/javatests/src/org/chromium/chrome/browser/supervised_user/WebsiteParentApprovalNativesTest.java b/chrome/browser/supervised_user/android/javatests/src/org/chromium/chrome/browser/supervised_user/WebsiteParentApprovalNativesTest.java index 9b49b3d3..1af77c3 100644 --- a/chrome/browser/supervised_user/android/javatests/src/org/chromium/chrome/browser/supervised_user/WebsiteParentApprovalNativesTest.java +++ b/chrome/browser/supervised_user/android/javatests/src/org/chromium/chrome/browser/supervised_user/WebsiteParentApprovalNativesTest.java
@@ -191,4 +191,27 @@ mHistogramTester.getHistogramValueCount( "FamilyLinkUser.LocalWebApprovalResult", /*Cancelled=*/2)); } + + @Test + @MediumTest + public void cancelApprovalRequestIfOneAlreadyInProgress() { + mockParentAuthDelegateRequestLocalAuthResponse(true); + mTabbedActivityTestRule.loadUrl(mBlockedUrl); + + WebsiteParentApprovalTestUtils.clickAskInPerson(mWebContents); + WebsiteParentApprovalTestUtils.clickAskInPerson(mWebContents); + + WebsiteParentApprovalTestUtils.clickApprove(mBottomSheetTestSupport); + + // Delay to ensure the asynchronous code that records the histograms is executed. + verify(mParentAuthDelegateMock, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL).times(1)) + .requestLocalAuth(any(WindowAndroid.class), any(GURL.class), any(Callback.class)); + + Assert.assertEquals(1, + mHistogramTester.getHistogramValueCount( + "FamilyLinkUser.LocalWebApprovalResult", /*Approved=*/0)); + Assert.assertEquals(1, + mHistogramTester.getHistogramValueCount( + "FamilyLinkUser.LocalWebApprovalResult", /*Cancelled=*/2)); + } }
diff --git a/chrome/browser/task_manager/providers/worker_task_provider.cc b/chrome/browser/task_manager/providers/worker_task_provider.cc index 27894db7..4aa7940 100644 --- a/chrome/browser/task_manager/providers/worker_task_provider.cc +++ b/chrome/browser/task_manager/providers/worker_task_provider.cc
@@ -13,12 +13,7 @@ WorkerTaskProvider::WorkerTaskProvider() = default; -WorkerTaskProvider::~WorkerTaskProvider() { - // Because the TaskManagerImpl is a LazyInstance destroyed by the - // AtExitManager, the global browser process instance may already be gone. - if (g_browser_process && g_browser_process->profile_manager()) - g_browser_process->profile_manager()->RemoveObserver(this); -} +WorkerTaskProvider::~WorkerTaskProvider() = default; Task* WorkerTaskProvider::GetTaskOfUrlRequest(int child_id, int route_id) { return nullptr; @@ -44,6 +39,10 @@ DCHECK(inserted); } +void WorkerTaskProvider::OnProfileManagerDestroying() { + profile_manager_observation_.Reset(); +} + void WorkerTaskProvider::OnOffTheRecordProfileCreated(Profile* off_the_record) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -80,9 +79,8 @@ void WorkerTaskProvider::StartUpdating() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - ProfileManager* profile_manager = g_browser_process->profile_manager(); - if (profile_manager) { - profile_manager->AddObserver(this); + if (ProfileManager* profile_manager = g_browser_process->profile_manager()) { + profile_manager_observation_.Observe(profile_manager); auto loaded_profiles = profile_manager->GetLoadedProfiles(); for (auto* profile : loaded_profiles) { @@ -100,8 +98,7 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); // Stop observing profile creation and destruction. - if (g_browser_process && g_browser_process->profile_manager()) - g_browser_process->profile_manager()->RemoveObserver(this); + profile_manager_observation_.Reset(); observed_profiles_.RemoveAllObservations(); // Clear all ProfileWorkerTaskProvider instances to remove existing tasks.
diff --git a/chrome/browser/task_manager/providers/worker_task_provider.h b/chrome/browser/task_manager/providers/worker_task_provider.h index 718118f..0346c9a1 100644 --- a/chrome/browser/task_manager/providers/worker_task_provider.h +++ b/chrome/browser/task_manager/providers/worker_task_provider.h
@@ -9,11 +9,14 @@ #include "base/containers/flat_map.h" #include "base/scoped_multi_source_observation.h" +#include "base/scoped_observation.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager_observer.h" #include "chrome/browser/profiles/profile_observer.h" #include "chrome/browser/task_manager/providers/task_provider.h" +class ProfileManager; + namespace task_manager { class PerProfileWorkerTaskTracker; @@ -43,6 +46,7 @@ // ProfileManagerObserver: void OnProfileAdded(Profile* profile) override; + void OnProfileManagerDestroying() override; // ProfileObserver: void OnOffTheRecordProfileCreated(Profile* off_the_record) override; @@ -61,6 +65,9 @@ base::ScopedMultiSourceObservation<Profile, ProfileObserver> observed_profiles_{this}; + base::ScopedObservation<ProfileManager, ProfileManagerObserver> + profile_manager_observation_{this}; + // Observes all types of workers for a given profile. base::flat_map<Profile*, std::unique_ptr<PerProfileWorkerTaskTracker>> per_profile_worker_task_trackers_;
diff --git a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.cc b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.cc index cdd45b56..39fd8724 100644 --- a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.cc +++ b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.cc
@@ -35,7 +35,6 @@ view_ = std::move(view); delegate_ = std::move(delegate); - SetShouldSuppressKeyboard(/*suppress=*/true); return true; } @@ -44,15 +43,8 @@ view_->Hide(); } -void TouchToFillCreditCardController::SetShouldSuppressKeyboard(bool suppress) { - if (delegate_) { - delegate_->GetManager()->SetShouldSuppressKeyboard(suppress); - } -} - void TouchToFillCreditCardController::OnDismissed(JNIEnv* env, bool dismissed_by_user) { - SetShouldSuppressKeyboard(/*suppress=*/false); if (delegate_) { delegate_->OnDismissed(dismissed_by_user); }
diff --git a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.h b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.h index 2d325662..bdbe02bf 100644 --- a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.h +++ b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.h
@@ -53,9 +53,6 @@ base::android::JavaParamRef<jstring> unique_id) override; private: - // Called after the surface gets shown or hidden. - void SetShouldSuppressKeyboard(bool suppress); - // Gets or creates the Java counterpart. base::android::ScopedJavaLocalRef<jobject> GetJavaObject() override;
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 9f371b6..87907de 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -3048,6 +3048,8 @@ "webui/settings/ash/guest_os_handler.h", "webui/settings/ash/hierarchy.cc", "webui/settings/ash/hierarchy.h", + "webui/settings/ash/input_device_settings/input_device_settings_provider.cc", + "webui/settings/ash/input_device_settings/input_device_settings_provider.h", "webui/settings/ash/internet_handler.cc", "webui/settings/ash/internet_handler.h", "webui/settings/ash/internet_section.cc", @@ -3156,6 +3158,7 @@ "//ash/public/cpp", "//ash/public/cpp/app_list/vector_icons", "//ash/public/cpp/resources:ash_public_unscaled_resources", + "//ash/public/mojom", "//ash/quick_pair/common", "//ash/quick_pair/keyed_service", "//ash/quick_pair/proto:fastpair_proto", @@ -3242,6 +3245,7 @@ "//chrome/browser/ui/webui/ash/parent_access:proto", "//chrome/browser/ui/webui/ash/vm:mojo_bindings", "//chrome/browser/ui/webui/nearby_share:mojom", + "//chrome/browser/ui/webui/settings/ash/input_device_settings:mojom", "//chrome/browser/ui/webui/settings/ash/os_apps_page/mojom", "//chrome/browser/ui/webui/settings/ash/search:mojo_bindings", "//chrome/browser/web_applications", @@ -6126,6 +6130,7 @@ ] deps += [ "//ash/public/cpp", + "//ash/public/mojom", "//chrome/browser/ui/webui/settings/chromeos/constants:mojom", "//chromeos/ash/components/dbus", "//chromeos/ui/base",
diff --git a/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn b/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn index d57e7e2..5af7fc9 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn +++ b/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn
@@ -57,6 +57,8 @@ "//ui/android:ui_java_resources", ] sources = [ + "java/res/anim/fast_checkout_view_flipper_fade_in.xml", + "java/res/anim/fast_checkout_view_flipper_fade_out.xml", "java/res/drawable/fast_checkout_item_background_bottom.xml", "java/res/drawable/fast_checkout_item_background_top.xml", "java/res/drawable/fast_checkout_item_background_top_copy.xml",
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/res/anim/fast_checkout_view_flipper_fade_in.xml b/chrome/browser/ui/android/fast_checkout/internal/java/res/anim/fast_checkout_view_flipper_fade_in.xml new file mode 100644 index 0000000..157aec30 --- /dev/null +++ b/chrome/browser/ui/android/fast_checkout/internal/java/res/anim/fast_checkout_view_flipper_fade_in.xml
@@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2023 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:interpolator="@android:interpolator/accelerate_quad"> +<alpha + android:fromAlpha="0.0" + android:toAlpha="1.0" + android:duration="100" + android:startOffset="118" /> +</set>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/res/anim/fast_checkout_view_flipper_fade_out.xml b/chrome/browser/ui/android/fast_checkout/internal/java/res/anim/fast_checkout_view_flipper_fade_out.xml new file mode 100644 index 0000000..249cd7cf --- /dev/null +++ b/chrome/browser/ui/android/fast_checkout/internal/java/res/anim/fast_checkout_view_flipper_fade_out.xml
@@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2023 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> + +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:interpolator="@android:interpolator/decelerate_quad" + > +<alpha + android:fromAlpha="1.0" + android:toAlpha="0.0" + android:duration="100"/> +</set>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/res/layout/fast_checkout_bottom_sheet.xml b/chrome/browser/ui/android/fast_checkout/internal/java/res/layout/fast_checkout_bottom_sheet.xml index eac54fab..c9939179 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/res/layout/fast_checkout_bottom_sheet.xml +++ b/chrome/browser/ui/android/fast_checkout/internal/java/res/layout/fast_checkout_bottom_sheet.xml
@@ -28,7 +28,9 @@ android:id="@+id/fast_checkout_bottom_sheet_view_flipper" android:layout_width="match_parent" android:layout_height="wrap_content" - android:measureAllChildren="false" > + android:measureAllChildren="false" + android:inAnimation="@anim/fast_checkout_view_flipper_fade_in" + android:outAnimation="@anim/fast_checkout_view_flipper_fade_out" > <include android:id="@+id/fast_checkout_home_screen_sheet"
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index 39c4d1f0..64798039 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -1347,6 +1347,9 @@ <message name="IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_TITLE" desc="Label of the dropdown that selects the time range for which browsing data will be deleted."> Time range </message> + <message name="IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_15_MINUTES" desc="The option to delete browsing data from the last 15 minutes."> + Last 15 minutes + </message> <message name="IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_HOUR" desc="The option to delete browsing data from the last hour."> Last hour </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_15_MINUTES.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_15_MINUTES.png.sha1 new file mode 100644 index 0000000..0d8d9a2 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_15_MINUTES.png.sha1
@@ -0,0 +1 @@ +dc0249b7f53b28350f79919516b03fc4eb0d86d7 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index 0ca6b8c..3a0cc8a7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">የሚከተሉትን ጠቃሚ ምክሮች ይሞክሩ፦ በእርስዎ መሣሪያ ላይ በቂ ባዶ ቦታ መኖሩን ያረጋግጡ፣ ወይም እንደገና ወደ ውጭ ለመላክ ይሞክሩ።</translation> <translation id="7686086654630106285">ስለ በጣቢያ የተጠቆሙ ማስታወቂያዎች ተጨማሪ</translation> <translation id="768618399695552958">የጎበኟቸው አንዳንድ ገጾች ቅድሚያ ተጭነዋል። ገጾች ከGoogle ጣቢያ ከተገናኙ በGoogle አገልጋዮች በኩል ቅድሚያ ሊጫኑ ይችላሉ።</translation> +<translation id="7691043218961417207">ለመከተል ይዘትን ያስሱ</translation> <translation id="7698359219371678927">በ<ph name="APP_NAME" /> ውስጥ ኢሜይል ይፍጠሩ</translation> <translation id="7707922173985738739">የተንቀሳቃሽ ስልክ ውሂብ</translation> <translation id="7709094866268987903">ያስወገዷቸው ፍላጎቶች እዚህ ይታያሉ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index 1127d3e1..c795ef98 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -1240,6 +1240,7 @@ <translation id="7682724950699840886">Aşağıdakıları sınayın: cihazda kifayət qədər yer olduğuna əmin olun və eksport etməyə cəhd edin.</translation> <translation id="7686086654630106285">Saytın təklif etdiyi reklamlar haqqında ətraflı</translation> <translation id="768618399695552958">Ziyarət etdiyiniz bəzi səhifələr əvvəlcədən yüklənib. Səhifələr Google saytından əlaqələndirildikdə Google serverləri vasitəsilə əvvəlcədən yüklənə bilər.</translation> +<translation id="7691043218961417207">İzləmək üçün kontentləri araşdırın</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> tətbiqində e-poçt yaradın</translation> <translation id="7707922173985738739">Mobil data istifadə edin</translation> <translation id="7709094866268987903">Sildiyiniz maraqlar burada görünəcək</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 692402b..f327c67e 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
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">Segueix aquests consells: comprova que hi hagi prou espai al dispositiu i prova d'exportar les contrasenyes de nou.</translation> <translation id="7686086654630106285">Més informació sobre els anuncis suggerits per llocs web</translation> <translation id="768618399695552958">Algunes de les pàgines que visites estan precarregades. És possible que les pàgines es precarreguin a través dels servidors de Google quan s'enllacin des d'un lloc web de Google.</translation> +<translation id="7691043218961417207">Explora contingut i segueix-lo</translation> <translation id="7698359219371678927">Crea una adreça electrònica a <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Utilitza dades mòbils</translation> <translation id="7709094866268987903">Els interessos que hagis suprimit es mostraran aquí</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index 1626be9..89e4e1b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -1224,6 +1224,7 @@ <translation id="7596558890252710462">Operační systém</translation> <translation id="7605594153474022051">Synchronizace nefunguje</translation> <translation id="7612619742409846846">Jste přihlášeni do Googlu jako</translation> +<translation id="7612989789287281429">Přihlašování…</translation> <translation id="7616551326690708776">Vyberte šablonu zvýraznění.</translation> <translation id="7619072057915878432">Stahování souboru <ph name="FILE_NAME" /> se nezdařilo z důvodu selhání sítě.</translation> <translation id="7626032353295482388">Vítá vás Chrome</translation> @@ -1242,6 +1243,7 @@ <translation id="7682724950699840886">Vyzkoušejte tyto tipy: Zajistěte, aby v zařízení byl dostatek místa a zkuste export zopakovat.</translation> <translation id="7686086654630106285">Další informace o reklamách navrhovaných weby</translation> <translation id="768618399695552958">Některé stránky, které navštěvujete, se načítají předběžně. Pokud na stránky odkazuje web Google, mohou se předběžně načíst prostřednictvím serverů Google.</translation> +<translation id="7691043218961417207">Objevte obsah ke sledování</translation> <translation id="7698359219371678927">Vytvořit e-mail v aplikaci <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Bude používat mobilní data</translation> <translation id="7709094866268987903">Zde se budou zobrazovat odstraněné zájmy</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 1d18f94a..c7477a2 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
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">Prøv følgende tips: Sørg for, at der er nok ledig plads på din enhed, og prøv at eksportere igen.</translation> <translation id="7686086654630106285">Mere om foreslåede annoncer fra websites</translation> <translation id="768618399695552958">Nogle af de sider, du besøger, forudindlæses. Nogle sider forudindlæses muligvis via Google-servere, når de er linket fra et Google-website.</translation> +<translation id="7691043218961417207">Gennemse indhold, du vil følge</translation> <translation id="7698359219371678927">Opret mail i <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Brug mobildata</translation> <translation id="7709094866268987903">Interesser, du har fjernet, vises her</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb index 4c22193..6b65452 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">Saiatu hau egiten: ziurtatu gailuan behar adina toki duzula eta saiatu berriro esportatzen.</translation> <translation id="7686086654630106285">Webguneek iradokitako iragarkiei buruzko informazio gehiago</translation> <translation id="768618399695552958">Bisitatzen dituzun orrietako batzuk aurrez kargatzen dira. Baliteke orriak Google-ren zerbitzarien bidez aurrez kargatzea esteka Google-ren webgune batean badago.</translation> +<translation id="7691043218961417207">Arakatu jarraitzeko edukia</translation> <translation id="7698359219371678927">Sortu mezu elektronikoa <ph name="APP_NAME" /> aplikazioan</translation> <translation id="7707922173985738739">Erabili datu-konexioa</translation> <translation id="7709094866268987903">Kendutako interesak hemen agertuko dira</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index 1aaf2cc4..bce6f0a27 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">نکات زیر را امتحان کنید: مطمئن شوید که در دستگاهتان فضای کافی وجود داشته باشد، سعی کنید دوباره صادر کنید.</translation> <translation id="7686086654630106285">اطلاعات بیشتر درباره آگهیهای پیشنهادی سایت</translation> <translation id="768618399695552958">برخیاز صفحاتی که بازدید میکنید پیشبارگیری شدهاند وقتی صفحات از سایت Google پیوند داده شده باشند، ممکن است ازطریق سرورهای Google پیشبارگیری شوند.</translation> +<translation id="7691043218961417207">کاوش محتوا برای دنبال کردن</translation> <translation id="7698359219371678927">ایجاد ایمیل در <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">استفاده از داده تلفن همراه</translation> <translation id="7709094866268987903">علایقی که برداشتید اینجا نشان داده خواهد شد</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index dfb9db0..3724a15 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">નીચેની ટિપ અજમાવી જુઓ: ખાતરી કરો કે તમારા ઉપકરણ પર પૂરતી સ્પેસ છે, ફરીથી નિકાસ કરવાનો પ્રયાસ કરો.</translation> <translation id="7686086654630106285">સાઇટ દ્વારા સૂચિત જાહેરાતો વિશે વધુ વિગતો</translation> <translation id="768618399695552958">તમે મુલાકાત લો છો તે કેટલાક પેજ પહેલેથી લોડ કરેલા છે. જ્યારે પેજ Google site પરથી લિંક કરવામાં આવેલા હોય, ત્યારે તેમને Googleના સર્વર મારફતે પહેલેથી લોડ કરી શકાય છે.</translation> +<translation id="7691043218961417207">ફૉલો કરવા માટેના કન્ટેન્ટ વિશે જાણકારી મેળવો</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> માં ઇમેઇલ બનાવો</translation> <translation id="7707922173985738739">મોબાઇલ ડેટાનો ઉપયોગ કરો</translation> <translation id="7709094866268987903">તમે કાઢી નાખેલી રુચિઓ અહીં દેખાશે</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 69f39895..43825cab 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
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">Coba tips berikut ini: pastikan ruang di perangkat Anda mencukupi, lalu coba ekspor lagi.</translation> <translation id="7686086654630106285">Selengkapnya tentang iklan yang disarankan situs</translation> <translation id="768618399695552958">Beberapa halaman yang Anda buka akan dipramuat. Halaman mungkin dipramuat melalui server Google saat ditautkan dari situs Google.</translation> +<translation id="7691043218961417207">Jelajahi konten untuk diikuti</translation> <translation id="7698359219371678927">Buat email di <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Gunakan data seluler</translation> <translation id="7709094866268987903">Minat yang Anda hapus akan muncul di sini</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 60e8763..d5aca8f 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
@@ -961,7 +961,7 @@ <translation id="6277522088822131679">אירעה בעיה בעת הדפסת הדף. יש לנסות שוב.</translation> <translation id="6277722725779679269">לא ניתן היה לעדכן את המחיר שבמעקב</translation> <translation id="6278428485366576908">עיצוב</translation> -<translation id="6294610283659775533">אפשר לשלוח כרטיסיות ממכשיר למכשיר, כל עוד נכנסת במכשירים לאותו חשבון Google.</translation> +<translation id="6294610283659775533">אפשר לשלוח כרטיסיות ממכשיר למכשיר אם נכנסת במכשירים לאותו חשבון Google.</translation> <translation id="6295158916970320988">כל האתרים</translation> <translation id="6297765934698848803">המצלמה הושבתה במכשיר, בהתאם להגדרות שנקבעו על ידי הארגון שמנהל את המכשיר.</translation> <translation id="6301525844455696527">רוצה להתקדם ברשימת הקריאה שלך?</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 00b5105e..42ad5f7 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
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">推奨される対策: デバイスに十分な空き容量があることを確認し、再度エクスポートを試します。</translation> <translation id="7686086654630106285">サイト提案広告の詳細</translation> <translation id="768618399695552958">アクセスしたページの一部はプリロードされています。ページが Google サイトからリンクされている場合、Google サーバーを介してプリロードされる可能性があります。</translation> +<translation id="7691043218961417207">フォローするコンテンツを探しましょう</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> でメールを作成</translation> <translation id="7707922173985738739">モバイルデータを使用します</translation> <translation id="7709094866268987903">削除した興味 / 関心がここに表示されます</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index 08e61fd..2c268ae 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -1234,6 +1234,7 @@ <translation id="7682724950699840886">Төмөнкү кеңештерди аткарып көрүңүз: түзмөгүңүздө бош орун бар экенин текшерип, кайра экспорттоп көрүңүз.</translation> <translation id="7686086654630106285">Сайтта сунушталган жарнамалар жөнүндө кеңири маалымат</translation> <translation id="768618399695552958">Cиз баш баккан айрым барактар алдын ала жүктөлгөн. Google сайтынан шилтеме берилген барактар Google'дун серверлери аркылуу алдын ала жүктөлүшү мүмкүн.</translation> +<translation id="7691043218961417207">Кызыктуу контентти таап, жазылыңыз</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> колдонмосунан электрондук почта түзүңүз</translation> <translation id="7707922173985738739">Мобилдик Интернетти колдонуу</translation> <translation id="7709094866268987903">Өчүрүлгөн кызыккан нерселериңиз тууралуу маалымат ушул жерде көрүнөт</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index 8c3ade1..30f5f63 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">ລອງຄຳແນະນຳຕໍ່ໄປນີ້: ກວດໃຫ້ແນ່ໃຈວ່າມີພື້ນທີ່ຫວ່າງພຽງພໍໃນອຸປະກອນຂອງທ່ານ, ລອງສົ່ງອອກອີກຄັ້ງ.</translation> <translation id="7686086654630106285">ເພີ່ມເຕີມກ່ຽວກັບການໂຄສະນາທີ່ແນະນໍາຈາກເວັບໄຊ</translation> <translation id="768618399695552958">ໜ້າບາງໜ້າທີ່ທ່ານເຂົ້າແມ່ນຖືກໂຫຼດກ່ອນລ່ວງໜ້າແລ້ວ. ໜ້າຕ່າງໆອາດຖືກໂຫຼດກ່ອນລ່ວງໜ້າຜ່ານເຊີບເວີ Google ໃນເວລາລິ້ງມາຈາກເວັບໄຊ Google ໃດໜຶ່ງ.</translation> +<translation id="7691043218961417207">ສຳຫຼວດເນື້ອຫາເພື່ອຕິດຕາມ</translation> <translation id="7698359219371678927">ສ້າງອີເມວໃນ <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">ໃຊ້ຂໍ້ມູນມືຖື</translation> <translation id="7709094866268987903">ຄວາມສົນໃຈທີ່ທ່ານລຶບອອກຈະປາກົດຢູ່ບ່ອນນີ້</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 0856e493..60b661d 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
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">Išbandykite nurodytus patarimus: įsitikinkite, kad įrenginyje yra pakankamai vietos, ir bandykite eksportuoti dar kartą.</translation> <translation id="7686086654630106285">Daugiau apie svetainių siūlomus skelbimus</translation> <translation id="768618399695552958">Kai kurie puslapiai, kuriuose lankotės, yra iš anksto įkelti. Puslapiai gali būti iš anksto įkelti per „Google“ serverius, kai susieti iš „Google“ svetainės.</translation> +<translation id="7691043218961417207">Naršykite turinį, kurį norite stebėti</translation> <translation id="7698359219371678927">Kurti el. laišką naudojant „<ph name="APP_NAME" />“</translation> <translation id="7707922173985738739">Naudoti mobiliojo ryšio duomenis</translation> <translation id="7709094866268987903">Čia bus rodomi jūsų pašalinti pomėgiai</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index 4dc4155d..8586ba0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -1241,6 +1241,7 @@ <translation id="7682724950699840886">အောက်ပါအကြံပြုချက်များကို စမ်းကြည့်ပါ− သင့်စက်ပစ္စည်းပေါ်တွင် နေရာအလုံအလောက်ရှိ မရှိ စစ်ဆေးပြီး ထပ်မံ၍ တင်ပို့ကြည့်ပါ</translation> <translation id="7686086654630106285">ဝဘ်ဆိုက်က အကြံပြုထားသည့် ကြော်ငြာဆိုင်ရာ နောက်ထပ်အချက်အလက်</translation> <translation id="768618399695552958">သင်ဝင်ကြည့်သော စာမျက်နှာတစ်ချို့ကို ကြိုဖွင့်ထားသည်။ Google ဝဘ်ဆိုက်တစ်ခုမှ လင့်ခ်ချိတ်သည့်အခါ Google ဆာဗာများမှတစ်ဆင့် စာမျက်နှာများကို ကြိုဖွင့်ထားနိုင်ပါသည်။</translation> +<translation id="7691043218961417207">လိုက်ကြည့်မည့် အကြောင်းအရာကို စူးစမ်းလေ့လာရန်</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> တွင် အီးမေးလ်ရေးပါ</translation> <translation id="7707922173985738739">မိုဘိုင်းဒေတာကို သုံးရန်</translation> <translation id="7709094866268987903">သင်ဖယ်ရှားလိုက်သည့် စိတ်ဝင်စားမှုများ ဤနေရာတွင် ပေါ်ပါမည်</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index f6ed19f..0d24900e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">Probeer de volgende tips: zorg dat er voldoende ruimte op je apparaat beschikbaar is, probeer opnieuw te exporteren.</translation> <translation id="7686086654630106285">Meer informatie over door de site voorgestelde advertenties</translation> <translation id="768618399695552958">Sommige pagina's die je bezoekt, zijn vooraf geladen. Pagina's kunnen vooraf worden geladen via Google-servers als ernaar wordt gelinkt vanaf een Google-site.</translation> +<translation id="7691043218961417207">Ontdek content om te volgen</translation> <translation id="7698359219371678927">E-mail in <ph name="APP_NAME" /> maken</translation> <translation id="7707922173985738739">Mobiele data gebruiken</translation> <translation id="7709094866268987903">Door jou verwijderde interesses verschijnen hier</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 56ee579f..cb544f1 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
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">ਅੱਗੇ ਦਿੱਤੇ ਨੁਕਤੇ ਅਜ਼ਮਾਓ: ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਹਾਡੇ ਡੀਵਾਈਸ 'ਤੇ ਲੋੜੀਂਦੀ ਜਗ੍ਹਾ ਹੈ, ਦੁਬਾਰਾ ਨਿਰਯਾਤ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="7686086654630106285">ਸਾਈਟਾਂ ਵੱਲੋਂ ਸੁਝਾਏ ਗਏ ਵਿਗਿਆਪਨਾਂ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ</translation> <translation id="768618399695552958">ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੇ ਗਏ ਕੁਝ ਪੰਨਿਆਂ ਨੂੰ ਪ੍ਰੀਲੋਡ ਕੀਤਾ ਗਿਆ ਹੈ। Google ਸਾਈਟ ਤੋਂ ਲਿੰਕ ਕੀਤੇ ਜਾਣ 'ਤੇ ਪੰਨਿਆਂ ਨੂੰ Google ਸਰਵਰਾਂ ਰਾਹੀਂ ਪ੍ਰੀਲੋਡ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।</translation> +<translation id="7691043218961417207">ਅਨੁਸਰਣ ਕਰਨ ਲਈ ਸਮੱਗਰੀ ਦੀ ਪੜਚੋਲ ਕਰੋ</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> ਵਿੱਚ ਈਮੇਲ ਬਣਾਓ</translation> <translation id="7707922173985738739">ਮੋਬਾਈਲ ਡਾਟਾ ਵਰਤੋ</translation> <translation id="7709094866268987903">ਤੁਹਾਡੇ ਵੱਲੋਂ ਹਟਾਈਆਂ ਗਈਆਂ ਦਿਲਚਸਪੀਆਂ ਇੱਥੇ ਦਿਸਣਗੀਆਂ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index 6e89ad3..6be4cb4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">පහත ඉඟි උත්සාහ කරන්න: ඔබේ උපාංගයේ ප්රමාණවත් ඉඩක් ඇති බවට වග බලා ගෙන, නැවත නිර්යාත කිරීමට උත්සාහ කරන්න.</translation> <translation id="7686086654630106285">අඩවි-යෝජිත දැන්වීම් පිළිබඳ වැඩිදුර</translation> <translation id="768618399695552958">ඔබ පිවිසෙන සමහර පිටු පූර්ව පූරණය කර ඇත. Google අඩවියකින් සම්බන්ධ කළ විට පිටු Google සේවාදායක හරහා පූර්ව පූරණය කළ හැකිය.</translation> +<translation id="7691043218961417207">අනුගමනය කිරීමට අන්තර්ගතය ගවේෂණය කරන්න</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> තුළ ඊ-තැපෑලක් සාදන්න</translation> <translation id="7707922173985738739">ජංගම දත්ත භාවිත කරන්න</translation> <translation id="7709094866268987903">ඔබ ඉවත් කළ ලැදිකම් මෙහි දිස් වනු ඇත</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index 6db886c8..e61e85b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">Poskusite ta nasveta: poskrbite, da je v napravi dovolj prostora, ali poskusite znova izvoziti.</translation> <translation id="7686086654630106285">Več o oglasih, ki jih predlaga spletno mesto</translation> <translation id="768618399695552958">Nekatere strani, ki jih obiskujete, so vnaprej naložene. Strani bodo morda vnaprej naložene prek Googlovih strežnikov, ko nanje vodi povezava z Googlovega spletnega mesta.</translation> +<translation id="7691043218961417207">Raziščite vsebino, ki jo želite spremljati</translation> <translation id="7698359219371678927">Ustvarite e-poštno sporočilo v aplikaciji <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Uporaba prenosa podatkov v mobilnem omrežju</translation> <translation id="7709094866268987903">Zanimanja, ki ste jih odstranili, bodo prikazana tukaj.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index 2d03ec8..6d2e8f0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -1224,6 +1224,7 @@ <translation id="7596558890252710462">ระบบปฏิบัติการ</translation> <translation id="7605594153474022051">การซิงค์ไม่ทำงาน</translation> <translation id="7612619742409846846">ลงชื่อเข้าใช้ Google ด้วย</translation> +<translation id="7612989789287281429">กำลังลงชื่อเข้าใช้…</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_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index f86f1fa..de75392 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
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">Şu ipuçlarını deneyin: Cihazınızda yeterli alan bulunduğundan emin olun, daha sonra dışa aktarmayı tekrar deneyin.</translation> <translation id="7686086654630106285">Site tarafından önerilen reklamlar hakkında daha fazla bilgi</translation> <translation id="768618399695552958">Ziyaret ettiğiniz sayfaların bazıları önceden yüklenir. Bir Google sitesinden bağlantı verildiğinde sayfalar Google sunucuları aracılığıyla önceden yüklenebilir.</translation> +<translation id="7691043218961417207">Takip edilecek içerikleri keşfedin</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> adlı uygulamada e-posta oluşturun</translation> <translation id="7707922173985738739">Mobil veri kullanın</translation> <translation id="7709094866268987903">Kaldırdığınız ilgi alanları burada görünür</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index e46ce4b0..da89692 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">مندرجہ ذیل تجاویز آزمائیں: یقینی بنائیں کہ آپ کے آلہ پر کافی جگہ ہے، دوبارہ برآمد کرنے کی کوشش کریں۔</translation> <translation id="7686086654630106285">سائٹ کے تجویز کردہ اشتہارات کے بارے میں مزید</translation> <translation id="768618399695552958">آپ کے ملاحظہ کردہ صفحات میں سے کچھ پیشگی لوڈ کردہ ہیں۔ کسی Google سائٹ سے لنک ہونے پر صفحات کو Google سرورز کے ذریعے پیشگی لوڈ کیا جا سکتا ہے۔</translation> +<translation id="7691043218961417207">پیروی کرنے کے لیے مواد کو دریافت کریں</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> میں ای میل تخلیق کریں</translation> <translation id="7707922173985738739">موبائل ڈیٹا استعمال کریں</translation> <translation id="7709094866268987903">آپ کی ہٹائی گئی دلچسپیاں یہاں ظاہر ہوں گی</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 056a8f7..253164b 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
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">请尝试按以下提示操作:确保您的设备上有足够的空间,然后重新尝试导出。</translation> <translation id="7686086654630106285">详细了解网站建议的广告</translation> <translation id="768618399695552958">在您访问的网页中,有一些是预加载的网页。从 Google 网站链接到的网页可能会通过 Google 服务器预加载。</translation> +<translation id="7691043218961417207">探索值得关注的内容</translation> <translation id="7698359219371678927">在 <ph name="APP_NAME" /> 中创建电子邮件</translation> <translation id="7707922173985738739">使用移动数据</translation> <translation id="7709094866268987903">您移除的兴趣将会显示在此处</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index b0e5e264..884b045 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -1242,6 +1242,7 @@ <translation id="7682724950699840886">請嘗試按照以下提示操作:確保您的裝置上有足夠的儲存空間,然後嘗試重新匯出。</translation> <translation id="7686086654630106285">進一步瞭解網站建議的廣告</translation> <translation id="768618399695552958">系統會預先載入您瀏覽的部分網頁。當您從 Google 網站連至這些網頁時,系統可能會透過 Google 伺服器預先載入網頁內容。</translation> +<translation id="7691043218961417207">探索值得追蹤的內容</translation> <translation id="7698359219371678927">在 <ph name="APP_NAME" /> 中建立電郵</translation> <translation id="7707922173985738739">使用流動數據</translation> <translation id="7709094866268987903">系統會在此處顯示您已移除的興趣</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 2962b1d8..4fda875 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
@@ -1241,6 +1241,7 @@ <translation id="7682724950699840886">請嘗試按照下列提示操作:確認你的裝置上有足夠空間,然後嘗試重新匯出。</translation> <translation id="7686086654630106285">進一步瞭解網站建議廣告</translation> <translation id="768618399695552958">系統會預先載入你要造訪的部分網頁。當你從 Google 網站連到這些網頁時,系統可能會透過 Google 伺服器預先載入網頁內容。</translation> +<translation id="7691043218961417207">探索值得追蹤的內容</translation> <translation id="7698359219371678927">在「<ph name="APP_NAME" />」中建立電子郵件</translation> <translation id="7707922173985738739">使用行動數據</translation> <translation id="7709094866268987903">你移除的興趣喜好會顯示在這裡</translation>
diff --git a/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.cc b/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.cc index ba7732f..4cd72ef7 100644 --- a/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.cc +++ b/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.cc
@@ -112,6 +112,16 @@ DiceWebSigninInterceptorDelegate::~DiceWebSigninInterceptorDelegate() = default; +bool DiceWebSigninInterceptorDelegate::IsSigninInterceptionSupported( + const content::WebContents& web_contents) { + Browser* browser = chrome::FindBrowserWithWebContents(&web_contents); + // The profile creation flow has no browser. + if (!browser) { + return false; + } + return IsSigninInterceptionSupportedInternal(*browser); +} + std::unique_ptr<ScopedDiceWebSigninInterceptionBubbleHandle> DiceWebSigninInterceptorDelegate::ShowSigninInterceptionBubble( content::WebContents* web_contents,
diff --git a/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.h b/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.h index e726334..b26629b 100644 --- a/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.h +++ b/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.h
@@ -23,6 +23,8 @@ ~DiceWebSigninInterceptorDelegate() override; // DiceWebSigninInterceptor::Delegate + bool IsSigninInterceptionSupported( + const content::WebContents& web_contents) override; std::unique_ptr<ScopedDiceWebSigninInterceptionBubbleHandle> ShowSigninInterceptionBubble( content::WebContents* web_contents, @@ -43,6 +45,7 @@ base::OnceCallback<void(SigninInterceptionResult)> callback); // Implemented in profile_customization_bubble_view.cc + static bool IsSigninInterceptionSupportedInternal(const Browser& Browser); void ShowProfileCustomizationBubbleInternal(Browser* browser); };
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_dialog_view.h b/chrome/browser/ui/views/autofill/payments/local_card_migration_dialog_view.h index f89047a..37ca5b52 100644 --- a/chrome/browser/ui/views/autofill/payments/local_card_migration_dialog_view.h +++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_dialog_view.h
@@ -63,7 +63,8 @@ // The view containing a list of cards. It is the content of the scroll bar. // Owned by the LocalCardMigrationOfferView. - raw_ptr<views::View> card_list_view_; + // DanglingUntriaged because it is assigned a DanglingUntriaged pointer. + raw_ptr<views::View, DanglingUntriaged> card_list_view_; }; } // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/popup/popup_cell_view.cc b/chrome/browser/ui/views/autofill/popup/popup_cell_view.cc index fbd440da..96b78486 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_cell_view.cc +++ b/chrome/browser/ui/views/autofill/popup/popup_cell_view.cc
@@ -4,7 +4,8 @@ #include "chrome/browser/ui/views/autofill/popup/popup_cell_view.h" -#include <string> +#include <memory> +#include <utility> #include "base/functional/callback.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -42,16 +43,9 @@ } } -void PopupCellView::SetVoiceOverString(std::u16string voice_over) { - voice_over_ = std::move(voice_over); -} - -void PopupCellView::SetSetSizeForAccessibility(absl::optional<int> set_size) { - set_size_ = set_size; -} - -void PopupCellView::SetSetIndexForAccessibility(absl::optional<int> set_index) { - set_index_ = set_index; +void PopupCellView::SetAccessibilityDelegate( + std::unique_ptr<AccessibilityDelegate> a11y_delegate) { + a11y_delegate_ = std::move(a11y_delegate); } void PopupCellView::SetOnEnteredCallback(base::RepeatingClosure callback) { @@ -157,17 +151,8 @@ } void PopupCellView::GetAccessibleNodeData(ui::AXNodeData* node_data) { - // Options are selectable. - node_data->role = ax::mojom::Role::kListBoxOption; - node_data->AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, - GetSelected()); - node_data->SetNameChecked(GetVoiceOverString()); - - if (set_size_) { - node_data->AddIntAttribute(ax::mojom::IntAttribute::kSetSize, *set_size_); - } - if (set_index_) { - node_data->AddIntAttribute(ax::mojom::IntAttribute::kPosInSet, *set_index_); + if (a11y_delegate_) { + a11y_delegate_->GetAccessibleNodeData(GetSelected(), node_data); } } @@ -203,9 +188,6 @@ BEGIN_METADATA(PopupCellView, views::View) ADD_PROPERTY_METADATA(bool, Selected) -ADD_PROPERTY_METADATA(std::u16string, VoiceOverString) -ADD_PROPERTY_METADATA(absl::optional<int>, SetSizeForAccessibility) -ADD_PROPERTY_METADATA(absl::optional<int>, SetIndexForAccessibility) ADD_PROPERTY_METADATA(base::RepeatingClosure, OnEnteredCallback) ADD_PROPERTY_METADATA(base::RepeatingClosure, OnExitedCallback) ADD_PROPERTY_METADATA(base::RepeatingClosure, OnAcceptedCallback)
diff --git a/chrome/browser/ui/views/autofill/popup/popup_cell_view.h b/chrome/browser/ui/views/autofill/popup/popup_cell_view.h index ddd5c18..5ffa5de 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_cell_view.h +++ b/chrome/browser/ui/views/autofill/popup/popup_cell_view.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_UI_VIEWS_AUTOFILL_POPUP_POPUP_CELL_VIEW_H_ #define CHROME_BROWSER_UI_VIEWS_AUTOFILL_POPUP_POPUP_CELL_VIEW_H_ +#include <memory> #include <string> #include "base/functional/callback.h" @@ -28,6 +29,19 @@ // information. class PopupCellView : public views::View { public: + // Interface for injecting accessibility data into `PopupCellView`. This + // allows to have `PopupCellViews` with different a11y roles without needing + // to subclass them. + class AccessibilityDelegate { + public: + virtual ~AccessibilityDelegate() = default; + + // Sets the a11y information in `node_data` based on whether the cell in + // question `is_selected` or not. + virtual void GetAccessibleNodeData(bool is_selected, + ui::AXNodeData* node_data) const = 0; + }; + METADATA_HEADER(PopupCellView); PopupCellView(); @@ -39,16 +53,10 @@ bool GetSelected() const { return selected_; } void SetSelected(bool selected); - // Gets and sets the string announced by VoiceOver. - const std::u16string& GetVoiceOverString() const { return voice_over_; } - void SetVoiceOverString(std::u16string voice_over); - - // Gets and sets additional (optional) accessibility information. See the - // member definition for more information. - absl::optional<int> GetSetSizeForAccessibility() const { return set_size_; } - void SetSetSizeForAccessibility(absl::optional<int> set_size); - absl::optional<int> GetSetIndexForAccessibility() const { return set_index_; } - void SetSetIndexForAccessibility(absl::optional<int> set_index); + // Sets the accessibility delegate that is consulted when providing accessible + // node data. + void SetAccessibilityDelegate( + std::unique_ptr<AccessibilityDelegate> a11y_delegate); // Gets and sets the callback that is run when the cell is entered (via mouse // or gesture event). @@ -106,17 +114,8 @@ // The selection state. bool selected_ = false; - // The string announced by VoiceOver. - std::u16string voice_over_; - - // Additional information set for a11y purposes. The `set_size_` is the number - // of non-separator suggestions and `set_index_` is this element's (1-indexed) - // position in it. - // TODO(crbug.com/1411172): Move to subclasses once `PopupStrategy` exists - // and uses them since in the future not every `PopupCellView` may be a - // `ListBoxOption`. - absl::optional<int> set_index_; - absl::optional<int> set_size_; + // The accessibility delegate. + std::unique_ptr<AccessibilityDelegate> a11y_delegate_; base::RepeatingClosure on_entered_callback_; base::RepeatingClosure on_exited_callback_; @@ -137,9 +136,8 @@ }; BEGIN_VIEW_BUILDER(/* no export*/, PopupCellView, views::View) -VIEW_BUILDER_PROPERTY(std::u16string, VoiceOverString) -VIEW_BUILDER_PROPERTY(absl::optional<int>, SetSizeForAccessibility) -VIEW_BUILDER_PROPERTY(absl::optional<int>, SetIndexForAccessibility) +VIEW_BUILDER_PROPERTY(std::unique_ptr<PopupCellView::AccessibilityDelegate>, + AccessibilityDelegate) VIEW_BUILDER_PROPERTY(base::RepeatingClosure, OnEnteredCallback) VIEW_BUILDER_PROPERTY(base::RepeatingClosure, OnExitedCallback) VIEW_BUILDER_PROPERTY(base::RepeatingClosure, OnAcceptedCallback)
diff --git a/chrome/browser/ui/views/autofill/popup/popup_cell_view_unittest.cc b/chrome/browser/ui/views/autofill/popup/popup_cell_view_unittest.cc index 1209768c..4e7c4ea 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_cell_view_unittest.cc +++ b/chrome/browser/ui/views/autofill/popup/popup_cell_view_unittest.cc
@@ -11,6 +11,7 @@ #include "base/memory/raw_ptr.h" #include "base/test/mock_callback.h" #include "build/build_config.h" +#include "chrome/browser/ui/views/autofill/popup/test_popup_row_strategy.h" #include "chrome/test/views/chrome_views_test_base.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -78,32 +79,22 @@ }; TEST_F(PopupCellViewTest, AccessibleNodeData) { - constexpr char16_t kVoiceOverName[] = u"Sample voice over name"; - constexpr absl::optional<int> kSetSize{5}; - constexpr absl::optional<int> kSetIndex{3}; ShowView(views::Builder<PopupCellView>() - .SetVoiceOverString(kVoiceOverName) - .SetSetSizeForAccessibility(kSetSize) - .SetSetIndexForAccessibility(kSetIndex) + .SetAccessibilityDelegate( + std::make_unique<TestAccessibilityDelegate>()) .Build()); ui::AXNodeData node_data; view().GetAccessibleNodeData(&node_data); - EXPECT_EQ(ax::mojom::Role::kListBoxOption, node_data.role); - EXPECT_FALSE(view().GetSelected()); - EXPECT_FALSE(node_data.GetBoolAttribute(ax::mojom::BoolAttribute::kSelected)); - EXPECT_EQ(kVoiceOverName, + EXPECT_EQ(TestAccessibilityDelegate::kVoiceOverName, node_data.GetString16Attribute(ax::mojom::StringAttribute::kName)); - EXPECT_EQ(kSetSize, - node_data.GetIntAttribute(ax::mojom::IntAttribute::kSetSize)); - EXPECT_EQ(kSetIndex, - node_data.GetIntAttribute(ax::mojom::IntAttribute::kPosInSet)); } TEST_F(PopupCellViewTest, SetSelectedUpdatesBackground) { ShowView(views::Builder<PopupCellView>() - .SetVoiceOverString(u"Dummy name") + .SetAccessibilityDelegate( + std::make_unique<TestAccessibilityDelegate>()) .Build()); // The unselected background. @@ -123,7 +114,10 @@ TEST_F(PopupCellViewTest, SetSelectedUpdatesTrackedLabels) { std::unique_ptr<PopupCellView> cell = - views::Builder<PopupCellView>().SetVoiceOverString(u"Dummy name").Build(); + views::Builder<PopupCellView>() + .SetAccessibilityDelegate( + std::make_unique<TestAccessibilityDelegate>()) + .Build(); views::Label* tracked_label = cell->AddChildView(std::make_unique<views::Label>( u"Label text 1", views::style::CONTEXT_DIALOG_BODY_TEXT, @@ -163,7 +157,10 @@ TEST_F(PopupCellViewTest, MouseEvents) { std::unique_ptr<PopupCellView> cell = - views::Builder<PopupCellView>().SetVoiceOverString(u"Dummy name").Build(); + views::Builder<PopupCellView>() + .SetAccessibilityDelegate( + std::make_unique<TestAccessibilityDelegate>()) + .Build(); views::Label* label = cell->AddChildView(std::make_unique<views::Label>(u"Label text")); ShowView(std::move(cell)); @@ -196,7 +193,10 @@ #if !BUILDFLAG(IS_MAC) TEST_F(PopupCellViewTest, GestureEvents) { std::unique_ptr<PopupCellView> cell = - views::Builder<PopupCellView>().SetVoiceOverString(u"Dummy name").Build(); + views::Builder<PopupCellView>() + .SetAccessibilityDelegate( + std::make_unique<TestAccessibilityDelegate>()) + .Build(); views::Label* label = cell->AddChildView(std::make_unique<views::Label>(u"Label text")); ShowView(std::move(cell)); @@ -217,7 +217,10 @@ TEST_F(PopupCellViewTest, IgnoreClickIfMouseWasNotOutsideBefore) { std::unique_ptr<PopupCellView> cell = - views::Builder<PopupCellView>().SetVoiceOverString(u"Dummy name").Build(); + views::Builder<PopupCellView>() + .SetAccessibilityDelegate( + std::make_unique<TestAccessibilityDelegate>()) + .Build(); views::Label* label = cell->AddChildView(std::make_unique<views::Label>(u"Label text")); ShowView(std::move(cell));
diff --git a/chrome/browser/ui/views/autofill/popup/popup_row_strategy.cc b/chrome/browser/ui/views/autofill/popup/popup_row_strategy.cc index e990089..0c85901 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_row_strategy.cc +++ b/chrome/browser/ui/views/autofill/popup/popup_row_strategy.cc
@@ -14,7 +14,6 @@ #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/memory/weak_ptr.h" -#include "base/notreached.h" #include "base/ranges/algorithm.h" #include "base/strings/string_util.h" #include "base/time/time.h" @@ -28,12 +27,15 @@ #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/chrome_typography.h" #include "components/autofill/core/browser/data_model/credit_card.h" +#include "components/autofill/core/browser/ui/popup_item_ids.h" #include "components/autofill/core/browser/ui/popup_types.h" #include "components/autofill/core/browser/ui/suggestion.h" +#include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_payments_features.h" #include "components/omnibox/browser/vector_icons.h" #include "components/strings/grit/components_strings.h" #include "components/vector_icons/vector_icons.h" +#include "ui/accessibility/ax_enums.mojom.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/models/image_model.h" #include "ui/color/color_id.h" @@ -41,6 +43,7 @@ #include "ui/gfx/image/image_skia.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/vector_icon_types.h" +#include "ui/views/controls/button/image_button.h" #include "ui/views/controls/image_view.h" #include "ui/views/controls/label.h" #include "ui/views/controls/menu/menu_config.h" @@ -435,30 +438,6 @@ return base::JoinString(text, u" "); } -// Adds all relevant accessibility information to a content view. -void AddAccessibilityInformationToContentView( - base::WeakPtr<AutofillPopupController> controller, - int line_number, - PopupCellView& content_view) { - DCHECK(controller); - content_view.SetVoiceOverString(GetVoiceOverStringFromSuggestion( - controller->GetSuggestionAt(line_number))); - - int set_size = 0; - int set_index = line_number + 1; - for (int i = 0; i < controller->GetLineCount(); ++i) { - if (controller->GetSuggestionAt(i).frontend_id == POPUP_ITEM_ID_SEPARATOR) { - if (i < line_number) { - --set_index; - } - } else { - ++set_size; - } - } - content_view.SetSetIndexForAccessibility(set_index); - content_view.SetSetSizeForAccessibility(set_size); -} - // Adds the callbacks for the content area to `content_view`. void AddCallbacksToContentView( base::WeakPtr<AutofillPopupController> controller, @@ -473,6 +452,85 @@ /*show_threshold=*/kIgnoreEarlyClicksOnPopupDuration)); } +// ********************* AccessibilityDelegate implementations ***************** + +// ********************* ContentItemAccessibilityDelegate ********************* +class ContentItemAccessibilityDelegate + : public PopupCellView::AccessibilityDelegate { + public: + // Creates an a11y delegate for the `line_number`. `controller` must not be + // null. + ContentItemAccessibilityDelegate( + base::WeakPtr<AutofillPopupController> controller, + int line_number); + ~ContentItemAccessibilityDelegate() override = default; + + void GetAccessibleNodeData(bool is_selected, + ui::AXNodeData* node_data) const override; + + private: + // The string announced via VoiceOver. + std::u16string voice_over_string_; + // The number of suggestions in the popup and the (1-based) index of the + // suggestion this delegate belongs to. + int set_index_ = 0; + int set_size_ = 0; +}; + +ContentItemAccessibilityDelegate::ContentItemAccessibilityDelegate( + base::WeakPtr<AutofillPopupController> controller, + int line_number) { + DCHECK(controller); + + voice_over_string_ = GetVoiceOverStringFromSuggestion( + controller->GetSuggestionAt(line_number)); + + set_size_ = 0; + set_index_ = line_number + 1; + for (int i = 0; i < controller->GetLineCount(); ++i) { + if (controller->GetSuggestionAt(i).frontend_id == POPUP_ITEM_ID_SEPARATOR) { + if (i < line_number) { + --set_index_; + } + } else { + ++set_size_; + } + } +} + +void ContentItemAccessibilityDelegate::GetAccessibleNodeData( + bool is_selected, + ui::AXNodeData* node_data) const { + DCHECK(node_data); + // Options are selectable. + node_data->role = ax::mojom::Role::kListBoxOption; + node_data->AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, is_selected); + node_data->SetNameChecked(voice_over_string_); + + node_data->AddIntAttribute(ax::mojom::IntAttribute::kPosInSet, set_index_); + node_data->AddIntAttribute(ax::mojom::IntAttribute::kSetSize, set_size_); +} + +// ******************** DeleteButtonAccessibilityDelegate ********************* +class DeleteButtonAccessibilityDelegate + : public PopupCellView::AccessibilityDelegate { + public: + DeleteButtonAccessibilityDelegate() = default; + ~DeleteButtonAccessibilityDelegate() override = default; + + void GetAccessibleNodeData(bool is_selected, + ui::AXNodeData* node_data) const override; +}; + +void DeleteButtonAccessibilityDelegate::GetAccessibleNodeData( + bool is_selected, + ui::AXNodeData* node_data) const { + node_data->role = ax::mojom::Role::kButton; + // TODO(crbug.com/1417187): Add voice over text of original suggestion here? + node_data->SetNameChecked(l10n_util::GetStringUTF16( + IDS_AUTOFILL_DELETE_AUTOCOMPLETE_SUGGESTION_TOOLTIP)); +} + } // namespace /**************************** PopupRowBaseStrategy ****************************/ @@ -506,11 +564,12 @@ } const Suggestion& kSuggestion = GetController()->GetSuggestionAt(GetLineNumber()); - auto view = std::make_unique<PopupCellView>(); - - // Prepare the a11y information. - AddAccessibilityInformationToContentView(GetController(), GetLineNumber(), - *view); + std::unique_ptr<PopupCellView> view = + views::Builder<PopupCellView>() + .SetAccessibilityDelegate( + std::make_unique<ContentItemAccessibilityDelegate>( + GetController(), GetLineNumber())) + .Build(); // Add the actual views. std::unique_ptr<views::Label> main_text_label = CreateMainTextLabel( @@ -585,7 +644,33 @@ } std::unique_ptr<PopupCellView> PopupSuggestionStrategy::CreateControl() { - NOTIMPLEMENTED(); + if (!GetController()) { + return nullptr; + } + + // If the feature is enabled, autocomplete entries have a delete button. + if (GetController()->GetSuggestionAt(GetLineNumber()).frontend_id == + POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY && + base::FeatureList::IsEnabled( + features::kAutofillShowAutocompleteDeleteButton)) { + std::unique_ptr<PopupCellView> view = + views::Builder<PopupCellView>() + .SetAccessibilityDelegate( + std::make_unique<DeleteButtonAccessibilityDelegate>()) + .Build(); + + view->SetUseDefaultFillLayout(true); + views::ImageView* delete_icon = + view->AddChildView(ImageViewFromVectorIcon(kTrashCanIcon)); + delete_icon->SetTooltipText(l10n_util::GetStringUTF16( + IDS_AUTOFILL_DELETE_AUTOCOMPLETE_SUGGESTION_TOOLTIP)); + view->SetOnAcceptedCallback(base::BindRepeating( + base::IgnoreResult(&AutofillPopupController::RemoveSuggestion), + GetController(), GetLineNumber())); + + return view; + } + return nullptr; } @@ -606,10 +691,12 @@ const Suggestion& kSuggestion = GetController()->GetSuggestionAt(GetLineNumber()); - auto view = std::make_unique<PopupCellView>(); - - AddAccessibilityInformationToContentView(GetController(), GetLineNumber(), - *view); + std::unique_ptr<PopupCellView> view = + views::Builder<PopupCellView>() + .SetAccessibilityDelegate( + std::make_unique<ContentItemAccessibilityDelegate>( + GetController(), GetLineNumber())) + .Build(); // Add the actual views. std::unique_ptr<views::Label> main_text_label = CreateMainTextLabel( @@ -662,7 +749,6 @@ std::unique_ptr<PopupCellView> PopupPasswordSuggestionStrategy::CreateControl() { - NOTIMPLEMENTED(); return nullptr; } @@ -682,9 +768,12 @@ const Suggestion& kSuggestion = GetController()->GetSuggestionAt(GetLineNumber()); - auto view = std::make_unique<PopupCellView>(); - AddAccessibilityInformationToContentView(GetController(), GetLineNumber(), - *view); + std::unique_ptr<PopupCellView> view = + views::Builder<PopupCellView>() + .SetAccessibilityDelegate( + std::make_unique<ContentItemAccessibilityDelegate>( + GetController(), GetLineNumber())) + .Build(); views::BoxLayout* layout_manager = view->SetLayoutManager(std::make_unique<views::BoxLayout>( @@ -746,7 +835,6 @@ } std::unique_ptr<PopupCellView> PopupFooterStrategy::CreateControl() { - NOTIMPLEMENTED(); return nullptr; }
diff --git a/chrome/browser/ui/views/autofill/popup/popup_row_strategy_unittest.cc b/chrome/browser/ui/views/autofill/popup/popup_row_strategy_unittest.cc index 88da3ef..0392ba1 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_row_strategy_unittest.cc +++ b/chrome/browser/ui/views/autofill/popup/popup_row_strategy_unittest.cc
@@ -9,14 +9,19 @@ #include <vector> #include "base/functional/callback.h" +#include "base/functional/callback_forward.h" +#include "base/test/scoped_feature_list.h" #include "base/time/time.h" #include "chrome/browser/autofill/mock_autofill_popup_controller.h" #include "chrome/browser/ui/views/autofill/popup/popup_cell_view.h" #include "chrome/test/views/chrome_views_test_base.h" #include "components/autofill/core/browser/ui/popup_item_ids.h" #include "components/autofill/core/browser/ui/suggestion.h" +#include "components/autofill/core/common/autofill_features.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/accessibility/ax_enums.mojom.h" +#include "ui/accessibility/ax_node_data.h" using ::testing::IsNull; using ::testing::NotNull; @@ -38,6 +43,10 @@ int line_number; // The type of strategy to be tested. StrategyType strategy_type; + // The number of (non-separator) entries and the 1-indexed position of the + // entry with `line_number` inside them. + int set_size; + int set_index; }; const RowStrategyTestdata kTestcases[] = { @@ -46,6 +55,8 @@ POPUP_ITEM_ID_AUTOFILL_OPTIONS}, .line_number = 1, .strategy_type = StrategyType::kSuggestion, + .set_size = 3, + .set_index = 2, }, RowStrategyTestdata{ .frontend_ids = {POPUP_ITEM_ID_PASSWORD_ENTRY, @@ -54,21 +65,32 @@ POPUP_ITEM_ID_ALL_SAVED_PASSWORDS_ENTRY}, .line_number = 0, .strategy_type = StrategyType::kPasswordSuggestion, + .set_size = 3, + .set_index = 1, }, RowStrategyTestdata{ .frontend_ids = {1, 2, POPUP_ITEM_ID_SEPARATOR, POPUP_ITEM_ID_AUTOFILL_OPTIONS}, .line_number = 3, .strategy_type = StrategyType::kFooter, + .set_size = 3, + .set_index = 3, + }, + RowStrategyTestdata{ + .frontend_ids = {POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY, + POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY, + POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY}, + .line_number = 1, + .strategy_type = StrategyType::kSuggestion, + .set_size = 3, + .set_index = 2, }}; } // namespace // Test fixture for testing PopupRowStrategy. Note that most of the detailed // view testing is covered by pixel tests in `popup_view_views_browsertest.cc`. -class PopupRowStrategyTest - : public ChromeViewsTestBase, - public ::testing::WithParamInterface<RowStrategyTestdata> { +class PopupRowStrategyTest : public ChromeViewsTestBase { public: // Sets suggestions in the mocked popup controller. void SetSuggestions(const std::vector<int>& frontend_ids) { @@ -76,7 +98,7 @@ suggestions.reserve(frontend_ids.size()); for (int frontend_id : frontend_ids) { // Create a suggestion with empty labels. - suggestions.emplace_back("", "", "", frontend_id); + suggestions.emplace_back("Main text", "", "", frontend_id); } controller().set_suggestions(std::move(suggestions)); } @@ -124,7 +146,50 @@ MockAutofillPopupController controller_; }; -TEST_P(PopupRowStrategyTest, HasContentArea) { +TEST_F(PopupRowStrategyTest, AutocompleteDeleteButtonRemovesEntry) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature( + features::kAutofillShowAutocompleteDeleteButton); + SetSuggestions({POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY, + POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY, + POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY}); + std::unique_ptr<PopupRowStrategy> strategy = + CreateStrategy(StrategyType::kSuggestion, /*line_number=*/1); + + std::unique_ptr<PopupCellView> cell = strategy->CreateControl(); + ASSERT_THAT(cell, NotNull()); + + // Clicking the cell (as opposed to the button) should not do anything. + base::RepeatingClosure on_accept_callback = cell->GetOnAcceptedCallback(); + ASSERT_TRUE(on_accept_callback); + EXPECT_CALL(controller(), RemoveSuggestion(1)); + on_accept_callback.Run(); +} + +TEST_F(PopupRowStrategyTest, AutocompleteDeleteButtonSetsAccessibility) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature( + features::kAutofillShowAutocompleteDeleteButton); + SetSuggestions({POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY, + POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY, + POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY}); + std::unique_ptr<PopupRowStrategy> strategy = + CreateStrategy(StrategyType::kSuggestion, /*line_number=*/1); + + std::unique_ptr<PopupCellView> cell = strategy->CreateControl(); + ASSERT_THAT(cell, NotNull()); + + ui::AXNodeData node_data; + cell->GetAccessibleNodeData(&node_data); + + EXPECT_EQ(node_data.role, ax::mojom::Role::kButton); +} + +class PopupRowStrategyParametrizedTest + : public PopupRowStrategyTest, + public ::testing::WithParamInterface<RowStrategyTestdata> {}; + +TEST_P(PopupRowStrategyParametrizedTest, HasContentArea) { const RowStrategyTestdata kTestdata = GetParam(); SetSuggestions(kTestdata.frontend_ids); @@ -135,7 +200,7 @@ EXPECT_THAT(strategy->CreateContent(), NotNull()); } -TEST_P(PopupRowStrategyTest, ContentAreaCallbacksWork) { +TEST_P(PopupRowStrategyParametrizedTest, ContentAreaCallbacksWork) { const RowStrategyTestdata kTestdata = GetParam(); SetSuggestions(kTestdata.frontend_ids); @@ -147,7 +212,7 @@ TestContentCallbacks(*content_cell, kTestdata.line_number); } -TEST_P(PopupRowStrategyTest, DeletedControllerIsHandledGracefully) { +TEST_P(PopupRowStrategyParametrizedTest, DeletedControllerIsHandledGracefully) { const RowStrategyTestdata kTestdata = GetParam(); SetSuggestions(kTestdata.frontend_ids); @@ -165,7 +230,30 @@ callback.Run(); } -TEST_P(PopupRowStrategyTest, HasNoControlArea) { +TEST_P(PopupRowStrategyParametrizedTest, + SetsAccessibilityAttributesForContentArea) { + const RowStrategyTestdata kTestdata = GetParam(); + + SetSuggestions(kTestdata.frontend_ids); + std::unique_ptr<PopupRowStrategy> strategy = + CreateStrategy(kTestdata.strategy_type, kTestdata.line_number); + + std::unique_ptr<PopupCellView> content_cell = strategy->CreateContent(); + ASSERT_THAT(content_cell, NotNull()); + + ui::AXNodeData node_data; + content_cell->GetAccessibleNodeData(&node_data); + + EXPECT_EQ(node_data.role, ax::mojom::Role::kListBoxOption); + EXPECT_EQ(u"Main text", + node_data.GetString16Attribute(ax::mojom::StringAttribute::kName)); + EXPECT_EQ(node_data.GetIntAttribute(ax::mojom::IntAttribute::kSetSize), + kTestdata.set_size); + EXPECT_EQ(node_data.GetIntAttribute(ax::mojom::IntAttribute::kPosInSet), + kTestdata.set_index); +} + +TEST_P(PopupRowStrategyParametrizedTest, HasControlArea) { const RowStrategyTestdata kTestdata = GetParam(); SetSuggestions(kTestdata.frontend_ids); @@ -176,7 +264,7 @@ } INSTANTIATE_TEST_SUITE_P(All, - PopupRowStrategyTest, + PopupRowStrategyParametrizedTest, ::testing::ValuesIn(kTestcases)); } // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/popup/popup_row_view_unittest.cc b/chrome/browser/ui/views/autofill/popup/popup_row_view_unittest.cc index fca1e61..8d8c2c25 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_row_view_unittest.cc +++ b/chrome/browser/ui/views/autofill/popup/popup_row_view_unittest.cc
@@ -11,6 +11,7 @@ #include "base/memory/raw_ptr.h" #include "chrome/browser/ui/views/autofill/popup/popup_cell_view.h" #include "chrome/browser/ui/views/autofill/popup/popup_row_strategy.h" +#include "chrome/browser/ui/views/autofill/popup/test_popup_row_strategy.h" #include "chrome/test/views/chrome_views_test_base.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -44,38 +45,6 @@ MOCK_METHOD(void, SetSelectedCell, (absl::optional<CellIndex>), (override)); }; -class PopupTestStrategy : public PopupRowStrategy { - public: - explicit PopupTestStrategy(int line_number, bool has_control) - : line_number_(line_number), has_control_(has_control) {} - ~PopupTestStrategy() override = default; - - std::unique_ptr<PopupCellView> CreateContent() override { - auto cell = std::make_unique<PopupCellView>(); - cell->SetUseDefaultFillLayout(true); - cell->SetVoiceOverString(u"Test content cell"); - cell->AddChildView(std::make_unique<views::Label>(u"Test content")); - return cell; - } - - std::unique_ptr<PopupCellView> CreateControl() override { - if (!has_control_) { - return nullptr; - } - auto cell = std::make_unique<PopupCellView>(); - cell->SetUseDefaultFillLayout(true); - cell->SetVoiceOverString(u"Test control cell"); - cell->AddChildView(std::make_unique<views::Label>(u"Test control")); - return cell; - } - - int GetLineNumber() const override { return line_number_; } - - private: - const int line_number_; - const bool has_control_; -}; - } // namespace class PopupRowViewTest : public ChromeViewsTestBase { @@ -92,7 +61,7 @@ row_view_ = widget_->SetContentsView(std::make_unique<PopupRowView>( mock_a11y_selection_delegate_, mock_selection_delegate_, /*controller=*/nullptr, - std::make_unique<PopupTestStrategy>(line_number, has_control))); + std::make_unique<TestPopupRowStrategy>(line_number, has_control))); widget_->Show(); }
diff --git a/chrome/browser/ui/views/autofill/popup/test_popup_row_strategy.cc b/chrome/browser/ui/views/autofill/popup/test_popup_row_strategy.cc new file mode 100644 index 0000000..2837c99 --- /dev/null +++ b/chrome/browser/ui/views/autofill/popup/test_popup_row_strategy.cc
@@ -0,0 +1,57 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/views/autofill/popup/test_popup_row_strategy.h" + +#include <memory> + +#include "chrome/browser/ui/views/autofill/popup/popup_cell_view.h" +#include "ui/accessibility/ax_enums.mojom.h" +#include "ui/accessibility/ax_node_data.h" +#include "ui/views/controls/label.h" + +namespace autofill { + +void TestAccessibilityDelegate::GetAccessibleNodeData( + bool is_selected, + ui::AXNodeData* node_data) const { + node_data->role = ax::mojom::Role::kListBoxOption; + node_data->SetNameChecked(kVoiceOverName); +} + +TestPopupRowStrategy::TestPopupRowStrategy(int line_number, bool has_control) + : line_number_(line_number), has_control_(has_control) {} + +TestPopupRowStrategy::~TestPopupRowStrategy() = default; + +std::unique_ptr<PopupCellView> TestPopupRowStrategy::CreateContent() { + std::unique_ptr<PopupCellView> cell = + views::Builder<PopupCellView>() + .SetAccessibilityDelegate( + std::make_unique<TestAccessibilityDelegate>()) + .SetUseDefaultFillLayout(true) + .Build(); + cell->AddChildView(std::make_unique<views::Label>(u"Test content")); + return cell; +} + +std::unique_ptr<PopupCellView> TestPopupRowStrategy::CreateControl() { + if (!has_control_) { + return nullptr; + } + std::unique_ptr<PopupCellView> cell = + views::Builder<PopupCellView>() + .SetAccessibilityDelegate( + std::make_unique<TestAccessibilityDelegate>()) + .SetUseDefaultFillLayout(true) + .Build(); + cell->AddChildView(std::make_unique<views::Label>(u"Test control")); + return cell; +} + +int TestPopupRowStrategy::GetLineNumber() const { + return line_number_; +} + +} // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/popup/test_popup_row_strategy.h b/chrome/browser/ui/views/autofill/popup/test_popup_row_strategy.h new file mode 100644 index 0000000..3e0456b --- /dev/null +++ b/chrome/browser/ui/views/autofill/popup/test_popup_row_strategy.h
@@ -0,0 +1,46 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_VIEWS_AUTOFILL_POPUP_TEST_POPUP_ROW_STRATEGY_H_ +#define CHROME_BROWSER_UI_VIEWS_AUTOFILL_POPUP_TEST_POPUP_ROW_STRATEGY_H_ + +#include <memory> + +#include "chrome/browser/ui/views/autofill/popup/popup_row_strategy.h" + +namespace autofill { + +class PopupCellView; + +class TestAccessibilityDelegate : public PopupCellView::AccessibilityDelegate { + public: + static constexpr char16_t kVoiceOverName[] = u"Sample voice over name"; + + TestAccessibilityDelegate() = default; + ~TestAccessibilityDelegate() override = default; + + void GetAccessibleNodeData(bool is_selected, + ui::AXNodeData* node_data) const override; +}; + +// A `PopupRowStrategy` used solely in tests. +class TestPopupRowStrategy : public PopupRowStrategy { + public: + TestPopupRowStrategy(int line_number, bool has_control); + ~TestPopupRowStrategy() override; + + std::unique_ptr<PopupCellView> CreateContent() override; + // Creates the control view. Returns `nullptr` if `has_control_` is false. + std::unique_ptr<PopupCellView> CreateControl() override; + + int GetLineNumber() const override; + + private: + const int line_number_; + const bool has_control_; +}; + +} // namespace autofill + +#endif // CHROME_BROWSER_UI_VIEWS_AUTOFILL_POPUP_TEST_POPUP_ROW_STRATEGY_H_
diff --git a/chrome/browser/ui/views/collected_cookies_view_interactive_uitest.cc b/chrome/browser/ui/views/collected_cookies_view_interactive_uitest.cc index 76fda37..5ebec62 100644 --- a/chrome/browser/ui/views/collected_cookies_view_interactive_uitest.cc +++ b/chrome/browser/ui/views/collected_cookies_view_interactive_uitest.cc
@@ -51,7 +51,8 @@ }; IN_PROC_BROWSER_TEST_F(CollectedCookiesViewInteractiveUiTest, - CheckCookiesAreBlockedInIncognitoWindow) { + // TODO(crbug.com/1417914): Re-enable this test + DISABLED_CheckCookiesAreBlockedInIncognitoWindow) { const GURL third_party_cookie_page_url = embedded_test_server()->GetURL("a.com", "/third_party_cookie.html");
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_view.cc b/chrome/browser/ui/views/passwords/manage_passwords_view.cc index 4a6a7a8b..6661476 100644 --- a/chrome/browser/ui/views/passwords/manage_passwords_view.cc +++ b/chrome/browser/ui/views/passwords/manage_passwords_view.cc
@@ -182,6 +182,7 @@ gfx::Insets::VH(vertical_margin, 0)); note_label->SetVerticalAlignment(gfx::VerticalAlignment::ALIGN_TOP); note_label->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); + note_label->SetSelectable(true); return note_label; }
diff --git a/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc b/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc index 3f8b958..ce70470 100644 --- a/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc +++ b/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc
@@ -41,6 +41,12 @@ constexpr int kInterceptionBubbleBaseHeight = 500; constexpr int kInterceptionBubbleWidth = 290; +views::View* GetBubbleAnchorView(const Browser& browser) { + return BrowserView::GetBrowserViewForBrowser(&browser) + ->toolbar_button_provider() + ->GetAvatarToolbarButton(); +} + } // namespace DiceWebSigninInterceptionBubbleView::~DiceWebSigninInterceptionBubbleView() { @@ -252,6 +258,14 @@ // DiceWebSigninInterceptorDelegate -------------------------------------------- +// static +bool DiceWebSigninInterceptorDelegate::IsSigninInterceptionSupportedInternal( + const Browser& browser) { + // Some browsers, such as web apps, don't have an avatar toolbar button to + // anchor the bubble. + return GetBubbleAnchorView(browser) != nullptr; +} + std::unique_ptr<ScopedDiceWebSigninInterceptionBubbleHandle> DiceWebSigninInterceptorDelegate::ShowSigninInterceptionBubbleInternal( Browser* browser, @@ -260,9 +274,7 @@ base::OnceCallback<void(SigninInterceptionResult)> callback) { DCHECK(browser); - views::View* anchor_view = BrowserView::GetBrowserViewForBrowser(browser) - ->toolbar_button_provider() - ->GetAvatarToolbarButton(); + views::View* anchor_view = GetBubbleAnchorView(*browser); DCHECK(anchor_view); return DiceWebSigninInterceptionBubbleView::CreateBubble( browser, anchor_view, bubble_parameters, std::move(callback));
diff --git a/chrome/browser/ui/views/profiles/sync_confirmation_ui_browsertest.cc b/chrome/browser/ui/views/profiles/sync_confirmation_ui_browsertest.cc index dd90b2d..e7a0108 100644 --- a/chrome/browser/ui/views/profiles/sync_confirmation_ui_browsertest.cc +++ b/chrome/browser/ui/views/profiles/sync_confirmation_ui_browsertest.cc
@@ -294,7 +294,9 @@ std::unique_ptr<base::ScopedEnvironmentVariableOverride> scoped_env_override_; }; -IN_PROC_BROWSER_TEST_P(SyncConfirmationUIDialogPixelTest, InvokeUi_default) { +// TODO(crbug.com/1417934): Re-enable this test +IN_PROC_BROWSER_TEST_P(SyncConfirmationUIDialogPixelTest, + DISABLED_InvokeUi_default) { ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/web_applications/web_app_metrics.h b/chrome/browser/ui/web_applications/web_app_metrics.h index 181d8b71..2a4429a 100644 --- a/chrome/browser/ui/web_applications/web_app_metrics.h +++ b/chrome/browser/ui/web_applications/web_app_metrics.h
@@ -110,7 +110,9 @@ int num_user_installed_apps_ = kNumUserInstalledAppsNotCounted; base::flat_map<web_app::AppId, base::Time> app_last_interacted_time_{}; - raw_ptr<content::WebContents> foreground_web_contents_ = nullptr; + // DanglingUntriaged because it is assigned a DanglingUntriaged pointer. + raw_ptr<content::WebContents, DanglingUntriaged> foreground_web_contents_ = + nullptr; GURL last_recorded_web_app_start_url_; const raw_ptr<Profile> profile_;
diff --git a/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_dialog.cc b/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_dialog.cc index 9a06adf..9d0fb17 100644 --- a/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_dialog.cc +++ b/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_dialog.cc
@@ -373,8 +373,8 @@ if (ShouldFixUpOffice(profile, cloud_provider)) { // TODO(cassycc): Use page specifically for fix up. - CloudUploadDialog::SetUpAndShowDialog(profile, file_urls, - mojom::DialogPage::kOneDriveSetup); + return CloudUploadDialog::SetUpAndShowDialog( + profile, file_urls, mojom::DialogPage::kOneDriveSetup); } OpenOrMoveFiles(profile, file_urls, cloud_provider); return true;
diff --git a/chrome/browser/ui/webui/ash/login/base_screen_handler.cc b/chrome/browser/ui/webui/ash/login/base_screen_handler.cc index 07ec8e5..1d456d5 100644 --- a/chrome/browser/ui/webui/ash/login/base_screen_handler.cc +++ b/chrome/browser/ui/webui/ash/login/base_screen_handler.cc
@@ -32,8 +32,9 @@ BaseScreenHandler::~BaseScreenHandler() = default; void BaseScreenHandler::ShowInWebUI(absl::optional<base::Value::Dict> data) { - if (!GetOobeUI()) + if (!GetOobeUI()) { return; + } GetOobeUI()->GetCoreOobeView()->ShowScreenWithData(oobe_screen_, std::move(data)); } @@ -54,22 +55,25 @@ } bool BaseScreenHandler::HandleUserActionImpl(const base::Value::List& args) { - if (!LoginDisplayHost::default_host()) - return false; - LoginDisplayHost* host = LoginDisplayHost::default_host(); if (!host) { return false; } WizardController* wizard_controller = host->GetWizardController(); - if (!wizard_controller) { - return false; + BaseScreen* screen = nullptr; + + if (wizard_controller) { + screen = wizard_controller->GetScreen(oobe_screen_); + } else if (WizardController::IsErrorScreen(oobe_screen_)) { + // This case happens during auto-launch kiosk, as currently we do not create + // a `WizardController` in this flow. See b/267741004 for more details. + screen = host->GetOobeUI()->GetErrorScreen(); } - BaseScreen* screen = wizard_controller->GetScreen(oobe_screen_); - if (!screen) + if (!screen) { return false; + } screen->HandleUserAction(args); return true;
diff --git a/chrome/browser/ui/webui/intro/intro_ui.cc b/chrome/browser/ui/webui/intro/intro_ui.cc index 5d216b5..e9e8e97 100644 --- a/chrome/browser/ui/webui/intro/intro_ui.cc +++ b/chrome/browser/ui/webui/intro/intro_ui.cc
@@ -6,6 +6,7 @@ #include "base/feature_list.h" #include "base/metrics/histogram_functions.h" +#include "base/notreached.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/policy/profile_policy_connector.h" @@ -101,10 +102,34 @@ source, base::make_span(kIntroResources, kIntroResourcesSize), IDR_INTRO_INTRO_HTML); - constexpr webui::LocalizedString kLocalizedStrings[] = { #if BUILDFLAG(ENABLE_DICE_SUPPORT) - {"pageTitle", IDS_FRE_SIGN_IN_TITLE_0}, - {"pageSubtitle", IDS_FRE_SIGN_IN_SUBTITLE_0}, + int title_id = 0; + int subtitle_id = 0; + switch (kForYouFreSignInPromoVariant.Get()) { + case SigninPromoVariant::kSignIn: { + title_id = IDS_FRE_SIGN_IN_TITLE_0; + subtitle_id = IDS_FRE_SIGN_IN_SUBTITLE_0; + break; + } + case SigninPromoVariant::kMakeYourOwn: { + title_id = IDS_FRE_SIGN_IN_TITLE_1; + subtitle_id = IDS_FRE_SIGN_IN_SUBTITLE_1; + break; + } + case SigninPromoVariant::kDoMore: { + title_id = IDS_FRE_SIGN_IN_TITLE_2; + subtitle_id = IDS_FRE_SIGN_IN_SUBTITLE_1; + break; + } + default: + NOTREACHED(); + } +#endif + + webui::LocalizedString localized_strings[] = { +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + {"pageTitle", title_id}, + {"pageSubtitle", subtitle_id}, {"devicesCardTitle", IDS_FRE_DEVICES_CARD_TITLE}, {"devicesCardDescription", IDS_FRE_DEVICES_CARD_DESCRIPTION}, {"securityCardTitle", IDS_FRE_SECURITY_CARD_TITLE}, @@ -118,7 +143,7 @@ {"proceedLabel", IDS_PRIMARY_PROFILE_FIRST_RUN_NEXT_BUTTON_LABEL}, #endif }; - source->AddLocalizedStrings(kLocalizedStrings); + source->AddLocalizedStrings(localized_strings); // TODO(crbug.com/1409028): Replace this function by a call to // chrome::GetDeviceManagerIdentity()
diff --git a/chrome/browser/ui/webui/settings/ash/input_device_settings/BUILD.gn b/chrome/browser/ui/webui/settings/ash/input_device_settings/BUILD.gn new file mode 100644 index 0000000..83c5397 --- /dev/null +++ b/chrome/browser/ui/webui/settings/ash/input_device_settings/BUILD.gn
@@ -0,0 +1,19 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD - style license that can be +# found in the LICENSE file. + +import("//build/config/chromeos/ui_mode.gni") +import("//mojo/public/tools/bindings/mojom.gni") + +assert(is_chromeos_ash) + +mojom("mojom") { + disable_variants = true + + sources = [ "input_device_settings_provider.mojom" ] + + public_deps = [ + "//ash/public/mojom:mojom", + "//mojo/public/mojom/base", + ] +}
diff --git a/chrome/browser/ui/webui/settings/ash/input_device_settings/OWNERS b/chrome/browser/ui/webui/settings/ash/input_device_settings/OWNERS new file mode 100644 index 0000000..08850f4 --- /dev/null +++ b/chrome/browser/ui/webui/settings/ash/input_device_settings/OWNERS
@@ -0,0 +1,2 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.cc b/chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.cc new file mode 100644 index 0000000..d8247372 --- /dev/null +++ b/chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.cc
@@ -0,0 +1,32 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.h" +#include "ash/constants/ash_features.h" +#include "ash/public/cpp/input_device_settings_controller.h" +#include "ash/public/mojom/input_device_settings.mojom.h" + +namespace ash::settings { + +InputDeviceSettingsProvider::InputDeviceSettingsProvider( + InputDeviceSettingsController* controller) + : controller_(controller) {} +InputDeviceSettingsProvider::~InputDeviceSettingsProvider() = default; + +void InputDeviceSettingsProvider::BindInterface( + mojo::PendingReceiver<mojom::InputDeviceSettingsProvider> receiver) { + DCHECK(features::IsInputDeviceSettingsSplitEnabled()); + if (receiver_.is_bound()) { + receiver_.reset(); + } + receiver_.Bind(std::move(receiver)); +} + +void InputDeviceSettingsProvider::GetConnectedKeyboards( + GetConnectedKeyboardsCallback callback) { + DCHECK(features::IsInputDeviceSettingsSplitEnabled()); + std::move(callback).Run(controller_->GetConnectedKeyboards()); +} + +} // namespace ash::settings
diff --git a/chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.h b/chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.h new file mode 100644 index 0000000..2011a66f --- /dev/null +++ b/chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.h
@@ -0,0 +1,38 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_ASH_INPUT_DEVICE_SETTINGS_INPUT_DEVICE_SETTINGS_PROVIDER_H_ +#define CHROME_BROWSER_UI_WEBUI_SETTINGS_ASH_INPUT_DEVICE_SETTINGS_INPUT_DEVICE_SETTINGS_PROVIDER_H_ + +#include "ash/public/cpp/input_device_settings_controller.h" +#include "chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.mojom.h" +#include "mojo/public/cpp/bindings/receiver.h" + +namespace ash::settings { + +class InputDeviceSettingsProvider : public mojom::InputDeviceSettingsProvider { + public: + explicit InputDeviceSettingsProvider( + InputDeviceSettingsController* controller); + + ~InputDeviceSettingsProvider() override; + InputDeviceSettingsProvider(const InputDeviceSettingsProvider& other) = + delete; + InputDeviceSettingsProvider& operator=( + const InputDeviceSettingsProvider& other) = delete; + + void BindInterface( + mojo::PendingReceiver<mojom::InputDeviceSettingsProvider> receiver); + + // mojom::InputDeviceSettingsProvider: + void GetConnectedKeyboards(GetConnectedKeyboardsCallback callback) override; + + private: + InputDeviceSettingsController* controller_; + mojo::Receiver<mojom::InputDeviceSettingsProvider> receiver_{this}; +}; + +} // namespace ash::settings + +#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_ASH_INPUT_DEVICE_SETTINGS_INPUT_DEVICE_SETTINGS_PROVIDER_H_
diff --git a/chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.mojom b/chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.mojom new file mode 100644 index 0000000..7b41bc6 --- /dev/null +++ b/chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.mojom
@@ -0,0 +1,13 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module ash.settings.mojom; + +import "ash/public/mojom/input_device_settings.mojom"; + +// Interface for fetching and configuring input device settings in OSSettings. +interface InputDeviceSettingsProvider { + // Returns the list of currently connected keyboards. + GetConnectedKeyboards() => (array<ash.mojom.Keyboard> keyboards); +};
diff --git a/chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider_unittest.cc b/chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider_unittest.cc new file mode 100644 index 0000000..71166c7 --- /dev/null +++ b/chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider_unittest.cc
@@ -0,0 +1,163 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.h" + +#include <memory> + +#include "ash/constants/ash_features.h" +#include "ash/public/cpp/input_device_settings_controller.h" +#include "ash/public/mojom/input_device_settings.mojom-forward.h" +#include "ash/public/mojom/input_device_settings.mojom-shared.h" +#include "ash/public/mojom/input_device_settings.mojom.h" +#include "base/containers/cxx20_erase_vector.h" +#include "base/functional/bind.h" +#include "base/test/scoped_feature_list.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash::settings { +namespace { +const ::ash::mojom::Keyboard keyboard1 = + ::ash::mojom::Keyboard(/*name=*/"AT Translated Set 2", + /*is_external=*/false, + /*id=*/0, + /*device_key=*/"fake-device-key1", + /*meta_key=*/::ash::mojom::MetaKey::kLauncher, + /*modifier_keys=*/{}, + nullptr); +const ::ash::mojom::Keyboard keyboard2 = + ::ash::mojom::Keyboard(/*name=*/"Logitech K580", + /*is_external=*/true, + /*id=*/1, + /*device_key=*/"fake-device-key2", + /*meta_key=*/::ash::mojom::MetaKey::kExternalMeta, + /*modifier_keys=*/{}, + nullptr); + +template <typename T> +void ExpectListsEqual(std::vector<T> expected_list, + std::vector<T> actual_list) { + ASSERT_EQ(expected_list.size(), actual_list.size()); + for (size_t i = 0; i < actual_list.size(); i++) { + EXPECT_EQ(expected_list[i], actual_list[i]); + } +} + +template <typename T> +std::vector<T> CloneMojomVector(const std::vector<T>& devices) { + std::vector<T> devices_copy; + devices_copy.reserve(devices.size()); + for (const auto& device : devices) { + devices_copy.push_back(device->Clone()); + } + return devices_copy; +} + +class FakeInputDeviceSettingsController : public InputDeviceSettingsController { + public: + // InputDeviceSettingsController: + std::vector<::ash::mojom::KeyboardPtr> GetConnectedKeyboards() override { + return CloneMojomVector(keyboards_); + } + std::vector<::ash::mojom::TouchpadPtr> GetConnectedTouchpads() override { + return CloneMojomVector(touchpads_); + } + std::vector<::ash::mojom::MousePtr> GetConnectedMice() override { + return CloneMojomVector(mice_); + } + std::vector<::ash::mojom::PointingStickPtr> GetConnectedPointingSticks() + override { + return CloneMojomVector(pointing_sticks_); + } + + void SetKeyboardSettings( + DeviceId id, + const ::ash::mojom::KeyboardSettings& settings) override {} + void AddObserver(Observer* observer) override {} + void RemoveObserver(Observer* observer) override {} + + void AddKeyboard(::ash::mojom::KeyboardPtr keyboard) { + keyboards_.push_back(std::move(keyboard)); + } + void RemoveKeyboard(uint32_t device_id) { + base::EraseIf(keyboards_, [device_id](const auto& keyboard) { + return keyboard->id == device_id; + }); + } + void AddMouse(::ash::mojom::MousePtr mouse) { + mice_.push_back(std::move(mouse)); + } + void RemoveMouse(uint32_t device_id) { + base::EraseIf(mice_, [device_id](const auto& mouse) { + return mouse->id == device_id; + }); + } + void AddTouchpad(::ash::mojom::TouchpadPtr touchpad) { + touchpads_.push_back(std::move(touchpad)); + } + void RemoveTouchpad(uint32_t device_id) { + base::EraseIf(touchpads_, [device_id](const auto& touchpad) { + return touchpad->id == device_id; + }); + } + void AddPointingStick(::ash::mojom::PointingStickPtr pointing_stick) { + pointing_sticks_.push_back(std::move(pointing_stick)); + } + void RemovePointingStick(uint32_t device_id) { + base::EraseIf(pointing_sticks_, [device_id](const auto& pointing_stick) { + return pointing_stick->id == device_id; + }); + } + + private: + std::vector<::ash::mojom::KeyboardPtr> keyboards_; + std::vector<::ash::mojom::TouchpadPtr> touchpads_; + std::vector<::ash::mojom::MousePtr> mice_; + std::vector<::ash::mojom::PointingStickPtr> pointing_sticks_; +}; + +} // namespace + +class InputDeviceSettingsProviderTest : public testing::Test { + public: + InputDeviceSettingsProviderTest() = default; + ~InputDeviceSettingsProviderTest() override = default; + + void SetUp() override { + feature_list_ = std::make_unique<base::test::ScopedFeatureList>(); + feature_list_->InitAndEnableFeature(features::kInputDeviceSettingsSplit); + + controller_ = std::make_unique<FakeInputDeviceSettingsController>(); + provider_ = + std::make_unique<InputDeviceSettingsProvider>(controller_.get()); + } + + void TearDown() override { + provider_.reset(); + controller_.reset(); + feature_list_.reset(); + } + + protected: + std::unique_ptr<FakeInputDeviceSettingsController> controller_; + std::unique_ptr<InputDeviceSettingsProvider> provider_; + std::unique_ptr<base::test::ScopedFeatureList> feature_list_; +}; + +TEST_F(InputDeviceSettingsProviderTest, TestGetConnectedKeyboards) { + std::vector<::ash::mojom::KeyboardPtr> expected_keyboards; + expected_keyboards.push_back(keyboard1.Clone()); + controller_->AddKeyboard(keyboard1.Clone()); + provider_->GetConnectedKeyboards( + base::BindOnce(ExpectListsEqual<::ash::mojom::KeyboardPtr>, + CloneMojomVector(expected_keyboards))); + + expected_keyboards.push_back(keyboard2.Clone()); + controller_->AddKeyboard(keyboard2.Clone()); + provider_->GetConnectedKeyboards( + base::BindOnce(ExpectListsEqual<::ash::mojom::KeyboardPtr>, + CloneMojomVector(expected_keyboards))); +} + +} // namespace ash::settings
diff --git a/chrome/browser/ui/webui/settings/ash/internet_section.cc b/chrome/browser/ui/webui/settings/ash/internet_section.cc index b5797ad..f61a5b63 100644 --- a/chrome/browser/ui/webui/settings/ash/internet_section.cc +++ b/chrome/browser/ui/webui/settings/ash/internet_section.cc
@@ -27,6 +27,7 @@ #include "chromeos/ash/components/dbus/hermes/hermes_manager_client.h" #include "chromeos/strings/grit/chromeos_strings.h" #include "components/strings/grit/components_strings.h" +#include "components/user_manager/user_manager.h" #include "content/public/browser/web_ui_data_source.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/webui/web_ui_util.h" @@ -673,6 +674,11 @@ onc_source == network_config::mojom::OncSource::kDevicePolicy; } +bool IsUserLoggedIn() { + return user_manager::UserManager::Get() && + user_manager::UserManager::Get()->IsUserLoggedIn(); +} + } // namespace InternetSection::InternetSection(Profile* profile, @@ -1054,6 +1060,7 @@ l10n_util::GetStringFUTF16( IDS_SETTINGS_INTERNET_HOTSPOT_SETTINGS_SUBTITLE_WITH_LEARN_MORE_LINK, GetHelpUrlWithBoard(chrome::kInstantTetheringLearnMoreURL))); + html_source->AddBoolean("isUserLoggedIn", IsUserLoggedIn()); } void InternetSection::AddHandlers(content::WebUI* web_ui) {
diff --git a/chrome/browser/ui/webui/settings/ash/os_settings_manager.cc b/chrome/browser/ui/webui/settings/ash/os_settings_manager.cc index 27803f90..bf2311f 100644 --- a/chrome/browser/ui/webui/settings/ash/os_settings_manager.cc +++ b/chrome/browser/ui/webui/settings/ash/os_settings_manager.cc
@@ -5,7 +5,9 @@ #include "chrome/browser/ui/webui/settings/ash/os_settings_manager.h" #include "ash/constants/ash_features.h" +#include "ash/public/cpp/input_device_settings_controller.h" #include "chrome/browser/ui/webui/settings/ash/hierarchy.h" +#include "chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.h" #include "chrome/browser/ui/webui/settings/ash/os_apps_page/app_notification_handler.h" #include "chrome/browser/ui/webui/settings/ash/os_settings_sections.h" #include "chrome/browser/ui/webui/settings/ash/search/search_handler.h" @@ -56,7 +58,10 @@ hierarchy_.get(), local_search_service_proxy)), app_notification_handler_( - std::make_unique<AppNotificationHandler>(app_service_proxy)) {} + std::make_unique<AppNotificationHandler>(app_service_proxy)), + input_device_settings_provider_( + std::make_unique<InputDeviceSettingsProvider>( + InputDeviceSettingsController::Get())) {} OsSettingsManager::~OsSettingsManager() = default; @@ -75,6 +80,7 @@ void OsSettingsManager::Shutdown() { // Note: These must be deleted in the opposite order of their creation to // prevent against UAF violations. + input_device_settings_provider_.reset(); app_notification_handler_.reset(); search_handler_.reset(); settings_user_action_tracker_.reset();
diff --git a/chrome/browser/ui/webui/settings/ash/os_settings_manager.h b/chrome/browser/ui/webui/settings/ash/os_settings_manager.h index be7a1fc..12ebdc9 100644 --- a/chrome/browser/ui/webui/settings/ash/os_settings_manager.h +++ b/chrome/browser/ui/webui/settings/ash/os_settings_manager.h
@@ -10,6 +10,7 @@ #include "ash/webui/eche_app_ui/eche_app_manager.h" #include "base/gtest_prod_util.h" #include "chrome/browser/apps/app_service/app_service_proxy_forward.h" +#include "chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.h" #include "components/keyed_service/core/keyed_service.h" class ArcAppListPrefs; @@ -118,6 +119,10 @@ return app_notification_handler_.get(); } + InputDeviceSettingsProvider* input_device_settings_provider() { + return input_device_settings_provider_.get(); + } + SearchHandler* search_handler() { return search_handler_.get(); } SettingsUserActionTracker* settings_user_action_tracker() { @@ -138,6 +143,7 @@ std::unique_ptr<SettingsUserActionTracker> settings_user_action_tracker_; std::unique_ptr<SearchHandler> search_handler_; std::unique_ptr<AppNotificationHandler> app_notification_handler_; + std::unique_ptr<InputDeviceSettingsProvider> input_device_settings_provider_; }; } // namespace settings
diff --git a/chrome/browser/ui/webui/settings/ash/os_settings_ui.cc b/chrome/browser/ui/webui/settings/ash/os_settings_ui.cc index 0e2dd83..5abaf9f 100644 --- a/chrome/browser/ui/webui/settings/ash/os_settings_ui.cc +++ b/chrome/browser/ui/webui/settings/ash/os_settings_ui.cc
@@ -229,6 +229,14 @@ } void OSSettingsUI::BindInterface( + mojo::PendingReceiver<mojom::InputDeviceSettingsProvider> receiver) { + DCHECK(features::IsInputDeviceSettingsSplitEnabled()); + OsSettingsManagerFactory::GetForProfile(Profile::FromWebUI(web_ui())) + ->input_device_settings_provider() + ->BindInterface(std::move(receiver)); +} + +void OSSettingsUI::BindInterface( mojo::PendingReceiver<auth::mojom::AuthFactorConfig> receiver) { auth::BindToAuthFactorConfig(std::move(receiver), quick_unlock::QuickUnlockFactory::GetDelegate());
diff --git a/chrome/browser/ui/webui/settings/ash/os_settings_ui.h b/chrome/browser/ui/webui/settings/ash/os_settings_ui.h index 75a485f..a85d8aab 100644 --- a/chrome/browser/ui/webui/settings/ash/os_settings_ui.h +++ b/chrome/browser/ui/webui/settings/ash/os_settings_ui.h
@@ -12,6 +12,7 @@ #include "chrome/browser/ui/webui/app_management/app_management_page_handler.h" #include "chrome/browser/ui/webui/app_management/app_management_page_handler_factory.h" #include "chrome/browser/ui/webui/nearby_share/nearby_share.mojom.h" +#include "chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.mojom.h" #include "chrome/browser/ui/webui/settings/ash/os_apps_page/mojom/app_notification_handler.mojom-forward.h" #include "chrome/browser/ui/webui/settings/ash/search/user_action_recorder.mojom-forward.h" #include "chrome/browser/ui/webui/webui_load_timer.h" @@ -113,6 +114,11 @@ mojo::PendingReceiver<app_notification::mojom::AppNotificationsHandler> receiver); + // Instantiates implementor of the mojom::InputDeviceSettingsProvider mojo + // interface passing the pending receiver that will be internally bound. + void BindInterface( + mojo::PendingReceiver<mojom::InputDeviceSettingsProvider> receiver); + // Instantiates implementor of the mojom::PageHandlerFactory mojo interface // passing the pending receiver that will be internally bound. void BindInterface(
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc index 1960cf3..732a4382a 100644 --- a/chrome/browser/ui/webui/settings/settings_ui.cc +++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -304,6 +304,11 @@ "enableSendPasswords", base::FeatureList::IsEnabled(password_manager::features::kSendPasswords)); + html_source->AddBoolean( + "enableNewPasswordManagerPage", + base::FeatureList::IsEnabled( + password_manager::features::kPasswordManagerRedesign)); + commerce::ShoppingService* shopping_service = commerce::ShoppingServiceFactory::GetForBrowserContext(profile); html_source->AddBoolean("changePriceEmailNotificationsEnabled",
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc index 4c7d78fe4..273138f 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -2609,56 +2609,62 @@ const base::Value::List& grants = data.arg3()->GetList(); EXPECT_EQ(grants.size(), 2UL); - EXPECT_EQ(grants[0].FindKey(site_settings::kOrigin)->GetString(), + const base::Value::Dict& first_grant = grants[0].GetDict(); + const base::Value::Dict& second_grant = grants[1].GetDict(); + EXPECT_EQ(CHECK_DEREF(first_grant.FindString(site_settings::kOrigin)), "https://www.a.com/"); - EXPECT_EQ(grants[1].FindKey(site_settings::kOrigin)->GetString(), + EXPECT_EQ(CHECK_DEREF(second_grant.FindString(site_settings::kOrigin)), "https://www.b.com/"); - auto* kTestOrigin1FileReadGrants = - grants[0].FindKey(site_settings::kFileReadGrants); - auto* kTestOrigin1FileWriteGrants = - grants[0].FindKey(site_settings::kFileWriteGrants); - auto* kTestOrigin1DirectoryReadGrants = - grants[0].FindKey(site_settings::kDirectoryReadGrants); - auto* kTestOrigin1DirectoryWriteGrants = - grants[0].FindKey(site_settings::kDirectoryWriteGrants); + const base::Value::List* kTestOrigin1FileReadGrants = + first_grant.FindList(site_settings::kFileReadGrants); + const base::Value::List* kTestOrigin1FileWriteGrants = + first_grant.FindList(site_settings::kFileWriteGrants); + const base::Value::List* kTestOrigin1DirectoryReadGrants = + first_grant.FindList(site_settings::kDirectoryReadGrants); + const base::Value::List* kTestOrigin1DirectoryWriteGrants = + first_grant.FindList(site_settings::kDirectoryWriteGrants); - auto* kTestOrigin2FileReadGrants = - grants[1].FindKey(site_settings::kFileReadGrants); - auto* kTestOrigin2FileWriteGrants = - grants[1].FindKey(site_settings::kFileWriteGrants); - auto* kTestOrigin2DirectoryReadGrants = - grants[1].FindKey(site_settings::kDirectoryReadGrants); - auto* kTestOrigin2DirectoryWriteGrants = - grants[1].FindKey(site_settings::kDirectoryWriteGrants); + const base::Value::List* kTestOrigin2FileReadGrants = + second_grant.FindList(site_settings::kFileReadGrants); + const base::Value::List* kTestOrigin2FileWriteGrants = + second_grant.FindList(site_settings::kFileWriteGrants); + const base::Value::List* kTestOrigin2DirectoryReadGrants = + second_grant.FindList(site_settings::kDirectoryReadGrants); + const base::Value::List* kTestOrigin2DirectoryWriteGrants = + second_grant.FindList(site_settings::kDirectoryWriteGrants); // Checks that the grants for test origins are populated as expected. - EXPECT_FALSE(kTestOrigin1FileReadGrants->GetList()[0] + EXPECT_FALSE(CHECK_DEREF(kTestOrigin1FileReadGrants)[0] .GetDict() - .Find(site_settings::kIsDirectory) - ->GetBool()); - EXPECT_EQ(kTestOrigin1FileWriteGrants->GetList().size(), 0UL); - EXPECT_EQ(kTestOrigin1DirectoryReadGrants->GetList()[0] - .GetDict() - .Find(site_settings::kFilePath) - ->GetString(), - "/e/"); - EXPECT_EQ(kTestOrigin1DirectoryWriteGrants->GetList().size(), 0UL); + .FindBool(site_settings::kIsDirectory) + .value_or(true)); + ASSERT_TRUE(kTestOrigin1FileWriteGrants != nullptr); + EXPECT_TRUE(kTestOrigin1FileWriteGrants->empty()); + EXPECT_EQ( + CHECK_DEREF( + CHECK_DEREF(kTestOrigin1DirectoryReadGrants)[0].GetDict().FindString( + site_settings::kFilePath)), + "/e/"); + ASSERT_TRUE(kTestOrigin1DirectoryWriteGrants != nullptr); + EXPECT_TRUE(kTestOrigin1DirectoryWriteGrants->empty()); // In the case of kTestOrigin2, check that when an origin has an // associated 'write' grant, that the grant is only recorded in the // respective write grants list, and is not recorded in the origin's // read grants list. - EXPECT_EQ(kTestOrigin2FileReadGrants->GetList().size(), 0UL); - EXPECT_TRUE(kTestOrigin2FileWriteGrants->GetList()[0] + ASSERT_TRUE(kTestOrigin2FileReadGrants != nullptr); + EXPECT_TRUE(kTestOrigin2FileReadGrants->empty()); + EXPECT_TRUE(CHECK_DEREF(kTestOrigin2FileWriteGrants)[0] .GetDict() - .Find(site_settings::kIsWritable) - ->GetBool()); - EXPECT_EQ(kTestOrigin2DirectoryReadGrants->GetList().size(), 0UL); - EXPECT_TRUE(kTestOrigin2DirectoryWriteGrants->GetList()[0] + .FindBool(site_settings::kIsWritable) + .value_or(false)); + ASSERT_TRUE(kTestOrigin2DirectoryReadGrants != nullptr); + EXPECT_TRUE(kTestOrigin2DirectoryReadGrants->empty()); + EXPECT_TRUE(CHECK_DEREF(kTestOrigin2DirectoryWriteGrants)[0] .GetDict() - .Find(site_settings::kIsDirectory) - ->GetBool()); + .FindBool(site_settings::kIsDirectory) + .value_or(false)); } // RevokeGrant() revokes a single File System Access permission grant, @@ -2709,10 +2715,10 @@ // After revoking the `file_read_grant` for kTestOrigin1, only one // `directory_read_grant` should remain when retrieving the file system grants // for kTestOrigin1. - EXPECT_EQ(grants[0].FindKey(site_settings::kFileReadGrants)->GetList().size(), - 0UL); + EXPECT_TRUE( + grants[0].GetDict().FindList(site_settings::kFileReadGrants)->empty()); EXPECT_EQ( - grants[0].FindKey(site_settings::kDirectoryReadGrants)->GetList().size(), + grants[0].GetDict().FindList(site_settings::kDirectoryReadGrants)->size(), 1UL); // Revoking a single grant from an origin with multiple grants in a given @@ -2731,15 +2737,14 @@ const base::Value::List& updated_grants = updated_data.arg3()->GetList(); EXPECT_EQ(updated_grants[1] - .FindKey(site_settings::kDirectoryWriteGrants) - ->GetList() - .size(), + .GetDict() + .FindList(site_settings::kDirectoryWriteGrants) + ->size(), 1UL); - EXPECT_EQ(updated_grants[1] - .FindKey(site_settings::kDirectoryWriteGrants) - ->GetList()[0] - .FindKey(site_settings::kFilePath) - ->GetString(), + EXPECT_EQ(CHECK_DEREF(CHECK_DEREF(updated_grants[1].GetDict().FindList( + site_settings::kDirectoryWriteGrants))[0] + .GetDict() + .FindString(site_settings::kFilePath)), "/f/g/h/"); } @@ -2800,14 +2805,14 @@ // are unaffected. EXPECT_EQ(updated_grants.size(), 1UL); EXPECT_EQ(updated_grants[0] - .FindKey(site_settings::kFileWriteGrants) - ->GetList() - .size(), + .GetDict() + .FindList(site_settings::kFileWriteGrants) + ->size(), 1UL); EXPECT_EQ(updated_grants[0] - .FindKey(site_settings::kDirectoryWriteGrants) - ->GetList() - .size(), + .GetDict() + .FindList(site_settings::kDirectoryWriteGrants) + ->size(), 1UL); }
diff --git a/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc index 621419c5..d761c08 100644 --- a/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc +++ b/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc
@@ -826,10 +826,10 @@ *ephemeral_device_info); // Add the policy granted permissions for testing. - auto policy_value = base::JSONReader::ReadDeprecated(kUsbPolicySetting); + auto policy_value = base::JSONReader::Read(kUsbPolicySetting); DCHECK(policy_value); profile()->GetPrefs()->Set(prefs::kManagedWebUsbAllowDevicesForUrls, - *policy_value); + std::move(*policy_value)); } device::FakeUsbDeviceManager device_manager_;
diff --git a/chrome/browser/web_applications/commands/externally_managed_install_command.cc b/chrome/browser/web_applications/commands/externally_managed_install_command.cc index 6046c1b..2759bcc4 100644 --- a/chrome/browser/web_applications/commands/externally_managed_install_command.cc +++ b/chrome/browser/web_applications/commands/externally_managed_install_command.cc
@@ -259,7 +259,6 @@ finalize_options.locally_installed = install_params_.locally_installed; finalize_options.overwrite_existing_manifest_fields = install_params_.force_reinstall; - finalize_options.parent_app_id = install_params_.parent_app_id; ApplyParamsToFinalizeOptions(install_params_, finalize_options);
diff --git a/chrome/browser/web_applications/commands/sub_app_install_command.cc b/chrome/browser/web_applications/commands/sub_app_install_command.cc index b3e010d..605304b0 100644 --- a/chrome/browser/web_applications/commands/sub_app_install_command.cc +++ b/chrome/browser/web_applications/commands/sub_app_install_command.cc
@@ -73,7 +73,6 @@ finalize_options.locally_installed = true; finalize_options.overwrite_existing_manifest_fields = false; - finalize_options.parent_app_id = parent_app_id; if (IsChromeOsDataMandatory()) { // Default values for ChromeOS installation. finalize_options.chromeos_data.emplace(); @@ -263,6 +262,7 @@ webapps::InstallResultCode::kGetWebAppInstallInfoFailed); return; } + install_info->parent_app_id = parent_app_id_; DCHECK(base::Contains(pending_installs_map_, unhashed_app_id)); const GURL& install_url = pending_installs_map_[unhashed_app_id];
diff --git a/chrome/browser/web_applications/web_app_icon_manager.cc b/chrome/browser/web_applications/web_app_icon_manager.cc index 719a21f..6e3dd40 100644 --- a/chrome/browser/web_applications/web_app_icon_manager.cc +++ b/chrome/browser/web_applications/web_app_icon_manager.cc
@@ -15,6 +15,7 @@ #include "base/check.h" #include "base/check_op.h" #include "base/containers/adapters.h" +#include "base/containers/extend.h" #include "base/containers/flat_tree.h" #include "base/feature_list.h" #include "base/files/file.h" @@ -73,11 +74,6 @@ std::vector<std::string> error_log; bool HasErrors() const { return !error_log.empty(); } - void DepositErrorLog(std::vector<std::string>& other_error_log) { - for (std::string& error : error_log) - other_error_log.push_back(std::move(error)); - error_log.clear(); - } }; std::string CreateError(std::initializer_list<base::StringPiece> parts) { @@ -95,8 +91,9 @@ if (!manager) return; std::vector<std::string>* error_log = manager->error_log(); - if (error_log) - result.DepositErrorLog(*error_log); + if (error_log) { + base::Extend(*error_log, std::move(result.error_log)); + } std::move(callback).Run(std::move(result.value)); } @@ -383,7 +380,7 @@ IconId icon_id(app_id, purpose, icon_size_px); TypedResult<SkBitmap> read_result = ReadIconBlocking(utils, web_apps_directory, icon_id); - read_result.DepositErrorLog(result.error_log); + base::Extend(result.error_log, std::move(read_result.error_log)); if (!read_result.value.empty()) result.value[icon_size_px] = std::move(read_result.value); } @@ -405,7 +402,7 @@ base::FilePath icon_file = GetIconFileName(web_apps_directory, icon_id); TypedResult<base::Time> read_result = ReadIconTimeBlocking(utils, icon_file); - read_result.DepositErrorLog(result.error_log); + base::Extend(result.error_log, std::move(read_result.error_log)); if (!read_result.value.is_null()) result.value[icon_size_px] = std::move(read_result.value); } @@ -425,7 +422,7 @@ TypedResult<std::map<SquareSizePx, SkBitmap>> read_result = ReadIconsBlocking(utils, web_apps_directory, app_id, purpose_sizes.first, purpose_sizes.second); - read_result.DepositErrorLog(result.error_log); + base::Extend(result.error_log, std::move(read_result.error_log)); result.value.SetBitmapsForPurpose(purpose_sizes.first, std::move(read_result.value)); } @@ -451,7 +448,7 @@ TypedResult<SkBitmap> read_result = ReadShortcutsMenuIconBlocking(utils, web_apps_directory, app_id, purpose, curr_index, icon_size_px); - read_result.DepositErrorLog(results.error_log); + base::Extend(results.error_log, std::move(read_result.error_log)); if (!read_result.value.empty()) bitmaps[icon_size_px] = std::move(read_result.value); } @@ -555,7 +552,7 @@ web_apps_directory, app_id, purpose, curr_index, icon_size_px); TypedResult<base::Time> read_result = ReadIconTimeBlocking(utils, file_name); - read_result.DepositErrorLog(results.error_log); + base::Extend(results.error_log, std::move(read_result.error_log)); if (!read_result.value.is_null()) { bitmap_with_time[icon_size_px] = std::move(read_result.value); }
diff --git a/chrome/browser/web_applications/web_app_install_finalizer.cc b/chrome/browser/web_applications/web_app_install_finalizer.cc index 6bd5c93..255846b 100644 --- a/chrome/browser/web_applications/web_app_install_finalizer.cc +++ b/chrome/browser/web_applications/web_app_install_finalizer.cc
@@ -200,10 +200,10 @@ WebApp::IsolationData(*options.isolated_web_app_location)); } + web_app->SetParentAppId(web_app_info.parent_app_id); web_app->SetAdditionalSearchTerms(web_app_info.additional_search_terms); web_app->AddSource(options.source); web_app->SetIsFromSyncAndPendingInstallation(false); - web_app->SetParentAppId(options.parent_app_id); web_app->SetInstallSourceForMetrics(options.install_surface); WriteExternalConfigMapInfo(*web_app, options.source,
diff --git a/chrome/browser/web_applications/web_app_install_finalizer.h b/chrome/browser/web_applications/web_app_install_finalizer.h index e8856162..5c1af28b 100644 --- a/chrome/browser/web_applications/web_app_install_finalizer.h +++ b/chrome/browser/web_applications/web_app_install_finalizer.h
@@ -77,7 +77,6 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) absl::optional<ash::SystemWebAppData> system_web_app_data; #endif - absl::optional<AppId> parent_app_id; absl::optional<web_app::IsolatedWebAppLocation> isolated_web_app_location; // If true, OsIntegrationManager::InstallOsHooks won't be called at all,
diff --git a/chrome/browser/web_applications/web_app_install_info.h b/chrome/browser/web_applications/web_app_install_info.h index 44668690..f9fc2e90 100644 --- a/chrome/browser/web_applications/web_app_install_info.h +++ b/chrome/browser/web_applications/web_app_install_info.h
@@ -15,6 +15,7 @@ #include "base/values.h" #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h" #include "chrome/browser/web_applications/scope_extension_info.h" +#include "chrome/browser/web_applications/web_app_id.h" #include "components/services/app_service/public/cpp/file_handler.h" #include "components/services/app_service/public/cpp/icon_info.h" #include "components/services/app_service/public/cpp/protocol_handler_info.h" @@ -337,6 +338,11 @@ // display mode is set to 'tabbed'. absl::optional<blink::Manifest::TabStrip> tab_strip; + // Id of the app that called the SUB_APP API to install this app. This field + // is only used when the app is installed as a sub app through the SUB_APP + // API. + absl::optional<web_app::AppId> parent_app_id; + private: // Used this method in Clone() method. Use Clone() to deep copy explicitly. WebAppInstallInfo(const WebAppInstallInfo& other);
diff --git a/chrome/browser/web_applications/web_app_install_params.h b/chrome/browser/web_applications/web_app_install_params.h index dba9f14..9205ce6 100644 --- a/chrome/browser/web_applications/web_app_install_params.h +++ b/chrome/browser/web_applications/web_app_install_params.h
@@ -107,9 +107,6 @@ bool oem_installed = false; - // Set for SUB_APP API installs. - absl::optional<AppId> parent_app_id; - // The install URL for the app. This does not always need to be // populated (especially for user installed or sync installed apps) // in which case the URL will not be written to the web_app DB.
diff --git a/chrome/browser/web_applications/web_app_install_task.cc b/chrome/browser/web_applications/web_app_install_task.cc index 6aa3314..b1ac37f 100644 --- a/chrome/browser/web_applications/web_app_install_task.cc +++ b/chrome/browser/web_applications/web_app_install_task.cc
@@ -501,7 +501,7 @@ // case we proceed with the installation which adds the SUB_APP install source // as well. if (install_surface_ == webapps::WebappInstallSource::SUB_APP) { - DCHECK(install_params_ && install_params_->parent_app_id.has_value()); + DCHECK(web_app_info->parent_app_id.has_value()); if (registrar_->WasInstalledBySubApp(app_id)) { CallInstallCallback(std::move(app_id), webapps::InstallResultCode::kSuccessAlreadyInstalled); @@ -704,7 +704,6 @@ finalize_options.locally_installed = install_params_->locally_installed; finalize_options.overwrite_existing_manifest_fields = install_params_->force_reinstall; - finalize_options.parent_app_id = install_params_->parent_app_id; ApplyParamsToFinalizeOptions(*install_params_, finalize_options);
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 54ad7a7..422b653 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1676872608-bb8ab0671abba1313d33f6059ca6588ea5490207.profdata +chrome-linux-main-1676958321-0f38d607074192aa865070e29812cd508dab5fc7.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index b8013a85..8fc819b 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1676872608-0aea9b2f4f09988dce2fdcc66c9408bac531c33d.profdata +chrome-mac-arm-main-1676958321-a7506818683d28d5f314e7a732589f57cbc893e9.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index bbd7c2e..3b57420 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1676872608-73641c15f5e303645b9b5655dfc950c8d30b38ac.profdata +chrome-mac-main-1676958321-3a15a6ea4903056f4c2154ff19b6ada3fe3697d8.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index b2029b2..72e2be5 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1676883239-0829e2b02db61b5e629d3fb05da022d1c3e9b650.profdata +chrome-win32-main-1676958321-76f98ca1981bc471ce6d14755fe86a2564f8b6e3.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 06c2cf6..d6a3fe1 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1676883239-c564998965e7387332487b6bb964c5cb1fee716e.profdata +chrome-win64-main-1676958321-32867ed2882fd3d1a2ce92f6a20fa4e4cbeb0610.profdata
diff --git a/chrome/common/features.gni b/chrome/common/features.gni index 657bbbb..03a01aa 100644 --- a/chrome/common/features.gni +++ b/chrome/common/features.gni
@@ -105,6 +105,7 @@ "enable_vr=$enable_vr", "enable_webui_certificate_viewer=$enable_webui_certificate_viewer", "enable_webui_tab_strip=$enable_webui_tab_strip", + "is_official_build=$is_official_build", "safe_browsing_mode=$safe_browsing_mode", "optimize_webui=$optimize_webui", "use_nss_certs=$use_nss_certs",
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index aff2aeb9..839e07a 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -3755,6 +3755,7 @@ "../browser/ash/child_accounts/parent_access_code/parent_access_service_browsertest.cc", "../browser/ash/child_accounts/screen_time_controller_browsertest.cc", "../browser/ash/child_accounts/time_limits/app_time_browsertest.cc", + "../browser/ash/crosapi/web_app_provider_bridge_browsertest.cc", "../browser/ash/crostini/crostini_browser_test_util.cc", "../browser/ash/crostini/crostini_browser_test_util.h", "../browser/ash/crostini/crostini_browsertest.cc", @@ -8789,6 +8790,8 @@ "../browser/ui/views/autofill/popup/popup_view_utils_unittest.cc", "../browser/ui/views/autofill/popup/popup_view_views_unittest.cc", "../browser/ui/views/autofill/popup/popup_warning_view_unittest.cc", + "../browser/ui/views/autofill/popup/test_popup_row_strategy.cc", + "../browser/ui/views/autofill/popup/test_popup_row_strategy.h", "../browser/ui/views/bookmarks/bookmark_bar_view_test_helper.h", "../browser/ui/views/bookmarks/bookmark_bar_view_unittest.cc", "../browser/ui/views/bookmarks/bookmark_bubble_view_unittest.cc",
diff --git a/chrome/test/chromedriver/chrome/browser_info.cc b/chrome/test/chromedriver/chrome/browser_info.cc index 189c270..d48cd9dd 100644 --- a/chrome/test/chromedriver/chrome/browser_info.cc +++ b/chrome/test/chromedriver/chrome/browser_info.cc
@@ -27,9 +27,10 @@ BrowserInfo::~BrowserInfo() {} Status ParseBrowserInfo(const std::string& data, BrowserInfo* browser_info) { - std::unique_ptr<base::Value> value = base::JSONReader::ReadDeprecated(data); - if (!value.get()) + absl::optional<base::Value> value = base::JSONReader::Read(data); + if (!value) { return Status(kUnknownError, "version info not in JSON"); + } if (!value->is_dict()) return Status(kUnknownError, "version info not a dictionary");
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl.cc b/chrome/test/chromedriver/chrome/devtools_client_impl.cc index c3999074..d91888e 100644 --- a/chrome/test/chromedriver/chrome/devtools_client_impl.cc +++ b/chrome/test/chromedriver/chrome/devtools_client_impl.cc
@@ -1194,8 +1194,8 @@ InspectorCommandResponse* command_response) { // We want to allow invalid characters in case they are valid ECMAScript // strings. For example, webplatform tests use this to check string handling - std::unique_ptr<base::Value> message_value = base::JSONReader::ReadDeprecated( - message, base::JSON_REPLACE_INVALID_CHARACTERS); + absl::optional<base::Value> message_value = + base::JSONReader::Read(message, base::JSON_REPLACE_INVALID_CHARACTERS); base::Value::Dict* message_dict = message_value ? message_value->GetIfDict() : nullptr; if (!message_dict) @@ -1335,8 +1335,7 @@ } Status ParseInspectorError(const std::string& error_json) { - std::unique_ptr<base::Value> error = - base::JSONReader::ReadDeprecated(error_json); + absl::optional<base::Value> error = base::JSONReader::Read(error_json); base::Value::Dict* error_dict = error ? error->GetIfDict() : nullptr; if (!error_dict) return Status(kUnknownError, "inspector error with no error message");
diff --git a/chrome/test/chromedriver/chrome/devtools_http_client.cc b/chrome/test/chromedriver/chrome/devtools_http_client.cc index ecef50ed..e7707fec 100644 --- a/chrome/test/chromedriver/chrome/devtools_http_client.cc +++ b/chrome/test/chromedriver/chrome/devtools_http_client.cc
@@ -160,9 +160,10 @@ namespace internal { Status ParseWebViewsInfo(const std::string& data, WebViewsInfo* views_info) { - std::unique_ptr<base::Value> value = base::JSONReader::ReadDeprecated(data); - if (!value.get()) + absl::optional<base::Value> value = base::JSONReader::Read(data); + if (!value) { return Status(kUnknownError, "DevTools returned invalid JSON"); + } if (!value->is_list()) return Status(kUnknownError, "DevTools did not return list");
diff --git a/chrome/test/chromedriver/chrome/log.cc b/chrome/test/chromedriver/chrome/log.cc index 4ac3857b..b27cdfb 100644 --- a/chrome/test/chromedriver/chrome/log.cc +++ b/chrome/test/chromedriver/chrome/log.cc
@@ -98,8 +98,8 @@ } std::string FormatJsonForDisplay(const std::string& json) { - std::unique_ptr<base::Value> value = base::JSONReader::ReadDeprecated(json); + absl::optional<base::Value> value = base::JSONReader::Read(json); if (!value) - value = std::make_unique<base::Value>(json); + value.emplace(json); return FormatValueForDisplay(*value); }
diff --git a/chrome/test/chromedriver/chrome_launcher.cc b/chrome/test/chromedriver/chrome_launcher.cc index 9277dc77..44e8d5f 100644 --- a/chrome/test/chromedriver/chrome_launcher.cc +++ b/chrome/test/chromedriver/chrome_launcher.cc
@@ -994,8 +994,8 @@ std::string manifest_data; if (!base::ReadFileToString(manifest_path, &manifest_data)) return Status(kUnknownError, "cannot read manifest"); - std::unique_ptr<base::Value> manifest_value = - base::JSONReader::ReadDeprecated(manifest_data); + absl::optional<base::Value> manifest_value = + base::JSONReader::Read(manifest_data); base::Value::Dict* manifest = manifest_value ? manifest_value->GetIfDict() : nullptr; if (!manifest)
diff --git a/chrome/test/chromedriver/chrome_launcher_unittest.cc b/chrome/test/chromedriver/chrome_launcher_unittest.cc index e9997d5..db86710e 100644 --- a/chrome/test/chromedriver/chrome_launcher_unittest.cc +++ b/chrome/test/chromedriver/chrome_launcher_unittest.cc
@@ -113,8 +113,7 @@ std::string manifest_txt; ASSERT_TRUE(base::ReadFileToString( temp_ext_path.AppendASCII("manifest.json"), &manifest_txt)); - std::unique_ptr<base::Value> manifest = - base::JSONReader::ReadDeprecated(manifest_txt); + absl::optional<base::Value> manifest = base::JSONReader::Read(manifest_txt); ASSERT_TRUE(manifest); base::Value::Dict* manifest_dict = manifest->GetIfDict(); ASSERT_TRUE(manifest_dict);
diff --git a/chrome/test/chromedriver/element_commands.cc b/chrome/test/chromedriver/element_commands.cc index 34b933b..87628c45 100644 --- a/chrome/test/chromedriver/element_commands.cc +++ b/chrome/test/chromedriver/element_commands.cc
@@ -864,14 +864,14 @@ return status; // Computed label stores as `name` in the AXTree. - absl::optional<base::Value> name_node = ax_node->ExtractKey("name"); + base::Value::Dict* name_node = ax_node->GetDict().FindDict("name"); if (!name_node) { // No computed label found. Return empty string. *value = std::make_unique<base::Value>(""); return Status(kOk); } - absl::optional<base::Value> name_val = name_node->ExtractKey("value"); + absl::optional<base::Value> name_val = name_node->Extract("value"); if (!name_val) return Status(kUnknownError, "No name value found in the node in CDP response"); @@ -891,14 +891,14 @@ if (status.IsError()) return status; - absl::optional<base::Value> role_node = ax_node->ExtractKey("role"); + base::Value::Dict* role_node = ax_node->GetDict().FindDict("role"); if (!role_node) { // No computed role found. Return empty string. *value = std::make_unique<base::Value>(""); return Status(kOk); } - absl::optional<base::Value> role_val = role_node->ExtractKey("value"); + absl::optional<base::Value> role_val = role_node->Extract("value"); if (!role_val) { return Status(kUnknownError, "No role value found in the node in CDP response");
diff --git a/chrome/test/chromedriver/element_util.cc b/chrome/test/chromedriver/element_util.cc index 4a34f78..417b600f 100644 --- a/chrome/test/chromedriver/element_util.cc +++ b/chrome/test/chromedriver/element_util.cc
@@ -1011,7 +1011,7 @@ if (status.IsError()) return status; - absl::optional<base::Value> nodes = result->ExtractKey("nodes"); + absl::optional<base::Value> nodes = result->GetDict().Extract("nodes"); if (!nodes) return Status(kUnknownError, "No `nodes` found in CDP response");
diff --git a/chrome/test/chromedriver/log_replay/log_replay_socket.cc b/chrome/test/chromedriver/log_replay/log_replay_socket.cc index 62a77c06..c067e88 100644 --- a/chrome/test/chromedriver/log_replay/log_replay_socket.cc +++ b/chrome/test/chromedriver/log_replay/log_replay_socket.cc
@@ -37,7 +37,7 @@ } bool LogReplaySocket::Send(const std::string& message) { - std::unique_ptr<base::Value> json = base::JSONReader::ReadDeprecated(message); + absl::optional<base::Value> json = base::JSONReader::Read(message); max_id_ = json->GetDict().FindInt("id").value(); return true; }
diff --git a/chrome/test/chromedriver/server/http_handler.cc b/chrome/test/chromedriver/server/http_handler.cc index ca684d4..4a31acf 100644 --- a/chrome/test/chromedriver/server/http_handler.cc +++ b/chrome/test/chromedriver/server/http_handler.cc
@@ -1165,8 +1165,8 @@ } if (request.data.length()) { - std::unique_ptr<base::Value> parsed_body = - base::JSONReader::ReadDeprecated(request.data); + absl::optional<base::Value> parsed_body = + base::JSONReader::Read(request.data); base::Value::Dict* body_params = parsed_body ? parsed_body->GetIfDict() : nullptr; if (!body_params) {
diff --git a/chrome/test/chromedriver/session_commands_unittest.cc b/chrome/test/chromedriver/session_commands_unittest.cc index 9debcd6b..40b6135 100644 --- a/chrome/test/chromedriver/session_commands_unittest.cc +++ b/chrome/test/chromedriver/session_commands_unittest.cc
@@ -11,9 +11,9 @@ #include "base/files/file_util.h" #include "base/functional/bind.h" #include "base/functional/callback.h" -#include "base/json/json_reader.h" #include "base/run_loop.h" #include "base/system/sys_info.h" +#include "base/test/values_test_util.h" #include "base/threading/thread.h" #include "base/values.h" #include "chrome/test/chromedriver/capabilities.h" @@ -217,11 +217,8 @@ Status ProcessCapabilitiesJson(const std::string& params_json, base::Value::Dict& result_capabilities) { - std::unique_ptr<base::Value> params = - base::JSONReader::ReadDeprecated(params_json); - if (!params || !params->is_dict()) - return Status(kUnknownError); - return ProcessCapabilities(params->GetDict(), result_capabilities); + base::Value::Dict params = base::test::ParseJsonDict(params_json); + return ProcessCapabilities(params, result_capabilities); } } // namespace @@ -566,8 +563,8 @@ MockChrome* chrome = new MockChrome(binfo); Session session("id", std::unique_ptr<Chrome>(chrome)); - base::Value value = base::JSONReader::Read( - R"({ + base::Value::Dict params_in = base::test::ParseJsonDict( + R"({ "capabilities": { "alwaysMatch": { }, "firstMatch": [ { @@ -588,16 +585,13 @@ "unhandledPromptBehavior": "accept" } ] } - })") - .value(); - base::Value::Dict* params_in = value.GetIfDict(); - ASSERT_TRUE(params_in); + })"); const base::Value::Dict* desired_caps_out = nullptr; base::Value::Dict merged_out; Capabilities capabilities_out; Status status = internal::ConfigureSession( - &session, *params_in, desired_caps_out, merged_out, &capabilities_out); + &session, params_in, desired_caps_out, merged_out, &capabilities_out); ASSERT_EQ(kOk, status.code()) << status.message(); // Verify out parameters have been set ASSERT_NE(desired_caps_out, nullptr); @@ -616,22 +610,19 @@ MockChrome* chrome = new MockChrome(binfo); Session session("id", std::unique_ptr<Chrome>(chrome)); - base::Value value = base::JSONReader::Read( - R"({ + base::Value::Dict params_in = base::test::ParseJsonDict( + R"({ "capabilities": { "alwaysMatch": { }, "firstMatch": [ { } ] } - })") - .value(); - const base::Value::Dict* params_in = value.GetIfDict(); - ASSERT_TRUE(params_in); + })"); const base::Value::Dict* desired_caps_out = nullptr; base::Value::Dict merged_out; Capabilities capabilities_out; Status status = internal::ConfigureSession( - &session, *params_in, desired_caps_out, merged_out, &capabilities_out); + &session, params_in, desired_caps_out, merged_out, &capabilities_out); ASSERT_EQ(kOk, status.code()) << status.message(); ASSERT_NE(desired_caps_out, nullptr); // Testing specific values could be fragile, but want to verify they are set @@ -649,24 +640,21 @@ MockChrome* chrome = new MockChrome(binfo); Session session("id", std::unique_ptr<Chrome>(chrome)); - base::Value value = base::JSONReader::Read( - R"({ + base::Value::Dict params_in = base::test::ParseJsonDict( + R"({ "desiredCapabilities": { "browserName": "chrome", "goog:chromeOptions": { "w3c": false } } - })") - .value(); - const base::Value::Dict* params_in = value.GetIfDict(); - ASSERT_TRUE(params_in); + })"); const base::Value::Dict* desired_caps_out = nullptr; base::Value::Dict merged_out; Capabilities capabilities_out; Status status = internal::ConfigureSession( - &session, *params_in, desired_caps_out, merged_out, &capabilities_out); + &session, params_in, desired_caps_out, merged_out, &capabilities_out); ASSERT_EQ(kOk, status.code()) << status.message(); ASSERT_NE(desired_caps_out, nullptr); // legacy values:
diff --git a/chrome/test/chromedriver/webauthn_commands.cc b/chrome/test/chromedriver/webauthn_commands.cc index cec8f76..143fd79f 100644 --- a/chrome/test/chromedriver/webauthn_commands.cc +++ b/chrome/test/chromedriver/webauthn_commands.cc
@@ -164,7 +164,7 @@ return status; absl::optional<base::Value> authenticator_id = - result->ExtractKey("authenticatorId"); + result->GetDict().Extract("authenticatorId"); if (!authenticator_id) return Status(kUnknownError, kDevToolsDidNotReturnExpectedValue); @@ -217,7 +217,8 @@ if (status.IsError()) return status; - absl::optional<base::Value> credentials = result->ExtractKey("credentials"); + absl::optional<base::Value> credentials = + result->GetDict().Extract("credentials"); if (!credentials) return Status(kUnknownError, kDevToolsDidNotReturnExpectedValue);
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js index 5a85149..c043677 100644 --- a/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js
@@ -1416,5 +1416,44 @@ // user certificate is not needed for PEAP assertEquals('no-user-cert', networkConfig.selectedUserCertHash_); }); + + [true, false].forEach(eapDefaultCasWithoutSubjectVerificationAllowed => { + test('WiFi EAP-TLS Default CA Cert Flag', async function() { + loadTimeData.overrideValues({ + 'eapDefaultCasWithoutSubjectVerificationAllowed': + eapDefaultCasWithoutSubjectVerificationAllowed, + }); + + setNetworkType(NetworkType.kWiFi, SecurityType.kWpaEap); + setAuthenticated(); + initNetworkConfigWithCerts( + /* hasServerCa= */ false, /* hasUserCert= */ true); + networkConfig.shareNetwork_ = true; + networkConfig.set('eapProperties_.outer', 'EAP-TLS'); + + await mojoApi_.whenCalled('getNetworkCertificates'); + networkConfig.setEapProperties_(networkConfig.eapProperties_); + networkConfig.save(); + await flushAsync(); + + // 'default' Server CA should be selected in case of no certificates + assertEquals('default', networkConfig.selectedServerCaHash_); + + if (eapDefaultCasWithoutSubjectVerificationAllowed) { + assertEquals('', networkConfig.error); + } else { + assertEquals( + 'missingEapDefaultServerCaSubjectVerification', + networkConfig.error); + } + + // Setting a domain suffix match clear the error. + networkConfig.serializedDomainSuffixMatch_ = 'test.com'; + networkConfig.save(); + await flushAsync(); + + assertEquals('', networkConfig.error); + }); + }); }); });
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_list_item_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_list_item_test.js index 9103dc4..06e1705 100644 --- a/chrome/test/data/webui/cr_components/chromeos/network/network_list_item_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/network/network_list_item_test.js
@@ -29,6 +29,9 @@ let eventTriggered; setup(function() { + loadTimeData.overrideValues({ + 'isUserLoggedIn': true, + }); mojoApi_ = new FakeNetworkConfig(); MojoInterfaceProviderImpl.getInstance().remote_ = mojoApi_; eSimManagerRemote = new FakeESimManagerRemote(); @@ -194,9 +197,9 @@ test('Pending activation pSIM UI visibility', async () => { init(); - const networkStateText = listItem.$.networkStateText; - assertTrue(!!networkStateText); - assertTrue(networkStateText.hidden); + const sublabel = listItem.$.sublabel; + assertTrue(!!sublabel); + assertTrue(sublabel.hidden); assertFalse(!!listItem.$$('#activateButton')); // Set item to an activated pSIM network first. @@ -216,7 +219,7 @@ // Activate button should not be showing. assertFalse(!!listItem.$$('#activateButton')); // Network state text should not be showing. - assertTrue(networkStateText.hidden); + assertTrue(sublabel.hidden); // Set item to an unactivated eSIM network with a payment URL. const managedPropertiesESimNotActivated = @@ -235,7 +238,7 @@ // Activate button should not be showing. assertFalse(!!listItem.$$('#activateButton')); - assertFalse(networkStateText.hidden); + assertFalse(sublabel.hidden); // Set item to an unactivated pSIM network with a payment URL. const managedPropertiesNotActivated = @@ -257,7 +260,7 @@ const activateButton = listItem.$$('#activateButton'); assertTrue(!!activateButton); // Network state text should not be showing. - assertTrue(networkStateText.hidden); + assertTrue(sublabel.hidden); // Arrow button should also be visible. const arrow = listItem.$$('#subpageButton'); @@ -288,9 +291,9 @@ test('Unavailable cellular network UI visibility', async () => { init(); - const networkStateText = listItem.$.networkStateText; - assertTrue(!!networkStateText); - assertTrue(networkStateText.hidden); + const sublabel = listItem.$.sublabel; + assertTrue(!!sublabel); + assertTrue(sublabel.hidden); assertFalse(!!listItem.$$('#activateButton')); // Set item to an unactivated eSIM network without a payment URL. @@ -311,10 +314,10 @@ // Activate button should not be showing. assertFalse(!!listItem.$$('#activateButton')); // Network state text should be showing. - assertFalse(networkStateText.hidden); - assertTrue(networkStateText.classList.contains('warning')); + assertFalse(sublabel.hidden); + assertTrue(sublabel.classList.contains('warning')); assertEquals( - networkStateText.textContent.trim(), + sublabel.textContent.trim(), listItem.i18n('networkListItemUnavailableSimNetwork')); // Selecting the row should fire the show-detail event. @@ -339,10 +342,10 @@ // Activate button should not be showing. assertFalse(!!listItem.$$('#activateButton')); // Network state text should be showing. - assertFalse(networkStateText.hidden); - assertTrue(networkStateText.classList.contains('warning')); + assertFalse(sublabel.hidden); + assertTrue(sublabel.classList.contains('warning')); assertEquals( - networkStateText.textContent.trim(), + sublabel.textContent.trim(), listItem.i18n('networkListItemUnavailableSimNetwork')); // Arrow button should still be visible. @@ -506,10 +509,9 @@ assertTrue(!!arrow); assertFalse(!!unlockBtn); - let networkStateText = listItem.$$('#networkStateText'); - assertTrue(!!networkStateText); - assertNotEquals( - networkStateLockedText, networkStateText.textContent.trim()); + let sublabel = listItem.$$('#sublabel'); + assertTrue(!!sublabel); + assertNotEquals(networkStateLockedText, sublabel.textContent.trim()); listItem.set('networkState.typeState.cellular.simLocked', true); await flushAsync(); @@ -528,9 +530,9 @@ simLockDialog = listItem.$$('sim-lock-dialogs'); assertTrue(!!simLockDialog); - networkStateText = listItem.$$('#networkStateText'); - assertTrue(!!networkStateText); - assertEquals(networkStateLockedText, networkStateText.textContent.trim()); + sublabel = listItem.$$('#sublabel'); + assertTrue(!!sublabel); + assertEquals(networkStateLockedText, sublabel.textContent.trim()); // Setting showButtons to false should hide unlock button. listItem.showButtons = false; @@ -659,9 +661,9 @@ listItem.item = initCellularNetwork(iccid, eid, /*simlocked=*/ true); await flushAsync(); - const networkStateText = listItem.$$('#networkStateText'); - assertTrue(!!networkStateText); - assertEquals(networkStateLockedText, networkStateText.textContent.trim()); + const sublabel = listItem.$$('#sublabel'); + assertTrue(!!sublabel); + assertEquals(networkStateLockedText, sublabel.textContent.trim()); }); test( @@ -679,10 +681,9 @@ listItem.deviceState = {scanning: true}; await flushAsync(); - const networkStateText = listItem.$$('#networkStateText'); - assertTrue(!!networkStateText); - assertEquals( - networkStateLockedText, networkStateText.textContent.trim()); + const sublabel = listItem.$$('#sublabel'); + assertTrue(!!sublabel); + assertEquals(networkStateLockedText, sublabel.textContent.trim()); }); test('computeIsBlockedNetwork()_ should return expected value', async () => { @@ -736,6 +737,46 @@ assertEquals(showDetailEvent.detail, networkState); }); + [true, false].forEach(isUserLoggedIn => { + test('pSIM Network unactivated', async () => { + loadTimeData.overrideValues({ + 'isUserLoggedIn': isUserLoggedIn, + }); + init(); + + const managedPropertiesNotActivated = OncMojo.getDefaultManagedProperties( + NetworkType.kCellular, 'cellular'); + managedPropertiesNotActivated.typeProperties.cellular.activationState = + ActivationStateType.kNotActivated; + managedPropertiesNotActivated.typeProperties.cellular.paymentPortal = { + url: 'url', + }; + mojoApi_.setManagedPropertiesForTest(managedPropertiesNotActivated); + + const networkState = OncMojo.managedPropertiesToNetworkState( + managedPropertiesNotActivated); + listItem.item = networkState; + + await flushAsync(); + + const sublabel = listItem.$.sublabel; + const activateButton = listItem.$$('#activateButton'); + const arrow = listItem.$$('#subpageButton'); + assertTrue(!!arrow); + + if (isUserLoggedIn) { + assertTrue(!!activateButton); + assertTrue(sublabel.hidden); + } else { + assertFalse(!!activateButton); + assertFalse(sublabel.hidden); + assertEquals( + listItem.i18n('networkListItemActivateAfterDeviceSetup'), + sublabel.textContent.trim()); + } + }); + }); + suite('Portal', function() { function initWithPortalState(portalState) { const managedProperties = @@ -754,29 +795,25 @@ test('kPortal portalState show sign in description', async () => { init(); initWithPortalState(PortalState.kPortal); - const getNetworkStateText = () => { - const element = listItem.$$('#networkStateText'); + const getSublabel = () => { + const element = listItem.$$('#sublabel'); return element ? element.textContent.trim() : ''; }; - assertEquals( - getNetworkStateText(), listItem.i18n('networkListItemSignIn')); - assertTrue( - listItem.$$('#networkStateText').classList.contains('warning')); - assertFalse(!!listItem.$$('#networkStateText').hasAttribute('active')); + assertEquals(getSublabel(), listItem.i18n('networkListItemSignIn')); + assertTrue(listItem.$$('#sublabel').classList.contains('warning')); + assertFalse(!!listItem.$$('#sublabel').hasAttribute('active')); }); test('kPortalProxyAuth portalState show sign in description', async () => { init(); initWithPortalState(PortalState.kProxyAuthRequired); - const getNetworkStateText = () => { - const element = listItem.$$('#networkStateText'); + const getSublabel = () => { + const element = listItem.$$('#sublabel'); return element ? element.textContent.trim() : ''; }; - assertEquals( - getNetworkStateText(), listItem.i18n('networkListItemSignIn')); - assertTrue( - listItem.$$('#networkStateText').classList.contains('warning')); - assertFalse(!!listItem.$$('#networkStateText').hasAttribute('active')); + assertEquals(getSublabel(), listItem.i18n('networkListItemSignIn')); + assertTrue(listItem.$$('#sublabel').classList.contains('warning')); + assertFalse(!!listItem.$$('#sublabel').hasAttribute('active')); }); test( @@ -784,17 +821,14 @@ async () => { init(); initWithPortalState(PortalState.kPortalSuspected); - const getNetworkStateText = () => { - const element = listItem.$$('#networkStateText'); + const getSublabel = () => { + const element = listItem.$$('#sublabel'); return element ? element.textContent.trim() : ''; }; assertEquals( - getNetworkStateText(), - listItem.i18n('networkListItemConnectedLimited')); - assertTrue( - listItem.$$('#networkStateText').classList.contains('warning')); - assertFalse( - !!listItem.$$('#networkStateText').hasAttribute('active')); + getSublabel(), listItem.i18n('networkListItemConnectedLimited')); + assertTrue(listItem.$$('#sublabel').classList.contains('warning')); + assertFalse(!!listItem.$$('#sublabel').hasAttribute('active')); }); test( @@ -802,17 +836,15 @@ async () => { init(); initWithPortalState(PortalState.kNoInternet); - const getNetworkStateText = () => { - const element = listItem.$$('#networkStateText'); + const getSublabel = () => { + const element = listItem.$$('#sublabel'); return element ? element.textContent.trim() : ''; }; assertEquals( - getNetworkStateText(), + getSublabel(), listItem.i18n('networkListItemConnectedNoConnectivity')); - assertTrue( - listItem.$$('#networkStateText').classList.contains('warning')); - assertFalse( - !!listItem.$$('#networkStateText').hasAttribute('active')); + assertTrue(listItem.$$('#sublabel').classList.contains('warning')); + assertFalse(!!listItem.$$('#sublabel').hasAttribute('active')); }); }); });
diff --git a/chrome/test/data/webui/settings/autofill_page_test.ts b/chrome/test/data/webui/settings/autofill_page_test.ts index aa36f95..91aef55 100644 --- a/chrome/test/data/webui/settings/autofill_page_test.ts +++ b/chrome/test/data/webui/settings/autofill_page_test.ts
@@ -501,4 +501,30 @@ assertEquals(routes.PASSWORDS, Router.getInstance().getCurrentRoute()); assertFalse(!!autofillSection.credential); }); + + test('New Password Manager UI enabled', async function() { + // Enable new Password Manager UI. + loadTimeData.overrideValues({enableNewPasswordManagerPage: true}); + Router.resetInstanceForTesting(buildRouter()); + + const autofillSection = createAutofillPageSection(); + assertTrue(autofillSection.$.passwordManagerButton.external); + + autofillSection.$.passwordManagerButton.click(); + const url = await openWindowProxy.whenCalled('openUrl'); + assertEquals(url, 'chrome://password-manager'); + }); + + test('New Password Manager UI disabled', async function() { + // Enable new Password Manager UI. + loadTimeData.overrideValues({enableNewPasswordManagerPage: false}); + Router.resetInstanceForTesting(buildRouter()); + + const autofillSection = createAutofillPageSection(); + + assertFalse(autofillSection.$.passwordManagerButton.external); + + autofillSection.$.passwordManagerButton.click(); + assertEquals(routes.PASSWORDS, Router.getInstance().getCurrentRoute()); + }); });
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js index 62c4deb..aa40cff2 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js +++ b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
@@ -53,17 +53,8 @@ } }; -// TODO(https://crbug.com/1411677): Re-enable in debug builds once test suite -// does not time out anymore. -TEST_F_WITH_PREAMBLE( - ` -#if !defined(NDEBUG) -#define MAYBE_All DISABLED_All -#else -#define MAYBE_All All -#endif - `, - 'OSSettingsDevicePageV3Test', 'MAYBE_All', +TEST_F( + 'OSSettingsDevicePageV3Test', 'All', () => mocha.grep('/^((?!arrow_key_arrangement_disabled).)*$/').run()); // TODO(crbug.com/1347746): move this to the generic test lists below after the @@ -619,6 +610,11 @@ mocha.grep('SearchFeedback_OfficialBuild').run(); }); GEN('#endif'); + } else if (testName === 'OsSettingsPage') { + // TODO(crbug.com/1411677): times out (flaky) debug builds + GEN('#if defined(NDEBUG)'); + TEST_F(className, 'All', () => mocha.run()); + GEN('#endif'); } else { TEST_F(className, 'All', () => mocha.run()); }
diff --git a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc index aa60783..fa34d7c9 100644 --- a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc +++ b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc
@@ -89,6 +89,10 @@ // A flag describing how we pretend that the user's home directory migration // was not completed correctly. bool incomplete_migration = false; + + // If users are created in test constructor, UserDataDir is not available + // yet, so actual directory creation needs to be postponed. + bool postponed_directory_creation = false; }; namespace { @@ -496,9 +500,9 @@ if (!profile_dir) { LOG(WARNING) << "User data directory has not been set, will not create " "user profile directory"; + user_it->second.postponed_directory_creation = true; return; } - base::ScopedAllowBlockingForTesting allow_blocking; CHECK(base::CreateDirectory(*profile_dir)); } @@ -509,6 +513,19 @@ return FakeUserDataAuthClient::Get()->GetUserProfileDir(account_id); } +void FakeUserDataAuthClient::TestApi::CreatePostponedDirectories() { + base::ScopedAllowBlockingForTesting allow_blocking; + for (auto& user_it : FakeUserDataAuthClient::Get()->users_) { + if (!user_it.second.postponed_directory_creation) { + continue; + } + const absl::optional<base::FilePath> profile_dir = + FakeUserDataAuthClient::Get()->GetUserProfileDir(user_it.first); + CHECK(profile_dir) << "User data directory has not been set"; + CHECK(base::CreateDirectory(*profile_dir)); + } +} + void FakeUserDataAuthClient::TestApi::AddKey( const cryptohome::AccountIdentifier& account_id, const cryptohome::Key& key) { @@ -1274,6 +1291,13 @@ UpdateAuthFactorCallback callback) { ::user_data_auth::UpdateAuthFactorReply reply; ReplyOnReturn auto_reply(&reply, std::move(callback)); + RememberRequest<Operation::kUpdateAuthFactor>(request); + + if (auto error = TakeOperationError(Operation::kUpdateAuthFactor); + error != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { + reply.set_error(error); + return; + } auto error = CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET; auto* session =
diff --git a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h index 82941ba..1ef26c6 100644 --- a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h +++ b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h
@@ -37,6 +37,7 @@ kPreparePersistentVault, kPrepareVaultForMigration, kAddAuthFactor, + kUpdateAuthFactor, kListAuthFactors, kStartMigrateToDircrypto, }; @@ -117,6 +118,9 @@ absl::optional<base::FilePath> GetUserProfileDir( const cryptohome::AccountIdentifier& account_id) const; + // Creates user directories once UserDataDir is available. + void CreatePostponedDirectories(); + // Adds the given key as a fake auth factor to the user (the user must // already exist). void AddKey(const cryptohome::AccountIdentifier& account_id, @@ -298,6 +302,7 @@ FUDAC_OPERATION_TYPES(kPrepareVaultForMigration, PrepareVaultForMigrationRequest); FUDAC_OPERATION_TYPES(kAddAuthFactor, AddAuthFactorRequest); + FUDAC_OPERATION_TYPES(kUpdateAuthFactor, UpdateAuthFactorRequest); FUDAC_OPERATION_TYPES(kListAuthFactors, ListAuthFactorsRequest); FUDAC_OPERATION_TYPES(kStartMigrateToDircrypto, StartMigrateToDircryptoRequest);
diff --git a/chromeos/ash/components/device_activity/device_activity_controller.cc b/chromeos/ash/components/device_activity/device_activity_controller.cc index f59f0e4..0f6b18e9 100644 --- a/chromeos/ash/components/device_activity/device_activity_controller.cc +++ b/chromeos/ash/components/device_activity/device_activity_controller.cc
@@ -223,7 +223,6 @@ DeviceActivityClient::RecordDeviceActivityMethodCalled( DeviceActivityClient::DeviceActivityMethod:: kDeviceActivityControllerDestructor); - DCHECK_EQ(this, g_ash_device_activity_controller); Stop(); g_ash_device_activity_controller = nullptr;
diff --git a/chromeos/ash/components/drivefs/drivefs_pin_manager.h b/chromeos/ash/components/drivefs/drivefs_pin_manager.h index 36ef54f..6302d4e 100644 --- a/chromeos/ash/components/drivefs/drivefs_pin_manager.h +++ b/chromeos/ash/components/drivefs/drivefs_pin_manager.h
@@ -192,7 +192,6 @@ void OnError(const mojom::DriveError& error) override; base::WeakPtr<PinManager> GetWeakPtr() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return weak_ptr_factory_.GetWeakPtr(); } @@ -376,8 +375,7 @@ // cached yet. Files files_to_track_ GUARDED_BY_CONTEXT(sequence_checker_); - base::WeakPtrFactory<PinManager> weak_ptr_factory_ - GUARDED_BY_CONTEXT(sequence_checker_){this}; + base::WeakPtrFactory<PinManager> weak_ptr_factory_{this}; FRIEND_TEST_ALL_PREFIXES(DriveFsPinManagerTest, Add); FRIEND_TEST_ALL_PREFIXES(DriveFsPinManagerTest, Update);
diff --git a/chromeos/ash/components/login/auth/recovery/service_constants.cc b/chromeos/ash/components/login/auth/recovery/service_constants.cc index 964cd6a..b1e95f4 100644 --- a/chromeos/ash/components/login/auth/recovery/service_constants.cc +++ b/chromeos/ash/components/login/auth/recovery/service_constants.cc
@@ -3,6 +3,8 @@ // found in the LICENSE file. #include "chromeos/ash/components/login/auth/recovery/service_constants.h" +#include "ash/constants/ash_switches.h" +#include "base/command_line.h" #include "url/gurl.h" @@ -13,18 +15,37 @@ const char kTestingRecoveryServiceUrl[] = "https://autopush-chromeoslogin-pa.sandbox.googleapis.com"; +const char kRecoveryServiceUrl[] = "https://chromeoslogin-pa.googleapis.com"; + const char kTestingHsmPublicKey[] = "3059301306072a8648ce3d020106082a8648ce3d03010703420004240237734dac9e973653" "3633dc0de71f926d919927e9190aa409a89ffc8fa8b6072516ddc88785ae78de0411357d27" "0b1793859f1d8725911005b4384edcda7f"; -// Hard-coded development ledger info, including the public key, name and key +// -----BEGIN PUBLIC KEY----- +// MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsZOjqidd3MwYuW48GUsGEaP1H0Pj +// b2fKi6u3D3PdTuuao6iFNLbd3STNaiZ9O5F7+KKNieMN9/KsDWCMPKzRQw== +//-----END PUBLIC KEY----- +// Converted from Base64 to hex string. +const char kHsmPublicKey[] = + "3059301306072a8648ce3d020106082a8648ce3d03010703420004b193a3aa275ddccc18b9" + "6e3c194b0611a3f51f43e36f67ca8babb70f73dd4eeb9aa3a88534b6dddd24cd6a267d3b91" + "7bf8a28d89e30df7f2ac0d608c3cacd143"; + +// Hard-coded ledger info, including the public key, name and key // hash. It mirrors the value from the server. constexpr char kDevLedgerName[] = "ChromeOSLedgerOwnerPrototype"; +constexpr char kLedgerName[] = "ChromeOSLedgerOwnerPrototype"; + constexpr uint32_t kDevLedgerPublicKeyHash = 0x960a3b30; +constexpr uint32_t kLedgerPublicKeyHash = 0x5a30b187; + constexpr char kDevLedgerPublicKey[] = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUL2cKW4wHEdyWDjjJktxkijFOKJZ8rflR-Sfb-" "ToowJtLyNOBh6wj0anP4kP4llXK4HMZoJDKy9texKJl2UOog=="; +constexpr char kLedgerPublicKey[] = + "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEW_0IGDyIKy_lA10CIjNV4dy3G1jVLIhabzRLJJ" + "DSD9nesZLv6Pqe0MVRGjncQkCjh4lOwOsOwMbdRaux8R912w=="; const char kEpochSuffix[] = "v1/epoch/1"; const char kMediateSuffix[] = "v1/cryptorecovery"; @@ -33,26 +54,47 @@ const char kRecoveryOAuth2Scope[] = "https://www.googleapis.com/auth/chromeoscryptorecovery"; +bool IsUsingTestEnvironment() { + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + return command_line->HasSwitch( + ash::switches::kCryptohomeRecoveryUseTestEnvironment); +} + GURL GetRecoveryServiceBaseURL() { - return GURL(kTestingRecoveryServiceUrl); + if (IsUsingTestEnvironment()) { + return GURL(kTestingRecoveryServiceUrl); + } + return GURL(kRecoveryServiceUrl); } } // namespace std::string GetRecoveryHsmPublicKey() { - return kTestingHsmPublicKey; + if (IsUsingTestEnvironment()) { + return kTestingHsmPublicKey; + } + return kHsmPublicKey; } std::string GetRecoveryLedgerName() { - return kDevLedgerName; + if (IsUsingTestEnvironment()) { + return kDevLedgerName; + } + return kLedgerName; } std::string GetRecoveryLedgerPublicKey() { - return kDevLedgerPublicKey; + if (IsUsingTestEnvironment()) { + return kDevLedgerPublicKey; + } + return kLedgerPublicKey; } uint32_t GetRecoveryLedgerPublicKeyHash() { - return kDevLedgerPublicKeyHash; + if (IsUsingTestEnvironment()) { + return kDevLedgerPublicKeyHash; + } + return kLedgerPublicKeyHash; } GURL GetRecoveryServiceEpochURL() {
diff --git a/chromeos/ash/components/login/auth/stub_authenticator.cc b/chromeos/ash/components/login/auth/stub_authenticator.cc index 18871271..f7b2e4af 100644 --- a/chromeos/ash/components/login/auth/stub_authenticator.cc +++ b/chromeos/ash/components/login/auth/stub_authenticator.cc
@@ -53,11 +53,6 @@ FROM_HERE, base::BindOnce(&StubAuthenticator::OnAuthFailure, this, AuthFailure(failure_reason_))); break; - case AuthAction::kPasswordChange: - task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&StubAuthenticator::OnPasswordChangeDetected, this)); - break; case AuthAction::kOldEncryption: if (user_context->IsForcingDircrypto()) { task_runner_->PostTask( @@ -94,7 +89,6 @@ AuthFailure(failure_reason_))); break; case AuthAction::kAuthSuccess: - case AuthAction::kPasswordChange: case AuthAction::kOldEncryption: // The distinction between fields other than AuthAction::kAuthFailure // only matter for login. @@ -175,24 +169,18 @@ std::unique_ptr<UserContext> user_context, const std::string& old_password) { if (old_password_ != old_password) { - if (data_recovery_notifier_) - data_recovery_notifier_.Run(DataRecoveryStatus::kRecoveryFailed); task_runner_->PostTask( FROM_HERE, base::BindOnce(&StubAuthenticator::OnPasswordChangeDetected, this)); return; } - if (data_recovery_notifier_) - data_recovery_notifier_.Run(DataRecoveryStatus::kRecovered); task_runner_->PostTask( FROM_HERE, base::BindOnce(&StubAuthenticator::OnAuthSuccess, this)); } void StubAuthenticator::ResyncEncryptedData( std::unique_ptr<UserContext> user_context) { - if (data_recovery_notifier_) - data_recovery_notifier_.Run(DataRecoveryStatus::kResynced); task_runner_->PostTask( FROM_HERE, base::BindOnce(&StubAuthenticator::OnAuthSuccess, this)); }
diff --git a/chromeos/ash/components/login/auth/stub_authenticator.h b/chromeos/ash/components/login/auth/stub_authenticator.h index 99e8e13a..a0d2c98 100644 --- a/chromeos/ash/components/login/auth/stub_authenticator.h +++ b/chromeos/ash/components/login/auth/stub_authenticator.h
@@ -25,15 +25,6 @@ class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_LOGIN_AUTH) StubAuthenticator : public Authenticator { public: - enum class DataRecoveryStatus { - kNone, - kRecovered, - kRecoveryFailed, - kResynced - }; - using DataRecoveryNotifier = - base::RepeatingCallback<void(DataRecoveryStatus status)>; - StubAuthenticator(AuthStatusConsumer* consumer, const UserContext& expected_user_context); @@ -64,12 +55,7 @@ private: friend class StubAuthenticatorBuilder; - enum class AuthAction { - kAuthSuccess, - kAuthFailure, - kPasswordChange, - kOldEncryption - }; + enum class AuthAction { kAuthSuccess, kAuthFailure, kOldEncryption }; // Returns a copy of expected_user_context_ with a transformed key. UserContext ExpectedUserContextWithTransformedKey() const; @@ -86,10 +72,6 @@ // For password change requests - the old user password. std::string old_password_; - // If set, the callback that will be called as authenticator handles user - // encrypted data recovery during password change flow. - DataRecoveryNotifier data_recovery_notifier_; - // For requests that detect old encryption - whether there is an incomplete // encryption migration attempt. bool has_incomplete_encryption_migration_ = false;
diff --git a/chromeos/ash/components/login/auth/stub_authenticator_builder.cc b/chromeos/ash/components/login/auth/stub_authenticator_builder.cc index c42d1683d..8d8be30a 100644 --- a/chromeos/ash/components/login/auth/stub_authenticator_builder.cc +++ b/chromeos/ash/components/login/auth/stub_authenticator_builder.cc
@@ -17,10 +17,6 @@ scoped_refptr<StubAuthenticator> authenticator = new StubAuthenticator(consumer, expected_user_context_); authenticator->auth_action_ = auth_action_; - if (auth_action_ == StubAuthenticator::AuthAction::kPasswordChange) - authenticator->old_password_ = old_password_; - if (data_recovery_notifier_) - authenticator->data_recovery_notifier_ = data_recovery_notifier_; authenticator->has_incomplete_encryption_migration_ = has_incomplete_encryption_migration_; if (auth_action_ == StubAuthenticator::AuthAction::kAuthFailure) @@ -28,15 +24,6 @@ return authenticator; } -void StubAuthenticatorBuilder::SetUpPasswordChange( - const std::string& old_password, - const StubAuthenticator::DataRecoveryNotifier& notifier) { - DCHECK_EQ(auth_action_, StubAuthenticator::AuthAction::kAuthSuccess); - auth_action_ = StubAuthenticator::AuthAction::kPasswordChange; - old_password_ = old_password; - data_recovery_notifier_ = notifier; -} - void StubAuthenticatorBuilder::SetUpOldEncryption( bool has_incomplete_migration) { DCHECK_EQ(auth_action_, StubAuthenticator::AuthAction::kAuthSuccess);
diff --git a/chromeos/ash/components/login/auth/stub_authenticator_builder.h b/chromeos/ash/components/login/auth/stub_authenticator_builder.h index 9dccc5e..ef9161ca 100644 --- a/chromeos/ash/components/login/auth/stub_authenticator_builder.h +++ b/chromeos/ash/components/login/auth/stub_authenticator_builder.h
@@ -31,16 +31,6 @@ scoped_refptr<Authenticator> Create(AuthStatusConsumer* consumer); - // Sets up the stub Authenticator to report password changed. - // |old_password| - the expected old user password. The authenticator will use - // it to handle data migration requests (it will report failure if the - // provided old password does not match this one). - // |notifier| - can be empty. If set called when a user data recovery is - // attempted. - void SetUpPasswordChange( - const std::string& old_password, - const StubAuthenticator::DataRecoveryNotifier& notifier); - // Sets up the stub Authenticator to report that user's cryptohome was // encrypted using old encryption method, and should be migrated accordingly. // |has_incomplete_migration| - whether a migration was attempted but did not @@ -60,9 +50,6 @@ // For kPasswordChange action, the old user password. std::string old_password_; - // For kPasswordChange action, the callback to be called to report user data - // recovery result. - StubAuthenticator::DataRecoveryNotifier data_recovery_notifier_; // For kOldEncryption action - whether an incomplete migration // attempt exists.
diff --git a/chromeos/ash/services/ime/public/cpp/assistive_suggestions.h b/chromeos/ash/services/ime/public/cpp/assistive_suggestions.h index 5c7bfe9f..bcf267b 100644 --- a/chromeos/ash/services/ime/public/cpp/assistive_suggestions.h +++ b/chromeos/ash/services/ime/public/cpp/assistive_suggestions.h
@@ -58,6 +58,7 @@ kGrammarSuggestion, kMultiWordSuggestion, kLongpressDiacriticsSuggestion, + kLearnMore, }; // Represents the current state of suggestions in the assistive window.
diff --git a/chromeos/crosapi/mojom/test_controller.mojom b/chromeos/crosapi/mojom/test_controller.mojom index 96a9745..3c49674e 100644 --- a/chromeos/crosapi/mojom/test_controller.mojom +++ b/chromeos/crosapi/mojom/test_controller.mojom
@@ -49,8 +49,8 @@ // Implemented in lacros-chrome. // Lets the Ash browser tests that require Lacros to send commands to this // lacros-chrome instance. -// Next version: 4 -// Next method id: 4 +// Next version: 6 +// Next method id: 6 [Stable, Uuid="20e7f031-f4e1-4ad9-bd91-ad59eb8b1504"] interface StandaloneBrowserTestController { // Installs a test web app in lacros-chrome given a start URL and mode (open @@ -75,6 +75,12 @@ [MinVersion=4] TtsSpeak@4(TtsUtterance utterance, pending_remote<TtsUtteranceClient> utterance_client); + + // Installs an app with the given start url as a sub app of the given parent + // app in Lacros. + [MinVersion=5] + InstallSubApp@5(string parent_app_id, string sub_app_start_url) + => (string sub_app_id); }; // Allows callers running in lacros to trigger test events that are passed to
diff --git a/chromeos/crosapi/mojom/web_app_service.mojom b/chromeos/crosapi/mojom/web_app_service.mojom index a094b4a..5568ea5 100644 --- a/chromeos/crosapi/mojom/web_app_service.mojom +++ b/chromeos/crosapi/mojom/web_app_service.mojom
@@ -29,8 +29,8 @@ // Implemented in lacros-chrome. Allows ash-chrome to modify web app state in // lacros-chrome. -// Next version: 3 -// Next method id: 4 +// Next version: 4 +// Next method id: 5 [Stable, Uuid="84eb46eb-76fe-439c-9fcb-3388492e141d"] interface WebAppProviderBridge { // Called when a web app described by |info| is installed in ARC (Android @@ -56,6 +56,10 @@ // Installs Microsoft 365 web app in Lacros. [MinVersion=2] InstallMicrosoft365@3() => (WebAppInstallResultCode install_result); + + // Returns the ids of all the sub-apps of the given app. + [MinVersion=3] + GetSubAppIds@4(string app_id) => (array<string> sub_apps); }; // An interface implemented in ash-chrome. Allows lacros-chrome:
diff --git a/chromeos/strings/chromeos_strings_af.xtb b/chromeos/strings/chromeos_strings_af.xtb index 9ff0cc7..7e01aee9 100644 --- a/chromeos/strings/chromeos_strings_af.xtb +++ b/chromeos/strings/chromeos_strings_af.xtb
@@ -520,6 +520,7 @@ <translation id="576835345334454681">Verhoog skermhelderheid</translation> <translation id="57838592816432529">Demp</translation> <translation id="5784136236926853061">Hoë HTTP-traagheid</translation> +<translation id="5826644637650799838">Meer oor die kuns</translation> <translation id="5832805196449965646">Voeg persoon by</translation> <translation id="583281660410589416">Onbekend</translation> <translation id="5843706793424741864">Fahrenheit</translation>
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb index 281be13..a9267ce 100644 --- a/chromeos/strings/chromeos_strings_ar.xtb +++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -520,6 +520,7 @@ <translation id="576835345334454681">زيادة سطوع الشاشة</translation> <translation id="57838592816432529">كتم الصوت</translation> <translation id="5784136236926853061">وقت استجابة بروتوكول HTTP طويل.</translation> +<translation id="5826644637650799838">لمحة عن العمل الفني</translation> <translation id="5832805196449965646">إضافة شخص</translation> <translation id="583281660410589416">غير معروف</translation> <translation id="5843706793424741864">فهرنهايت</translation>
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb index 8f11946..94e5319 100644 --- a/chromeos/strings/chromeos_strings_it.xtb +++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -347,7 +347,7 @@ <translation id="4258281355379922695">Latenza HTTP</translation> <translation id="4271957103967917607">Visualizza a schermo intero</translation> <translation id="4289540628985791613">Panoramica</translation> -<translation id="4289849978083912975">Slideshow</translation> +<translation id="4289849978083912975">Presentazione</translation> <translation id="4297501883039923494">Operazione interrotta - Errore sconosciuto</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> immagini</translation> <translation id="4311195029067684288">Completo</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb index 75b3f6d..a7d8e35 100644 --- a/chromeos/strings/chromeos_strings_ka.xtb +++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -520,6 +520,7 @@ <translation id="576835345334454681">ეკრანის სიკაშკაშის მომატება</translation> <translation id="57838592816432529">დადუმება</translation> <translation id="5784136236926853061">HTTP რეაგირების დრო დიდია</translation> +<translation id="5826644637650799838">ხელოვნების შესახებ</translation> <translation id="5832805196449965646">მომხმარებლის დამატება</translation> <translation id="583281660410589416">უცნობი</translation> <translation id="5843706793424741864">ფარენჰაიტი</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb index 362d594..ab91d5f 100644 --- a/chromeos/strings/chromeos_strings_kk.xtb +++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -520,6 +520,7 @@ <translation id="576835345334454681">Дисплей жарықтығын арттыру</translation> <translation id="57838592816432529">Дыбысын өшіру</translation> <translation id="5784136236926853061">HTTP кідірісі жоғары.</translation> +<translation id="5826644637650799838">Өнер туралы</translation> <translation id="5832805196449965646">Адам қосу</translation> <translation id="583281660410589416">Белгісіз</translation> <translation id="5843706793424741864">Фаренгейт</translation>
diff --git a/chromeos/strings/chromeos_strings_km.xtb b/chromeos/strings/chromeos_strings_km.xtb index 6a2f3b15..efb94d18a 100644 --- a/chromeos/strings/chromeos_strings_km.xtb +++ b/chromeos/strings/chromeos_strings_km.xtb
@@ -520,6 +520,7 @@ <translation id="576835345334454681">គ្រាប់ចុចព្រួញឡើងលើសម្រាប់បង្កើនពន្លឺផ្ទាំងអេក្រង់</translation> <translation id="57838592816432529">បិទសម្លេង</translation> <translation id="5784136236926853061">ការពន្យារ HTTP ខ្ពស់</translation> +<translation id="5826644637650799838">អំពីសិល្បៈ</translation> <translation id="5832805196449965646">បន្ថែមបុគ្គល</translation> <translation id="583281660410589416">មិនស្គាល់</translation> <translation id="5843706793424741864">ហ្វារិនហៃ</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb index dbc8877..fdec4b16 100644 --- a/chromeos/strings/chromeos_strings_kn.xtb +++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -520,6 +520,7 @@ <translation id="576835345334454681">ಡಿಸ್ಪ್ಲೇ ಪ್ರಖರತೆಯನ್ನು ಹೆಚ್ಚಿಸಿ</translation> <translation id="57838592816432529">ಮ್ಯೂಟ್</translation> <translation id="5784136236926853061">ಅಧಿಕ HTTP ವಿಳಂಬ</translation> +<translation id="5826644637650799838">ಕಲೆಯ ಕುರಿತು</translation> <translation id="5832805196449965646">ವ್ಯಕ್ತಿಯನ್ನು ಸೇರಿಸು</translation> <translation id="583281660410589416">ಅಪರಿಚಿತ</translation> <translation id="5843706793424741864">ಫ್ಯಾರನ್ಹೀಟ್</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb index 1fd9e3a..77019c6 100644 --- a/chromeos/strings/chromeos_strings_pl.xtb +++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -520,6 +520,7 @@ <translation id="576835345334454681">Zwiększ jasność wyświetlacza</translation> <translation id="57838592816432529">Wycisz</translation> <translation id="5784136236926853061">Duże opóźnienie HTTP</translation> +<translation id="5826644637650799838">Informacje o grafice</translation> <translation id="5832805196449965646">Dodaj osobę</translation> <translation id="583281660410589416">Nieznany</translation> <translation id="5843706793424741864">Stopnie Fahrenheita</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb index 63d6086..3531fc2 100644 --- a/chromeos/strings/chromeos_strings_ro.xtb +++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -520,6 +520,7 @@ <translation id="576835345334454681">Creșterea luminozității ecranului</translation> <translation id="57838592816432529">Dezactivează sunetul</translation> <translation id="5784136236926853061">Latență mare a solicitărilor HTTP</translation> +<translation id="5826644637650799838">Despre lucrarea de artă</translation> <translation id="5832805196449965646">Adăugați un utilizator</translation> <translation id="583281660410589416">Necunoscut</translation> <translation id="5843706793424741864">Fahrenheit</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb index 97e5370e..d7dd26b 100644 --- a/chromeos/strings/chromeos_strings_sl.xtb +++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -520,6 +520,7 @@ <translation id="576835345334454681">Povečanje svetlosti zaslona</translation> <translation id="57838592816432529">Izklopi zvok</translation> <translation id="5784136236926853061">Velika zakasnitev HTTP</translation> +<translation id="5826644637650799838">O likovnem izdelku</translation> <translation id="5832805196449965646">Dodaj osebo</translation> <translation id="583281660410589416">Neznano</translation> <translation id="5843706793424741864">Fahrenheit</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb index 0ceda83..5840e040 100644 --- a/chromeos/strings/chromeos_strings_tr.xtb +++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -520,6 +520,7 @@ <translation id="576835345334454681">Ekran parlaklığını artır</translation> <translation id="57838592816432529">Sesi kapat</translation> <translation id="5784136236926853061">Yüksek HTTP gecikmesi</translation> +<translation id="5826644637650799838">Eser hakkında</translation> <translation id="5832805196449965646">Kişi Ekle</translation> <translation id="583281660410589416">Bilinmiyor</translation> <translation id="5843706793424741864">Fahrenhayt</translation>
diff --git a/components/autofill/core/browser/autofill_browser_util.cc b/components/autofill/core/browser/autofill_browser_util.cc index d2647a17..eee1871 100644 --- a/components/autofill/core/browser/autofill_browser_util.cc +++ b/components/autofill/core/browser/autofill_browser_util.cc
@@ -32,6 +32,12 @@ (form.action.is_valid() && form.action.SchemeIs("http")); } +bool IsFormOrClientNonSecure(const AutofillClient* client, + const FormStructure& form) { + return !client->IsContextSecure() || + (form.target_url().is_valid() && form.target_url().SchemeIs("http")); +} + bool IsFormMixedContent(const AutofillClient* client, const FormData& form) { return client->IsContextSecure() && (form.action.is_valid() && IsInsecureFormAction(form.action));
diff --git a/components/autofill/core/browser/autofill_browser_util.h b/components/autofill/core/browser/autofill_browser_util.h index 84158fc..635246aa 100644 --- a/components/autofill/core/browser/autofill_browser_util.h +++ b/components/autofill/core/browser/autofill_browser_util.h
@@ -18,6 +18,10 @@ bool IsFormOrClientNonSecure(const AutofillClient* client, const FormData& form); +// Checks whether a given form is considered insecure (by origin or action). +bool IsFormOrClientNonSecure(const AutofillClient* client, + const FormStructure& form); + // Checks whether a given form is considered mixed content. A form is mixed // content if is displayed on a secure context, but submits to an insecure one. bool IsFormMixedContent(const AutofillClient* client, const FormData& form);
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc index f3e4531..c0e95771 100644 --- a/components/autofill/core/browser/form_structure.cc +++ b/components/autofill/core/browser/form_structure.cc
@@ -5,6 +5,7 @@ #include "components/autofill/core/browser/form_structure.h" #include <stdint.h> +#include <utility> #include <algorithm> #include <deque> @@ -1475,19 +1476,28 @@ NOTREACHED(); return nullptr; } - return fields_[index].get(); } AutofillField* FormStructure::field(size_t index) { - return const_cast<AutofillField*>( - static_cast<const FormStructure*>(this)->field(index)); + return const_cast<AutofillField*>(std::as_const(*this).field(index)); } size_t FormStructure::field_count() const { return fields_.size(); } +const AutofillField* FormStructure::GetFieldById(FieldGlobalId field_id) const { + auto it = base::ranges::find( + fields_, field_id, [](const auto& field) { return field->global_id(); }); + return it != fields_.end() ? it->get() : nullptr; +} + +AutofillField* FormStructure::GetFieldById(FieldGlobalId field_id) { + return const_cast<AutofillField*>( + std::as_const(*this).GetFieldById(field_id)); +} + size_t FormStructure::active_field_count() const { return active_field_count_; }
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h index d738c82..138aa899 100644 --- a/components/autofill/core/browser/form_structure.h +++ b/components/autofill/core/browser/form_structure.h
@@ -317,6 +317,9 @@ AutofillField* field(size_t index); size_t field_count() const; + const AutofillField* GetFieldById(FieldGlobalId field_id) const; + AutofillField* GetFieldById(FieldGlobalId field_id); + // Returns the number of fields that are part of the form signature and that // are included in queries to the Autofill server. size_t active_field_count() const;
diff --git a/components/autofill/core/browser/touch_to_fill_delegate_impl.cc b/components/autofill/core/browser/touch_to_fill_delegate_impl.cc index 77b944d..9d0d67d2 100644 --- a/components/autofill/core/browser/touch_to_fill_delegate_impl.cc +++ b/components/autofill/core/browser/touch_to_fill_delegate_impl.cc
@@ -17,6 +17,18 @@ namespace autofill { +TouchToFillDelegateImpl::DryRunResult::DryRunResult( + TriggerOutcome outcome, + std::vector<CreditCard*> cards_to_suggest) + : outcome(outcome), cards_to_suggest(std::move(cards_to_suggest)) {} + +TouchToFillDelegateImpl::DryRunResult::DryRunResult(DryRunResult&&) = default; + +TouchToFillDelegateImpl::DryRunResult& +TouchToFillDelegateImpl::DryRunResult::operator=(DryRunResult&&) = default; + +TouchToFillDelegateImpl::DryRunResult::~DryRunResult() = default; + TouchToFillDelegateImpl::TouchToFillDelegateImpl( BrowserAutofillManager* manager) : manager_(manager) { @@ -29,6 +41,71 @@ HideTouchToFill(); } +TouchToFillDelegateImpl::DryRunResult TouchToFillDelegateImpl::DryRun( + FormGlobalId form_id, + FieldGlobalId field_id) { + // Trigger only on supported platforms. + if (!manager_->client()->IsTouchToFillCreditCardSupported()) { + return {TriggerOutcome::kUnsupportedFieldType, {}}; + } + const FormStructure* form = manager_->FindCachedFormById(form_id); + if (!form) { + return {TriggerOutcome::kUnknownForm, {}}; + } + const AutofillField* field = form->GetFieldById(field_id); + if (!field) { + return {TriggerOutcome::kUnknownField, {}}; + } + // Trigger only for a credit card field/form. + if (field->Type().group() != FieldTypeGroup::kCreditCard) { + return {TriggerOutcome::kUnsupportedFieldType, {}}; + } + + // Trigger only for complete forms (contining the fields for the card number + // and the card expiration date). + if (!FormHasAllCreditCardFields(*form)) { + return {TriggerOutcome::kIncompleteForm, {}}; + } + // Trigger only if not shown before. + if (ttf_credit_card_state_ != TouchToFillState::kShouldShow) { + return {TriggerOutcome::kShownBefore, {}}; + } + // Trigger only if the client and the form are not insecure. + if (IsFormOrClientNonSecure(manager_->client(), *form)) { + return {TriggerOutcome::kFormOrClientNotSecure, {}}; + } + // Trigger only on focusable empty field. + // TODO(crbug.com/1331312): This should be the field's *current* value, not + // the original value. + if (!field->IsFocusable() || !SanitizedFieldIsEmpty(field->value)) { + return {TriggerOutcome::kFieldNotEmptyOrNotFocusable, {}}; + } + + // Trigger only if there is at least 1 complete valid credit card on file. + // Complete = contains number, expiration date and name on card. + // Valid = unexpired with valid number format. + std::vector<CreditCard*> cards_to_suggest = + AutofillSuggestionGenerator::GetOrderedCardsToSuggest( + manager_->client(), /*suppress_disused_cards=*/true); + if (base::ranges::none_of(cards_to_suggest, + &CreditCard::IsCompleteValidCard)) { + return {TriggerOutcome::kNoValidCards, {}}; + } + // Trigger only if the UI is available. + if (!manager_->CanShowAutofillUi()) { + return {TriggerOutcome::kCannotShowAutofillUi, {}}; + } + return {TriggerOutcome::kShown, std::move(cards_to_suggest)}; +} + +void TouchToFillDelegateImpl::SetShouldSuppressKeyboard(bool suppress) { + if (keyboard_is_suppressed_ == suppress) { + return; + } + manager_->SetShouldSuppressKeyboard(suppress); + keyboard_is_suppressed_ = suppress; +} + bool TouchToFillDelegateImpl::TryToShowTouchToFill(const FormData& form, const FormFieldData& field) { // TODO(crbug.com/1386143): store only FormGlobalId and FieldGlobalId instead @@ -36,61 +113,22 @@ // bottomsheet being open. query_form_ = form; query_field_ = field; - // Trigger only for a credit card field/form. - if (manager_->GetPopupType(form, field) != PopupType::kCreditCards) - return false; - // Trigger only on supported platforms. - if (!manager_->client()->IsTouchToFillCreditCardSupported()) - return false; - - TriggerOutcome outcome = TriggerOutcome::kShown; - // Trigger only for complete forms (contining the fields for the card number - // and the card expiration date). - FormStructure* form_structure = - manager_->FindCachedFormById(form.global_id()); - if (form_structure && !FormHasAllCreditCardFields(*form_structure)) { - outcome = TriggerOutcome::kIncompleteForm; + DryRunResult dry_run = DryRun(form.global_id(), field.global_id()); + if (dry_run.outcome == TriggerOutcome::kShown) { + SetShouldSuppressKeyboard(true); + if (manager_->client()->ShowTouchToFillCreditCard( + GetWeakPtr(), std::move(dry_run.cards_to_suggest))) { + // Success. + } else { + dry_run.outcome = TriggerOutcome::kFailedToDisplayBottomSheet; + } } - // Trigger only if not shown before. - if (ttf_credit_card_state_ != TouchToFillState::kShouldShow) { - outcome = TriggerOutcome::kShownBefore; + if (dry_run.outcome != TriggerOutcome::kUnsupportedFieldType) { + base::UmaHistogramEnumeration(kUmaTouchToFillCreditCardTriggerOutcome, + dry_run.outcome); } - // Trigger only if the client and the form are not insecure. - if (IsFormOrClientNonSecure(manager_->client(), form)) { - outcome = TriggerOutcome::kFormOrClientNotSecure; - } - // Trigger only on focusable empty field. - if (!field.is_focusable || !SanitizedFieldIsEmpty(field.value)) { - outcome = TriggerOutcome::kFieldNotEmptyOrNotFocusable; - } - // Trigger only if there is at least 1 complete valid credit card on file. - // Complete = contains number, expiration date and name on card. - // Valid = unexpired with valid number format. - PersonalDataManager* pdm = manager_->client()->GetPersonalDataManager(); - DCHECK(pdm); - std::vector<CreditCard*> cards_to_suggest = - AutofillSuggestionGenerator::GetOrderedCardsToSuggest( - manager_->client(), /*suppress_disused_cards=*/true); - - // Not showing the sheet if all the cards are incomplete or invalid. - if (base::ranges::none_of(cards_to_suggest, - &CreditCard::IsCompleteValidCard)) { - outcome = TriggerOutcome::kNoValidCards; - } - // Trigger only if the UI is available. - if (!manager_->CanShowAutofillUi()) { - outcome = TriggerOutcome::kCannotShowAutofillUi; - } - // Finally try showing the surface - if (outcome == TriggerOutcome::kShown && - !manager_->client()->ShowTouchToFillCreditCard( - GetWeakPtr(), std::move(cards_to_suggest))) { - outcome = TriggerOutcome::kFailedToDisplayBottomSheet; - } - base::UmaHistogramEnumeration(kUmaTouchToFillCreditCardTriggerOutcome, - outcome); - // Return if didn't show the sheet - if (outcome != TriggerOutcome::kShown) { + if (dry_run.outcome != TriggerOutcome::kShown) { + SetShouldSuppressKeyboard(false); return false; } @@ -98,7 +136,6 @@ manager_->client()->HideAutofillPopup( PopupHidingReason::kOverlappingWithTouchToFillSurface); manager_->DidShowSuggestions(/*has_autofill_suggestions=*/true, form, field); - return true; } @@ -163,6 +200,7 @@ } void TouchToFillDelegateImpl::OnDismissed(bool dismissed_by_user) { + SetShouldSuppressKeyboard(false); if (IsShowingTouchToFill()) { ttf_credit_card_state_ = TouchToFillState::kWasShown; dismissed_by_user_ = dismissed_by_user;
diff --git a/components/autofill/core/browser/touch_to_fill_delegate_impl.h b/components/autofill/core/browser/touch_to_fill_delegate_impl.h index f713894..a690c42 100644 --- a/components/autofill/core/browser/touch_to_fill_delegate_impl.h +++ b/components/autofill/core/browser/touch_to_fill_delegate_impl.h
@@ -42,7 +42,14 @@ kFailedToDisplayBottomSheet = 6, // The sheet was not shown because the payment form was incomplete. kIncompleteForm = 7, - kMaxValue = kIncompleteForm + // The form or field is not known to the form cache. + kUnknownForm = 8, + // The form is known to the form cache, but it doesn't contain the field. + kUnknownField = 9, + // TouchToFill is not supported for this field type. This value is not logged + // to UMA. + kUnsupportedFieldType = 9, + kMaxValue = kUnsupportedFieldType }; constexpr const char kUmaTouchToFillCreditCardTriggerOutcome[] = @@ -106,6 +113,30 @@ using TriggerOutcome = TouchToFillCreditCardTriggerOutcome; + struct DryRunResult { + DryRunResult(TriggerOutcome outcome, + std::vector<CreditCard*> cards_to_suggest); + DryRunResult(DryRunResult&&); + DryRunResult& operator=(DryRunResult&&); + ~DryRunResult(); + + TriggerOutcome outcome; + std::vector<CreditCard*> cards_to_suggest; + }; + + // Checks all preconditions for showing the TTF, that is, for calling + // AutofillClient::ShowTouchToFillCreditCard(). + // + // If the DryRunResult::outcome is TriggerOutcome::kShow, the + // DryRun::cards_to_suggest contains the cards; otherwise it is empty. + DryRunResult DryRun(FormGlobalId form_id, FieldGlobalId field_id); + + // Sets whether or not to suppress the on-screen keyboard in following + // requests that would usually display the keyboard. + // + // No-op if `suppress` if the previous call had the same value as `suppress`. + void SetShouldSuppressKeyboard(bool suppress); + bool HasAnyAutofilledFields(const FormStructure& submitted_form) const; // The form is considered perfectly filled if all non-empty fields are @@ -119,6 +150,7 @@ TouchToFillState ttf_credit_card_state_ = TouchToFillState::kShouldShow; const raw_ptr<BrowserAutofillManager> manager_; + bool keyboard_is_suppressed_ = false; FormData query_form_; FormFieldData query_field_; bool dismissed_by_user_;
diff --git a/components/autofill/core/browser/touch_to_fill_delegate_impl_unittest.cc b/components/autofill/core/browser/touch_to_fill_delegate_impl_unittest.cc index 73e630f68..8599788 100644 --- a/components/autofill/core/browser/touch_to_fill_delegate_impl_unittest.cc +++ b/components/autofill/core/browser/touch_to_fill_delegate_impl_unittest.cc
@@ -9,6 +9,7 @@ #include "components/autofill/core/browser/data_model/credit_card.h" #include "components/autofill/core/browser/form_structure.h" #include "components/autofill/core/browser/test_autofill_client.h" +#include "components/autofill/core/browser/test_autofill_clock.h" #include "components/autofill/core/browser/test_autofill_driver.h" #include "components/autofill/core/browser/test_browser_autofill_manager.h" #include "components/autofill/core/common/autofill_clock.h" @@ -125,7 +126,6 @@ std::move(touch_to_fill_delegate)); // Default setup for successful `TryToShowTouchToFill`. - field_.is_focusable = true; autofill_client_.GetPersonalDataManager()->AddCreditCard( test::GetCreditCard()); ON_CALL(*browser_autofill_manager_, GetPopupType(_, _)) @@ -149,7 +149,7 @@ test::CreateTestCreditCardFormData(&form_, /*is_https=*/true, /*use_month_type=*/false); - browser_autofill_manager_->OnFormsSeen({form_}, {}); + form_.fields[0].is_focusable = true; } void TryToShowTouchToFill(bool expected_success) { @@ -158,17 +158,20 @@ PopupHidingReason::kOverlappingWithTouchToFillSurface)) .Times(expected_success ? 1 : 0); - EXPECT_EQ(expected_success, - touch_to_fill_delegate_->TryToShowTouchToFill(form_, field_)); + if (!browser_autofill_manager_->FindCachedFormById(form_.global_id())) { + browser_autofill_manager_->OnFormsSeen({form_}, {}); + } + EXPECT_EQ(expected_success, touch_to_fill_delegate_->TryToShowTouchToFill( + form_, form_.fields[0])); EXPECT_EQ(expected_success, touch_to_fill_delegate_->IsShowingTouchToFill()); } FormData form_; - FormFieldData field_; base::test::TaskEnvironment task_environment_; test::AutofillEnvironment autofill_environment_; + TestAutofillClock test_autofill_clock_{AutofillClock::Now()}; NiceMock<MockAutofillClient> autofill_client_; std::unique_ptr<TestAutofillDriver> autofill_driver_; std::unique_ptr<MockBrowserAutofillManager> browser_autofill_manager_; @@ -188,22 +191,23 @@ TEST_F(TouchToFillDelegateImplUnitTest, TryToShowTouchToFillFailsIfNotCreditCardField) { + { + FormFieldData field; + test::CreateTestFormField("Arbitrary", "arbitrary", "", "text", &field); + form_.fields.insert(form_.fields.begin(), field); + } ASSERT_FALSE(touch_to_fill_delegate_->IsShowingTouchToFill()); - EXPECT_CALL(*browser_autofill_manager_, GetPopupType(Ref(form_), Ref(field_))) - .WillOnce(Return(PopupType::kAddresses)); TryToShowTouchToFill(/*expected_success=*/false); } TEST_F(TouchToFillDelegateImplUnitTest, TryToShowTouchToFillFailsForIncompleteForm) { - form_.fields.clear(); - FormFieldData field; - test::CreateTestFormField("Card Number", "cardnumber", "", "text", &field); - form_.fields.push_back(field); - - browser_autofill_manager_->OnFormsSeen({form_}, {}); - + // Erase expiration month and expiration year fields. + ASSERT_EQ(form_.fields[2].name, u"ccmonth"); + form_.fields.erase(form_.fields.begin() + 2); + ASSERT_EQ(form_.fields[2].name, u"ccyear"); + form_.fields.erase(form_.fields.begin() + 2); ASSERT_FALSE(touch_to_fill_delegate_->IsShowingTouchToFill()); TryToShowTouchToFill(/*expected_success=*/false); @@ -228,8 +232,6 @@ test::CreateTestCreditCardFormData(&form_, /*is_https=*/false, /*use_month_type=*/false); - browser_autofill_manager_->OnFormsSeen({form_}, {}); - ASSERT_FALSE(touch_to_fill_delegate_->IsShowingTouchToFill()); TryToShowTouchToFill(/*expected_success=*/false); @@ -253,15 +255,27 @@ } TEST_F(TouchToFillDelegateImplUnitTest, - TryToShowTouchToFillFailsIfAlreadyShown) { + TryToShowTouchToFillFailsIfShownBefore) { + TryToShowTouchToFill(/*expected_success=*/true); + touch_to_fill_delegate_->OnDismissed(/*dismissed_by_user=*/true); + + EXPECT_CALL( + autofill_client_, + HideAutofillPopup(PopupHidingReason::kOverlappingWithTouchToFillSurface)) + .Times(0); + TryToShowTouchToFill(/*expected_success=*/false); +} + +TEST_F(TouchToFillDelegateImplUnitTest, + TryToShowTouchToFillFailsIfShownCurrently) { TryToShowTouchToFill(/*expected_success=*/true); EXPECT_CALL( autofill_client_, HideAutofillPopup(PopupHidingReason::kOverlappingWithTouchToFillSurface)) .Times(0); - EXPECT_FALSE(touch_to_fill_delegate_->TryToShowTouchToFill(form_, field_)); - EXPECT_TRUE(touch_to_fill_delegate_->IsShowingTouchToFill()); + EXPECT_FALSE( + touch_to_fill_delegate_->TryToShowTouchToFill(form_, form_.fields[0])); } TEST_F(TouchToFillDelegateImplUnitTest, TryToShowTouchToFillFailsIfWasShown) { @@ -277,7 +291,7 @@ TEST_F(TouchToFillDelegateImplUnitTest, TryToShowTouchToFillFailsIfFieldIsNotFocusable) { ASSERT_FALSE(touch_to_fill_delegate_->IsShowingTouchToFill()); - field_.is_focusable = false; + form_.fields[0].is_focusable = false; TryToShowTouchToFill(/*expected_success=*/false); histogram_tester_.ExpectUniqueSample( @@ -288,15 +302,17 @@ TEST_F(TouchToFillDelegateImplUnitTest, TryToShowTouchToFillFailsIfFieldHasValue) { ASSERT_FALSE(touch_to_fill_delegate_->IsShowingTouchToFill()); - field_.value = u"Initial value"; + form_.fields[0].value = u"Initial value"; TryToShowTouchToFill(/*expected_success=*/false); histogram_tester_.ExpectUniqueSample( kUmaTouchToFillCreditCardTriggerOutcome, TouchToFillCreditCardTriggerOutcome::kFieldNotEmptyOrNotFocusable, 1); +} - // But should ignore formatting characters. - field_.value = u"____-____-____-____"; +TEST_F(TouchToFillDelegateImplUnitTest, + TryToShowTouchToFillToleratesFormattingCharacters) { + form_.fields[0].value = u"____-____-____-____"; TryToShowTouchToFill(/*expected_success=*/true); histogram_tester_.ExpectBucketCount( @@ -431,14 +447,15 @@ TryToShowTouchToFillDoesNotShowDisusedExpiredCards) { autofill_client_.GetPersonalDataManager()->ClearCreditCards(); CreditCard credit_card = autofill::test::GetCreditCard(); - credit_card.set_use_date(AutofillClock::Now()); CreditCard disused_expired_card = test::GetExpiredCreditCard(); - const base::Time last_used = - AutofillClock::Now() - kDisusedDataModelTimeDelta * 2; - disused_expired_card.set_use_date(last_used); + disused_expired_card.set_use_date(AutofillClock::Now()); + test_autofill_clock_.Advance(kDisusedDataModelTimeDelta * 2); + credit_card.set_use_date(AutofillClock::Now()); autofill_client_.GetPersonalDataManager()->AddCreditCard(credit_card); autofill_client_.GetPersonalDataManager()->AddCreditCard( disused_expired_card); + ASSERT_TRUE(credit_card.IsCompleteValidCard()); + ASSERT_FALSE(disused_expired_card.IsCompleteValidCard()); ASSERT_FALSE(touch_to_fill_delegate_->IsShowingTouchToFill()); EXPECT_CALL(autofill_client_, ShowTouchToFillCreditCard(_, ElementsAre(Pointee(credit_card))));
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc index 204a256..f2dd8e82 100644 --- a/components/autofill/core/browser/webdata/autofill_table.cc +++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -3421,8 +3421,11 @@ } bool AutofillTable::MigrateToVersion110AddInitialCreatorIdAndLastModifierId() { + if (!db_->DoesTableExist(kContactInfoTable)) { + return false; + } sql::Transaction transaction(db_); - return db_->DoesTableExist(kContactInfoTable) && transaction.Begin() && + return transaction.Begin() && AddColumnIfNotExists(db_, kContactInfoTable, kInitialCreatorId, "INTEGER DEFAULT 0") && AddColumnIfNotExists(db_, kContactInfoTable, kLastModifierId,
diff --git a/components/autofill_strings.grdp b/components/autofill_strings.grdp index 4a57ab2..50bcc67 100644 --- a/components/autofill_strings.grdp +++ b/components/autofill_strings.grdp
@@ -49,6 +49,9 @@ Remove address from Chromium? </message> </if> + <message name="IDS_AUTOFILL_DELETE_AUTOCOMPLETE_SUGGESTION_TOOLTIP" desc="Tooltip shown when hovering over a small button with a trash-can logo next to an Autocomplete entry in the Autofill popup." translateable="false"> + Remove entry + </message> <message name="IDS_AUTOFILL_CC_AMEX" desc="Full American Express credit card name."> American Express </message>
diff --git a/components/browser_ui/site_settings/android/website_preference_bridge.cc b/components/browser_ui/site_settings/android/website_preference_bridge.cc index 03edb1d..402eca6 100644 --- a/components/browser_ui/site_settings/android/website_preference_bridge.cc +++ b/components/browser_ui/site_settings/android/website_preference_bridge.cc
@@ -504,8 +504,8 @@ const JavaParamRef<jstring>& jobject) { GURL origin(ConvertJavaStringToUTF8(env, jorigin)); DCHECK(origin.is_valid()); - std::unique_ptr<base::Value> object = - base::JSONReader::ReadDeprecated(ConvertJavaStringToUTF8(env, jobject)); + absl::optional<base::Value> object = + base::JSONReader::Read(ConvertJavaStringToUTF8(env, jobject)); DCHECK(object && object->is_dict()); permissions::ObjectPermissionContextBase* context = GetChooserContext( jbrowser_context_handle,
diff --git a/components/browsing_data/core/browsing_data_utils.cc b/components/browsing_data/core/browsing_data_utils.cc index 978da30e1..95c3326 100644 --- a/components/browsing_data/core/browsing_data_utils.cc +++ b/components/browsing_data/core/browsing_data_utils.cc
@@ -11,6 +11,7 @@ #include "base/metrics/user_metrics.h" #include "base/no_destructor.h" #include "base/strings/utf_string_conversions.h" +#include "base/time/time.h" #include "components/browsing_data/core/counters/autofill_counter.h" #include "components/browsing_data/core/counters/history_counter.h" #include "components/browsing_data/core/counters/passwords_counter.h" @@ -53,6 +54,9 @@ base::TimeDelta diff; base::Time delete_begin_time = base::Time::Now(); switch (time_period) { + case TimePeriod::LAST_15_MINUTES: + diff = base::Minutes(15); + break; case TimePeriod::LAST_HOUR: diff = base::Hours(1); break; @@ -82,6 +86,10 @@ void RecordDeletionForPeriod(TimePeriod period) { switch (period) { + case TimePeriod::LAST_15_MINUTES: + base::RecordAction( + base::UserMetricsAction("ClearBrowsingData_Last15Minutes")); + break; case TimePeriod::LAST_HOUR: base::RecordAction(base::UserMetricsAction("ClearBrowsingData_LastHour")); break; @@ -108,6 +116,10 @@ void RecordTimePeriodChange(TimePeriod period) { switch (period) { + case TimePeriod::LAST_15_MINUTES: + base::RecordAction(base::UserMetricsAction( + "ClearBrowsingData_TimePeriodChanged_Last15Minutes")); + break; case TimePeriod::LAST_HOUR: base::RecordAction(base::UserMetricsAction( "ClearBrowsingData_TimePeriodChanged_LastHour"));
diff --git a/components/browsing_data/core/browsing_data_utils.h b/components/browsing_data/core/browsing_data_utils.h index 5d79675..513ab7f 100644 --- a/components/browsing_data/core/browsing_data_utils.h +++ b/components/browsing_data/core/browsing_data_utils.h
@@ -46,7 +46,8 @@ FOUR_WEEKS, ALL_TIME, OLDER_THAN_30_DAYS, - TIME_PERIOD_LAST = OLDER_THAN_30_DAYS + LAST_15_MINUTES, + TIME_PERIOD_LAST = LAST_15_MINUTES }; // Calculate the begin time for the deletion range specified by |time_period|.
diff --git a/components/components_strings.grd b/components/components_strings.grd index 2751b11..d5b3885 100644 --- a/components/components_strings.grd +++ b/components/components_strings.grd
@@ -500,18 +500,6 @@ <message name="IDS_ACCNAME_TAB_LIST" desc="The accessible name for the tab strip."> Tab list </message> - <message name="IDS_ACCNAME_PARTICLE_DISC" desc="The accessible name for the Account Consistency Disc on New Tab Page"> - Google Account - </message> - <message name="IDS_IDENTITY_DISC_WITH_NAME_AND_EMAIL" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button navigates to 'Sync and Google services' page in settings"> - Signed in as <ph name="USER_NAME">%1$s<ex>Peter Parker</ex></ph>. <ph name="USER_EMAIL">%2$s<ex>peter.parker@gmail.com</ex></ph>. Opens settings. - </message> - <message name="IDS_IDENTITY_DISC_WITH_NAME" desc="The content description for a toolbar button displaying user profile picture, for users who don't have a readable email address. Tapping on this button navigates to 'Sync and Google services' page in settings"> - Signed in as <ph name="USER_NAME">%s<ex>Bruce Wayne</ex></ph>. Opens settings. - </message> - <message name="IDS_SIGNED_OUT_IDENTITY_DISC" desc="The content description for a toolbar button displaying the signed-out avatar. Tapping on this button navigates to 'Turn on Sync' page in settings"> - Signed out. Opens dialog to sign in and turn on sync. - </message> <message name="IDS_UTILITY_PROCESS_JSON_PARSER_NAME" desc="The name of the utility process used for parsing JSON files."> JSON Parser
diff --git a/components/components_strings_grd/IDS_IDENTITY_DISC_WITH_NAME.png.sha1 b/components/components_strings_grd/IDS_IDENTITY_DISC_WITH_NAME.png.sha1 deleted file mode 100644 index a37a4bf1..0000000 --- a/components/components_strings_grd/IDS_IDENTITY_DISC_WITH_NAME.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -2004014b1f780d9d7cc38e3366d47da5d6c4f706 \ No newline at end of file
diff --git a/components/components_strings_grd/IDS_IDENTITY_DISC_WITH_NAME_AND_EMAIL.png.sha1 b/components/components_strings_grd/IDS_IDENTITY_DISC_WITH_NAME_AND_EMAIL.png.sha1 deleted file mode 100644 index a37a4bf1..0000000 --- a/components/components_strings_grd/IDS_IDENTITY_DISC_WITH_NAME_AND_EMAIL.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -2004014b1f780d9d7cc38e3366d47da5d6c4f706 \ No newline at end of file
diff --git a/components/exo/wayland/weston_test.cc b/components/exo/wayland/weston_test.cc index 1efd2bc..28bf1b8 100644 --- a/components/exo/wayland/weston_test.cc +++ b/components/exo/wayland/weston_test.cc
@@ -200,6 +200,42 @@ weston_test_send_pointer_button(resource, BTN_RIGHT, WL_POINTER_BUTTON_STATE_RELEASED); } + + // Reset accelerator states. + if (weston_test->control_pressed) { + base::RunLoop run_loop; + ui_controls::SendKeyEventsNotifyWhenDone( + /*window=*/nullptr, ui::VKEY_CONTROL, ui_controls::kKeyRelease, + run_loop.QuitClosure(), ui_controls::kNoAccelerator); + run_loop.Run(); + weston_test->control_pressed = false; + } + if (weston_test->alt_pressed) { + base::RunLoop run_loop; + ui_controls::SendKeyEventsNotifyWhenDone( + /*window=*/nullptr, ui::VKEY_MENU, ui_controls::kKeyRelease, + run_loop.QuitClosure(), ui_controls::kNoAccelerator); + run_loop.Run(); + weston_test->control_pressed = false; + } + if (weston_test->shift_pressed) { + base::RunLoop run_loop; + ui_controls::SendKeyEventsNotifyWhenDone( + /*window=*/nullptr, ui::VKEY_SHIFT, ui_controls::kKeyRelease, + run_loop.QuitClosure(), ui_controls::kNoAccelerator); + run_loop.Run(); + weston_test->shift_pressed = false; + } + if (weston_test->command_pressed) { + base::RunLoop run_loop; + ui_controls::SendKeyEventsNotifyWhenDone( + /*window=*/nullptr, ui::VKEY_COMMAND, ui_controls::kKeyRelease, + run_loop.QuitClosure(), ui_controls::kNoAccelerator); + run_loop.Run(); + weston_test->command_pressed = false; + } + + // TODO(crbug.com/1414800): Should reset other key events as well. } static void weston_test_send_axis(struct wl_client* client,
diff --git a/components/metrics/structured/mojom/BUILD.gn b/components/metrics/structured/mojom/BUILD.gn index 4eb18def..c15ac1f4 100644 --- a/components/metrics/structured/mojom/BUILD.gn +++ b/components/metrics/structured/mojom/BUILD.gn
@@ -15,6 +15,7 @@ { mojom = "metrics.structured.mojom.Event" cpp = "::metrics::structured::Event" + move_only = true }, ] traits_headers = [ "event_mojom_traits.h" ]
diff --git a/components/password_manager/core/browser/affiliation/affiliation_backend.cc b/components/password_manager/core/browser/affiliation/affiliation_backend.cc index 5fbfa81dd..529bf8c 100644 --- a/components/password_manager/core/browser/affiliation/affiliation_backend.cc +++ b/components/password_manager/core/browser/affiliation/affiliation_backend.cc
@@ -9,7 +9,9 @@ #include <utility> #include <vector> +#include "base/barrier_closure.h" #include "base/functional/bind.h" +#include "base/functional/callback_helpers.h" #include "base/location.h" #include "base/metrics/histogram_macros.h" #include "base/task/sequenced_task_runner.h" @@ -27,6 +29,14 @@ namespace password_manager { +namespace { + +void IgnoreResult(base::OnceClosure callback, const AffiliatedFacets&, bool) { + std::move(callback).Run(); +} + +} // namespace + AffiliationBackend::AffiliationBackend( const scoped_refptr<base::SequencedTaskRunner>& task_runner, base::Clock* time_source, @@ -162,13 +172,42 @@ } std::vector<GroupedFacets> AffiliationBackend::GetAllGroups() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return cache_->GetAllGroups(); } std::vector<std::string> AffiliationBackend::GetPSLExtensions() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return cache_->GetPSLExtensions(); } +void AffiliationBackend::UpdateAffiliationsAndBranding( + const std::vector<FacetURI>& facets, + base::OnceClosure callback) { + TRACE_EVENT0("passwords", + "AffiliationBackend::UpdateAffiliationsAndBranding"); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + // If there is no internet connection we can't do anything. Fail immediately. + if (!throttler_->HasInternetConnection()) { + std::move(callback).Run(); + return; + } + + base::RepeatingClosure pending_fetch_calls = + base::BarrierClosure(facets.size(), std::move(callback)); + + for (const auto& facet_uri : facets) { + // Clear local cache for |facet_uri|. + cache_->DeleteAffiliationsAndBrandingForFacetURI(facet_uri); + FacetManager* facet_manager = GetOrCreateFacetManager(facet_uri); + DCHECK(facet_manager); + facet_manager->GetAffiliationsAndBranding( + StrategyOnCacheMiss::TRY_ONCE_OVER_NETWORK, + base::BindOnce(&IgnoreResult, pending_fetch_calls), task_runner_); + } +} + // static void AffiliationBackend::DeleteCache(const base::FilePath& db_path) { AffiliationDatabase::Delete(db_path); @@ -314,6 +353,8 @@ // Trigger a retry if a fetch is still needed. for (const auto& facet_manager_pair : facet_managers_) { + // Notify all fetchers about failure to finish single attempt fetches. + facet_manager_pair.second->OnFetchFailed(); if (facet_manager_pair.second->DoesRequireFetch()) { throttler_->SignalNetworkRequestNeeded(); return;
diff --git a/components/password_manager/core/browser/affiliation/affiliation_backend.h b/components/password_manager/core/browser/affiliation/affiliation_backend.h index 1972353..761e4b6 100644 --- a/components/password_manager/core/browser/affiliation/affiliation_backend.h +++ b/components/password_manager/core/browser/affiliation/affiliation_backend.h
@@ -96,6 +96,8 @@ void TrimUnusedCache(std::vector<FacetURI> facet_uris); std::vector<GroupedFacets> GetAllGroups() const; std::vector<std::string> GetPSLExtensions() const; + void UpdateAffiliationsAndBranding(const std::vector<FacetURI>& facets, + base::OnceClosure callback); // Deletes the cache database file at |db_path|, and all auxiliary files. The // database must be closed before calling this.
diff --git a/components/password_manager/core/browser/affiliation/affiliation_backend_unittest.cc b/components/password_manager/core/browser/affiliation/affiliation_backend_unittest.cc index c3f8561..ae52685 100644 --- a/components/password_manager/core/browser/affiliation/affiliation_backend_unittest.cc +++ b/components/password_manager/core/browser/affiliation/affiliation_backend_unittest.cc
@@ -10,9 +10,11 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" +#include "base/functional/callback_helpers.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" +#include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/test/test_mock_time_task_runner.h" @@ -22,6 +24,7 @@ #include "components/password_manager/core/browser/affiliation/affiliation_database.h" #include "components/password_manager/core/browser/affiliation/affiliation_fetch_throttler.h" #include "components/password_manager/core/browser/affiliation/affiliation_fetch_throttler_delegate.h" +#include "components/password_manager/core/browser/affiliation/affiliation_utils.h" #include "components/password_manager/core/browser/affiliation/facet_manager.h" #include "components/password_manager/core/browser/affiliation/fake_affiliation_api.h" #include "components/password_manager/core/browser/affiliation/mock_affiliation_consumer.h" @@ -61,8 +64,7 @@ delegate, nullptr, network::TestNetworkConnectionTracker::GetInstance(), - nullptr), - signaled_network_request_needed_(false) { + nullptr) { EXPECT_CALL(*this, OnInformOfNetworkRequestComplete(testing::_)).Times(0); } @@ -104,6 +106,10 @@ signaled_network_request_needed_ = false; } + void SetInternetConnectivity(bool has_connection) { + has_network_connectivity_ = has_connection; + } + private: MOCK_METHOD1(OnInformOfNetworkRequestComplete, void(bool)); @@ -112,12 +118,17 @@ signaled_network_request_needed_ = true; } + bool HasInternetConnection() const override { + return has_network_connectivity_; + } + void InformOfNetworkRequestComplete(bool success) override { OnInformOfNetworkRequestComplete(success); reset_signaled_network_request_needed(); } - bool signaled_network_request_needed_; + bool signaled_network_request_needed_ = false; + bool has_network_connectivity_ = true; }; const char kTestFacetURIAlpha1[] = "https://one.alpha.example.com"; @@ -1007,6 +1018,79 @@ } } +TEST_P(AffiliationBackendTest, UpdateAffiliationsAndBrandingClearsOldCache) { + mock_fetch_throttler()->SetInternetConnectivity(/*has_connection=*/true); + ASSERT_NO_FATAL_FAILURE(PrefetchAndExpectFetch( + FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1), base::Time::Max())); + ASSERT_NO_FATAL_FAILURE(PrefetchAndExpectFetch( + FacetURI::FromCanonicalSpec(kTestFacetURIBeta1), base::Time::Max())); + EXPECT_EQ(2u, GetNumOfEquivalenceClassInDatabase()); + + backend()->UpdateAffiliationsAndBranding( + {FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1), + FacetURI::FromCanonicalSpec(kTestFacetURIBeta1)}, + base::DoNothing()); + EXPECT_EQ(0u, GetNumOfEquivalenceClassInDatabase()); +} + +TEST_P(AffiliationBackendTest, UpdateAffiliationsAndBrandingSuccess) { + mock_fetch_throttler()->SetInternetConnectivity(/*has_connection=*/true); + EXPECT_EQ(0u, GetNumOfEquivalenceClassInDatabase()); + + std::vector<FacetURI> facets = { + FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1), + FacetURI::FromCanonicalSpec(kTestFacetURIBeta1)}; + + base::MockOnceClosure completion_callback; + + backend()->UpdateAffiliationsAndBranding(facets, completion_callback.Get()); + ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent()); + ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(facets)); + + // Expect completion callback. + EXPECT_CALL(completion_callback, Run); + backend_task_runner()->RunUntilIdle(); + + EXPECT_GE(2u, backend_facet_manager_count()); + EXPECT_EQ(2u, GetNumOfEquivalenceClassInDatabase()); +} + +TEST_P(AffiliationBackendTest, UpdateAffiliationsAndBrandingFailure) { + mock_fetch_throttler()->SetInternetConnectivity(/*has_connection=*/true); + EXPECT_EQ(0u, GetNumOfEquivalenceClassInDatabase()); + + FacetURI facet = FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1); + base::MockOnceClosure completion_callback; + + backend()->UpdateAffiliationsAndBranding({facet}, completion_callback.Get()); + ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent()); + ASSERT_NO_FATAL_FAILURE(ExpectAndFailFetch(facet)); + + // Still expect completion callback. + EXPECT_CALL(completion_callback, Run); + backend_task_runner()->RunUntilIdle(); + + EXPECT_GE(1u, backend_facet_manager_count()); + EXPECT_EQ(0u, GetNumOfEquivalenceClassInDatabase()); +} + +TEST_P(AffiliationBackendTest, UpdateAffiliationsAndBrandingFailsIfNoInternet) { + mock_fetch_throttler()->SetInternetConnectivity(/*has_connection=*/false); + EXPECT_EQ(0u, GetNumOfEquivalenceClassInDatabase()); + + FacetURI facet = FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1); + base::MockOnceClosure completion_callback; + + // Expect call to completion callback right away. + EXPECT_CALL(completion_callback, Run); + backend()->UpdateAffiliationsAndBranding({facet}, completion_callback.Get()); + ASSERT_FALSE(fake_affiliation_api()->HasPendingRequest()); + ASSERT_FALSE(mock_fetch_throttler()->has_signaled_network_request_needed()); + + EXPECT_GE(0u, backend_facet_manager_count()); + EXPECT_EQ(0u, GetNumOfEquivalenceClassInDatabase()); +} + INSTANTIATE_TEST_SUITE_P(, AffiliationBackendTest, testing::Bool()); } // namespace password_manager
diff --git a/components/password_manager/core/browser/affiliation/affiliation_fetch_throttler.cc b/components/password_manager/core/browser/affiliation/affiliation_fetch_throttler.cc index f48ad77..8a2decb 100644 --- a/components/password_manager/core/browser/affiliation/affiliation_fetch_throttler.cc +++ b/components/password_manager/core/browser/affiliation/affiliation_fetch_throttler.cc
@@ -90,6 +90,10 @@ exponential_backoff_->InformOfRequest(success); } +bool AffiliationFetchThrottler::HasInternetConnection() const { + return !network_connection_tracker_->IsOffline(); +} + void AffiliationFetchThrottler::EnsureCallbackIsScheduled() { DCHECK_EQ(state_, FETCH_NEEDED); DCHECK(has_network_connectivity_);
diff --git a/components/password_manager/core/browser/affiliation/affiliation_fetch_throttler.h b/components/password_manager/core/browser/affiliation/affiliation_fetch_throttler.h index aeff76e4..35794c5 100644 --- a/components/password_manager/core/browser/affiliation/affiliation_fetch_throttler.h +++ b/components/password_manager/core/browser/affiliation/affiliation_fetch_throttler.h
@@ -81,6 +81,9 @@ // completed, either with |success| or not. virtual void InformOfNetworkRequestComplete(bool success); + // Returns whether there is internet connection or not. + virtual bool HasInternetConnection() const; + protected: raw_ptr<AffiliationFetchThrottlerDelegate> delegate_;
diff --git a/components/password_manager/core/browser/affiliation/affiliation_service.h b/components/password_manager/core/browser/affiliation/affiliation_service.h index bde1561..dc57d8d 100644 --- a/components/password_manager/core/browser/affiliation/affiliation_service.h +++ b/components/password_manager/core/browser/affiliation/affiliation_service.h
@@ -23,7 +23,15 @@ class AffiliationService : public KeyedService { public: // Controls whether to send a network request or fail on a cache miss. - enum class StrategyOnCacheMiss { FETCH_OVER_NETWORK, FAIL }; + enum class StrategyOnCacheMiss { + // Affiliation service will keep trying to send request with exponential + // backlog. + FETCH_OVER_NETWORK, + // Request will fail immediately. + FAIL, + // After first request failure affiliation service will stop trying. + TRY_ONCE_OVER_NETWORK + }; using ResultCallback = base::OnceCallback<void(const AffiliatedFacets& /* results */, @@ -103,6 +111,13 @@ // considered as PSL match. virtual void GetPSLExtensions( base::OnceCallback<void(std::vector<std::string>)> callback) const = 0; + + // This method will fetch the latest affiliation and branding information for + // |facets| even if local cache is still fresh. |callback| is invoked on + // completion. + virtual void UpdateAffiliationsAndBranding( + const std::vector<FacetURI>& facets, + base::OnceClosure callback) = 0; }; } // namespace password_manager
diff --git a/components/password_manager/core/browser/affiliation/affiliation_service_impl.cc b/components/password_manager/core/browser/affiliation/affiliation_service_impl.cc index dcb6643..b2b07ef 100644 --- a/components/password_manager/core/browser/affiliation/affiliation_service_impl.cc +++ b/components/password_manager/core/browser/affiliation/affiliation_service_impl.cc
@@ -303,4 +303,20 @@ std::move(callback)); } +void AffiliationServiceImpl::UpdateAffiliationsAndBranding( + const std::vector<FacetURI>& facets, + base::OnceClosure callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(backend_); + auto callback_in_main_sequence = + base::BindOnce(base::IgnoreResult(&base::TaskRunner::PostTask), + base::SequencedTaskRunner::GetCurrentDefault(), FROM_HERE, + std::move(callback)); + backend_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&AffiliationBackend::UpdateAffiliationsAndBranding, + base::Unretained(backend_), facets, + std::move(callback_in_main_sequence))); +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/affiliation/affiliation_service_impl.h b/components/password_manager/core/browser/affiliation/affiliation_service_impl.h index effeaae..7f089bbd 100644 --- a/components/password_manager/core/browser/affiliation/affiliation_service_impl.h +++ b/components/password_manager/core/browser/affiliation/affiliation_service_impl.h
@@ -103,6 +103,8 @@ void GetAllGroups(GroupsCallback callback) const override; void GetPSLExtensions(base::OnceCallback<void(std::vector<std::string>)> callback) const override; + void UpdateAffiliationsAndBranding(const std::vector<FacetURI>& facets, + base::OnceClosure callback) override; AffiliationBackend* GetBackendForTesting() { return backend_; }
diff --git a/components/password_manager/core/browser/affiliation/affiliation_service_impl_unittest.cc b/components/password_manager/core/browser/affiliation/affiliation_service_impl_unittest.cc index 4fc899af..fce7509 100644 --- a/components/password_manager/core/browser/affiliation/affiliation_service_impl_unittest.cc +++ b/components/password_manager/core/browser/affiliation/affiliation_service_impl_unittest.cc
@@ -642,4 +642,21 @@ testing::Mock::VerifyAndClearExpectations(mock_consumer()); } +TEST_F(AffiliationServiceImplTestWithFetcherFactory, + UpdateAffiliationsAndBranding) { + base::MockOnceClosure completion_callback; + + service()->UpdateAffiliationsAndBranding( + {FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)}, + completion_callback.Get()); + background_task_runner()->RunUntilIdle(); + + EXPECT_CALL(completion_callback, Run); + ASSERT_TRUE(fake_affiliation_api()->HasPendingRequest()); + fake_affiliation_api()->ServeNextRequest(); + background_task_runner()->RunUntilIdle(); + + RunUntilIdle(); +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/affiliation/facet_manager.cc b/components/password_manager/core/browser/affiliation/facet_manager.cc index f4828df..f83dae0 100644 --- a/components/password_manager/core/browser/affiliation/facet_manager.cc +++ b/components/password_manager/core/browser/affiliation/facet_manager.cc
@@ -129,6 +129,10 @@ } else if (cache_miss_strategy == StrategyOnCacheMiss::FETCH_OVER_NETWORK) { pending_requests_.push_back(std::move(request_info)); backend_->SignalNeedNetworkRequest(); + } else if (cache_miss_strategy == + StrategyOnCacheMiss::TRY_ONCE_OVER_NETWORK) { + pending_one_time_requests_.push_back(std::move(request_info)); + backend_->SignalNeedNetworkRequest(); } else { ServeRequestWithFailure(std::move(request_info)); } @@ -165,12 +169,23 @@ for (auto& request_info : pending_requests_) ServeRequestWithSuccess(std::move(request_info), affiliation.facets); pending_requests_.clear(); + for (auto& request_info : pending_one_time_requests_) { + ServeRequestWithSuccess(std::move(request_info), affiliation.facets); + } + pending_one_time_requests_.clear(); base::Time next_required_fetch(GetNextRequiredFetchTimeDueToPrefetch()); if (next_required_fetch < base::Time::Max()) backend_->RequestNotificationAtTime(facet_uri_, next_required_fetch); } +void FacetManager::OnFetchFailed() { + for (auto& request_info : pending_one_time_requests_) { + ServeRequestWithFailure(std::move(request_info)); + } + pending_one_time_requests_.clear(); +} + void FacetManager::NotifyAtRequestedTime() { base::Time next_required_fetch(GetNextRequiredFetchTimeDueToPrefetch()); if (next_required_fetch <= clock_->Now()) @@ -185,7 +200,7 @@ } bool FacetManager::CanBeDiscarded() const { - return pending_requests_.empty() && + return pending_requests_.empty() && pending_one_time_requests_.empty() && GetMaximumKeepFreshUntilThreshold() <= clock_->Now(); } @@ -195,7 +210,8 @@ } bool FacetManager::DoesRequireFetch() const { - return (!pending_requests_.empty() && !IsCachedDataFresh()) || + return ((!pending_requests_.empty() || !pending_one_time_requests_.empty()) && + !IsCachedDataFresh()) || GetNextRequiredFetchTimeDueToPrefetch() <= clock_->Now(); }
diff --git a/components/password_manager/core/browser/affiliation/facet_manager.h b/components/password_manager/core/browser/affiliation/facet_manager.h index 5e73e132..c2ac9e8 100644 --- a/components/password_manager/core/browser/affiliation/facet_manager.h +++ b/components/password_manager/core/browser/affiliation/facet_manager.h
@@ -55,6 +55,9 @@ // fetched from the Affiliation API. void OnFetchSucceeded(const AffiliatedFacetsWithUpdateTime& affiliation); + // Called when the network request failed. + void OnFetchFailed(); + // Called by the backend when the time specified in RequestNotificationAtTime // has come to pass, so that |this| can perform delayed administrative tasks. void NotifyAtRequestedTime(); @@ -125,6 +128,10 @@ // are waiting for the result of looking up this facet. std::vector<RequestInfo> pending_requests_; + // Same as |pending_requests_| but after first failure FacetManager will + // mark those request as failed. + std::vector<RequestInfo> pending_one_time_requests_; + // Keeps track of |keep_fresh_until| thresholds corresponding to Prefetch() // requests for this facet. Affiliation information for this facet must be // kept fresh by periodic refetches until at least the maximum time in this
diff --git a/components/password_manager/core/browser/affiliation/facet_manager_unittest.cc b/components/password_manager/core/browser/affiliation/facet_manager_unittest.cc index 042ee31..ea03ecb 100644 --- a/components/password_manager/core/browser/affiliation/facet_manager_unittest.cc +++ b/components/password_manager/core/browser/affiliation/facet_manager_unittest.cc
@@ -1537,4 +1537,32 @@ EXPECT_TRUE(facet_manager()->CanCachedDataBeDiscarded()); } +TEST_F(FacetManagerTest, GetAffiliationsAndBrandingOnceOverNetworkSuccess) { + CreateFacetManager(); + EXPECT_FALSE(facet_manager()->IsCachedDataFresh()); + + GetAffiliationsAndBranding(StrategyOnCacheMiss::TRY_ONCE_OVER_NETWORK); + ASSERT_NO_FATAL_FAILURE(ExpectFetchNeeded()); + EXPECT_FALSE(facet_manager()->CanBeDiscarded()); + ASSERT_NO_FATAL_FAILURE(CompleteFetch()); + ExpectConsumerSuccessCallback(); +} + +TEST_F(FacetManagerTest, GetAffiliationsAndBrandingOnceOverNetworkFailure) { + CreateFacetManager(); + EXPECT_FALSE(facet_manager()->IsCachedDataFresh()); + + GetAffiliationsAndBranding(StrategyOnCacheMiss::TRY_ONCE_OVER_NETWORK); + ASSERT_NO_FATAL_FAILURE(ExpectFetchNeeded()); + EXPECT_FALSE(facet_manager()->CanBeDiscarded()); + + // Simulate failure. + fake_facet_manager_host()->reset_need_network_request(); + facet_manager()->OnFetchFailed(); + main_task_runner()->RunUntilIdle(); + ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); + + ExpectConsumerFailureCallback(); +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/affiliation/fake_affiliation_service.cc b/components/password_manager/core/browser/affiliation/fake_affiliation_service.cc index d68e93a..89158db 100644 --- a/components/password_manager/core/browser/affiliation/fake_affiliation_service.cc +++ b/components/password_manager/core/browser/affiliation/fake_affiliation_service.cc
@@ -43,5 +43,10 @@ base::OnceCallback<void(std::vector<std::string>)> callback) const { std::move(callback).Run({}); } +void FakeAffiliationService::UpdateAffiliationsAndBranding( + const std::vector<FacetURI>& facets, + base::OnceClosure callback) { + std::move(callback).Run(); +} } // namespace password_manager
diff --git a/components/password_manager/core/browser/affiliation/fake_affiliation_service.h b/components/password_manager/core/browser/affiliation/fake_affiliation_service.h index a571e2b..328e4cd1a 100644 --- a/components/password_manager/core/browser/affiliation/fake_affiliation_service.h +++ b/components/password_manager/core/browser/affiliation/fake_affiliation_service.h
@@ -33,6 +33,8 @@ void GetAllGroups(GroupsCallback callback) const override; void GetPSLExtensions(base::OnceCallback<void(std::vector<std::string>)> callback) const override; + void UpdateAffiliationsAndBranding(const std::vector<FacetURI>& facets, + base::OnceClosure callback) override; }; } // namespace password_manager
diff --git a/components/password_manager/core/browser/affiliation/mock_affiliation_service.h b/components/password_manager/core/browser/affiliation/mock_affiliation_service.h index add4eded..8d41e96 100644 --- a/components/password_manager/core/browser/affiliation/mock_affiliation_service.h +++ b/components/password_manager/core/browser/affiliation/mock_affiliation_service.h
@@ -51,6 +51,10 @@ GetPSLExtensions, (base::OnceCallback<void(std::vector<std::string>)>), (override, const)); + MOCK_METHOD(void, + UpdateAffiliationsAndBranding, + (const std::vector<FacetURI>&, base::OnceClosure), + (override)); }; } // namespace password_manager
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index c71bb12..9ce26b1 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -1503,6 +1503,9 @@ Jika tidak disetel, cookie pihak ketiga akan aktif, tetapi pengguna dapat mengubah setelan ini.</translation> <translation id="2386362615870139244">Izinkan penguncian layar saat bangun</translation> <translation id="2387469539700985783">Kebijakan ini tidak memengaruhi pelaporan yang dilakukan oleh Android.</translation> +<translation id="2388701318721126001">Jika kebijakan ini disetel ke nonaktif, gambar wallpaper <ph name="PRODUCT_OS_NAME" /> pengguna tidak dapat dipilih dari album Google Foto. + +Jika kebijakan ini disetel ke aktif atau tidak disetel, pengguna dapat memilih foto Google Foto sebagai wallpaper.</translation> <translation id="2393862222659066027">Buka daftar URL dan pulihkan sesi sebelumnya</translation> <translation id="2394429297128584919">Jangan izinkan halaman mengirim permintaan XHR sinkron selama penutupan halaman</translation> <translation id="2394674739523870144">Menyetel kebijakan ke daftar string berarti string tersebut digabungkan dengan spasi dan diteruskan dari <ph name="IE_PRODUCT_NAME" /> ke <ph name="PRODUCT_NAME" /> sebagai parameter command line. Jika parameter berisi <ph name="URL_PLACEHOLDER" />, <ph name="URL_PLACEHOLDER" /> akan diganti dengan URL halaman yang akan dibuka. Jika tidak ada parameter yang berisi <ph name="URL_PLACEHOLDER" />, URL akan ditambahkan di akhir command line. @@ -2873,6 +2876,7 @@ <translation id="3608206578291537084">Aktifkan Pipeline Pelaporan Terenkripsi</translation> <translation id="3608281460204780443">Tampilkan ikon Chrome Web Store di peluncur <ph name="PRODUCT_OS_NAME" /> dan di halaman tab baru</translation> <translation id="3622463490728773174">Izinkan implementasi baru</translation> +<translation id="3623332696371971798">Cegah akses Google Foto dari aplikasi personalisasi</translation> <translation id="3627678165642179114">Mengaktifkan atau menonaktifkan layanan web memeriksa ejaan</translation> <translation id="3628480121685794414">Aktifkan pencetakan simpleks</translation> <translation id="3634125384445314047">Mengizinkan foto dan video yang terakhir diambil di ponsel untuk diakses melalui Phone Hub.</translation> @@ -2910,6 +2914,7 @@ Kebijakan ini bersifat sementara dan akan dihapus di <ph name="PRODUCT_NAME" /> 107. Batas waktu ini dapat diperpanjang jika diperlukan di antara perusahaan. </translation> +<translation id="3678069907945250643">Izinkan akses Google Foto dari aplikasi personalisasi</translation> <translation id="3685979383016152590">Menyetel kebijakan akan menentukan kebijakan akses yang berlaku untuk konfigurasi printer massal sehingga akan mengontrol printer mana dari <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> yang akan tersedia bagi pengguna. * <ph name="PRINTERS_BLOCKLIST" /> (nilai 0) menggunakan <ph name="PRINTERS_BULK_BLOCKLIST" /> untuk membatasi akses ke printer yang ditentukan @@ -7306,6 +7311,7 @@ Jika kebijakan ini dinonaktifkan atau tidak disetel, Aplikasi Chrome mungkin tidak diizinkan berjalan, bergantung pada status peluncuran penghentian. Dalam kasus apa pun, Aplikasi Chrome yang diinstal otomatis oleh kebijakan akan terus diizinkan.</translation> <translation id="7774768074957326919">Gunakan setelan proxy sistem</translation> +<translation id="7775077662962729812">Pilihan wallpaper dari Google Foto</translation> <translation id="7776848995687565978">Mengonfigurasi daftar origin yang memberikan perpanjangan masa aktif di latar belakang untuk ekstensi yang terhubung.</translation> <translation id="777734450201217641">Mengaktifkan pintasan fitur aksesibilitas di layar login.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 8be75f62..3a61c37 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -1438,6 +1438,9 @@ このポリシーを未設定のままにした場合、サードパーティ Cookie は有効になりますが、ユーザーはこの設定を変更できます。</translation> <translation id="2386362615870139244">ウェイクアップ画面のロックを許可する</translation> <translation id="2387469539700985783">このポリシーは Android によるレポートには適用されません。</translation> +<translation id="2388701318721126001">このポリシーを無効に設定した場合、ユーザーは <ph name="PRODUCT_OS_NAME" /> の壁紙画像を Google フォト アルバムから選択できなくなります。 + +このポリシーを有効に設定した場合や未設定のままにした場合、ユーザーは Google フォトの画像を壁紙として選択できます。</translation> <translation id="2393862222659066027">URL を開き、最後のセッションを復元する</translation> <translation id="2394429297128584919">ページの終了中にページから同期 XHR リクエストを送信することを許可しない</translation> <translation id="2394674739523870144">このポリシーを文字列のリストに設定すると、文字列がスペースで結合され、コマンドライン パラメータとして <ph name="IE_PRODUCT_NAME" /> から <ph name="PRODUCT_NAME" /> に渡されます。パラメータに <ph name="URL_PLACEHOLDER" /> が含まれる場合、<ph name="URL_PLACEHOLDER" /> は開くページの URL に置き換えられます。パラメータに <ph name="URL_PLACEHOLDER" /> が含まれない場合、URL はコマンドラインの末尾に追加されます。 @@ -2750,6 +2753,7 @@ <translation id="3608206578291537084">暗号化されたレポート パイプラインを有効にする</translation> <translation id="3608281460204780443"><ph name="PRODUCT_OS_NAME" /> ランチャーや新しいタブページに Chrome ウェブストア アイコンを表示する</translation> <translation id="3622463490728773174">新しい実装を許可する</translation> +<translation id="3623332696371971798">カスタマイズ アプリから Google フォトへのアクセスをブロックする</translation> <translation id="3627678165642179114">スペルチェック ウェブ サービスを有効または無効にする</translation> <translation id="3628480121685794414">片面印刷を有効にする</translation> <translation id="3634125384445314047">スマートフォンで最近撮影した写真や動画にスマートフォン ハブ経由でアクセスすることを許可します。</translation> @@ -2787,6 +2791,7 @@ これは、<ph name="PRODUCT_NAME" /> 107 で削除が計画されている一時的なポリシーです。企業からのニーズがある場合、この期限は延長される可能性があります。 </translation> +<translation id="3678069907945250643">カスタマイズ アプリから Google フォトへのアクセスを許可する</translation> <translation id="3685979383016152590">このポリシーでは、プリンタの一括設定に適用するアクセス ポリシーを指定して、ユーザーが <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> のどのプリンタを使用できるかを制御できます。 * <ph name="PRINTERS_BLOCKLIST" />(値 0): <ph name="PRINTERS_BULK_BLOCKLIST" /> を使用して指定プリンタへのアクセスを制限します @@ -6892,6 +6897,7 @@ このポリシーを無効に設定するか未設定のままにした場合、サポート終了の段階に応じて、一部の Chrome アプリは実行できなくなります。 いずれの場合も、ポリシーにより自動インストールされた Chrome アプリについては引き続き実行できます。</translation> <translation id="7774768074957326919">システムのプロキシ設定を使用する</translation> +<translation id="7775077662962729812">Google フォトから壁紙を選択する</translation> <translation id="7776848995687565978">接続している拡張機能のバックグラウンド ライフタイムの延長を許可するオリジンのリストを設定する。</translation> <translation id="777734450201217641">ログイン画面でユーザー補助機能のショートカットを有効にします。
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 78c2c82..81eb7058 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -1485,6 +1485,9 @@ Als je het beleid niet instelt, worden cookies van derden aangezet maar kunnen gebruikers deze instelling wijzigen.</translation> <translation id="2386362615870139244">Schermactiveringsvergrendeling toestaan</translation> <translation id="2387469539700985783">Dit beleid is niet van invloed op de rapportage van Android.</translation> +<translation id="2388701318721126001">Als je dit beleid niet toepast, kan de <ph name="PRODUCT_OS_NAME" />-achtergrondafbeelding van de gebruiker niet worden geselecteerd vanuit een Google Foto's-album. + +Als je dit beleid toepast of niet instelt, kan de gebruiker een Google Foto's-afbeelding kiezen als achtergrond.</translation> <translation id="2393862222659066027">Een lijst met URL's openen en de laatste sessie herstellen</translation> <translation id="2394429297128584919">Niet toestaan dat pagina's synchrone XHR-verzoeken sturen tijdens het sluiten van pagina's</translation> <translation id="2394674739523870144">Als je het beleid instelt op een lijst met tekenreeksen, worden de tekenreeksen samengevoegd met spaties en van <ph name="IE_PRODUCT_NAME" /> naar <ph name="PRODUCT_NAME" /> doorgegeven als opdrachtregelparameters. Als een parameter <ph name="URL_PLACEHOLDER" /> bevat, wordt <ph name="URL_PLACEHOLDER" /> vervangen door de URL van de pagina die moet worden geopend. Als geen enkele parameter <ph name="URL_PLACEHOLDER" /> bevat, wordt de URL toegevoegd aan het einde van de opdrachtregel. @@ -2840,6 +2843,7 @@ <translation id="3608206578291537084">De Encrypted Reporting Pipeline aanzetten</translation> <translation id="3608281460204780443">Het Chrome Web Store-icoon tonen in de <ph name="PRODUCT_OS_NAME" />-launcher en op de pagina Nieuw tabblad</translation> <translation id="3622463490728773174">Nieuwe implementatie toestaan</translation> +<translation id="3623332696371971798">Voorkomen dat Google Foto's toegang krijgt vanuit de personalisatie-app</translation> <translation id="3627678165642179114">Webservice voor spellingcontrole aan- of uitzetten</translation> <translation id="3628480121685794414">Enkelzijdig afdrukken aanzetten</translation> <translation id="3634125384445314047">Recente foto's en video's die op de telefoon zijn gemaakt, toegankelijk maken via Telefoonhub.</translation> @@ -2877,6 +2881,7 @@ Dit is een tijdelijk beleid dat volgens planning wordt verwijderd in <ph name="PRODUCT_NAME" /> 107. Deze deadline kan worden verlengd als daar bij bedrijven behoefte aan is. </translation> +<translation id="3678069907945250643">Toestaan dat Google Foto's toegang krijgt vanuit de personalisatie-app</translation> <translation id="3685979383016152590">Als je dit beleid instelt, kun je aangeven welk toegangsbeleid wordt toegepast op bulksgewijze printerconfiguratie en beheren welke printers van <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> beschikbaar zijn voor gebruikers. * <ph name="PRINTERS_BLOCKLIST" /> (waarde 0) gebruikt <ph name="PRINTERS_BULK_BLOCKLIST" /> om de toegang tot de opgegeven printers te beperken, @@ -7134,6 +7139,7 @@ Als je dit beleid niet toepast of niet instelt, kunnen Chrome-apps misschien niet worden uitgevoerd, afhankelijk van de status van de uitrol van de beëindiging. In beide gevallen zijn Chrome-apps die door het beleid afgedwongen worden geïnstalleerd, nog steeds toegestaan.</translation> <translation id="7774768074957326919">Proxyinstellingen van het systeem gebruiken</translation> +<translation id="7775077662962729812">Achtergrondselectie uit Google Foto's</translation> <translation id="7776848995687565978">Stel een lijst met oorsprongen in die langdurige toegang op de achtergrond verlenen aan de verbindende extensies.</translation> <translation id="777734450201217641">Zet snelkoppelingen voor toegankelijkheidsfuncties aan op het inlogscherm.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index e8a492c8..e739a5e 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -944,6 +944,11 @@ การตั้งค่านโยบายเป็น "เท็จ" หรือไม่ได้ตั้งค่าหมายความว่า <ph name="PRODUCT_NAME" /> จะไม่ตรวจสอบการเพิกถอนทางออนไลน์ใน <ph name="PRODUCT_NAME" /> 19 ขึ้นไป หมายเหตุ: การตรวจสอบ <ph name="OCSP_CRL_LABEL" /> ไม่มีประโยชน์ในด้านการรักษาความปลอดภัยที่มีประสิทธิผล</translation> +<translation id="1904685047904049720">หากเปิดใช้นโยบายนี้ ระบบจะปิดใช้ส่วนขยายที่ไม่ได้เผยแพร่ใน Chrome เว็บสโตร์บน <ph name="PRODUCT_NAME" /> +นโยบายนี้มีผลกับส่วนขยายที่ติดตั้งและอัปเดตจาก Chrome เว็บสโตร์เท่านั้น ระบบจะไม่สนใจส่วนขยายจากนอกสโตร์ เช่น ส่วนขยายที่คลายการแพคข้อมูลซึ่งติดตั้งโดยใช้โหมดนักพัฒนาซอฟต์แวร์และส่วนขยายที่ติดตั้งโดยใช้การเปลี่ยนบรรทัดคำสั่ง นอกจากนี้ ระบบจะไม่สนใจส่วนขยายที่บังคับติดตั้งซึ่งไม่ได้อัปเดตจาก Chrome เว็บสโตร์และส่วนขยายที่ปักหมุดทุกเวอร์ชัน + +หากตั้งค่านโยบายเป็น <ph name="ALLOW_UNPUBLISHED" /> (0) หรือไม่ได้ตั้งค่า ระบบจะอนุญาตส่วนขยายที่ไม่ได้เผยแพร่ใน Chrome เว็บสโตร์ +หากตั้งค่านโยบายเป็น <ph name="DISABLE_UNPUBLISHED" /> (1) ระบบจะปิดใช้ส่วนขยายที่ไม่ได้เผยแพร่ใน Chrome เว็บสโตร์</translation> <translation id="1905061765326052857">ไม่อนุญาตให้ผู้ใช้ที่ไม่เกี่ยวข้องใช้เครื่องเสมือนที่จำเป็นต่อการรองรับแอป Linux</translation> <translation id="1910704279188129272">อนุญาตให้กำหนดข้อจำกัดการใช้งานต่อแอป ข้อจำกัดการใช้งานนำไปใช้กับแอปที่ติดตั้งไว้ใน <ph name="PRODUCT_OS_NAME" /> สำหรับผู้ใช้นั้นๆ ได้ @@ -5646,6 +5651,7 @@ หากคุณตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนไม่ได้ หากไม่ได้ตั้งค่า ผู้ใช้จะเป็นผู้เลือกว่าจะแสดงหรือซ่อนทางลัดของแอปในเมนูตามบริบทของแถบบุ๊กมาร์ก</translation> <translation id="638003144128412430">ปิดใช้การรายงานข้อมูลเขตเวลาของอุปกรณ์</translation> +<translation id="6382209369210116232">ปิดใช้ส่วนขยายที่ไม่ได้เผยแพร่</translation> <translation id="6382351416269252693">สร้างรายการรูปแบบ URL ของเว็บไซต์ซึ่งระบุเว็บไซต์ที่จะปฏิเสธการให้สิทธิ์สำหรับแบบอักษรในเครื่องโดยอัตโนมัติ การดำเนินการนี้จะจำกัดไม่ให้เว็บไซต์ดูข้อมูลเกี่ยวกับแบบอักษรในเครื่องได้ ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ URL ที่ถูกต้องของเว็บไซต์ได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns ใช้ไวลด์การ์ด (<ph name="WILDCARD_VALUE" />) ได้ นโยบายนี้จะจับคู่โดยอิงตามต้นทางเท่านั้น ระบบจึงไม่สนใจเส้นทางใดก็ตามในรูปแบบ URL
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index d4afa78..650fb390 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -799,6 +799,7 @@ Politika ayarlanmadan bırakıldığında kullanıcı ekran kontrolleri veya otomatik parlaklık özellikleri etkilenmez. Not: Politika değerleri 0-100 aralığında yüzde olarak belirtilmelidir.</translation> +<translation id="1733092875104864334">Google hizmetlerinden WebRTC olay günlüğü toplanmasına izin verme</translation> <translation id="1733768596873041559">Varsayılan olarak SAML IdP'ye yönlendir (<ph name="PRODUCT_NAME" /> 99 sürümünden önce kullanıcı onayı gerekir)</translation> <translation id="1733939382419067578">Politikayı ayarlamak bildirimleri görüntüleyebilen siteleri belirten URL kalıpları için bir liste yapmanıza olanak tanır. @@ -1347,6 +1348,7 @@ Bu politika ayarlanmadan bırakılırsa "DisabledPlugins"teki kalıplarla eşleşen eklentiler kilitlenip devre dışı bırakılır ve kullanıcı bunları etkinleştiremez.</translation> <translation id="2236488539271255289">Hiçbir sitenin yerel verileri ayarlamasına izin verme</translation> +<translation id="2236593201136596376">Google hizmetlerinden WebRTC metin günlüklerinin toplanmasına izin ver</translation> <translation id="2241498944622759244">Bu özellik hiç kullanıma sunulmadı dolayısıyla politika kullanımdan kaldırıldı. Bu politika true (doğru) değerine ayarlanırsa veya ayarlanmadan bırakılırsa, <ph name="PRODUCT_NAME" /> geçerli sayfayla ilgili sayfalar önerir. Bu öneriler uzaktaki Google sunucularından getirilir. @@ -1497,6 +1499,9 @@ Politika ayarlanmadan bırakılırsa üçüncü taraf çerezlerine izin verilir, ancak kullanıcılar bu ayarı değiştirebilir.</translation> <translation id="2386362615870139244">Ekran uyandırma kilitlerine izin ver</translation> <translation id="2387469539700985783">Bu politikanın Android tarafından gerçekleştirilen raporlama işlemi üzerinde hiçbir etkisi yoktur.</translation> +<translation id="2388701318721126001">Bu politika devre dışı bırakılırsa kullanıcının <ph name="PRODUCT_OS_NAME" /> duvar kağıdı resmi, Google Fotoğraflar albümünden seçilemez. + +Bu politika etkinleştirilir veya ayarlanmazsa kullanıcı, bir Google Fotoğraflar resmini duvar kağıdı olarak seçebilir.</translation> <translation id="2393862222659066027">Bir URL listesi açıp son oturumu geri yükle</translation> <translation id="2394429297128584919">Sayfa kapatma işlemi sırasında sayfaların eş zamanlı XHR istekleri göndermesine izin verme</translation> <translation id="2394674739523870144">Bu politika bir dize listesine ayarlanırsa dizeler boşluklarla birleştirilir ve <ph name="IE_PRODUCT_NAME" /> tarayıcısından <ph name="PRODUCT_NAME" /> tarayıcısına komut satırı parametreleri olarak aktarılır. Bir parametre <ph name="URL_PLACEHOLDER" /> içeriyorsa <ph name="URL_PLACEHOLDER" />, açılacak sayfanın URL'siyle değiştirilir. Hiçbir öğe <ph name="URL_PLACEHOLDER" /> içermiyorsa URL, komut satırının sonuna eklenir. @@ -2861,6 +2866,7 @@ <translation id="3608206578291537084">Şifrelenmiş Raporlama Ardışık Düzeni'ni etkinleştir</translation> <translation id="3608281460204780443"><ph name="PRODUCT_OS_NAME" /> başlatıcıda ve yeni sekme sayfasında Chrome Web Mağazası simgesini göster</translation> <translation id="3622463490728773174">Yeni uygulamaya izin ver</translation> +<translation id="3623332696371971798">Google Fotoğraflar'ın, kişiselleştirme uygulamasından erişmesini engelle</translation> <translation id="3627678165642179114">Yazım denetimi Web hizmetini etkinleştir veya devre dışı bırak</translation> <translation id="3628480121685794414">Tek yönlü yazdırmayı etkinleştir</translation> <translation id="3634125384445314047">Telefonda çekilen son fotoğraflara ve videolara Telefon Merkezi aracılığıyla erişime izin ver.</translation> @@ -2898,6 +2904,7 @@ Bu politika geçicidir ve <ph name="PRODUCT_NAME" /> 107 sürümünde kaldırılması planlanmaktadır. Kuruluşların ihtiyaç duyması halinde bu süre uzatılabilir. </translation> +<translation id="3678069907945250643">Google Fotoğraflar'ın, kişiselleştirme uygulamasından erişmesine izin ver</translation> <translation id="3685979383016152590">Politika ayarlanırsa toplu yazıcı yapılandırması için hangi erişim politikasının geçerli olacağı belirlenerek <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> içerisinden hangi yazıcıların kullanılabileceği kontrol edilir. * <ph name="PRINTERS_BLOCKLIST" /> (0 değeri) ayarlanırsa belirtilen yazıcılara erişimi kısıtlamak için <ph name="PRINTERS_BULK_BLOCKLIST" /> kullanılır. @@ -7214,6 +7221,7 @@ Bu politika devre dışı bırakılır veya ayarlanmazsa, kullanımdan kaldırma durumuna bağlı olarak Chrome Uygulamalarının çalışmasına izin verilmeyebilir. Her iki durumda da, politika gereği zorunlu yüklenmiş Chrome Uygulamalarına izin verilmeye devam edilir.</translation> <translation id="7774768074957326919">Sistem proxy ayarlarını kullan</translation> +<translation id="7775077662962729812">Google Fotoğraflar'dan duvar kağıdı seçimi</translation> <translation id="7776848995687565978">Bağlı uzantıların arka planda ömrünü uzatan kaynakların listesini yapılandır.</translation> <translation id="777734450201217641">Giriş ekranında erişilebilirlik özellikleri kısayollarını etkinleştirin. @@ -8047,6 +8055,7 @@ Bu politikanın ayarlanmadığı bir site için mevcutsa <ph name="DEFAULT_JAVA_SCRIPT_JIT_SETTING_POLICY_NAME" /> ayarının politikası geçerli olur, mevcut değilse JavaScript JIT site için etkinleştirilir.</translation> <translation id="8543108307976719751">Bu makineye uzaktan erişim bağlantılarını engelle</translation> +<translation id="8543639085146778837">Google hizmetlerinden WebRTC olay günlüğü toplanmasına izin ver</translation> <translation id="8543975123557636331">Ses çıkışını etkinleştir</translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> için varsayılan HTML oluşturucusu</translation> <translation id="8544465954173828789">SMS Mesajlarının telefondan Chromebook'a senkronize edilmesine izin ver</translation> @@ -8554,6 +8563,9 @@ Politika değeri milisaniye olarak belirtilmelidir. Değerler 30 saniye ile 24 saat arasında olabilir.</translation> <translation id="9040042535845939426">Giriş ekranında gizlilik ekranının durumunu belirle</translation> +<translation id="9046248916118130378">Politika, Etkin değerine ayarlanırsa <ph name="PRODUCT_NAME" /> ürünü, Google Meet gibi Google hizmetlerinden WebRTC olay günlüklerini toplayıp bu günlükleri Google'a yükleyebilir. Bu günlükler, <ph name="PRODUCT_NAME" /> ürünündeki sesli veya görüntülü toplantılarla ilgili sorunlarda hata ayıklamada kullanılacak teşhis bilgileri içerir. Bunlar, gelen ve giden WebRTC akışlarını açıklayan metin meta verileri, WebRTC'ye özgü günlük girişleri ve ek sistem bilgileri olabilir. Bu günlükler toplantıya ait ses veya video içeriği barındırmaz. +Politika, Devre Dışı değerine ayarlanırsa bu tür günlükler Google'a yüklenmez. Günlükler, kullanıcının cihazında yerel olarak birikmeye devam eder. +Politika ayarlanmadan bırakılırsa <ph name="PRODUCT_NAME" /> varsayılan olarak bu günlükleri toplayıp yükleyebilir.</translation> <translation id="9050853837490399534">Bu politika, cihazın bir Hızlı Düzeltme Derlemesi'ne güncellenmesinin gerekip gerekmediğini kontrol eder. Politika değeri bir Hızlı Düzeltme Derlemesi'ne eşlenen bir belirtece ayarlanırsa ve güncelleme başka bir politika tarafından engellenmemişse cihaz, ilgili Hızlı Düzeltme Derlemesi'ne güncellenir.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index a2e9c5a..b9ca423 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -1477,6 +1477,9 @@ 如果此政策未设置,系统会开启第三方 Cookie,但用户可以更改此设置。</translation> <translation id="2386362615870139244">允许使用屏幕唤醒锁定</translation> <translation id="2387469539700985783">此政策对 Android 完成的报告没有任何影响。</translation> +<translation id="2388701318721126001">如果此政策处于停用状态,用户将无法从 Google 相册中的影集选择<ph name="PRODUCT_OS_NAME" />壁纸图片。 + +如果此政策处于启用状态或未设置,用户可以选择 Google 相册中的图片作为壁纸。</translation> <translation id="2393862222659066027">打开一系列网址并恢复上次的会话</translation> <translation id="2394429297128584919">不允许页面在关闭期间发送同步 XHR 请求</translation> <translation id="2394674739523870144">如果此政策设为一系列字符串,这些字符串会以空格连接,并作为命令行参数从 <ph name="IE_PRODUCT_NAME" /> 传递到 <ph name="PRODUCT_NAME" />。如果有参数包含 <ph name="URL_PLACEHOLDER" />,系统会将 <ph name="URL_PLACEHOLDER" /> 替换成要打开的网页对应的网址。如果没有参数包含 <ph name="URL_PLACEHOLDER" />,系统会将网址附加到命令行的末尾。 @@ -2828,6 +2831,7 @@ <translation id="3608206578291537084">启用加密报告管道</translation> <translation id="3608281460204780443">在 <ph name="PRODUCT_OS_NAME" /> 启动器和新标签页中显示 Chrome 应用商店的图标</translation> <translation id="3622463490728773174">允许使用新实现</translation> +<translation id="3623332696371971798">禁止通过个性化设置应用访问 Google 相册</translation> <translation id="3627678165642179114">启用或停用拼写检查网络服务</translation> <translation id="3628480121685794414">启用单面打印</translation> <translation id="3634125384445314047">允许通过 Phone Hub 访问手机上近期拍摄的照片和视频。</translation> @@ -2865,6 +2869,7 @@ 这是一项暂时性政策,我们计划在 <ph name="PRODUCT_NAME" /> 107 中将其移除。若有很多企业需要此政策,这个期限可能会延长。 </translation> +<translation id="3678069907945250643">允许通过个性化设置应用访问 Google 相册</translation> <translation id="3685979383016152590">通过设置此政策,您可以指定对批量打印机配置应用哪项访问政策,并控制用户可以使用 <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> 中的哪些打印机。 * 如果您选择 <ph name="PRINTERS_BLOCKLIST" />(值为 0),系统会使用 <ph name="PRINTERS_BULK_BLOCKLIST" /> 来限制用户对指定打印机的访问权 @@ -7121,6 +7126,7 @@ 如果此政策已停用或未设置,Chrome 应用可能会无法运行,具体取决于弃用安排的状态。 无论在哪种情况下,系统都允许由政策强制安装的 Chrome 应用继续运行。</translation> <translation id="7774768074957326919">使用系统代理设置</translation> +<translation id="7775077662962729812">从 Google 相册中选择壁纸</translation> <translation id="7776848995687565978">配置源列表,以向这些源所连接的扩展程序授予更长的后台生命周期。</translation> <translation id="777734450201217641">在登录屏幕上启用无障碍功能快捷方式。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index ea9fd7b..d52a38b 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -1473,6 +1473,9 @@ 如果不設定,系統會啟用第三方 Cookie,但使用者可以變更這項設定。</translation> <translation id="2386362615870139244">允許使用螢幕喚醒鎖</translation> <translation id="2387469539700985783">這項政策對 Android 應用程式製作的報表沒有影響。</translation> +<translation id="2388701318721126001">如果停用這項政策,使用者就無法從 Google 相簿選取 <ph name="PRODUCT_OS_NAME" /> 桌布圖像。 + +如果啟用或未設定這項政策,使用者將能選擇 Google 相簿的圖像做為桌布。</translation> <translation id="2393862222659066027">開啟網址清單並還原前次的工作階段</translation> <translation id="2394429297128584919">禁止網頁在關閉時傳送同步 XHR 要求</translation> <translation id="2394674739523870144">如果將這項政策設為字串清單,系統會使用空格連接字串,並將字串以指令列參數的形式從 <ph name="IE_PRODUCT_NAME" /> 傳送至 <ph name="PRODUCT_NAME" />。如果有參數包含 <ph name="URL_PLACEHOLDER" />,系統會將 <ph name="URL_PLACEHOLDER" /> 替換成要開啟的網頁網址。如果沒有參數包含 <ph name="URL_PLACEHOLDER" />,則網址會附加在指令列結尾。 @@ -2806,6 +2809,7 @@ <translation id="3608206578291537084">啟用加密報告管道</translation> <translation id="3608281460204780443">在 <ph name="PRODUCT_OS_NAME" /> 啟動器和新分頁顯示 Chrome 線上應用程式商店圖示</translation> <translation id="3622463490728773174">允許使用新實作</translation> +<translation id="3623332696371971798">禁止個人化應用程式存取 Google 相簿</translation> <translation id="3627678165642179114">啟用或停用拼字檢查網路服務</translation> <translation id="3628480121685794414">啟用單面列印</translation> <translation id="3634125384445314047">允許他人透過 Phone Hub 存取手機上最近拍攝的相片和影片。</translation> @@ -2842,6 +2846,7 @@ 這是暫時性政策,預計會在 <ph name="PRODUCT_NAME" /> 107 中移除。如果許多企業需要使用,我們也許會延長這個期限。 </translation> +<translation id="3678069907945250643">允許個人化應用程式存取 Google 相簿</translation> <translation id="3685979383016152590">你可以透過這項政策指定要套用到大量印表機設定的存取權政策,藉此控管要為使用者提供 <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> 的哪些印表機。 * <ph name="PRINTERS_BLOCKLIST" /> (值為 0) 會採用 <ph name="PRINTERS_BULK_BLOCKLIST" />,禁止使用者存取特定印表機 @@ -7062,6 +7067,7 @@ 如果這項政策已停用或未設定,系統可能不允許執行 Chrome 應用程式,實際情況視淘汰措施的實施狀態而定。 不過,在任何情況下,系統都會允許因政策而強制安裝的 Chrome 應用程式繼續執行。</translation> <translation id="7774768074957326919">使用系統 Proxy 設定</translation> +<translation id="7775077662962729812">從 Google 相簿選取桌布圖像</translation> <translation id="7776848995687565978">設定來源清單,為連線中的擴充功能延長背景生命週期。</translation> <translation id="777734450201217641">在登入畫面上啟用無障礙功能快速鍵。 @@ -7964,7 +7970,7 @@ <translation id="8619748440665904084">不允許在第一次執行時匯入自動填入表單資料</translation> <translation id="8623672932476443039">如果將這項政策設為啟用,使用者可以存取「已隔離應用程式的開發人員模式」。 如果將這項政策設為停用,使用者將無法存取這些功能。 - 如果不設定這項政策,在預設情況下,Chrome OS 上受企業管理的使用者將無法存取這個模式,其他作業系統上的一般使用者則可存取這個模式。</translation> + 如果不設定這項政策,在預設情況下,Chrome OS 上受企業管理的使用者將無法存取這個模式,其他 OS 上的一般使用者則可存取這個模式。</translation> <translation id="8626826495474944836">要求針對所有網站啟用網站隔離功能</translation> <translation id="8631314130868563649">停用尖峰轉移電源管理</translation> <translation id="8631434304112909927">到第 <ph name="UNTIL_VERSION" /> 版為止</translation>
diff --git a/components/services/heap_profiling/public/cpp/profiling_client.cc b/components/services/heap_profiling/public/cpp/profiling_client.cc index 2d2b29c..2c0a067 100644 --- a/components/services/heap_profiling/public/cpp/profiling_client.cc +++ b/components/services/heap_profiling/public/cpp/profiling_client.cc
@@ -6,16 +6,15 @@ #include <string> #include <unordered_set> +#include <utility> #include <vector> #include "base/allocator/partition_allocator/partition_alloc_buildflags.h" #include "base/debug/stack_trace.h" -#include "base/functional/bind.h" #include "base/no_destructor.h" #include "base/notreached.h" #include "base/sampling_heap_profiler/poisson_allocation_sampler.h" #include "base/sampling_heap_profiler/sampling_heap_profiler.h" -#include "base/task/thread_pool.h" #include "base/trace_event/heap_profiler_allocation_context_tracker.h" #include "base/trace_event/malloc_dump_provider.h" #include "base/trace_event/memory_dump_manager.h" @@ -25,11 +24,6 @@ #include "components/services/heap_profiling/public/cpp/heap_profiling_trace_source.h" #endif -#if BUILDFLAG(IS_ANDROID) && BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE) && \ - defined(OFFICIAL_BUILD) -#include "base/trace_event/cfi_backtrace_android.h" -#endif - #if BUILDFLAG(IS_APPLE) #include "base/allocator/partition_allocator/shim/allocator_interception_mac.h" #endif @@ -62,25 +56,7 @@ allocator_shim::PeriodicallyShimNewMallocZones(); #endif // BUILDFLAG(IS_APPLE) && !BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) -#if BUILDFLAG(IS_ANDROID) && BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE) && \ - defined(OFFICIAL_BUILD) - // On Android the unwinder initialization requires file reading before - // initializing shim. So, post task on background thread. - base::ThreadPool::PostTaskAndReply( - FROM_HERE, - {base::TaskPriority::BEST_EFFORT, base::MayBlock(), - base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, - base::BindOnce([]() { - base::trace_event::CFIBacktraceAndroid::GetInitializedInstance() - ->can_unwind_stack_frames(); - // Ignore failures since the default unwind tables are used as backup. - }), - base::BindOnce(&ProfilingClient::StartProfilingInternal, - base::Unretained(this), std::move(params), - std::move(callback))); -#else StartProfilingInternal(std::move(params), std::move(callback)); -#endif #if !BUILDFLAG(IS_IOS) // Create trace source so that it registers itself to the tracing system.
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index cdfb845..414affe 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 × 16″</translation> <translation id="1181037720776840403">Odebrat</translation> <translation id="1186201132766001848">Zkontrolovat hesla</translation> +<translation id="1195073053842921378">Tato adresa bude smazána z tohoto zařízení</translation> <translation id="1195558154361252544">Oznámení jsou automaticky blokována u všech webů s výjimkou těch, u nichž je povolíte</translation> <translation id="1197088940767939838">Oranžová</translation> <translation id="1201402288615127009">Další</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index f142756..7adaf90a 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 დუიმი</translation> <translation id="1181037720776840403">ამოშლა</translation> <translation id="1186201132766001848">პაროლების შემოწმება</translation> +<translation id="1195073053842921378">ეს მისამართი წაიშლება ამ მოწყობილობიდან</translation> <translation id="1195558154361252544">შეტყობინებები ავტომატურად დაბლოკილია ყველა საიტისთვის, გარდა თქვენ მიერ დაშვებულისა</translation> <translation id="1197088940767939838">ნარინჯისფერი</translation> <translation id="1201402288615127009">შემდეგი</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 2d241f9..54747af 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 tommer</translation> <translation id="1181037720776840403">Fjern</translation> <translation id="1186201132766001848">Kontroller passordene</translation> +<translation id="1195073053842921378">Adressen blir slettet fra denne enheten</translation> <translation id="1195558154361252544">Varsler blokkeres automatisk for alle nettsteder unntatt dem du tillater</translation> <translation id="1197088940767939838">Oransje</translation> <translation id="1201402288615127009">Neste</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 9d40132..792b757a 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 palcev</translation> <translation id="1181037720776840403">Odstrani</translation> <translation id="1186201132766001848">Preveri gesla</translation> +<translation id="1195073053842921378">Ta naslov bo izbrisan iz te naprave.</translation> <translation id="1195558154361252544">Obvestila so samodejno blokirana za vsa spletna mesta, razen za tista z vašim dovoljenjem</translation> <translation id="1197088940767939838">Oranžna</translation> <translation id="1201402288615127009">Naprej</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 7269d2f..2cbd983c 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 นิ้ว</translation> <translation id="1181037720776840403">นำออก</translation> <translation id="1186201132766001848">ตรวจสอบรหัสผ่าน</translation> +<translation id="1195073053842921378">ระบบจะลบที่อยู่นี้ออกจากอุปกรณ์นี้</translation> <translation id="1195558154361252544">ระบบจะบล็อกการแจ้งเตือนของทุกเว็บไซต์โดยอัตโนมัติ ยกเว้นเว็บไซต์ที่คุณอนุญาต</translation> <translation id="1197088940767939838">สีส้ม</translation> <translation id="1201402288615127009">ถัดไป</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 396afc9..e1b124e 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 英寸</translation> <translation id="1181037720776840403">移除</translation> <translation id="1186201132766001848">检查密码</translation> +<translation id="1195073053842921378">该地址将从此设备中删除</translation> <translation id="1195558154361252544">除您允许的网站外,已自动阻止所有其他网站显示通知</translation> <translation id="1197088940767939838">橙色</translation> <translation id="1201402288615127009">下一步</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index d1f93a3..c988d8f 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 吋</translation> <translation id="1181037720776840403">移除</translation> <translation id="1186201132766001848">檢查密碼</translation> +<translation id="1195073053842921378">此地址將會從此裝置上刪除</translation> <translation id="1195558154361252544">系統已自動封鎖所有網站的通知,但您允許的網站除外</translation> <translation id="1197088940767939838">橙色</translation> <translation id="1201402288615127009">下一個</translation>
diff --git a/components/supervised_user/core/browser/supervised_user_settings_service.cc b/components/supervised_user/core/browser/supervised_user_settings_service.cc index 53d426ba..3a57ced 100644 --- a/components/supervised_user/core/browser/supervised_user_settings_service.cc +++ b/components/supervised_user/core/browser/supervised_user_settings_service.cc
@@ -309,8 +309,8 @@ DCHECK_EQ(SUPERVISED_USER_SETTINGS, sync_data.GetDataType()); const ::sync_pb::ManagedUserSettingSpecifics& supervised_user_setting = sync_data.GetSpecifics().managed_user_setting(); - std::unique_ptr<base::Value> value = - JSONReader::ReadDeprecated(supervised_user_setting.value()); + absl::optional<base::Value> value = + JSONReader::Read(supervised_user_setting.value()); // Wrongly formatted input will cause null values. // SetKey below requires non-null values. if (!value) {
diff --git a/components/sync/driver/glue/sync_engine_impl.h b/components/sync/driver/glue/sync_engine_impl.h index 30e9ee6..bdc0a41c 100644 --- a/components/sync/driver/glue/sync_engine_impl.h +++ b/components/sync/driver/glue/sync_engine_impl.h
@@ -204,7 +204,8 @@ // The host which we serve (and are owned by). Set in Initialize() and nulled // out in StopSyncingForShutdown(). - raw_ptr<SyncEngineHost> host_ = nullptr; + // DanglingUntriaged because it is assigned a DanglingUntriaged pointer. + raw_ptr<SyncEngineHost, DanglingUntriaged> host_ = nullptr; raw_ptr<invalidation::InvalidationService> invalidator_ = nullptr; bool invalidation_handler_registered_ = false;
diff --git a/components/sync/driver/trusted_vault_histograms.cc b/components/sync/driver/trusted_vault_histograms.cc index d7083576..6df7e9c6 100644 --- a/components/sync/driver/trusted_vault_histograms.cc +++ b/components/sync/driver/trusted_vault_histograms.cc
@@ -7,6 +7,7 @@ #include <string> #include "base/metrics/histogram_functions.h" +#include "base/notreached.h" #include "base/strings/strcat.h" #include "base/time/time.h" #include "components/sync/base/time.h" @@ -49,6 +50,12 @@ registration_state); } +void RecordTrustedVaultDeviceRegistrationOutcome( + TrustedVaultDeviceRegistrationOutcomeForUMA registration_outcome) { + base::UmaHistogramEnumeration("Sync.TrustedVaultDeviceRegistrationOutcome", + registration_outcome); +} + void RecordTrustedVaultURLFetchResponse( int http_response_code, int net_error,
diff --git a/components/sync/driver/trusted_vault_histograms.h b/components/sync/driver/trusted_vault_histograms.h index c80d7a2..ba3dc6b 100644 --- a/components/sync/driver/trusted_vault_histograms.h +++ b/components/sync/driver/trusted_vault_histograms.h
@@ -32,6 +32,20 @@ kMaxValue = kAlreadyRegisteredV1, }; +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class TrustedVaultDeviceRegistrationOutcomeForUMA { + kSuccess = 0, + kAlreadyRegistered = 1, + kLocalDataObsolete = 2, + kTransientAccessTokenFetchError = 3, + kPersistentAccessTokenFetchError = 4, + kPrimaryAccountChangeAccessTokenFetchError = 5, + kNetworkError = 6, + kOtherError = 7, + kMaxValue = kOtherError, +}; + // Used to provide UMA metric breakdowns. enum class TrustedVaultURLFetchReasonForUMA { kUnspecified, @@ -83,6 +97,9 @@ void RecordTrustedVaultDeviceRegistrationState( TrustedVaultDeviceRegistrationStateForUMA registration_state); +void RecordTrustedVaultDeviceRegistrationOutcome( + TrustedVaultDeviceRegistrationOutcomeForUMA registration_outcome); + // Records url fetch response status (combined http and net error code). If // |http_response_code| is non-zero, it will be recorded, otherwise |net_error| // will be recorded. Either |http_status| or |net_error| must be non zero.
diff --git a/components/sync/test/fake_sync_engine.h b/components/sync/test/fake_sync_engine.h index 16cc7f4..6bf1e85 100644 --- a/components/sync/test/fake_sync_engine.h +++ b/components/sync/test/fake_sync_engine.h
@@ -111,7 +111,8 @@ const bool allow_init_completion_; const bool is_first_time_sync_configure_; const base::RepeatingClosure sync_transport_data_cleared_cb_; - raw_ptr<SyncEngineHost> host_ = nullptr; + // DanglingUntriaged because it is assigned a DanglingUntriaged pointer. + raw_ptr<SyncEngineHost, DanglingUntriaged> host_ = nullptr; bool initialized_ = false; const SyncStatus default_sync_status_; CoreAccountId authenticated_account_id_;
diff --git a/components/sync/trusted_vault/download_keys_response_handler.cc b/components/sync/trusted_vault/download_keys_response_handler.cc index a8957e6..2cf640f 100644 --- a/components/sync/trusted_vault/download_keys_response_handler.cc +++ b/components/sync/trusted_vault/download_keys_response_handler.cc
@@ -159,7 +159,10 @@ case TrustedVaultRequest::HttpStatus::kNotFound: return ProcessedResponse( /*status=*/TrustedVaultDownloadKeysStatus::kMemberNotFound); - case TrustedVaultRequest::HttpStatus::kAccessTokenFetchingFailure: + case TrustedVaultRequest::HttpStatus::kTransientAccessTokenFetchError: + case TrustedVaultRequest::HttpStatus::kPersistentAccessTokenFetchError: + case TrustedVaultRequest::HttpStatus:: + kPrimaryAccountChangeAccessTokenFetchError: return ProcessedResponse( /*status=*/TrustedVaultDownloadKeysStatus:: kAccessTokenFetchingFailure);
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_backend.cc b/components/sync/trusted_vault/standalone_trusted_vault_backend.cc index bc6a5224..aa45d56f 100644 --- a/components/sync/trusted_vault/standalone_trusted_vault_backend.cc +++ b/components/sync/trusted_vault/standalone_trusted_vault_backend.cc
@@ -35,6 +35,7 @@ #include "components/sync/protocol/local_trusted_vault.pb.h" #include "components/sync/trusted_vault/proto_string_bytes_conversion.h" #include "components/sync/trusted_vault/securebox.h" +#include "components/sync/trusted_vault/trusted_vault_connection.h" #include "components/sync/trusted_vault/trusted_vault_server_constants.h" #include "google_apis/gaia/gaia_auth_util.h" #include "google_apis/gaia/google_service_auth_error.h" @@ -171,6 +172,35 @@ return result; } +TrustedVaultDeviceRegistrationOutcomeForUMA +GetDeviceRegistrationOutcomeForUMAFromResponse( + TrustedVaultRegistrationStatus response_status) { + switch (response_status) { + case TrustedVaultRegistrationStatus::kSuccess: + return TrustedVaultDeviceRegistrationOutcomeForUMA::kSuccess; + case TrustedVaultRegistrationStatus::kAlreadyRegistered: + return TrustedVaultDeviceRegistrationOutcomeForUMA::kAlreadyRegistered; + case TrustedVaultRegistrationStatus::kLocalDataObsolete: + return TrustedVaultDeviceRegistrationOutcomeForUMA::kLocalDataObsolete; + case TrustedVaultRegistrationStatus::kTransientAccessTokenFetchError: + return TrustedVaultDeviceRegistrationOutcomeForUMA:: + kTransientAccessTokenFetchError; + case TrustedVaultRegistrationStatus::kPersistentAccessTokenFetchError: + return TrustedVaultDeviceRegistrationOutcomeForUMA:: + kPersistentAccessTokenFetchError; + case TrustedVaultRegistrationStatus:: + kPrimaryAccountChangeAccessTokenFetchError: + return TrustedVaultDeviceRegistrationOutcomeForUMA:: + kPrimaryAccountChangeAccessTokenFetchError; + case TrustedVaultRegistrationStatus::kNetworkError: + return TrustedVaultDeviceRegistrationOutcomeForUMA::kNetworkError; + case TrustedVaultRegistrationStatus::kOtherError: + return TrustedVaultDeviceRegistrationOutcomeForUMA::kOtherError; + } + NOTREACHED(); + return TrustedVaultDeviceRegistrationOutcomeForUMA::kOtherError; +} + // Version 0 may contain corrupted data: missing constant key if the client // was affected by crbug.com/1267391, this function injects constant key if it's // not stored and there is exactly one non-constant key. |local_trusted_vault| @@ -897,7 +927,8 @@ // `kAlreadyRegistered`. DCHECK(!per_user_vault->local_device_registration_info() .last_registration_returned_local_data_obsolete()); - + RecordTrustedVaultDeviceRegistrationOutcome( + GetDeviceRegistrationOutcomeForUMAFromResponse(status)); switch (status) { case TrustedVaultRegistrationStatus::kSuccess: case TrustedVaultRegistrationStatus::kAlreadyRegistered: @@ -914,7 +945,10 @@ ->set_last_registration_returned_local_data_obsolete(true); WriteDataToDisk(); return; - case TrustedVaultRegistrationStatus::kAccessTokenFetchingFailure: + case TrustedVaultRegistrationStatus::kTransientAccessTokenFetchError: + case TrustedVaultRegistrationStatus::kPersistentAccessTokenFetchError: + case TrustedVaultRegistrationStatus:: + kPrimaryAccountChangeAccessTokenFetchError: case TrustedVaultRegistrationStatus::kNetworkError: // Request wasn't sent to the server, so there is no need for throttling. return; @@ -963,7 +997,10 @@ // WriteToDisk() will be called by OnDeviceRegistered(). } break; - case TrustedVaultRegistrationStatus::kAccessTokenFetchingFailure: + case TrustedVaultRegistrationStatus::kTransientAccessTokenFetchError: + case TrustedVaultRegistrationStatus::kPersistentAccessTokenFetchError: + case TrustedVaultRegistrationStatus:: + kPrimaryAccountChangeAccessTokenFetchError: case TrustedVaultRegistrationStatus::kLocalDataObsolete: case TrustedVaultRegistrationStatus::kNetworkError: case TrustedVaultRegistrationStatus::kOtherError:
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc b/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc index d7c4a6e..e0fd3a79 100644 --- a/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc +++ b/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc
@@ -819,6 +819,10 @@ // Pretend that the registration completed successfully. std::move(device_registration_callback) .Run(TrustedVaultRegistrationStatus::kSuccess); + histogram_tester.ExpectUniqueSample( + /*name=*/"Sync.TrustedVaultDeviceRegistrationOutcome", + /*sample=*/TrustedVaultDeviceRegistrationOutcomeForUMA::kSuccess, + /*expected_bucket_count=*/1); // Now the device should be registered. sync_pb::LocalDeviceRegistrationInfo registration_info = @@ -1160,9 +1164,18 @@ ASSERT_FALSE(device_registration_callback.is_null()); Mock::VerifyAndClearExpectations(connection()); + base::HistogramTester histogram_tester; + // Mimic access token fetching failure. std::move(device_registration_callback) - .Run(TrustedVaultRegistrationStatus::kAccessTokenFetchingFailure); + .Run(TrustedVaultRegistrationStatus::kTransientAccessTokenFetchError); + + histogram_tester.ExpectUniqueSample( + /*name=*/"Sync.TrustedVaultDeviceRegistrationOutcome", + /*sample=*/ + TrustedVaultDeviceRegistrationOutcomeForUMA:: + kTransientAccessTokenFetchError, + /*expected_bucket_count=*/1); // Mimic a restart to trigger device registration attempt, which should not be // throttled.
diff --git a/components/sync/trusted_vault/trusted_vault_access_token_fetcher.h b/components/sync/trusted_vault/trusted_vault_access_token_fetcher.h index d604ec7..833ab3ec 100644 --- a/components/sync/trusted_vault/trusted_vault_access_token_fetcher.h +++ b/components/sync/trusted_vault/trusted_vault_access_token_fetcher.h
@@ -28,9 +28,6 @@ // Used when requested account is not primary or became not primary during // the fetching. kNotPrimaryAccount, - // Used when fetching attempt is not possible, because required dependencies - // were already destroyed during the browser shutdown. - kShutdown, }; using AccessTokenInfoOrError =
diff --git a/components/sync/trusted_vault/trusted_vault_access_token_fetcher_impl.cc b/components/sync/trusted_vault/trusted_vault_access_token_fetcher_impl.cc index 8596e4e..a0ecdac 100644 --- a/components/sync/trusted_vault/trusted_vault_access_token_fetcher_impl.cc +++ b/components/sync/trusted_vault/trusted_vault_access_token_fetcher_impl.cc
@@ -24,12 +24,11 @@ const CoreAccountId& account_id, TrustedVaultAccessTokenFetcher::TokenCallback callback) { if (!frontend) { - // This is likely to happen during the browser shutdown. - std::move(callback).Run(base::unexpected( - TrustedVaultAccessTokenFetcher::FetchingError::kShutdown)); - } else { - frontend->FetchAccessToken(account_id, std::move(callback)); + // This is likely to happen during the browser shutdown, leave request + // hanging. + return; } + frontend->FetchAccessToken(account_id, std::move(callback)); } } // namespace
diff --git a/components/sync/trusted_vault/trusted_vault_connection.h b/components/sync/trusted_vault/trusted_vault_connection.h index 8643a13..1c4c8dd7 100644 --- a/components/sync/trusted_vault/trusted_vault_connection.h +++ b/components/sync/trusted_vault/trusted_vault_connection.h
@@ -26,12 +26,18 @@ // Used when trusted vault request can't be completed successfully due to // vault key being outdated or device key being not registered. kLocalDataObsolete, - // Used when request isn't sent due to access token fetching failure. - kAccessTokenFetchingFailure, + // Used when request wasn't sent due to transient auth error that prevented + // fetching an access token. + kTransientAccessTokenFetchError, + // Used when request wasn't sent due to persistent auth error that prevented + // fetching an access token. + kPersistentAccessTokenFetchError, + // Used when request wasn't sent because primary account changed meanwhile. + kPrimaryAccountChangeAccessTokenFetchError, // Used for all network errors. kNetworkError, // Used for all http and protocol errors not covered by the above. - kOtherError + kOtherError, }; enum class TrustedVaultDownloadKeysStatus {
diff --git a/components/sync/trusted_vault/trusted_vault_connection_impl.cc b/components/sync/trusted_vault/trusted_vault_connection_impl.cc index 5e05948..41f072d 100644 --- a/components/sync/trusted_vault/trusted_vault_connection_impl.cc +++ b/components/sync/trusted_vault/trusted_vault_connection_impl.cc
@@ -164,11 +164,22 @@ std::move(callback).Run(TrustedVaultRegistrationStatus::kOtherError, /*last_key_version=*/0); return; - case TrustedVaultRequest::HttpStatus::kAccessTokenFetchingFailure: + case TrustedVaultRequest::HttpStatus::kTransientAccessTokenFetchError: std::move(callback).Run( - TrustedVaultRegistrationStatus::kAccessTokenFetchingFailure, + TrustedVaultRegistrationStatus::kTransientAccessTokenFetchError, /*last_key_version=*/0); return; + case TrustedVaultRequest::HttpStatus::kPersistentAccessTokenFetchError: + std::move(callback).Run( + TrustedVaultRegistrationStatus::kPersistentAccessTokenFetchError, + /*last_key_version=*/0); + return; + case TrustedVaultRequest::HttpStatus:: + kPrimaryAccountChangeAccessTokenFetchError: + std::move(callback).Run(TrustedVaultRegistrationStatus:: + kPrimaryAccountChangeAccessTokenFetchError, + /*last_key_version=*/0); + return; case TrustedVaultRequest::HttpStatus::kNotFound: case TrustedVaultRequest::HttpStatus::kBadRequest: // Local trusted vault keys are outdated. @@ -227,7 +238,10 @@ case TrustedVaultRequest::HttpStatus::kNotFound: case TrustedVaultRequest::HttpStatus::kBadRequest: case TrustedVaultRequest::HttpStatus::kConflict: - case TrustedVaultRequest::HttpStatus::kAccessTokenFetchingFailure: + case TrustedVaultRequest::HttpStatus::kTransientAccessTokenFetchError: + case TrustedVaultRequest::HttpStatus::kPersistentAccessTokenFetchError: + case TrustedVaultRequest::HttpStatus:: + kPrimaryAccountChangeAccessTokenFetchError: std::move(callback).Run(TrustedVaultRecoverabilityStatus::kError); return; }
diff --git a/components/sync/trusted_vault/trusted_vault_connection_impl_unittest.cc b/components/sync/trusted_vault/trusted_vault_connection_impl_unittest.cc index 5c2067d..6849fd1 100644 --- a/components/sync/trusted_vault/trusted_vault_connection_impl_unittest.cc +++ b/components/sync/trusted_vault/trusted_vault_connection_impl_unittest.cc
@@ -77,29 +77,28 @@ return response; } +signin::AccessTokenInfo MakeAccessTokenInfo(const std::string& access_token) { + return signin::AccessTokenInfo( + access_token, + /*expiration_time_param=*/base::Time::Now() + base::Hours(1), + /*id_token=*/std::string()); +} + class FakeTrustedVaultAccessTokenFetcher : public TrustedVaultAccessTokenFetcher { public: explicit FakeTrustedVaultAccessTokenFetcher( - const absl::optional<std::string>& access_token) - : access_token_(access_token) {} + const AccessTokenInfoOrError& access_token_info_or_error) + : access_token_info_or_error_(access_token_info_or_error) {} ~FakeTrustedVaultAccessTokenFetcher() override = default; void FetchAccessToken(const CoreAccountId& account_id, TokenCallback callback) override { - if (access_token_) { - std::move(callback).Run(signin::AccessTokenInfo( - *access_token_, - /*expiration_time_param=*/base::Time::Now() + base::Hours(1), - /*id_token=*/std::string())); - } else { - std::move(callback).Run(base::unexpected( - TrustedVaultAccessTokenFetcher::FetchingError::kTransientAuthError)); - } + std::move(callback).Run(access_token_info_or_error_); } private: - const absl::optional<std::string> access_token_; + const AccessTokenInfoOrError access_token_info_or_error_; }; // TODO(crbug.com/1113598): revisit this tests suite and determine what actually @@ -114,7 +113,7 @@ &test_url_loader_factory_) ->Clone(), std::make_unique<FakeTrustedVaultAccessTokenFetcher>( - kAccessToken)) {} + MakeAccessTokenInfo(kAccessToken))) {} ~TrustedVaultConnectionImplTest() override = default; @@ -122,14 +121,16 @@ // Allows overloading of FakeTrustedVaultAccessTokenFetcher behavior, doesn't // overwrite connection(). - std::unique_ptr<TrustedVaultConnectionImpl> CreateConnectionWithAccessToken( - absl::optional<std::string> access_token) { + std::unique_ptr<TrustedVaultConnectionImpl> + CreateConnectionWithAccessTokenError( + TrustedVaultAccessTokenFetcher::FetchingError fetching_error) { return std::make_unique<TrustedVaultConnectionImpl>( kTestURL, base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( &test_url_loader_factory_) ->Clone(), - std::make_unique<FakeTrustedVaultAccessTokenFetcher>(access_token)); + std::make_unique<FakeTrustedVaultAccessTokenFetcher>( + base::unexpected(fetching_error))); } network::TestURLLoaderFactory::PendingRequest* GetPendingHTTPRequest() { @@ -579,8 +580,8 @@ TrustedVaultConnectionImplTest, ShouldHandleAccessTokenFetchingFailureWhenRegisteringAuthenticationFactor) { std::unique_ptr<TrustedVaultConnectionImpl> connection = - CreateConnectionWithAccessToken( - /*access_token=*/absl::nullopt); + CreateConnectionWithAccessTokenError( + TrustedVaultAccessTokenFetcher::FetchingError::kPersistentAuthError); std::unique_ptr<SecureBoxKeyPair> key_pair = MakeTestKeyPair(); ASSERT_THAT(key_pair, NotNull()); @@ -593,7 +594,8 @@ // because there is no access token. EXPECT_CALL( callback, - Run(Eq(TrustedVaultRegistrationStatus::kAccessTokenFetchingFailure))); + Run(Eq( + TrustedVaultRegistrationStatus::kPersistentAccessTokenFetchError))); std::unique_ptr<TrustedVaultConnection::Request> request = connection->RegisterAuthenticationFactor( /*account_info=*/CoreAccountInfo(), kTrustedVaultKeys, @@ -675,8 +677,8 @@ TEST_F(TrustedVaultConnectionImplTest, ShouldHandleAccessTokenFetchingFailureWhenDownloadingKeys) { std::unique_ptr<TrustedVaultConnectionImpl> connection = - CreateConnectionWithAccessToken( - /*access_token=*/absl::nullopt); + CreateConnectionWithAccessTokenError( + TrustedVaultAccessTokenFetcher::FetchingError::kPersistentAuthError); base::MockCallback<TrustedVaultConnection::DownloadNewKeysCallback> callback;
diff --git a/components/sync/trusted_vault/trusted_vault_request.cc b/components/sync/trusted_vault/trusted_vault_request.cc index 6deec60a..26611a6 100644 --- a/components/sync/trusted_vault/trusted_vault_request.cc +++ b/components/sync/trusted_vault/trusted_vault_request.cc
@@ -70,6 +70,21 @@ return std::string(); } +TrustedVaultRequest::HttpStatus AccessTokenFetchingErrorToRequestHttpStatus( + TrustedVaultAccessTokenFetcher::FetchingError access_token_error) { + switch (access_token_error) { + case TrustedVaultAccessTokenFetcher::FetchingError::kTransientAuthError: + return TrustedVaultRequest::HttpStatus::kTransientAccessTokenFetchError; + case TrustedVaultAccessTokenFetcher::FetchingError::kPersistentAuthError: + return TrustedVaultRequest::HttpStatus::kPersistentAccessTokenFetchError; + case TrustedVaultAccessTokenFetcher::FetchingError::kNotPrimaryAccount: + return TrustedVaultRequest::HttpStatus:: + kPrimaryAccountChangeAccessTokenFetchError; + } + NOTREACHED(); + return TrustedVaultRequest::HttpStatus::kTransientAccessTokenFetchError; +} + } // namespace TrustedVaultRequest::TrustedVaultRequest( @@ -111,7 +126,8 @@ // TODO(crbug.com/1413179): expose persistent auth errors to the higher // level as a dedicated status. RunCompletionCallbackAndMaybeDestroySelf( - HttpStatus::kAccessTokenFetchingFailure, + /*status=*/AccessTokenFetchingErrorToRequestHttpStatus( + access_token_info_or_error.error()), /*response_body=*/std::string()); return; }
diff --git a/components/sync/trusted_vault/trusted_vault_request.h b/components/sync/trusted_vault/trusted_vault_request.h index 09eddcdb..f6e7aa7 100644 --- a/components/sync/trusted_vault/trusted_vault_request.h +++ b/components/sync/trusted_vault/trusted_vault_request.h
@@ -37,9 +37,15 @@ kNotFound, // Reported when server returns http status code 409 (conflict). kConflict, - // Reported when access token fetch attempt was failed and request wasn't - // sent. - kAccessTokenFetchingFailure, + // Reported when access token fetch attempt was failed due to transient auth + // error. + kTransientAccessTokenFetchError, + // Reported when access token fetch attempt failed due to permanent auth + // error. + kPersistentAccessTokenFetchError, + // Reported when access token fetch attempt was cancelled due to primary + // account change. + kPrimaryAccountChangeAccessTokenFetchError, // Reported when network error occurs. kNetworkError, // Reported when other http errors occur.
diff --git a/components/sync/trusted_vault/trusted_vault_request_unittest.cc b/components/sync/trusted_vault/trusted_vault_request_unittest.cc index d141112..2154648 100644 --- a/components/sync/trusted_vault/trusted_vault_request_unittest.cc +++ b/components/sync/trusted_vault/trusted_vault_request_unittest.cc
@@ -8,6 +8,7 @@ #include <string> #include <utility> +#include "base/containers/flat_map.h" #include "base/functional/bind.h" #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" @@ -52,29 +53,28 @@ return access_token_header == base::StringPrintf("Bearer %s", kAccessToken); } +signin::AccessTokenInfo MakeAccessTokenInfo(const std::string& access_token) { + return signin::AccessTokenInfo( + access_token, + /*expiration_time_param=*/base::Time::Now() + base::Hours(1), + /*id_token=*/std::string()); +} + class FakeTrustedVaultAccessTokenFetcher : public TrustedVaultAccessTokenFetcher { public: explicit FakeTrustedVaultAccessTokenFetcher( - const absl::optional<std::string>& access_token) - : access_token_(access_token) {} + const AccessTokenInfoOrError& access_token_info_or_error) + : access_token_info_or_error_(access_token_info_or_error) {} ~FakeTrustedVaultAccessTokenFetcher() override = default; void FetchAccessToken(const CoreAccountId& account_id, TokenCallback callback) override { - if (access_token_) { - std::move(callback).Run(signin::AccessTokenInfo( - *access_token_, - /*expiration_time_param=*/base::Time::Now() + base::Hours(1), - /*id_token=*/std::string())); - } else { - std::move(callback).Run(base::unexpected( - TrustedVaultAccessTokenFetcher::FetchingError::kTransientAuthError)); - } + std::move(callback).Run(access_token_info_or_error_); } private: - const absl::optional<std::string> access_token_; + const AccessTokenInfoOrError access_token_info_or_error_; }; class TrustedVaultRequestTest : public testing::Test { @@ -85,12 +85,13 @@ &test_url_loader_factory_)) {} std::unique_ptr<TrustedVaultRequest> StartNewRequestWithAccessToken( - const absl::optional<std::string>& access_token, + const std::string& access_token, TrustedVaultRequest::HttpMethod http_method, const absl::optional<std::string>& request_body, TrustedVaultRequest::CompletionCallback completion_callback) { const CoreAccountId account_id = CoreAccountId::FromGaiaId("user_id"); - FakeTrustedVaultAccessTokenFetcher access_token_fetcher(access_token); + FakeTrustedVaultAccessTokenFetcher access_token_fetcher( + MakeAccessTokenInfo(access_token)); auto request = std::make_unique<TrustedVaultRequest>( http_method, GURL(kRequestUrl), request_body, @@ -101,6 +102,22 @@ return request; } + std::unique_ptr<TrustedVaultRequest> StartNewRequestWithAccessTokenError( + TrustedVaultAccessTokenFetcher::FetchingError error, + TrustedVaultRequest::CompletionCallback completion_callback) { + const CoreAccountId account_id = CoreAccountId::FromGaiaId("user_id"); + FakeTrustedVaultAccessTokenFetcher access_token_fetcher( + base::unexpected{error}); + + auto request = std::make_unique<TrustedVaultRequest>( + TrustedVaultRequest::HttpMethod::kGet, GURL(kRequestUrl), + /*serialized_request_proto=*/absl::nullopt, shared_url_loader_factory_, + TrustedVaultURLFetchReasonForUMA::kUnspecified); + request->FetchAccessTokenAndSendRequest(account_id, &access_token_fetcher, + std::move(completion_callback)); + return request; + } + bool RespondToHttpRequest( net::Error error, absl::optional<net::HttpStatusCode> response_http_code, @@ -305,21 +322,34 @@ } TEST_F(TrustedVaultRequestTest, ShouldHandleAccessTokenFetchingFailures) { - base::MockCallback<TrustedVaultRequest::CompletionCallback> - completion_callback; - base::HistogramTester histogram_tester; - // Access token fetching failure propagated immediately in this test, so - // |completion_callback| should be called immediately as well. - EXPECT_CALL( - completion_callback, - Run(TrustedVaultRequest::HttpStatus::kAccessTokenFetchingFailure, _)); - std::unique_ptr<TrustedVaultRequest> request = StartNewRequestWithAccessToken( - /*access_token=*/absl::nullopt, TrustedVaultRequest::HttpMethod::kGet, - /*request_body=*/absl::nullopt, completion_callback.Get()); - histogram_tester.ExpectUniqueSample( - /*name=*/"Sync.TrustedVaultAccessTokenFetchSuccess", - /*sample=*/false, - /*expected_bucket_count=*/1); + base::flat_map<TrustedVaultAccessTokenFetcher::FetchingError, + TrustedVaultRequest::HttpStatus> + fetching_error_to_http_status = { + {TrustedVaultAccessTokenFetcher::FetchingError::kTransientAuthError, + TrustedVaultRequest::HttpStatus::kTransientAccessTokenFetchError}, + {TrustedVaultAccessTokenFetcher::FetchingError::kPersistentAuthError, + TrustedVaultRequest::HttpStatus::kPersistentAccessTokenFetchError}, + {TrustedVaultAccessTokenFetcher::FetchingError::kNotPrimaryAccount, + TrustedVaultRequest::HttpStatus:: + kPrimaryAccountChangeAccessTokenFetchError}}; + + for (const auto& [fetching_error, expected_http_status] : + fetching_error_to_http_status) { + base::HistogramTester histogram_tester; + + base::MockCallback<TrustedVaultRequest::CompletionCallback> + completion_callback; + // Access token fetching failure propagated immediately in this test, so + // |completion_callback| should be called immediately as well. + EXPECT_CALL(completion_callback, Run(expected_http_status, _)); + std::unique_ptr<TrustedVaultRequest> request = + StartNewRequestWithAccessTokenError(fetching_error, + completion_callback.Get()); + histogram_tester.ExpectUniqueSample( + /*name=*/"Sync.TrustedVaultAccessTokenFetchSuccess", + /*sample=*/false, + /*expected_bucket_count=*/1); + } } } // namespace syncer
diff --git a/components/user_manager/fake_user_manager.cc b/components/user_manager/fake_user_manager.cc index 21de882..37e2fb9 100644 --- a/components/user_manager/fake_user_manager.cc +++ b/components/user_manager/fake_user_manager.cc
@@ -110,6 +110,11 @@ } } +void FakeUserManager::RemoveUserFromListForRecreation( + const AccountId& account_id) { + RemoveUserFromList(account_id); +} + const UserList& FakeUserManager::GetUsers() const { return users_; }
diff --git a/components/user_manager/fake_user_manager.h b/components/user_manager/fake_user_manager.h index 676c7f2..ef09f551 100644 --- a/components/user_manager/fake_user_manager.h +++ b/components/user_manager/fake_user_manager.h
@@ -97,6 +97,7 @@ UserRemovalReason reason, RemoveUserDelegate* delegate) override {} void RemoveUserFromList(const AccountId& account_id) override; + void RemoveUserFromListForRecreation(const AccountId& account_id) override; bool IsKnownUser(const AccountId& account_id) const override; const User* FindUser(const AccountId& account_id) const override; User* FindUserAndModify(const AccountId& account_id) override;
diff --git a/components/user_manager/user_manager.h b/components/user_manager/user_manager.h index b3e5080..2d023b1 100644 --- a/components/user_manager/user_manager.h +++ b/components/user_manager/user_manager.h
@@ -211,6 +211,15 @@ // picture. virtual void RemoveUserFromList(const AccountId& account_id) = 0; + // Removes the user from persistent list, without triggering user removal + // notification. + // Used to re-create user in Password changed flow when user can not + // remember old password and decides to delete existing user directory and + // re-create it. + // TODO(b/270040728): Remove this method once internal architecture allows + // better solution. + virtual void RemoveUserFromListForRecreation(const AccountId& account_id) = 0; + // Returns true if a user with the given account id is found in the persistent // list or currently logged in as ephemeral. virtual bool IsKnownUser(const AccountId& account_id) const = 0;
diff --git a/components/user_manager/user_manager_base.cc b/components/user_manager/user_manager_base.cc index 1c1ee86..36c643c1 100644 --- a/components/user_manager/user_manager_base.cc +++ b/components/user_manager/user_manager_base.cc
@@ -380,6 +380,16 @@ } void UserManagerBase::RemoveUserFromList(const AccountId& account_id) { + RemoveUserFromListImpl(account_id, /* notify=*/true); +} + +void UserManagerBase::RemoveUserFromListForRecreation( + const AccountId& account_id) { + RemoveUserFromListImpl(account_id, /* notify=*/false); +} + +void UserManagerBase::RemoveUserFromListImpl(const AccountId& account_id, + bool notify) { DCHECK(!task_runner_ || task_runner_->RunsTasksInCurrentSequence()); RemoveNonCryptohomeData(account_id); KnownUser(GetLocalState()).RemovePrefs(account_id); @@ -387,8 +397,7 @@ // After the User object is deleted from memory in DeleteUser() here, // the account_id reference will be invalid if the reference points // to the account_id in the User object. - DeleteUser( - RemoveRegularOrSupervisedUserFromList(account_id, true /* notify */)); + DeleteUser(RemoveRegularOrSupervisedUserFromList(account_id, notify)); } else { NOTREACHED() << "Users are not loaded yet."; return;
diff --git a/components/user_manager/user_manager_base.h b/components/user_manager/user_manager_base.h index 5172367..8b1d212 100644 --- a/components/user_manager/user_manager_base.h +++ b/components/user_manager/user_manager_base.h
@@ -97,6 +97,7 @@ UserRemovalReason reason, RemoveUserDelegate* delegate) override; void RemoveUserFromList(const AccountId& account_id) override; + void RemoveUserFromListForRecreation(const AccountId& account_id) override; bool IsKnownUser(const AccountId& account_id) const override; const User* FindUser(const AccountId& account_id) const override; User* FindUserAndModify(const AccountId& account_id) override; @@ -234,6 +235,9 @@ User* RemoveRegularOrSupervisedUserFromList(const AccountId& account_id, bool notify); + // Implementation for `RemoveUserFromList`[`ForRecreation`] methods. + void RemoveUserFromListImpl(const AccountId& account_id, bool notify); + // Implementation for RemoveUser method. This is an asynchronous part of the // method, that verifies that owner will not get deleted, and calls // |RemoveNonOwnerUserInternal|.
diff --git a/content/browser/attribution_reporting/attributions_browsertest.cc b/content/browser/attribution_reporting/attributions_browsertest.cc index 0e019d9a..c05f923 100644 --- a/content/browser/attribution_reporting/attributions_browsertest.cc +++ b/content/browser/attribution_reporting/attributions_browsertest.cc
@@ -68,6 +68,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/features.h" +#include "third_party/blink/public/common/fenced_frame/fenced_frame_utils.h" #include "third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h" #include "third_party/blink/public/common/service_worker/service_worker_status_code.h" #include "third_party/blink/public/common/storage_key/storage_key.h" @@ -1870,4 +1871,68 @@ expected_report2.WaitForReport(); } +IN_PROC_BROWSER_TEST_F(AttributionsFencedFrameBrowserTest, + AutomaticBeacon_ReportSent) { + // Expected reports must be registered before the server starts. + ExpectedReportWaiter expected_report( + GURL("https://a.test/.well-known/attribution-reporting/" + "report-event-attribution"), + /*attribution_destination=*/"https://a.test", + /*source_event_id=*/"5", /*source_type=*/"navigation", + /*trigger_data=*/"7", https_server()); + ASSERT_TRUE(https_server()->Start()); + + GURL main_url = + https_server()->GetURL("a.test", "/page_with_impression_creator.html"); + ASSERT_TRUE(NavigateToURL(shell(), main_url)); + FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) + ->GetPrimaryFrameTree() + .root(); + TestFrameNavigationObserver root_observer(root); + GURL fenced_frame_url( + https_server()->GetURL("a.test", "/page_with_impression_creator.html")); + + GURL reporting_url = https_server()->GetURL( + "a.test", "/register_source_headers_trigger_same_origin.html"); + + scoped_refptr<FencedFrameReporter> fenced_frame_reporter = + CreateFencedFrameReporter(); + // Set valid reporting metadata for buyer. + fenced_frame_reporter->OnUrlMappingReady( + blink::FencedFrame::ReportingDestination::kBuyer, + {{blink::kFencedFrameTopNavigationBeaconType, reporting_url}}); + + FrameTreeNode* fenced_frame_root_node = + AddFencedFrame(root, fenced_frame_url, std::move(fenced_frame_reporter)); + + ASSERT_TRUE(ExecJs(fenced_frame_root_node, + JsReplace(R"( + window.fence.setReportEventDataForAutomaticBeacons({ + eventType: $1, + eventData: 'This is the event data!', + destination: ['buyer'] + }); + )", + blink::kFencedFrameTopNavigationBeaconType))); + + GURL navigation_url( + https_server()->GetURL("a.test", "/page_with_impression_creator.html")); + + ASSERT_TRUE( + ExecJs(fenced_frame_root_node, + JsReplace("window.open($1, '_unfencedTop');", navigation_url))); + + // The page must fully load before it can do anything involving attribution + // reporting. + root_observer.Wait(); + + ASSERT_TRUE(ExecJs(root, JsReplace("createAttributionSrcImg($1);", + https_server()->GetURL( + "a.test", + "/attribution_reporting/" + "register_trigger_headers.html")))); + + expected_report.WaitForReport(); +} + } // namespace content
diff --git a/content/browser/direct_sockets/direct_sockets_open_browsertest.cc b/content/browser/direct_sockets/direct_sockets_open_browsertest.cc index f48fb52..2be950e 100644 --- a/content/browser/direct_sockets/direct_sockets_open_browsertest.cc +++ b/content/browser/direct_sockets/direct_sockets_open_browsertest.cc
@@ -18,6 +18,7 @@ #include "content/browser/direct_sockets/direct_sockets_test_utils.h" #include "content/public/browser/browser_context.h" #include "content/public/common/content_features.h" +#include "content/public/common/content_switches.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test.h" @@ -182,6 +183,13 @@ ASSERT_TRUE(NavigateToURL(shell(), GetTestOpenPageURL())); } + void SetUpCommandLine(base::CommandLine* command_line) override { + // For TCPServerSocket support. + // TODO(crbug.com/1408140): remove after TCPServerSocket is fully supported. + command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures, + "DirectSocketsExperimental"); + } + void SetUp() override { embedded_test_server()->AddDefaultHandlers(GetTestDataFilePath()); ASSERT_TRUE(embedded_test_server()->Start()); @@ -571,4 +579,46 @@ } } +IN_PROC_BROWSER_TEST_F(DirectSocketsOpenBrowserTest, OpenTcpServerOptions) { + { + const std::string script = R"( + openTcpServer('direct-sockets.com'); + )"; + EXPECT_THAT(EvalJs(shell(), script).ExtractString(), + testing::HasSubstr("localAddress must be a valid IP address")); + } + + { + const std::string script = R"( + openTcpServer('127.0.0.1', { + localPort: 0, + }); + )"; + EXPECT_THAT(EvalJs(shell(), script).ExtractString(), + testing::HasSubstr("localPort must be greater than zero")); + } + + { + const std::string script = R"( + openTcpServer('127.0.0.1', { + backlog: 0, + }); + )"; + EXPECT_THAT(EvalJs(shell(), script).ExtractString(), + testing::HasSubstr("backlog must be greater than zero")); + } + + { + const std::string script = R"( + openTcpServer('127.0.0.1', { + ipv6Only: true, + }); + )"; + EXPECT_THAT( + EvalJs(shell(), script).ExtractString(), + testing::HasSubstr( + "ipv6Only can only be specified when localAddress is [::]")); + } +} + } // namespace content
diff --git a/content/browser/direct_sockets/direct_sockets_service_impl.cc b/content/browser/direct_sockets/direct_sockets_service_impl.cc index e61e6975..0af40ac 100644 --- a/content/browser/direct_sockets/direct_sockets_service_impl.cc +++ b/content/browser/direct_sockets/direct_sockets_service_impl.cc
@@ -29,6 +29,14 @@ #include "third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h" +#if BUILDFLAG(IS_WIN) +#include <winsock2.h> +#endif // BUILDFLAG(IS_WIN) + +#if BUILDFLAG(IS_POSIX) +#include <sys/socket.h> +#endif // BUILDFLAG(IS_POSIX) + namespace content { namespace { @@ -253,6 +261,22 @@ } } +void DirectSocketsServiceImpl::OpenTCPServerSocket( + blink::mojom::DirectTCPServerSocketOptionsPtr options, + mojo::PendingReceiver<network::mojom::TCPServerSocket> socket, + OpenTCPServerSocketCallback callback) { + // Default if |options->backlog| is 0. + uint32_t backlog = SOMAXCONN; + if (options->backlog > 0) { + // Truncate the provided value if it is larger than allowed by the platform. + backlog = std::min<uint32_t>(options->backlog, SOMAXCONN); + } + GetNetworkContext()->CreateTCPServerSocket( + options->local_addr, backlog, + net::MutableNetworkTrafficAnnotationTag(kDirectSocketsTrafficAnnotation), + std::move(socket), std::move(callback)); +} + // static void DirectSocketsServiceImpl::SetNetworkContextForTesting( network::mojom::NetworkContext* network_context) {
diff --git a/content/browser/direct_sockets/direct_sockets_service_impl.h b/content/browser/direct_sockets/direct_sockets_service_impl.h index 4a3f48a3..9ef62b22 100644 --- a/content/browser/direct_sockets/direct_sockets_service_impl.h +++ b/content/browser/direct_sockets/direct_sockets_service_impl.h
@@ -46,6 +46,10 @@ mojo::PendingReceiver<network::mojom::RestrictedUDPSocket> receiver, mojo::PendingRemote<network::mojom::UDPSocketListener> listener, OpenUDPSocketCallback callback) override; + void OpenTCPServerSocket( + blink::mojom::DirectTCPServerSocketOptionsPtr options, + mojo::PendingReceiver<network::mojom::TCPServerSocket> socket, + OpenTCPServerSocketCallback callback) override; // Testing: static void SetNetworkContextForTesting(network::mojom::NetworkContext*);
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc index 6148a3d..7d971eb9 100644 --- a/content/browser/fenced_frame/fenced_frame_browsertest.cc +++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -4938,8 +4938,7 @@ return message.log_level == blink::mojom::ConsoleMessageLevel::kError; }; console_observer.SetFilter(base::BindRepeating(filter)); - console_observer.SetPattern( - GetConsoleWarningPattern(Step::Result::kModeNotOpaque)); + console_observer.SetPattern(GetConsoleWarningPattern(Step::Result::kNoMeta)); // Perform the reportEvent call, with a unique body. const char report_event_script[] = R"( @@ -5022,7 +5021,9 @@ RunTest(config); } -// reportEvent should work in same-origin subframes. +// reportEvent should work in subframes that are same-origin to the most recent +// embedder-initiated committed url in the fenced frame, regardless of the +// fenced frame root's current url. IN_PROC_BROWSER_TEST_F(FencedFrameReportEventBrowserTest, FencedFrameReportEventNestedIframeSameOriginNavigation) { std::vector<Step> config = { @@ -5037,11 +5038,22 @@ .destination = {"a.test", "/fenced_frames/title1.html"}, .report_event_result = Step::Result::kSuccess, }, + { + .destination = {"b.test", "/fenced_frames/title1.html"}, + .report_event_result = Step::Result::kNoMeta, + }, + { + .is_target_nested_iframe = true, + .destination = {"a.test", "/fenced_frames/title1.html"}, + .report_event_result = Step::Result::kSuccess, + }, }; RunTest(config); } -// reportEvent shouldn't work in cross-origin subframes. +// reportEvent shouldn't work in subframes that are cross-origin to the most +// recent embedder-initiated committed url in the fenced frame, regardless of +// the fenced frame root's current url. IN_PROC_BROWSER_TEST_F( FencedFrameReportEventBrowserTest, FencedFrameReportEventNestedIframeCrossOriginNavigation) { @@ -5055,7 +5067,16 @@ { .is_target_nested_iframe = true, .destination = {"b.test", "/fenced_frames/title1.html"}, - .report_event_result = Step::Result::kCrossOrigin, + .report_event_result = Step::Result::kNoMeta, + }, + { + .destination = {"b.test", "/fenced_frames/title1.html"}, + .report_event_result = Step::Result::kNoMeta, + }, + { + .is_target_nested_iframe = true, + .destination = {"b.test", "/fenced_frames/title1.html"}, + .report_event_result = Step::Result::kNoMeta, }, }; RunTest(config); @@ -5146,7 +5167,8 @@ } // Cross-origin redirects in the initial URN navigation shouldn't affect -// reporting metadata either. +// reporting metadata either. The final URL in the redirect chain should be the +// one used for subsequent same- or cross- origin checks. IN_PROC_BROWSER_TEST_F(FencedFrameReportEventBrowserTest, FencedFrameReportEventEmbedderCrossOriginRedirect) { std::vector<Step> config = { @@ -5161,14 +5183,26 @@ }, .report_event_result = Step::Result::kSuccess, }, + { + .destination = {"a.test", "/fenced_frames/title1.html"}, + .report_event_result = Step::Result::kNoMeta, + }, + { + .destination = {"b.test", "/fenced_frames/title1.html"}, + .report_event_result = Step::Result::kNoMeta, + }, + { + .destination = {"c.test", "/fenced_frames/title1.html"}, + .report_event_result = Step::Result::kSuccess, + }, }; RunTest(config); } -// Metadata should be preserved if all URLs in an FF-initiated redirect chain -// are same-origin. +// Metadata should be preserved as long as the final URL in a FF-initiated +// redirect chain is same-origin. IN_PROC_BROWSER_TEST_F(FencedFrameReportEventBrowserTest, - FencedFrameReportEventFFSameOriginRedirect) { + FencedFrameReportEventFFSameOriginInterveningRedirect) { std::vector<Step> config = { { .is_embedder_initiated = true, @@ -5189,10 +5223,10 @@ RunTest(config); } -// Metadata should be dropped if any URLs in an FF-initiated redirect chain -// are cross-origin. +// Metadata should be preserved as long as the final URL in an FF-initiated +// redirect chain is same-origin. IN_PROC_BROWSER_TEST_F(FencedFrameReportEventBrowserTest, - FencedFrameReportEventFFCrossOriginRedirect) { + FencedFrameReportEventFFCrossOriginInterveningRedirect) { std::vector<Step> config = { { .is_embedder_initiated = true, @@ -5207,7 +5241,7 @@ {"b.test", "/fenced_frames/redirect2.html"}, {"a.test", "/fenced_frames/title1.html"}, }, - .report_event_result = Step::Result::kNoMeta, + .report_event_result = Step::Result::kSuccess, }, }; RunTest(config); @@ -6196,7 +6230,7 @@ // Verify the request contains the eligibility header. EXPECT_EQ( response.http_request()->headers.at("Attribution-Reporting-Eligible"), - "event-source"); + "navigation-source"); EXPECT_FALSE(base::Contains(response.http_request()->headers, "Attribution-Reporting-Support")); response.Done();
diff --git a/content/browser/fenced_frame/fenced_frame_config.cc b/content/browser/fenced_frame/fenced_frame_config.cc index d6780136..0a4a939 100644 --- a/content/browser/fenced_frame/fenced_frame_config.cc +++ b/content/browser/fenced_frame/fenced_frame_config.cc
@@ -252,4 +252,9 @@ return redacted_properties; } +void FencedFrameProperties::UpdateMappedURL(GURL url) { + CHECK(mapped_url_.has_value()); + mapped_url_->value_ = url; +} + } // namespace content
diff --git a/content/browser/fenced_frame/fenced_frame_config.h b/content/browser/fenced_frame/fenced_frame_config.h index 06224b9..bf4ea97 100644 --- a/content/browser/fenced_frame/fenced_frame_config.h +++ b/content/browser/fenced_frame/fenced_frame_config.h
@@ -192,6 +192,8 @@ // // Config-generating APIs like FLEDGE's runAdAuction and sharedStorage's // selectURL return urns as handles to `FencedFrameConfig`s. +// TODO(crbug.com/1417871): Turn this into a class, make its fields private, +// and have a single constructor that requires all fields to be specified. struct CONTENT_EXPORT FencedFrameConfig { FencedFrameConfig(); explicit FencedFrameConfig(const GURL& mapped_url); @@ -281,6 +283,7 @@ // These `FencedFrameProperties` are stored in the fenced frame root // `FrameTreeNode`, and live between embedder-initiated fenced frame // navigations. +// TODO(crbug.com/1417871): Turn this into a class and make its fields private. struct CONTENT_EXPORT FencedFrameProperties { // The empty constructor is used for: // * pre-navigation fenced frames @@ -303,6 +306,13 @@ absl::optional<FencedFrameProperty<GURL>> mapped_url_; + // Update the stored mapped URL to a new one given by `url`. + // `this` must have a value for `mapped_url_` when the function is called. + // We use this method when an embedder-initiated fenced frame root navigation + // commits, to update the mapped URL to reflect the final destination after + // any server-side redirects. + void UpdateMappedURL(GURL url); + absl::optional<FencedFrameProperty<gfx::Size>> container_size_; absl::optional<FencedFrameProperty<gfx::Size>> content_size_;
diff --git a/content/browser/fenced_frame/fenced_frame_reporter.cc b/content/browser/fenced_frame/fenced_frame_reporter.cc index 6304b79..c0712da 100644 --- a/content/browser/fenced_frame/fenced_frame_reporter.cc +++ b/content/browser/fenced_frame/fenced_frame_reporter.cc
@@ -33,6 +33,7 @@ #include "services/network/public/mojom/fetch_api.mojom.h" #include "services/network/public/mojom/url_response_head.mojom.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/abseil-cpp/absl/types/variant.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h" #include "url/gurl.h" @@ -219,7 +220,8 @@ const std::string& event_data, blink::FencedFrame::ReportingDestination reporting_destination, RenderFrameHostImpl* request_initiator_frame, - std::string& error_message) { + std::string& error_message, + absl::optional<int64_t> navigation_id) { DCHECK(request_initiator_frame); auto it = reporting_metadata_.find(reporting_destination); @@ -236,7 +238,16 @@ static base::AtomicSequenceNumber unique_id_counter; - BeaconId beacon_id(EventBeaconId(unique_id_counter.GetNext())); + // The id will be a `NavigationBeaconId` only if this report is being sent as + // the result of a top navigation initiated by a fenced frame. This is used to + // track attributions that occur on a navigated page after the current page + // has been unloaded. + BeaconId beacon_id; + if (navigation_id.has_value()) { + beacon_id = NavigationBeaconId(navigation_id.value()); + } else { + beacon_id = EventBeaconId(unique_id_counter.GetNext()); + } auto* attribution_host = AttributionHost::FromWebContents( WebContents::FromRenderFrameHost(request_initiator_frame)); @@ -303,9 +314,10 @@ request->trusted_params = network::ResourceRequest::TrustedParams(); request->trusted_params->isolation_info = net::IsolationInfo::CreateTransient(); - // TODO(xiaochenzh): The eligible header for automatic beacon should be - // `navigation-source`, update the code below when it is enabled. - request->headers.SetHeader("Attribution-Reporting-Eligible", "event-source"); + request->headers.SetHeader("Attribution-Reporting-Eligible", + absl::holds_alternative<EventBeaconId>(beacon_id) + ? "event-source" + : "navigation-source"); if (base::FeatureList::IsEnabled( blink::features::kAttributionReportingCrossAppWeb)) { request->headers.SetHeader("Attribution-Reporting-Support",
diff --git a/content/browser/fenced_frame/fenced_frame_reporter.h b/content/browser/fenced_frame/fenced_frame_reporter.h index ed12387..0d559d8 100644 --- a/content/browser/fenced_frame/fenced_frame_reporter.h +++ b/content/browser/fenced_frame/fenced_frame_reporter.h
@@ -118,12 +118,20 @@ // attempted, unless the reporting URL map for `reporting_destination` is // pending. In that case, errors are currently never reported, even if the // reporting URL map results in no request being sent. + // + // Note: `navigation_id` will only be non-null in the case of an automatic + // beacon `reserved.top_navigation` sent as a result of a top-level navigation + // from a fenced frame. It will be set to the ID of the navigation request + // initiated from the fenced frame and targeting the new top-level frame. + // In all other cases (including the fence.reportEvent() case), the navigation + // id will be null. bool SendReport( const std::string& event_type, const std::string& event_data, blink::FencedFrame::ReportingDestination reporting_destination, RenderFrameHostImpl* request_initiator_frame, - std::string& error_message); + std::string& error_message, + absl::optional<int64_t> navigation_id = absl::nullopt); // Stores the payload that will be sent as part of the // `reserved.top_navigation` automatic beacon.
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.cc b/content/browser/fenced_frame/fenced_frame_url_mapping.cc index 53b02f6d8..5e5c17a 100644 --- a/content/browser/fenced_frame/fenced_frame_url_mapping.cc +++ b/content/browser/fenced_frame/fenced_frame_url_mapping.cc
@@ -80,7 +80,18 @@ void FencedFrameURLMapping::ImportPendingAdComponents( const std::vector<std::pair<GURL, FencedFrameConfig>>& components) { for (const auto& component_ad : components) { - DCHECK(!IsMapped(component_ad.first)); + // If this is called redundantly, do nothing. + // This happens in urn iframes, because the FencedFrameURLMapping is + // attached to the Page. In fenced frames, the Page is rooted at the fenced + // frame root, so a new FencedFrameURLMapping is created when the root is + // navigated. In urn iframes, the Page is rooted at the top-level frame, so + // the same FencedFrameURLMapping exists after "urn iframe root" + // navigations. + // TODO(crbug.com/1415475): Change this to a CHECK when we remove urn + // iframes. + if (IsMapped(component_ad.first)) { + return; + } UrnUuidToUrlMap::iterator it = urn_uuid_to_url_map_.emplace(component_ad.first, component_ad.second)
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.h b/content/browser/fenced_frame/fenced_frame_url_mapping.h index 275ceb6..58c93440a 100644 --- a/content/browser/fenced_frame/fenced_frame_url_mapping.h +++ b/content/browser/fenced_frame/fenced_frame_url_mapping.h
@@ -70,8 +70,7 @@ // Imports URN to URL mappings from passed in mapping. Generally only called // once per PendingAdComponentsMap, on the mapping associated with a frame // being navigated to a URN. Calling this twice with the same - // PendingAdComponentsMap on the same FencedFrameURLMapping will assert, - // since it will result in adding the same URNs twice to the same mapping. + // PendingAdComponentsMap on the same FencedFrameURLMapping will do nothing. void ImportPendingAdComponents( const std::vector<std::pair<GURL, FencedFrameConfig>>& components);
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc index 97ed794..ae08291 100644 --- a/content/browser/interest_group/interest_group_browsertest.cc +++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -5724,6 +5724,79 @@ EXPECT_EQ(0u, GetAllInterestGroups().size()); } +// Runs ad auction with fenced frames enabled. The auction should succeed and +// be loaded in a fenced frame. Then the fenced frame content performs a +// cross-origin navigation on itself, and the new document loads an iframe that +// is same-origin to the interest group. We leave the interest group from the +// iframe, and it should succeed. +IN_PROC_BROWSER_TEST_P( + InterestGroupFencedFrameBrowserTest, + RunAdAuctionWithWinnerLeaveGroupAfterRendererInitiatedNavigation) { + URLLoaderMonitor url_loader_monitor; + + GURL test_url = + https_server_->GetURL("a.test", "/fenced_frames/opaque_ads.html"); + ASSERT_TRUE(NavigateToURL(shell(), test_url)); + url::Origin test_origin = url::Origin::Create(test_url); + + AttachInterestGroupObserver(); + + // First, load an ad urn-mapped to `test_url`. + EXPECT_EQ( + kSuccess, + JoinInterestGroupAndVerify( + blink::TestInterestGroupBuilder( + /*owner=*/test_origin, + /*name=*/"cars") + .SetBiddingUrl(https_server_->GetURL( + "a.test", "/interest_group/bidding_logic.js")) + .SetTrustedBiddingSignalsUrl(https_server_->GetURL( + "a.test", "/interest_group/trusted_bidding_signals.json")) + .SetTrustedBiddingSignalsKeys({{"key1"}}) + .SetAds({{{test_url, R"({"ad":"metadata","here":[1,2]})"}}}) + .Build())); + + ASSERT_NO_FATAL_FAILURE(RunAuctionAndNavigateFencedFrame( + test_url, JsReplace( + R"({ +seller: $1, +decisionLogicUrl: $2, +interestGroupBuyers: [$1], +auctionSignals: {x: 1}, +sellerSignals: {yet: 'more', info: 1}, +perBuyerSignals: {$1: {even: 'more', x: 4.5}} + })", + test_origin, + https_server_->GetURL( + "a.test", "/interest_group/decision_logic.js")))); + + // Now perform a fenced frame content-initiated navigation to a cross-origin + // document that will load a same-origin (to the mapped url) iframe that will + // leave the interest group. + GURL inner_url = https_server_->GetURL( + "a.test", "/fenced_frames/ad_that_leaves_interest_group.html"); + GURL ad_url = https_server_->GetURL( + "b.test", "/fenced_frames/outer_inner_frame_as_param.html"); + GURL::Replacements rep; + std::string query = "innerFrame=" + base::EscapeUrlEncodedData( + inner_url.spec(), /*use_plus=*/false); + rep.SetQueryStr(query); + ad_url = ad_url.ReplaceComponents(rep); + + RenderFrameHostImpl* ad_frame = GetFencedFrameRenderFrameHost(shell()); + TestFrameNavigationObserver observer(ad_frame); + EXPECT_TRUE(ExecJs(ad_frame, JsReplace("document.location = $1;", ad_url))); + observer.Wait(); + + // Wait for the interest group to disappear. + WaitForInterestGroupsSatisfying( + test_origin, + base::BindLambdaForTesting( + [](const std::vector<StorageInterestGroup>& groups) -> bool { + return groups.empty(); + })); +} + // Creates a Fenced Frame and then tries to use the leaveAdInterestGroup API. // Leaving the interest group should silently fail. IN_PROC_BROWSER_TEST_P(InterestGroupFencedFrameBrowserTest,
diff --git a/content/browser/memory_pressure/user_level_memory_pressure_signal_generator.cc b/content/browser/memory_pressure/user_level_memory_pressure_signal_generator.cc index f820ccb..19e08844 100644 --- a/content/browser/memory_pressure/user_level_memory_pressure_signal_generator.cc +++ b/content/browser/memory_pressure/user_level_memory_pressure_signal_generator.cc
@@ -9,7 +9,6 @@ #include <fcntl.h> #include <inttypes.h> #include <unistd.h> -#include <utility> #include "base/android/child_process_binding_types.h" #include "base/feature_list.h" #include "base/files/file.h" @@ -18,6 +17,8 @@ #include "base/functional/bind.h" #include "base/memory/memory_pressure_listener.h" #include "base/metrics/field_trial_params.h" +#include "base/metrics/histogram_functions.h" +#include "base/metrics/histogram_macros.h" #include "base/numerics/safe_conversions.h" #include "base/process/process.h" #include "base/strings/string_number_conversions.h" @@ -32,6 +33,10 @@ namespace memory_pressure { +namespace { +constexpr uint64_t k1MB = 1024ull * 1024; +} + #if !defined(ARCH_CPU_64_BITS) namespace features { @@ -79,7 +84,6 @@ return kMinimumInterval.Get(); } -constexpr uint64_t k1MB = 1024ull * 1024; constexpr size_t kDefaultMemoryThresholdMB = 485; uint64_t MemoryThresholdParamFor4GbDevices() { @@ -159,12 +163,15 @@ } void UserLevelMemoryPressureSignalGenerator::OnTimerFired() { base::TimeDelta interval = measure_interval_; - uint64_t total_private_footprint_bytes = + std::pair<uint64_t, uint64_t> total_pmfs = GetTotalPrivateFootprintVisibleOrHigherPriorityRenderers(); - if (total_private_footprint_bytes > memory_threshold_) { + if (total_pmfs.first > memory_threshold_) { NotifyMemoryPressure(); interval = minimum_interval_; + + ReportBeforeAfterMetrics(total_pmfs.first, total_pmfs.second, "Before"); + StartReportingTimer(); } StartPeriodicTimer(interval); @@ -183,19 +190,40 @@ base::Unretained(this))); } -// static -uint64_t UserLevelMemoryPressureSignalGenerator:: - GetTotalPrivateFootprintVisibleOrHigherPriorityRenderers() { - uint64_t total_private_footprint_bytes = 0u; +void UserLevelMemoryPressureSignalGenerator::StartReportingTimer() { + // Don't try to start the timer in tests that don't support it. + if (!base::SequencedTaskRunner::HasCurrentDefault()) { + return; + } + delayed_report_timer_.Start( + FROM_HERE, base::Seconds(10), + base::BindOnce( + &UserLevelMemoryPressureSignalGenerator::OnReportingTimerFired, + base::Unretained(this))); +} - auto add_process_private_footprint = [&](const base::Process& process) { +void UserLevelMemoryPressureSignalGenerator::OnReportingTimerFired() { + std::pair<uint64_t, uint64_t> total_pmfs = + GetTotalPrivateFootprintVisibleOrHigherPriorityRenderers(); + ReportBeforeAfterMetrics(total_pmfs.first, total_pmfs.second, "After"); +} + +// static +std::pair<uint64_t, uint64_t> UserLevelMemoryPressureSignalGenerator:: + GetTotalPrivateFootprintVisibleOrHigherPriorityRenderers() { + uint64_t total_pmf_visible_or_higher_priority_renderers_bytes = 0u; + + auto add_process_private_footprint = [&](uint64_t& pmf, + const base::Process& process) { if (process.IsValid()) { - total_private_footprint_bytes += GetPrivateFootprint(process).value_or(0); + pmf += GetPrivateFootprint(process).value_or(0); } }; // Measure private memory footprint of browser process - add_process_private_footprint(base::Process::Current()); + add_process_private_footprint( + total_pmf_visible_or_higher_priority_renderers_bytes, + base::Process::Current()); // Measure private memory footprints of GPU process and Utility processes. // Since GPU process uses the same user id as the browser process (android), @@ -206,13 +234,16 @@ // TODO(crbug.com/1393283): measure the private memory footprints of // the utility processes correctly. for (content::BrowserChildProcessHostIterator iter; !iter.Done(); ++iter) { - add_process_private_footprint(iter.GetData().GetProcess()); + add_process_private_footprint( + total_pmf_visible_or_higher_priority_renderers_bytes, + iter.GetData().GetProcess()); } // Measure private memory footprints of renderer processes with visible // or higher priority. Since the renderer processes with invisible or lower // priority will be cleaned up by Android OS, this pressure signal feature // doesn't need to take care of them. + uint64_t lower_priority_renderers_pmf_bytes = 0u; for (content::RenderProcessHost::iterator iter = content::RenderProcessHost::AllHostsIterator(); !iter.IsAtEnd(); iter.Advance()) { @@ -227,6 +258,8 @@ // Ignore renderer processes with invisible or lower priority. if (host->GetEffectiveChildBindingState() < base::android::ChildBindingState::VISIBLE) { + lower_priority_renderers_pmf_bytes += + GetPrivateFootprint(process).value_or(0); continue; } @@ -235,11 +268,14 @@ // status, i.e. no such file or directory. So each renderer process // provides its private memory footprint for the browser process and // the browser process gets the (cached) value via RenderProcessHostImpl. - total_private_footprint_bytes += + total_pmf_visible_or_higher_priority_renderers_bytes += static_cast<content::RenderProcessHostImpl*>(host) ->GetPrivateMemoryFootprint(); } - return total_private_footprint_bytes; + + return std::make_pair(total_pmf_visible_or_higher_priority_renderers_bytes, + total_pmf_visible_or_higher_priority_renderers_bytes + + lower_priority_renderers_pmf_bytes); } // static @@ -278,6 +314,27 @@ MEMORY_PRESSURE_LEVEL_CRITICAL); } +// static +void UserLevelMemoryPressureSignalGenerator::ReportBeforeAfterMetrics( + uint64_t total_pmf_visible_or_higher_priority_renderers, + uint64_t total_pmf, + const char* suffix_name) { + std::string metric_name_total_pmf_visible_or_higher_priority_renderers = + base::StringPrintf( + "Memory.Experimental.UserLevelMemoryPressureSignal." + "TotalPrivateMemoryFootprintVisibleOrHigherPriorityRenderers%s", + suffix_name); + base::UmaHistogramMemoryLargeMB( + metric_name_total_pmf_visible_or_higher_priority_renderers, + total_pmf_visible_or_higher_priority_renderers / k1MB); + + std::string metric_name_total_pmf = base::StringPrintf( + "Memory.Experimental.UserLevelMemoryPressureSignal." + "TotalPrivateMemoryFootprint%s", + suffix_name); + base::UmaHistogramMemoryLargeMB(metric_name_total_pmf, total_pmf / k1MB); +} + namespace { // TODO(crbug.com/1393283): if this feature is approved, refactor the duplicate
diff --git a/content/browser/memory_pressure/user_level_memory_pressure_signal_generator.h b/content/browser/memory_pressure/user_level_memory_pressure_signal_generator.h index 828088f..5fa1ffd1 100644 --- a/content/browser/memory_pressure/user_level_memory_pressure_signal_generator.h +++ b/content/browser/memory_pressure/user_level_memory_pressure_signal_generator.h
@@ -8,6 +8,7 @@ #include "build/build_config.h" #if BUILDFLAG(IS_ANDROID) +#include <utility> #include "base/no_destructor.h" #include "base/timer/timer.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -38,11 +39,20 @@ base::TimeDelta measure_interval, base::TimeDelta minimum_interval); void OnTimerFired(); + void OnReportingTimerFired(); void StartPeriodicTimer(base::TimeDelta interval); + void StartReportingTimer(); + + static std::pair<uint64_t, uint64_t> + GetTotalPrivateFootprintVisibleOrHigherPriorityRenderers(); static void NotifyMemoryPressure(); - static uint64_t GetTotalPrivateFootprintVisibleOrHigherPriorityRenderers(); + + static void ReportBeforeAfterMetrics( + uint64_t total_pmf_visible_or_higher_priority_renderers, + uint64_t total_pmf, + const char* suffix_name); static absl::optional<uint64_t> GetPrivateFootprint( const base::Process& process); @@ -51,6 +61,7 @@ base::TimeDelta measure_interval_; base::TimeDelta minimum_interval_; base::OneShotTimer periodic_measuring_timer_; + base::OneShotTimer delayed_report_timer_; }; } // namespace memory_pressure
diff --git a/content/browser/permissions/permission_service_context.cc b/content/browser/permissions/permission_service_context.cc index 0b4cee66..92814b0 100644 --- a/content/browser/permissions/permission_service_context.cc +++ b/content/browser/permissions/permission_service_context.cc
@@ -79,7 +79,7 @@ void NotifyPermissionStatusChangedIfNeeded() { DCHECK(status_at_bf_cache_entry_.has_value()); - if (status_at_bf_cache_entry_.value() != last_known_status_) { + if (status_at_bf_cache_entry_ != last_known_status_) { observer_->OnPermissionStatusChange(last_known_status_); } status_at_bf_cache_entry_.reset(); @@ -189,6 +189,12 @@ subscription->OnPermissionStatusChanged(current_status); } + if (render_frame_host_ && + render_frame_host_->IsInLifecycleState( + content::RenderFrameHost::LifecycleState::kInBackForwardCache)) { + subscription->StoreStatusAtBFCacheEntry(); + } + GURL requesting_origin(origin.Serialize()); auto subscription_id = PermissionControllerImpl::FromBrowserContext(browser_context)
diff --git a/content/browser/permissions/permission_service_context_unittest.cc b/content/browser/permissions/permission_service_context_unittest.cc index 47c4df8..53cb7ec 100644 --- a/content/browser/permissions/permission_service_context_unittest.cc +++ b/content/browser/permissions/permission_service_context_unittest.cc
@@ -233,6 +233,37 @@ EXPECT_EQ(observer->change_event_count(), 1U); } +TEST_F(PermissionServiceContextTest, CreateSubscriptionInBackForwardCache) { + EXPECT_TRUE(render_frame_host()->IsInLifecycleState( + RenderFrameHost::LifecycleState::kActive)); + render_frame_host()->DidEnterBackForwardCache(); + EXPECT_TRUE(render_frame_host()->IsInLifecycleState( + RenderFrameHost::LifecycleState::kInBackForwardCache)); + + // Create a subscription in BFCache + auto observer = CreateSubscription(PermissionType::GEOLOCATION, + blink::mojom::PermissionStatus::ASK, + blink::mojom::PermissionStatus::ASK); + SimulatePermissionChangedEvent(blink::PermissionType::GEOLOCATION, + blink::mojom::PermissionStatus::DENIED); + EXPECT_EQ(observer->change_event_count(), 0U); + SimulatePermissionChangedEvent(blink::PermissionType::GEOLOCATION, + blink::mojom::PermissionStatus::ASK); + EXPECT_EQ(observer->change_event_count(), 0U); + SimulatePermissionChangedEvent(blink::PermissionType::GEOLOCATION, + blink::mojom::PermissionStatus::GRANTED); + EXPECT_EQ(observer->change_event_count(), 0U); + + // Simulate the render frame host is back to active state by setting the + // lifecycle state. The last event should be dispatched. + render_frame_host()->SetLifecycleState( + RenderFrameHostImpl::LifecycleStateImpl::kActive); + EXPECT_TRUE(render_frame_host()->IsInLifecycleState( + RenderFrameHost::LifecycleState::kActive)); + WaitForAsyncTasksToComplete(); + EXPECT_EQ(observer->change_event_count(), 1U); +} + TEST_F(PermissionServiceContextTest, DispatchSameStatusAfterLeaveBackForwardCache) { EXPECT_TRUE(render_frame_host()->IsInLifecycleState(
diff --git a/content/browser/renderer_host/frame_tree_node.cc b/content/browser/renderer_host/frame_tree_node.cc index 3cb7a27..34589a8 100644 --- a/content/browser/renderer_host/frame_tree_node.cc +++ b/content/browser/renderer_host/frame_tree_node.cc
@@ -917,7 +917,17 @@ if (!properties || !properties->fenced_frame_reporter_) { mojo::ReportBadMessage( "Automatic beacon data can only be set in fenced frames or iframes " - "loaded with a URN."); + "loaded from a config with a fenced frame reporter."); + return; + } + // This metadata should only be present in the renderer in frames that are + // same-origin to the mapped url. + if (!properties->mapped_url_.has_value() || + !current_origin().IsSameOriginWith(url::Origin::Create( + properties->mapped_url_->GetValueIgnoringVisibility()))) { + mojo::ReportBadMessage( + "Automatic beacon data can only be set from documents that are same-" + "origin to the mapped url from the fenced frame config."); return; } properties->fenced_frame_reporter_->UpdateAutomaticBeaconData(event_data,
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 4e56e0c..a4dc978 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -2284,11 +2284,6 @@ common_params_->url = mapped_url_value; commit_params_->original_url = mapped_url_value; - // Create a view of the fenced frame properties from the perspective of the - // fenced frame content, which will be sent to its renderer. - commit_params_->fenced_frame_properties = - properties->RedactFor(content::FencedFrameEntity::kContent); - // Store the browser's view of the fenced frame properties in the // `NavigationRequest`. Upon commit, it will be stored in the fenced frame // root `FrameTreeNode`. @@ -6829,6 +6824,39 @@ } } + // For fenced frames, update the mapped URL to be the URL from navigation + // commit (after redirects), because we want future same-origin checks to be + // performed with respect to the first origin committed in the fenced frame. + if (is_embedder_initiated_fenced_frame_navigation_) { + // In certain circumstances, the FencedFrameProperties will not have a + // mapped url. + // * The initial about:blank navigation in a fenced frame. + // * Embedder-initiated FF root navigations to transparent (non-urn) urls. + // In those cases, we skip this step. + if (fenced_frame_properties_->mapped_url_.has_value()) { + fenced_frame_properties_->UpdateMappedURL(GetURL()); + } + } + + // Create a view of the fenced frame properties from the perspective of the + // fenced frame content, which will be sent to its renderer. + // On each navigation commit within the fenced frame tree, if the committed + // origin is same-origin to the urn's mapped_url (after redirects), the + // browser sends the `RedactedFencedFrameProperties` to the renderer for that + // frame. This is because we want to make fenced frame APIs available only + // in same-origin contexts. + const auto& computed_fenced_frame_properties = ComputeFencedFrameProperties(); + if (computed_fenced_frame_properties.has_value()) { + if (computed_fenced_frame_properties->mapped_url_.has_value() && + url::Origin::Create(common_params_->url) + .IsSameOriginWith(computed_fenced_frame_properties->mapped_url_ + ->GetValueIgnoringVisibility())) { + commit_params_->fenced_frame_properties = + computed_fenced_frame_properties->RedactFor( + content::FencedFrameEntity::kContent); + } + } + if (ready_to_commit_callback_for_testing_) std::move(ready_to_commit_callback_for_testing_).Run(); }
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h index 1d1b3e3..11b8fca 100644 --- a/content/browser/renderer_host/navigation_request.h +++ b/content/browser/renderer_host/navigation_request.h
@@ -983,15 +983,6 @@ return prerender_frame_tree_node_id_.value(); } - // Return the `FencedFrameProperties` attached to this `NavigationRequest`, - // if present. This will only return a non-null value during - // embedder-initiated fenced frame navigations of a fenced frame root (or - // urn iframe). - const absl::optional<FencedFrameProperties>& GetFencedFrameProperties() - const { - return fenced_frame_properties_; - } - // Compute and return the `FencedFrameProperties` that this // `NavigationRequest` acts under, i.e. the properties attached to this // `NavigationRequest` if present, or the properties attached to the fenced
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 5d5bfe7..856b55b 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -7983,6 +7983,9 @@ return; } + // Treat the automatic beacon as if it's being sent by the document that + // initiated the top-level navigation. (You can think of it like a + // reportEvent call from that document.) RenderFrameHostImpl* initiator_rfh = RenderFrameHostImpl::FromFrameToken( navigation_request.GetInitiatorProcessID(), navigation_request.GetInitiatorFrameToken().value()); @@ -7990,28 +7993,35 @@ return; } - RenderFrameHostImpl* initiator_main_rfh = initiator_rfh->GetMainFrame(); - + // Beacons can only be sent from inside a fenced frame/urn iframe tree, where + // there is a fenced frame reporter. const absl::optional<FencedFrameProperties>& properties = - initiator_main_rfh->frame_tree_node()->GetFencedFrameProperties(); - // Navigations that initiate from a fenced frame or iframe loaded with a urn - // and target either a new window or `_unfencedTop` should send an automatic - // beacon. + initiator_rfh->frame_tree_node()->GetFencedFrameProperties(); if (!properties.has_value() || !properties->fenced_frame_reporter_) { return; } + // If there is no automatic beacon declared, there is nothing to send. absl::optional<AutomaticBeaconInfo> info = properties->fenced_frame_reporter_->automatic_beacon_info(); if (!info) { return; } + // Beacons can only be sent when the initiator frame is same-origin with the + // fenced frame config's mapped url. + if (!properties->mapped_url_.has_value() || + !initiator_rfh->GetLastCommittedOrigin().IsSameOriginWith( + url::Origin::Create( + properties->mapped_url_->GetValueIgnoringVisibility()))) { + return; + } + for (blink::FencedFrame::ReportingDestination destination : info->destination) { - initiator_main_rfh->SendFencedFrameReportingBeaconInternal( + initiator_rfh->SendFencedFrameReportingBeaconInternal( info->data, blink::kFencedFrameTopNavigationBeaconType, destination, - /*from_renderer=*/false); + /*from_renderer=*/false, navigation_request.GetNavigationId()); } } @@ -8019,7 +8029,8 @@ const std::string& event_data, const std::string& event_type, blink::FencedFrame::ReportingDestination destination, - bool from_renderer) { + bool from_renderer, + absl::optional<int64_t> navigation_id) { // Get the reporting metadata associated with the fenced frame. const absl::optional<FencedFrameProperties>& fenced_frame_properties = frame_tree_node_->GetFencedFrameProperties(); @@ -8030,11 +8041,20 @@ // This implies there is an inconsistency between the browser and the // renderer. mojo::ReportBadMessage( - "This frame had reporting metadata registered in its renderer process " - "but not in its browser process. The reporting metadata should be " - "consistent between the two."); + "This frame has no fenced frame reporter registered in the browser."); return; } + + if (!fenced_frame_properties->mapped_url_.has_value() || + !GetLastCommittedOrigin().IsSameOriginWith( + url::Origin::Create(fenced_frame_properties->mapped_url_ + ->GetValueIgnoringVisibility()))) { + mojo::ReportBadMessage( + "This frame is cross-origin to the mapped url of its fenced frame " + "config, so the renderer should not be able to call reportEvent."); + return; + } + if (event_data.length() > blink::kFencedFrameMaxBeaconLength) { mojo::ReportBadMessage( "The data provided to SendFencedFrameReportingBeacon() exceeds the " @@ -8058,7 +8078,7 @@ std::string error_message; if (!fenced_frame_properties->fenced_frame_reporter_->SendReport( event_type, event_data, destination, - /*request_initiator_frame=*/this, error_message)) { + /*request_initiator_frame=*/this, error_message, navigation_id)) { AddMessageToConsole(blink::mojom::ConsoleMessageLevel::kError, error_message); } @@ -12099,12 +12119,22 @@ } const absl::optional<FencedFrameProperties>& fenced_frame_properties = - navigation_request->GetFencedFrameProperties(); - if (fenced_frame_properties) { - // This may only be done after creating the DocumentAssociatedData for the - // new document, if appropriate, since `fenced_frame_urls_map` hangs off - // of that. + navigation_request->ComputeFencedFrameProperties(); + // On navigations of fenced frame/urn iframe roots initiated within the + // fenced frame/urn iframe tree, store document-scoped and page-scoped + // metadata again. + // TODO(crbug.com/1347953): Remove this metadata, and access the metadata + // directly in the FencedFrameProperties. + if (fenced_frame_properties && + (frame_tree_node()->IsFencedFrameRoot() || + !frame_tree_node()->IsInFencedFrameTree())) { if (fenced_frame_properties->nested_urn_config_pairs_.has_value()) { + // Store nested ad components in the fenced frame's url map. + // This may only be done after creating the DocumentAssociatedData for + // the new document, if appropriate, since `fenced_frame_urls_map` hangs + // off of that. In urn iframes, unlike in fenced frames, navigations of + // the urn iframe root don't create a new Page (because the root of the + // Page is the top-level frame). So this operation is a no-op. GetPage().fenced_frame_urls_map().ImportPendingAdComponents( fenced_frame_properties->nested_urn_config_pairs_ ->GetValueIgnoringVisibility());
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index 609642d..1351752d 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -3755,7 +3755,8 @@ const std::string& event_data, const std::string& event_type, blink::FencedFrame::ReportingDestination destination, - bool from_renderer); + bool from_renderer, + absl::optional<int64_t> navigation_id = absl::nullopt); // The RenderViewHost that this RenderFrameHost is associated with. //
diff --git a/content/browser/service_worker/service_worker_container_host_unittest.cc b/content/browser/service_worker/service_worker_container_host_unittest.cc index 32a5b662..c66b7ba 100644 --- a/content/browser/service_worker/service_worker_container_host_unittest.cc +++ b/content/browser/service_worker/service_worker_container_host_unittest.cc
@@ -292,11 +292,7 @@ bool CanFindClientContainerHost(ServiceWorkerContainerHost* container_host) { for (std::unique_ptr<ServiceWorkerContextCore::ContainerHostIterator> it = context_->GetClientContainerHostIterator( - // TODO(crbug.com/1199077): Update this when - // ServiceWorkerContainerHost implements StorageKey. - blink::StorageKey::CreateFirstParty( - url::Origin::Create(container_host->url())), - false /* include_reserved_clients */, + container_host->key(), false /* include_reserved_clients */, false /* include_back_forward_cached_clients */); !it->IsAtEnd(); it->Advance()) { if (container_host == it->GetContainerHost())
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc index 8de6689..54ad5cd 100644 --- a/content/browser/service_worker/service_worker_version.cc +++ b/content/browser/service_worker/service_worker_version.cc
@@ -209,6 +209,7 @@ // This function merges SHA256 checksum hash strings in // ServiceWokrerResourceRecord and return a single hash string. absl::optional<std::string> MergeResourceRecordSHA256ScriptChecksum( + const GURL& main_script_url, const ServiceWorkerScriptCacheMap& script_cache_map) { const std::unique_ptr<crypto::SecureHash> checksum = crypto::SecureHash::Create(crypto::SecureHash::SHA256); @@ -240,8 +241,12 @@ uint8_t result[crypto::kSHA256Length]; checksum->Finish(result, crypto::kSHA256Length); + const std::string encoded = base::HexEncode(result); - return base::HexEncode(result); + DVLOG(3) << "Updated ServiceWorker script checksum. script_url:" + << main_script_url.spec() << ", checksum:" << encoded; + + return encoded; } } // namespace @@ -1340,7 +1345,7 @@ // with the script newly added/updated in |script_cache_map_|. if (!sha256_script_checksum_) { sha256_script_checksum_ = - MergeResourceRecordSHA256ScriptChecksum(script_cache_map_); + MergeResourceRecordSHA256ScriptChecksum(script_url_, script_cache_map_); } // Fire all start callbacks. @@ -2726,6 +2731,6 @@ DCHECK(!sha256_script_checksum_); script_cache_map_.SetResources(resources); sha256_script_checksum_ = - MergeResourceRecordSHA256ScriptChecksum(script_cache_map_); + MergeResourceRecordSHA256ScriptChecksum(script_url_, script_cache_map_); } } // namespace content
diff --git a/content/test/data/direct_sockets/open.js b/content/test/data/direct_sockets/open.js index 7ad83f7..b90a2bd 100644 --- a/content/test/data/direct_sockets/open.js +++ b/content/test/data/direct_sockets/open.js
@@ -7,7 +7,7 @@ return ('openTcp succeeded: ' + '{remoteAddress: "' + remoteAddress + '", remotePort: ' + remotePort + '}'); - } catch(error) { + } catch (error) { return ('openTcp failed: ' + error); } } @@ -19,7 +19,19 @@ return ('openUdp succeeded: ' + '{remoteAddress: "' + remoteAddress + '", remotePort: ' + remotePort + '}'); - } catch(error) { + } catch (error) { return ('openUdp failed: ' + error); } } + +async function openTcpServer(address, options = {}) { + try { + let tcpServerSocket = new TCPServerSocket(address, options); + let { localAddress, localPort } = await tcpServerSocket.opened; + return ('openTcpServer succeeded: ' + + '{localAddress: "' + localAddress + + '", localPort: ' + localPort + '}'); + } catch (error) { + return ('openTcpServer failed: ' + error); + } +}
diff --git a/content/test/fuzzer/BUILD.gn b/content/test/fuzzer/BUILD.gn index 6ba4d7c..69b095c 100644 --- a/content/test/fuzzer/BUILD.gn +++ b/content/test/fuzzer/BUILD.gn
@@ -325,7 +325,7 @@ } # Fuzzer only supports linux. As we use a `V4L2CaptureDevice`, which is only -# usable on linux through `VideoCaptureDeviceFactoryLinux`. +# usable on linux through `VideoCaptureDeviceFactoryV4L2`. if (is_linux || is_chromeos_lacros) { mojolpm_fuzzer_test("video_capture_host_mojolpm_fuzzer") { sources = [ "video_capture_host_mojolpm_fuzzer.cc" ]
diff --git a/content/test/fuzzer/video_capture_host_mojolpm_fuzzer.cc b/content/test/fuzzer/video_capture_host_mojolpm_fuzzer.cc index ebc5b0b5..03531e7 100644 --- a/content/test/fuzzer/video_capture_host_mojolpm_fuzzer.cc +++ b/content/test/fuzzer/video_capture_host_mojolpm_fuzzer.cc
@@ -34,7 +34,7 @@ #include "media/capture/video/create_video_capture_device_factory.h" #include "media/capture/video/linux/fake_device_provider.h" #include "media/capture/video/linux/fake_v4l2_impl.h" -#include "media/capture/video/linux/video_capture_device_factory_linux.h" +#include "media/capture/video/linux/video_capture_device_factory_v4l2.h" #include "media/capture/video/video_capture_system_impl.h" #include "media/capture/video_capture_types.h" #include "third_party/blink/public/common/mediastream/media_devices.h" @@ -335,7 +335,7 @@ void VideoCaptureHostTestcase::SetUpOnUIThread() { // Here we specify the devices described by `kDeviceDescriptors`. - // Which tells the `VideoCaptureDeviceFactoryLinux` what devices we have. + // Which tells the `VideoCaptureDeviceFactoryV4L2` what devices we have. // This factory is then used to setup the `MediaStreamManager`. std::unique_ptr<media::FakeDeviceProvider> fake_device_provider = std::make_unique<media::FakeDeviceProvider>(); @@ -349,9 +349,9 @@ fake_device_provider->AddDevice(descriptor); } - std::unique_ptr<media::VideoCaptureDeviceFactoryLinux> + std::unique_ptr<media::VideoCaptureDeviceFactoryV4L2> video_capture_device_factory = - std::make_unique<media::VideoCaptureDeviceFactoryLinux>( + std::make_unique<media::VideoCaptureDeviceFactoryV4L2>( task_environment_.GetMainThreadTaskRunner()); video_capture_device_factory->SetV4L2EnvironmentForTesting(
diff --git a/content/test/gpu/gpu_tests/expected_color_test.py b/content/test/gpu/gpu_tests/expected_color_test.py index 5fc047d2..a61d9c0b 100644 --- a/content/test/gpu/gpu_tests/expected_color_test.py +++ b/content/test/gpu/gpu_tests/expected_color_test.py
@@ -54,7 +54,7 @@ """ try: self._CompareScreenshotSamples(tab, screenshot, page, device_pixel_ratio) - except Exception as comparison_exception: + except Exception: # An exception raised from self.fail() indicates a failure. image_name = self._UrlToImageName(page.name) # We want to report the screenshot comparison failure, not any failures @@ -63,12 +63,7 @@ self._UploadTestResultToSkiaGold(image_name, screenshot, page) except Exception as gold_exception: # pylint: disable=broad-except logging.error(str(gold_exception)) - # TODO(https://crbug.com/1043129): Switch this to just "raise" once these - # tests are run with Python 3. Python 2's behavior with nested try/excepts - # is weird and ends up re-raising the exception raised by - # _UploadTestResultToSkiaGold instead of the one by - # _CompareScreenshotSamples. See https://stackoverflow.com/q/28698622. - raise comparison_exception + raise def _CompareScreenshotSamples(self, tab: ct.Tab, screenshot: ct.Screenshot, page: 'ExpectedColorPixelTestPage',
diff --git a/content/test/gpu/gpu_tests/webgl_conformance_integration_test_base.py b/content/test/gpu/gpu_tests/webgl_conformance_integration_test_base.py index b2ef4065..34cd52f2e 100644 --- a/content/test/gpu/gpu_tests/webgl_conformance_integration_test_base.py +++ b/content/test/gpu/gpu_tests/webgl_conformance_integration_test_base.py
@@ -347,9 +347,6 @@ # intermittent GPU process hangs that have been seen on the # waterfall. crbug.com/596622 crbug.com/609252 '--disable-gpu-watchdog', - # TODO(http://crbug.com/832952): Remove this when WebXR spec is more - # stable and setCompatibleXRDevice is part of the conformance test. - '--disable-blink-features=WebXR', # Force-enable SharedArrayBuffer to be able to test its # support in WEBGL_multi_draw. '--enable-blink-features=SharedArrayBuffer',
diff --git a/docs/clangd.md b/docs/clangd.md index f983da9..1134079 100644 --- a/docs/clangd.md +++ b/docs/clangd.md
@@ -110,7 +110,7 @@ 5. Use clangd in your favourite editor, see detailed [instructions]( https://clangd.llvm.org/installation.html#editor-plugins). - * Optional: You may want to add `-header-insertion=never` to the clangd + * Optional: You may want to add `--header-insertion=never` to the clangd flags, so that your editor doesn't automatically add incorrect #include lines. The feature doesn't correctly handle some common Chromium headers like `base/strings/string_piece_forward.h` and
diff --git a/docs/google_chrome_branded_builds.md b/docs/google_chrome_branded_builds.md index 9885021..f0c5c70 100644 --- a/docs/google_chrome_branded_builds.md +++ b/docs/google_chrome_branded_builds.md
@@ -13,11 +13,16 @@ license. Therefore, if you want to add a trademarked resource, check it into an internal -repository (see section below), and pick a resource based on the branding -(`is_chrome_branded` in GN, `#if BUILDFLAG(GOOGLE_CHROME_BRANDING)` in cpp, `<if -expr="_google_chrome">` in grit preprocessing). If possible, check an open -source version into Chromium, so the feature continues to work as expected in -the open source build. +repository (see section below), and pick a resource based on the branding. To +query in code whether the current build is branded, use: + +- GN: `is_chrome_branded` +- C++: `#if BUILDFLAG(GOOGLE_CHROME_BRANDING)` +- Java: `BuildConfig.IS_CHROME_BRANDED` +- Grit: `<if expr="_google_chrome">` + +If possible, check an open source version into Chromium, so the feature +continues to work as expected in the open source build. E.g. [`//components/resources/default_100_percent/chromium`](../components/resources/default_100_percent/chromium)
diff --git a/docs/ios/build_instructions.md b/docs/ios/build_instructions.md index c3680e7..c7ba372 100644 --- a/docs/ios/build_instructions.md +++ b/docs/ios/build_instructions.md
@@ -278,7 +278,7 @@ $ out/Debug-iphonesimulator/iossim out/Debug-iphonesimulator/Chromium.app ``` -With Xcode 9, `iossim` no longer automatically launches the Simulator. This must now +From Xcode 9 on, `iossim` no longer automatically launches the Simulator. This must now be done manually from within Xcode (`Xcode > Open Developer Tool > Simulator`), and also must be done *after* running `iossim`.
diff --git a/extensions/browser/api/runtime/restart_after_delay_api_unittest.cc b/extensions/browser/api/runtime/restart_after_delay_api_unittest.cc index 338e339..24b50b44 100644 --- a/extensions/browser/api/runtime/restart_after_delay_api_unittest.cc +++ b/extensions/browser/api/runtime/restart_after_delay_api_unittest.cc
@@ -4,10 +4,8 @@ #include <utility> -#include "base/functional/callback_helpers.h" #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -18,7 +16,6 @@ #include "extensions/browser/test_extensions_browser_client.h" #include "extensions/browser/test_runtime_api_delegate.h" #include "extensions/common/extension_builder.h" -#include "extensions/common/manifest.h" namespace extensions { @@ -27,18 +24,19 @@ // A RuntimeAPIDelegate that simulates a successful restart request every time. class DelayedRestartTestApiDelegate : public TestRuntimeAPIDelegate { public: - DelayedRestartTestApiDelegate() {} + DelayedRestartTestApiDelegate() = default; DelayedRestartTestApiDelegate(const DelayedRestartTestApiDelegate&) = delete; DelayedRestartTestApiDelegate& operator=( const DelayedRestartTestApiDelegate&) = delete; - ~DelayedRestartTestApiDelegate() override {} + ~DelayedRestartTestApiDelegate() override = default; // TestRuntimeAPIDelegate: bool RestartDevice(std::string* error_message) override { - if (quit_closure_) + if (quit_closure_) { std::move(quit_closure_).Run(); + } *error_message = "Success."; restart_done_ = true; @@ -65,7 +63,8 @@ class DelayedRestartExtensionsBrowserClient : public TestExtensionsBrowserClient { public: - DelayedRestartExtensionsBrowserClient(content::BrowserContext* context) + explicit DelayedRestartExtensionsBrowserClient( + content::BrowserContext* context) : TestExtensionsBrowserClient(context) {} DelayedRestartExtensionsBrowserClient( @@ -73,7 +72,7 @@ DelayedRestartExtensionsBrowserClient& operator=( const DelayedRestartExtensionsBrowserClient&) = delete; - ~DelayedRestartExtensionsBrowserClient() override {} + ~DelayedRestartExtensionsBrowserClient() override = default; // TestExtensionsBrowserClient: PrefService* GetPrefServiceForContext( @@ -107,12 +106,12 @@ class RestartAfterDelayApiTest : public ApiUnitTest { public: - RestartAfterDelayApiTest() {} + RestartAfterDelayApiTest() = default; RestartAfterDelayApiTest(const RestartAfterDelayApiTest&) = delete; RestartAfterDelayApiTest& operator=(const RestartAfterDelayApiTest&) = delete; - ~RestartAfterDelayApiTest() override {} + ~RestartAfterDelayApiTest() override = default; void SetUp() override { // Use our ExtensionsBrowserClient that returns our RuntimeAPIDelegate.
diff --git a/extensions/browser/api/runtime/runtime_api.cc b/extensions/browser/api/runtime/runtime_api.cc index 7ce2674a..eff2ce77 100644 --- a/extensions/browser/api/runtime/runtime_api.cc +++ b/extensions/browser/api/runtime/runtime_api.cc
@@ -11,7 +11,6 @@ #include "base/functional/bind.h" #include "base/lazy_instance.h" #include "base/location.h" -#include "base/metrics/histogram.h" #include "base/notreached.h" #include "base/one_shot_event.h" #include "base/strings/string_number_conversions.h" @@ -29,13 +28,11 @@ #include "extensions/browser/extension_host.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_system.h" -#include "extensions/browser/extension_util.h" #include "extensions/browser/extensions_browser_client.h" #include "extensions/browser/lazy_context_id.h" #include "extensions/browser/lazy_context_task_queue.h" #include "extensions/browser/process_manager_factory.h" #include "extensions/common/api/runtime.h" -#include "extensions/common/error_utils.h" #include "extensions/common/extension.h" #include "extensions/common/manifest_handlers/background_info.h" #include "extensions/common/manifest_handlers/shared_module_info.h" @@ -105,26 +102,30 @@ std::unique_ptr<LazyContextTaskQueue::ContextInfo> context_info) { // A NULL ContextInfo from the task callback means the page failed // to load. Give up. - if (!context_info && !first_call) + if (!context_info && !first_call) { return; + } // Don't send onStartup events to incognito browser contexts. - if (browser_context->IsOffTheRecord()) + if (browser_context->IsOffTheRecord()) { return; + } if (ExtensionsBrowserClient::Get()->IsShuttingDown() || - !ExtensionsBrowserClient::Get()->IsValidContext(browser_context)) + !ExtensionsBrowserClient::Get()->IsValidContext(browser_context)) { return; + } ExtensionSystem* system = ExtensionSystem::Get(browser_context); - if (!system) + if (!system) { return; + } // If this is a persistent background page, we want to wait for it to load // (it might not be ready, since this is startup). But only enqueue once. // If it fails to load the first time, don't bother trying again. - const Extension* extension = - ExtensionRegistry::Get(browser_context)->enabled_extensions().GetByID( - extension_id); + const Extension* extension = ExtensionRegistry::Get(browser_context) + ->enabled_extensions() + .GetByID(extension_id); if (extension && BackgroundInfo::HasPersistentBackgroundPage(extension) && first_call) { const LazyContextId context_id(browser_context, extension_id); @@ -210,13 +211,13 @@ ->AddObserver(this); } -RuntimeAPI::~RuntimeAPI() { -} +RuntimeAPI::~RuntimeAPI() = default; void RuntimeAPI::OnExtensionLoaded(content::BrowserContext* browser_context, const Extension* extension) { - if (!dispatch_chrome_updated_event_) + if (!dispatch_chrome_updated_event_) { return; + } // Dispatch the onInstalled event with reason "chrome_update". base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( @@ -347,8 +348,9 @@ } void RuntimeAPI::MaybeCancelRunningDelayedRestartTimer() { - if (restart_after_delay_timer_.IsRunning()) + if (restart_after_delay_timer_.IsRunning()) { restart_after_delay_timer_.Stop(); + } } void RuntimeAPI::OnExtensionsReady() { @@ -430,11 +432,13 @@ const std::string& extension_id, const base::Version& old_version, bool chrome_updated) { - if (!ExtensionsBrowserClient::Get()->IsValidContext(context)) + if (!ExtensionsBrowserClient::Get()->IsValidContext(context)) { return; + } ExtensionSystem* system = ExtensionSystem::Get(context); - if (!system) + if (!system) { return; + } // Only dispatch runtime.onInstalled events if: // 1. the extension has just been installed/updated @@ -474,8 +478,7 @@ std::unique_ptr<ExtensionSet> dependents = system->GetDependentExtensions(extension); for (ExtensionSet::const_iterator i = dependents->begin(); - i != dependents->end(); - i++) { + i != dependents->end(); i++) { base::Value::List sm_event_args; base::Value sm_info(base::Value::Type::DICT); sm_info.SetStringKey(kInstallReason, kInstallReasonSharedModuleUpdate); @@ -498,8 +501,9 @@ const std::string& extension_id, const base::Value::Dict* manifest) { ExtensionSystem* system = ExtensionSystem::Get(context); - if (!system) + if (!system) { return; + } base::Value::List args; args.Append(manifest->Clone()); @@ -515,8 +519,9 @@ void RuntimeEventRouter::DispatchOnBrowserUpdateAvailableEvent( content::BrowserContext* context) { ExtensionSystem* system = ExtensionSystem::Get(context); - if (!system) + if (!system) { return; + } EventRouter* event_router = EventRouter::Get(context); DCHECK(event_router); @@ -532,8 +537,9 @@ const std::string& app_id, api::runtime::OnRestartRequiredReason reason) { ExtensionSystem* system = ExtensionSystem::Get(context); - if (!system) + if (!system) { return; + } std::unique_ptr<Event> event( new Event(events::RUNTIME_ON_RESTART_REQUIRED, @@ -621,8 +627,9 @@ std::unique_ptr<api::runtime::SetUninstallURL::Params> params( api::runtime::SetUninstallURL::Params::Create(args())); EXTENSION_FUNCTION_VALIDATE(params); - if (!params->url.empty() && !GURL(params->url).SchemeIsHTTPOrHTTPS()) + if (!params->url.empty() && !GURL(params->url).SchemeIsHTTPOrHTTPS()) { return RespondNow(Error(kInvalidUrlError, params->url)); + } ExtensionPrefs::Get(browser_context()) ->UpdateExtensionPref( @@ -632,8 +639,9 @@ } ExtensionFunction::ResponseAction RuntimeReloadFunction::Run() { - RuntimeAPI::GetFactoryInstance()->Get(browser_context())->ReloadExtension( - extension_id()); + RuntimeAPI::GetFactoryInstance() + ->Get(browser_context()) + ->ReloadExtension(extension_id()); return RespondNow(NoArguments()); } @@ -659,9 +667,9 @@ ExtensionFunction::ResponseAction RuntimeRestartFunction::Run() { std::string message; - bool result = - RuntimeAPI::GetFactoryInstance()->Get(browser_context())->RestartDevice( - &message); + bool result = RuntimeAPI::GetFactoryInstance() + ->Get(browser_context()) + ->RestartDevice(&message); if (!result) { return RespondNow(Error(message)); } @@ -679,9 +687,10 @@ EXTENSION_FUNCTION_VALIDATE(params.get()); int seconds = params->seconds; - if (seconds <= 0 && seconds != -1) + if (seconds <= 0 && seconds != -1) { return RespondNow( Error(kErrorInvalidArgument, base::NumberToString(seconds))); + } RuntimeAPI::RestartAfterDelayStatus request_status = RuntimeAPI::GetFactoryInstance()
diff --git a/extensions/browser/api/runtime/runtime_api.h b/extensions/browser/api/runtime/runtime_api.h index 839187a..8845c8d 100644 --- a/extensions/browser/api/runtime/runtime_api.h +++ b/extensions/browser/api/runtime/runtime_api.h
@@ -38,11 +38,9 @@ namespace extensions { -namespace api { -namespace runtime { +namespace api::runtime { struct PlatformInfo; } -} class Extension; class ExtensionRegistry; @@ -235,7 +233,7 @@ RUNTIME_GETBACKGROUNDPAGE) protected: - ~RuntimeGetBackgroundPageFunction() override {} + ~RuntimeGetBackgroundPageFunction() override = default; ResponseAction Run() override; private: @@ -248,7 +246,7 @@ DECLARE_EXTENSION_FUNCTION("runtime.openOptionsPage", RUNTIME_OPENOPTIONSPAGE) protected: - ~RuntimeOpenOptionsPageFunction() override {} + ~RuntimeOpenOptionsPageFunction() override = default; ResponseAction Run() override; }; @@ -257,7 +255,7 @@ DECLARE_EXTENSION_FUNCTION("runtime.setUninstallURL", RUNTIME_SETUNINSTALLURL) protected: - ~RuntimeSetUninstallURLFunction() override {} + ~RuntimeSetUninstallURLFunction() override = default; ResponseAction Run() override; }; @@ -266,7 +264,7 @@ DECLARE_EXTENSION_FUNCTION("runtime.reload", RUNTIME_RELOAD) protected: - ~RuntimeReloadFunction() override {} + ~RuntimeReloadFunction() override = default; ResponseAction Run() override; }; @@ -276,7 +274,7 @@ RUNTIME_REQUESTUPDATECHECK) protected: - ~RuntimeRequestUpdateCheckFunction() override {} + ~RuntimeRequestUpdateCheckFunction() override = default; ResponseAction Run() override; private: @@ -288,7 +286,7 @@ DECLARE_EXTENSION_FUNCTION("runtime.restart", RUNTIME_RESTART) protected: - ~RuntimeRestartFunction() override {} + ~RuntimeRestartFunction() override = default; ResponseAction Run() override; }; @@ -298,7 +296,7 @@ RUNTIME_RESTARTAFTERDELAY) protected: - ~RuntimeRestartAfterDelayFunction() override {} + ~RuntimeRestartAfterDelayFunction() override = default; ResponseAction Run() override; }; @@ -307,7 +305,7 @@ DECLARE_EXTENSION_FUNCTION("runtime.getPlatformInfo", RUNTIME_GETPLATFORMINFO) protected: - ~RuntimeGetPlatformInfoFunction() override {} + ~RuntimeGetPlatformInfoFunction() override = default; ResponseAction Run() override; }; @@ -317,7 +315,7 @@ RUNTIME_GETPACKAGEDIRECTORYENTRY) protected: - ~RuntimeGetPackageDirectoryEntryFunction() override {} + ~RuntimeGetPackageDirectoryEntryFunction() override = default; ResponseAction Run() override; };
diff --git a/extensions/browser/api/runtime/runtime_api_delegate.h b/extensions/browser/api/runtime/runtime_api_delegate.h index eea4b2d..e0ab6711 100644 --- a/extensions/browser/api/runtime/runtime_api_delegate.h +++ b/extensions/browser/api/runtime/runtime_api_delegate.h
@@ -6,7 +6,6 @@ #define EXTENSIONS_BROWSER_API_RUNTIME_RUNTIME_API_DELEGATE_H_ #include "base/functional/callback.h" -#include "base/version.h" #include "extensions/common/api/runtime.h" class GURL; @@ -33,7 +32,7 @@ const std::string& version); }; - virtual ~RuntimeAPIDelegate() {} + virtual ~RuntimeAPIDelegate() = default; // The callback given to RequestUpdateCheck. using UpdateCheckCallback =
diff --git a/extensions/shell/browser/api/runtime/shell_runtime_api_delegate.cc b/extensions/shell/browser/api/runtime/shell_runtime_api_delegate.cc index 7202256..f4a942d 100644 --- a/extensions/shell/browser/api/runtime/shell_runtime_api_delegate.cc +++ b/extensions/shell/browser/api/runtime/shell_runtime_api_delegate.cc
@@ -11,7 +11,6 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) #include "chromeos/dbus/power/power_manager_client.h" -#include "third_party/cros_system_api/dbus/service_constants.h" #endif using extensions::api::runtime::PlatformInfo;
diff --git a/fuchsia_web/webengine/web_instance.cml b/fuchsia_web/webengine/web_instance.cml index 6fa3d8bc..303ca39 100644 --- a/fuchsia_web/webengine/web_instance.cml +++ b/fuchsia_web/webengine/web_instance.cml
@@ -17,6 +17,7 @@ { protocol: [ "fuchsia.web.Context", + "fuchsia.web.Debug", "fuchsia.web.FrameHost", ] } @@ -25,6 +26,7 @@ { protocol: [ "fuchsia.web.Context", + "fuchsia.web.Debug", "fuchsia.web.FrameHost", ], from: "self",
diff --git a/gpu/command_buffer/client/query_tracker.h b/gpu/command_buffer/client/query_tracker.h index 41d4df0d..4d5e74a8 100644 --- a/gpu/command_buffer/client/query_tracker.h +++ b/gpu/command_buffer/client/query_tracker.h
@@ -61,7 +61,8 @@ uint32_t index() const { return sync - bucket->syncs.get(); } raw_ptr<Bucket, DanglingUntriaged> bucket = nullptr; - raw_ptr<QuerySync, DanglingUntriaged> sync = nullptr; + // AllowPtrArithmetic because it is assigned an AllowPtrArithmetic pointer. + raw_ptr<QuerySync, DanglingUntriaged | AllowPtrArithmetic> sync = nullptr; int32_t submit_count = 0; };
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 957fafd0..98a184b 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1171,6 +1171,15 @@ <message name="IDS_IOS_ICON_SEARCH" desc="Accessibility label for the search icon [iOS only]."> Search </message> + <message name="IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button navigates to 'Sync and Google services' page in settings [iOS only]."> + Signed in as <ph name="USER_NAME">$1<ex>Peter Parker</ex></ph>. <ph name="USER_EMAIL">$2<ex>peter.parker@gmail.com</ex></ph>. Opens settings. + </message> + <message name="IDS_IOS_IDENTITY_DISC_WITH_EMAIL" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button navigates to 'Sync and Google services' page in settings [iOS only]."> + Signed in as <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>. Opens settings. + </message> + <message name="IDS_IOS_IDENTITY_DISC_SIGNED_OUT" desc="The content description for a toolbar button displaying the signed-out avatar. Tapping on this button navigates to 'Turn on Sync' page in settings [iOS only]."> + Signed out. Opens dialog to sign in and turn on sync. + </message> <message name="IDS_IOS_INACTIVE_TABS_BUTTON_TITLE" desc="Title of the button in the Tab Grid that opens the grid of Inactive Tabs."> Inactive Tabs </message> @@ -2569,6 +2578,32 @@ <message name="IDS_IOS_EXPORT_PASSWORDS_CANCEL_BUTTON" desc="Label of a confirmation dialog button which allows the user to cancel passwords export. [Length: 22em] [iOS only]"> Cancel </message> + <message name="IDS_IOS_SETTINGS_AUTOFILL_ACCOUNT_ADDRESS_FOOTER_TEXT" desc="Footer text of an account address profile when it is viewed in settings. [iOS only]"> + This address is saved in your Google Account(<ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>). You can use this address across Google products on any device. + </message> + <message name="IDS_IOS_SETTINGS_EDIT_AUTOFILL_ADDRESS_REQUIREMENT_ERROR" desc="Error shown when the address is edited in settings and one of the required fields is empty. [iOS only]"> + {count, plural, + =1 {A required field is empty. Fill it before saving.} + other {Some required fields are empty. Fill them before saving.}} + </message> + <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON" desc="Confirmation button title shown to the user when the address is deleted. [iOS only]"> + Delete Address + </message> + <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_ACCOUNT_ADDRESS_CONFIRMATION_TITLE" desc="Title of the confirmation shown to the user when an account address is deleted. [iOS only]"> + {count, plural, + =1 {This address will be deleted from your Google Account(<ph name="USER_EMAIL">{email}<ex>janedoe@google.com</ex></ph>) and from this device.} + other {These addresses will be deleted from your Google Account(<ph name="USER_EMAIL">{email}<ex>janedoe@google.com</ex></ph>) and from this device.}} + </message> + <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_SYNC_ADDRESS_CONFIRMATION_TITLE" desc="Title of the confirmation shown to the user when a sync address is deleted. [iOS only]"> + {count, plural, + =1 {This address will be deleted from this and your other signed-in devices.} + other {These addresses will be deleted from this and your other signed-in devices.}} + </message> + <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_LOCAL_ADDRESS_CONFIRMATION_TITLE" desc="Title of the confirmation shown to the user when a local address is deleted. [iOS only]"> + {count, plural, + =1 {This address will be deleted from this device.} + other {These addresses will be deleted from this device.}} + </message> <message name="IDS_IOS_SETTINGS_EXPORT_PASSWORDS_SET_UP_SCREENLOCK_CONTENT" desc="Message informing the user that in order to export the passwords, a screen lock needs to be set up on the device. This is shown as an alert message after the user tries to view or copy the password from a settings page. [Length: about two lines]"> To export passwords, you must first set a passcode on your device. </message>
diff --git a/components/components_strings_grd/IDS_SIGNED_OUT_IDENTITY_DISC.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_IDENTITY_DISC_SIGNED_OUT.png.sha1 similarity index 100% rename from components/components_strings_grd/IDS_SIGNED_OUT_IDENTITY_DISC.png.sha1 rename to ios/chrome/app/strings/ios_strings_grd/IDS_IOS_IDENTITY_DISC_SIGNED_OUT.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_IDENTITY_DISC_WITH_EMAIL.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_IDENTITY_DISC_WITH_EMAIL.png.sha1 new file mode 100644 index 0000000..9ea39a4 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_IDENTITY_DISC_WITH_EMAIL.png.sha1
@@ -0,0 +1 @@ +48774b6cda445b49032555f7ce400209603b60cf \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL.png.sha1 new file mode 100644 index 0000000..9ea39a4 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL.png.sha1
@@ -0,0 +1 @@ +48774b6cda445b49032555f7ce400209603b60cf \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_ACCOUNT_ADDRESS_FOOTER_TEXT.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_ACCOUNT_ADDRESS_FOOTER_TEXT.png.sha1 new file mode 100644 index 0000000..46fa6ad --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_ACCOUNT_ADDRESS_FOOTER_TEXT.png.sha1
@@ -0,0 +1 @@ +f61e8d74635e389c67652e0a8f921303919b2b52 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_ACCOUNT_ADDRESS_CONFIRMATION_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_ACCOUNT_ADDRESS_CONFIRMATION_TITLE.png.sha1 new file mode 100644 index 0000000..354b7bc --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_ACCOUNT_ADDRESS_CONFIRMATION_TITLE.png.sha1
@@ -0,0 +1 @@ +af363e38314727a5e48b3aa352f52703b12f9d8b \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON.png.sha1 new file mode 100644 index 0000000..354b7bc --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON.png.sha1
@@ -0,0 +1 @@ +af363e38314727a5e48b3aa352f52703b12f9d8b \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_LOCAL_ADDRESS_CONFIRMATION_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_LOCAL_ADDRESS_CONFIRMATION_TITLE.png.sha1 new file mode 100644 index 0000000..450a4f5 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_LOCAL_ADDRESS_CONFIRMATION_TITLE.png.sha1
@@ -0,0 +1 @@ +b0f657ac0aa6cbaeb84e876936b6b2198f15bbde \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_SYNC_ADDRESS_CONFIRMATION_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_SYNC_ADDRESS_CONFIRMATION_TITLE.png.sha1 new file mode 100644 index 0000000..a97419c --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_SYNC_ADDRESS_CONFIRMATION_TITLE.png.sha1
@@ -0,0 +1 @@ +d4f8efb89484cd963bf8ad0d6cdf428660f7a74d \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_EDIT_AUTOFILL_ADDRESS_REQUIREMENT_ERROR.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_EDIT_AUTOFILL_ADDRESS_REQUIREMENT_ERROR.png.sha1 new file mode 100644 index 0000000..54cb896 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_EDIT_AUTOFILL_ADDRESS_REQUIREMENT_ERROR.png.sha1
@@ -0,0 +1 @@ +8ace14d364163f7274aa7534a75eb8f999251591 \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_af.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_af.xtb index 4508191..aa187d31 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_af.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_af.xtb
@@ -4,6 +4,7 @@ <translation id="1047130070405668746">Kies Chromium</translation> <translation id="1091252999271033193">Dit beteken dat Chromium elke keer die mobiele werf sal versoek.</translation> <translation id="1185134272377778587">Meer oor Chromium</translation> +<translation id="1256849392437386613">Laat Chromium-kennisgewings in toestelinstellings toe om “Spoor prys na” aan te skakel</translation> <translation id="1257458525759135959">Om prente te stoor, moet jy op Instellings tik om Chromium toe te laat om foto's by te voeg</translation> <translation id="1289216811211435351">Skakel oor na Chromium</translation> <translation id="1361748954329991663">Chromium is verouderd. As geen opdatering in die <ph name="BEGIN_LINK" />App Store<ph name="END_LINK" /> beskikbaar is nie, is dit moontlik dat jou toestel nie meer nuwe weergawes van Chromium steun nie.</translation> @@ -71,6 +72,7 @@ <translation id="5573014823074921752">Chromium-wenk. Vir meer oortjieopsies, raak en hou die Wys Oortjies-knoppie op die nutsbalk aan die onderkant of bokant van jou skerm.</translation> <translation id="5700709190537129682">Chromium kan nie jou wagwoorde nagaan nie</translation> <translation id="5777187867430702742">Chromium-bladsy</translation> +<translation id="5918064849477363478">Chromium-kennisgewings is in jou toestelinstellings afgeskakel. Jy sal eers kennisgewings moet toelaat.</translation> <translation id="5945387852661427312">Jy meld tans aan met 'n rekening wat deur <ph name="DOMAIN" /> bestuur word en gee sy administrateur beheer oor jou Chromium-data. Jou data sal permanent met hierdie rekening verbind word. As jy uit Chromium afmeld, sal jou data van hierdie toestel af uitgevee word, maar dit sal steeds in jou Google-rekening geberg word.</translation> <translation id="5983312940147103417">Maak Chromium beter</translation> <translation id="6062449165341879460">Jou organisasie <ph name="DOMAIN" /> sal toegang hê tot jou Chromium-data, -boekmerke, -geskiedenis, -wagwoorde en ander -instellings wat jy in hierdie rekening stoor. Wanneer jy afmeld, sal jou data van hierdie toestel uitgevee word. Jou data sal egter gestoor bly in jou bestuurde Google-rekening en beskikbaar wees vir jou organisasie. Jou organisasie kan ook gebruikersbeleide spesifiek vir daardie rekening stel wat die gedrag van Chromium kan verander.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb index 1a729f57..d320cfb 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
@@ -4,6 +4,7 @@ <translation id="1047130070405668746">اختيار Chromium</translation> <translation id="1091252999271033193">يعني هذا أنّ Chromium سيطلب دائمًا استخدام الموقع الإلكتروني المتوافق مع الأجهزة الجوّالة.</translation> <translation id="1185134272377778587">لمحة عن Chromium</translation> +<translation id="1256849392437386613">يجب السماح بإشعارات Chromium في إعدادات الجهاز لتفعيل ميزة "تتبُّع السعر"</translation> <translation id="1257458525759135959">لحفظ الصور، يُرجى النقر على "الإعدادات" للسماح لمتصفّح Chromium بأن يضيف إلى صورك.</translation> <translation id="1289216811211435351">التبديل إلى Chromium</translation> <translation id="1361748954329991663">إصدار Chromium قديم. في حال عدم توفُّر تحديث في <ph name="BEGIN_LINK" />متجر التطبيقات<ph name="END_LINK" />، قد يعني هذا أن جهازك لم يعد متوافقًا مع الإصدارات الجديدة من Chromium.</translation> @@ -71,6 +72,7 @@ <translation id="5573014823074921752">نصيحة لاستخدام Chromium: لمزيد من خيارات علامات التبويب، يُرجى النقر مع الاستمرار على الزر "إظهار علامات التبويب" في شريط الأدوات الموجود أسفل الشاشة أو أعلاها.</translation> <translation id="5700709190537129682">يتعذّر على متصفِّح Chromium التحقُّق من كلمات المرور.</translation> <translation id="5777187867430702742">صفحة متصفِّح Chromium</translation> +<translation id="5918064849477363478">إنّ إشعارات Chromium غير مُفعَّلة في إعدادات جهازك. يجب تفعيلها أولاً لتفعيل الميزة.</translation> <translation id="5945387852661427312">إنك تسجل الدخول باستخدام حساب تتم إدارته من خلال <ph name="DOMAIN" /> وتمنح مشرفه الحق في التحكم في بياناتك على Chromium. سيؤدي ذلك إلى جعل بياناتك مرتبطة دائمًا بهذا الحساب. كما سيؤدي الخروج من Chromium إلى حذف بياناتك من هذا الجهاز، ولكن ستظل هذه البيانات مخزَّنة على حسابك في Google.</translation> <translation id="5983312940147103417">تحسين أداء متصفِّح Chromium</translation> <translation id="6062449165341879460">ستتمكن مؤسستك <ph name="DOMAIN" /> من الوصول إلى البيانات والإشارات المرجعية والسجلّ وكلمات المرور الخاصة بمتصفِّح Chromium والإعدادات الأخرى التي تخزنها في هذا الحساب. سيتم محو البيانات من هذا الجهاز عند تسجيل الخروج. ومع ذلك، ستبقى بياناتك مُخزَّنة في حساب Google المُدار، وستكون متاحة لمؤسستك. يمكن لمؤسستك ضبط سياسات المُستخدِم الخاصة بذلك الحساب لتغيير سلوك متصفِّح Chromium.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ka.xtb index efe0c6d..286c471 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ka.xtb
@@ -4,6 +4,7 @@ <translation id="1047130070405668746">აირჩიეთ Chromium</translation> <translation id="1091252999271033193">ეს იმას ნიშნავს, რომ Chromium ყოველ ჯერზე მოითხოვს მობილურ საიტს.</translation> <translation id="1185134272377778587">Chromium-ის შესახებ</translation> +<translation id="1256849392437386613">ფასისთვის თვალის მიდევნება რომ ჩართოთ, მოწყობილობის პარამეტრებიდან დაუშვით Chromium-ისთვის შეტყობინებების გამოგზავნა</translation> <translation id="1257458525759135959">სურათების შესანახად შეეხეთ „პარამეტრებს“ და მიეცით საშუალება Chromium-ს, დაამატოს თქვენი ფოტოები</translation> <translation id="1289216811211435351">გადაერთეთ Chromium-ზე</translation> <translation id="1361748954329991663">Chromium მოძველდა. თუ <ph name="BEGIN_LINK" />App Store<ph name="END_LINK" />-ში განახლება მიუწვდომელია, შესაძლოა, რომ თქვენს მოწყობილობაზე Chromium-ის ახალი ვერსიები მხარდაჭერილი აღარ იყოს.</translation> @@ -71,6 +72,7 @@ <translation id="5573014823074921752">Chromium მინიშნება: ჩანართებთან დაკავშირებული სხვა ვარიანტის სანახავად ხანგრძლივად შეეხეთ „ჩანართების ჩვენების“ ღილაკს ხელსაწყოთა ზოლში, რომელიც მდებარეობს ეკრანის ქვედა ან ზედა ნაწილში.</translation> <translation id="5700709190537129682">Chromium ვერ ახერხებს თქვენი პაროლების შემოწმებას</translation> <translation id="5777187867430702742">Chromium-ის გვერდი</translation> +<translation id="5918064849477363478">Chromium-ისგან შეტყობინებების მიღება გამორთულია თქვენი მოწყობილობის პარამეტრებიდან. პირველ რიგში, საჭიროა შეტყობინებების მიღების დაშვება.</translation> <translation id="5945387852661427312">თქვენ შედიხართ ანგარიშით, რომელსაც მართავს <ph name="DOMAIN" /> და მის ადმინისტრატორს თქვენი Chromium მონაცემების მართვის საშუალებას აძლევთ. Chromium-იდან გასვლის შემთხვევაში, თქვენი მონაცემები წაიშლება ამ მოწყობილობიდან, თუმცა ისინი თქვენს Google ანგარიშში შენარჩუნდება.</translation> <translation id="5983312940147103417">გააუმჯობესეთ Chromium</translation> <translation id="6062449165341879460">თქვენს ორგანიზაციას, <ph name="DOMAIN" />, წვდომა ექნება თქვენს Chromium მონაცემებზე, სანიშნეებზე, ისტორიაზე, პაროლებსა და სხვა პარამეტრებზე, რომლებიც თქვენ მიერ შენახულია ამ ანგარიშში. ანგარიშიდან გასვლისას თქვენი მონაცემები გასუფთავდება ამ მოწყობილობაზე. მიუხედავად ამისა, თქვენი მონაცემები შენახული დარჩება თქვენს მართულ Google ანგარიშში და ისინი ხელმისაწვდომი იქნება თქვენი ორგანიზაციისთვის. ამასთან, თქვენს ორგანიზაციას შეუძლია ანგარიშის მიხედვით სპეციფიკური ისეთი სამომხმარებლო წესების განსაზღვრა, რომლებსაც Chromium-ის ფუნქციონალის შეცვლა შეუძლია.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb index bf2b728..6408fbc 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb
@@ -4,6 +4,7 @@ <translation id="1047130070405668746">Chromium браузерін таңдаңыз.</translation> <translation id="1091252999271033193">Chromium браузерін әрдайым телефонда ашу қажет болады.</translation> <translation id="1185134272377778587">Chromium туралы ақпарат</translation> +<translation id="1256849392437386613">"Бағаны бақылау" функциясын қосу үшін құрылғы параметрлерінде Chromium хабарландыруларына рұқсат беру</translation> <translation id="1257458525759135959">Суреттерді сақтау үшін "Параметрлер" бөлімін түртіп, Chromium браузеріне суреттер қосуға рұқсат етіңіз.</translation> <translation id="1289216811211435351">Chromium браузеріне ауысыңыз</translation> <translation id="1361748954329991663">Chromium ескірген. Егер <ph name="BEGIN_LINK" />App Store<ph name="END_LINK" /> дүкенінде жаңа нұсқа болмаса, құрылғыңыз Chromium-ның жаңа нұсқаларын бұдан былай қолдамайтын болуы мүмкін.</translation> @@ -71,6 +72,7 @@ <translation id="5573014823074921752">Chromium кеңесі. Қосымша қойынды опциялары үшін экранның төменгі не жоғарғы жағындағы құралдар тақтасындағы "Қойындыларды көрсету" түймесін басып тұрыңыз.</translation> <translation id="5700709190537129682">Chromium құпия сөздеріңізді тексере алмайды.</translation> <translation id="5777187867430702742">Chromium беті</translation> +<translation id="5918064849477363478">Құрылғы параметрлерінде Chromium хабарландырулары өшірілген. Алдымен хабарландыруларға рұқсат беруіңіз керек.</translation> <translation id="5945387852661427312"><ph name="DOMAIN" /> басқаратын аккаунтпен кірдіңіз және оның әкімшісіне Chromium дерегін басқару құқығы берілді. Дерек осы аккаунтпен байланыстырылады. Chromium жүйесінен шыққанда, дерек бұл құрылғыдан жойылғанымен, Google аккаунтында сақталады.</translation> <translation id="5983312940147103417">Chromium-ды жақсартуға үлес қосыңыз</translation> <translation id="6062449165341879460">Ұйымыңыздың <ph name="DOMAIN" /> доменінде Chromium-дағы деректер, бетбелгілер, тарих, құпия сөздер және осы аккаунтта сақталған басқа да параметрлер пайдаланылатын болады. Жүйеден шыққан кезде, деректеріңіз бұл құрылғыдан өшіріледі. Дегенмен олар басқарылатын Google аккаунтында сол күйінде сақталады және ұйымыңызға қолжетімді болады. Сондай-ақ ұйымыңыз Chromium-дағы әрекеттерді өзгерте алатын аккаунтқа қатысты пайдаланушы саясаттарын орната алады.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_km.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_km.xtb index cd99fb8..e548eb7 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_km.xtb
@@ -4,6 +4,7 @@ <translation id="1047130070405668746">ជ្រើសរើស Chromium</translation> <translation id="1091252999271033193">មានន័យថា Chromium នឹងស្នើសុំទំព័រឧបករណ៍ចល័តគ្រប់ពេល។</translation> <translation id="1185134272377778587">អំពី Chromium</translation> +<translation id="1256849392437386613">ដើម្បីបើក `តាមដានតម្លៃ` សូមអនុញ្ញាតការជូនដំណឹងនៅលើ Chromium នៅក្នុងការកំណត់ឧបករណ៍</translation> <translation id="1257458525759135959">ដើម្បីរក្សាទុករូបភាព សូមចុចលើ "ការកំណត់" ដើម្បីអនុញ្ញាតឱ្យ Chromium បញ្ចូលទៅក្នុងរូបថតរបស់អ្នក</translation> <translation id="1289216811211435351">ប្ដូរទៅ Chromium</translation> <translation id="1361748954329991663">Chromium ហួសសម័យហើយ។ ប្រសិនបើមិនមានកំណែថ្មីនៅក្នុង <ph name="BEGIN_LINK" />App Store<ph name="END_LINK" /> ទេ ឧបករណ៍របស់អ្នកអាចនឹងមិនស្គាល់កំណែថ្មីៗរបស់ Chromium ទៀតទេ។</translation> @@ -71,6 +72,7 @@ <translation id="5573014823074921752">គន្លឹះប្រើប្រាស់ Chromium ។ ដើម្បីទទួលបានជម្រើសផ្ទាំងច្រើនទៀត សូមចុចប៊ូតុង "បង្ហាញផ្ទាំង" ឱ្យជាប់នៅក្នុងរបារឧបករណ៍ ដែលស្ថិតនៅផ្នែកខាងក្រោម ឬខាងលើអេក្រង់របស់អ្នក។</translation> <translation id="5700709190537129682">Chromium មិនអាចពិនិត្យពាក្យសម្ងាត់របស់អ្នកបានទេ</translation> <translation id="5777187867430702742">ទំព័រ Chromium</translation> +<translation id="5918064849477363478">ការជូនដំណឹងនៅលើ Chromium ត្រូវបានបិទនៅក្នុងការកំណត់ឧបករណ៍របស់អ្នក។ អ្នកនឹងត្រូវអនុញ្ញាតការជូនដំណឹងជាមុនសិន។</translation> <translation id="5945387852661427312">អ្នកកំពុងចូលដោយប្រើគណនីដែលគ្រប់គ្រងដោយ <ph name="DOMAIN" /> និងអនុញ្ញាតឲ្យអ្នកគ្រប់គ្រងរបស់វាធ្វើការគ្រប់គ្រងទិន្នន័យ Chromium របស់អ្នក។ ទិន្នន័យរបស់អ្នកនឹងភ្ជាប់ជាមួយគណនីនេះជាអចិន្ត្រៃយ៍។ ការចេញពី Chromium នឹងលុបទិន្នន័យរបស់អ្នកចេញពីឧបករណ៍នេះ ប៉ុន្តែវានឹងនៅតែរក្សាទុកក្នុងគណនី Google របស់អ្នកដដែល។</translation> <translation id="5983312940147103417">ធ្វើឱ្យ Chromium កាន់តែប្រសើរ</translation> <translation id="6062449165341879460">ស្ថាប័ន <ph name="DOMAIN" /> របស់អ្នកនឹងមានសិទ្ធិចូលប្រើប្រាស់ទិន្នន័យ Chromium របស់អ្នក ចំណាំ ប្រវត្តិ ពាក្យសម្ងាត់ និងការកំណត់ផ្សេងទៀតដែលអ្នករក្សាទុកក្នុងគណនីនេះ។ នៅពេលអ្នកចេញ ទិន្នន័យរបស់អ្នកនឹងត្រូវបានសម្អាតចេញពីឧបករណ៍នេះ។ ប៉ុន្តែ ទិន្នន័យរបស់អ្នកនឹងនៅតែរក្សាទុកក្នុងគណនី Google ដែលស្ថិតក្រោមការគ្រប់គ្រងរបស់អ្នក ហើយអាចប្រើបានសម្រាប់ស្ថាប័នរបស់អ្នក។ ស្ថាប័នរបស់អ្នកក៏អាចកំណត់គោលការណ៍អ្នកប្រើប្រាស់ដែលជាក់លាក់ចំពោះគណនីនោះ ដែលអាចផ្លាស់ប្ដូរសកម្មភាពប្រើប្រាស់ Chromium ផងដែរ។</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb index 54e9cb17..863e081 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb
@@ -4,6 +4,7 @@ <translation id="1047130070405668746">Chromium ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="1091252999271033193">ಇದರರ್ಥ Chromium ಪ್ರತಿ ಬಾರಿ ಮೊಬೈಲ್ ಸೈಟ್ ಅನ್ನು ವಿನಂತಿಸುತ್ತದೆ.</translation> <translation id="1185134272377778587">Chromium ಕುರಿತು</translation> +<translation id="1256849392437386613">`ಬೆಲೆ ಟ್ರ್ಯಾಕ್ ಮಾಡಿ' ಅನ್ನು ಆನ್ ಮಾಡಲು ಸಾಧನ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ Chromium ಅಧಿಸೂಚನೆಗಳನ್ನು ಅನುಮತಿಸಿ</translation> <translation id="1257458525759135959">ಚಿತ್ರಗಳನ್ನು ಉಳಿಸಲು, ಸೆಟ್ಟಿಂಗ್ಗಳ ಮೇಲೆ ಟ್ಯಾಪ್ ಮಾಡುವ ಮೂಲಕ, ನಿಮ್ಮ ಫೋಟೋಗಳಿಗೆ ಸೇರಿಸಲು Chromium ಗೆ ಅನುಮತಿಸಿ</translation> <translation id="1289216811211435351">Chromium ಗೆ ಬದಲಿಸಿ</translation> <translation id="1361748954329991663">Chromium ನ ಅವಧಿ ಮುಗಿದಿದೆ. <ph name="BEGIN_LINK" />ಆ್ಯಪ್ ಸ್ಟೋರ್<ph name="END_LINK" />ನಲ್ಲಿ ಯಾವುದೇ ಅಪ್ಡೇಟ್ ಲಭ್ಯವಿಲ್ಲದಿದ್ದರೆ, ನಿಮ್ಮ ಸಾಧನವು ಇನ್ನು ಮುಂದೆ Chromium ನ ಹೊಸ ಆವೃತ್ತಿಗಳನ್ನು ಬೆಂಬಲಿಸದಿರಬಹುದು.</translation> @@ -71,6 +72,7 @@ <translation id="5573014823074921752">Chromium ಸಲಹೆ. ಇನ್ನಷ್ಟು ಟ್ಯಾಬ್ ಆಯ್ಕೆಗಳಿಗಾಗಿ, ನಿಮ್ಮ ಪರದೆಯ ಕೆಳಭಾಗದಲ್ಲಿ ಅಥವಾ ಮೇಲ್ಭಾಗದಲ್ಲಿರುವ ಪರಿಕರಪಟ್ಟಿಯಲ್ಲಿ, ಟ್ಯಾಬ್ಗಳನ್ನು ತೋರಿಸಿ ಬಟನ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ.</translation> <translation id="5700709190537129682">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು Chromium ಗೆ ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ</translation> <translation id="5777187867430702742">Chromium ಪುಟ</translation> +<translation id="5918064849477363478">ನಿಮ್ಮ ಸಾಧನದ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ Chromium ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ. ಮೊದಲು ನೀವು ಅಧಿಸೂಚನೆಗಳನ್ನು ಅನುಮತಿಸಬೇಕಾಗುತ್ತದೆ.</translation> <translation id="5945387852661427312"><ph name="DOMAIN" /> ನಿರ್ವಹಿಸಿದ ಖಾತೆಯ ಮೂಲಕ ನೀವು ಸೈನ್ ಇನ್ ಮಾಡುತ್ತಿರುವಿರಿ ಮತ್ತು ಅದರ ನಿರ್ವಾಹಕರಿಗೆ ನಿಮ್ಮ Chromium ಡೇಟಾದ ನಿಯಂತ್ರಣವನ್ನು ನೀಡುತ್ತಿರುವಿರಿ. ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಈ ಖಾತೆಯೊಂದಿಗೆ ಜೋಡಿಸಲಾಗುತ್ತದೆ. Chromium ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡುವುದರಿಂದ ಈ ಸಾಧನದಿಂದ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ, ಆದರೆ ಅದು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಂಗ್ರಹಿತವಾಗಿಯೇ ಇರುತ್ತದೆ.</translation> <translation id="5983312940147103417">Chromium ಅನ್ನು ಉತ್ತಮವಾಗಿಸಿ</translation> <translation id="6062449165341879460">ನಿಮ್ಮ <ph name="DOMAIN" /> ಸಂಸ್ಥೆಯು ನಿಮ್ಮ Chromium ಡೇಟಾ, ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಇತಿಹಾಸ, ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಈ ಖಾತೆಯಲ್ಲಿ ನೀವು ಸಂಗ್ರಹಿಸುವ ಇತರ ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುತ್ತದೆ. ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡಿದ ನಂತರ, ಈ ಸಾಧನದಿಂದ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುತ್ತದೆ. ಆದರೂ, ನಿಮ್ಮ ಡೇಟಾವನ್ನು ನಿರ್ವಹಿಸಲಾದ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ ಹಾಗೂ ಇದೆಲ್ಲವೂ ನಿಮ್ಮ ಸಂಸ್ಥೆಗೆ ಲಭ್ಯವಿರುತ್ತದೆ. Chromium ಕಾರ್ಯನಿರ್ವಹಿಸುವ ವಿಧಾನವನ್ನು ಬದಲಾಯಿಸಲು ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ಆ ಖಾತೆಗೆ ನಿರ್ದಿಷ್ಟವಾದ ಬಳಕೆದಾರ ನೀತಿಗಳನ್ನು ಸಹ ಸೆಟ್ ಮಾಡಬಹುದು.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb index 8382da7..15b2815d 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
@@ -4,6 +4,7 @@ <translation id="1047130070405668746">Wybierz Chromium.</translation> <translation id="1091252999271033193">Oznacza to, że Chromium będzie za każdym razem wyświetlać witrynę mobilną.</translation> <translation id="1185134272377778587">Chromium – informacje</translation> +<translation id="1256849392437386613">Aby włączyć opcję „Monitoruj cenę”, zezwól na powiadomienia Chromium w ustawieniach urządzenia</translation> <translation id="1257458525759135959">Aby zapisać obrazy, kliknij Ustawienia i pozwól Chromium na dodanie ich do Twoich zdjęć</translation> <translation id="1289216811211435351">Przejdź na Chromium</translation> <translation id="1361748954329991663">Przeglądarka Chromium jest nieaktualna. Jeśli w <ph name="BEGIN_LINK" />App Store<ph name="END_LINK" /> nie ma dostępnej aktualizacji, Twoje urządzenie może już nie obsługiwać nowych wersji Chromium.</translation> @@ -71,6 +72,7 @@ <translation id="5573014823074921752">Wskazówka dla użytkowników Chromium. Aby zobaczyć więcej opcji kart, naciśnij i przytrzymaj przycisk Pokaż karty na pasku narzędzi, który znajduje się na dole lub na górze ekranu.</translation> <translation id="5700709190537129682">Chromium nie może sprawdzić Twoich haseł</translation> <translation id="5777187867430702742">Strona Chromium</translation> +<translation id="5918064849477363478">Powiadomienia Chromium są wyłączone w ustawieniach urządzenia. Najpierw musisz na nie zezwolić.</translation> <translation id="5945387852661427312">Logujesz się na konto, którym zarządza <ph name="DOMAIN" />, i przekazujesz jego administratorowi kontrolę nad Twoimi danymi Chromium. Zostaną one trwale przypisane do tego konta. Gdy się wylogujesz, znikną one z tego urządzenia, ale pozostaną zapisane na Twoim koncie Google.</translation> <translation id="5983312940147103417">Ulepszaj Chromium</translation> <translation id="6062449165341879460">Twoja organizacja (<ph name="DOMAIN" />) będzie miała dostęp do danych, zakładek, historii, haseł i innych ustawień Chromium, które przechowujesz na tym koncie. Gdy się wylogujesz, dane zostaną usunięte z tego urządzenia. Pozostaną one jednak zapisane na zarządzanym koncie Google i organizacja będzie miała do nich dostęp. Organizacja może też ustawiać na tym koncie zasady dotyczące użytkowników, które mogą zmieniać działanie Chromium.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb index 4c0f7bb..dcb74386 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
@@ -4,6 +4,7 @@ <translation id="1047130070405668746">Selectează Chromium.</translation> <translation id="1091252999271033193">Aceasta înseamnă că Chromium va solicita de fiecare dată site-ul mobil.</translation> <translation id="1185134272377778587">Despre Chromium</translation> +<translation id="1256849392437386613">Pentru a activa opțiunea Urmărește prețul, permite notificările în Chromium din setările dispozitivului</translation> <translation id="1257458525759135959">Pentru a salva imaginile, atinge Setări ca să permiți browserului Chromium să adauge fotografiile</translation> <translation id="1289216811211435351">Treci la Chromium</translation> <translation id="1361748954329991663">Chromium nu este actualizat. Dacă nu este disponibilă nicio actualizare în <ph name="BEGIN_LINK" />App Store<ph name="END_LINK" />, e posibil ca dispozitivul tău să nu mai accepte versiuni noi de Chromium.</translation> @@ -71,6 +72,7 @@ <translation id="5573014823074921752">Sfat pentru Chromium: 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="5700709190537129682">Chromium nu îți poate verifica parolele</translation> <translation id="5777187867430702742">Pagină Chromium</translation> +<translation id="5918064849477363478">Notificările din Chromium sunt dezactivate în setările dispozitivului. Mai întâi trebuie să permiți notificările.</translation> <translation id="5945387852661427312">Te conectezi cu un cont gestionat de <ph name="DOMAIN" /> și acorzi administratorului acestuia controlul asupra datelor Chromium. Datele vor fi asociate definitiv acestui cont. Dacă te deconectezi de la Chromium, datele vor fi șterse de pe acest dispozitiv, dar vor rămâne stocate în Contul Google.</translation> <translation id="5983312940147103417">Contribuie la îmbunătățirea Chromium</translation> <translation id="6062449165341879460">Organizația ta <ph name="DOMAIN" /> va avea acces la datele Chromium, marcajele, istoricul, parolele și alte setări pe care le stochezi în acest cont. Când te deconectezi, datele vor fi șterse de pe acest dispozitiv. Însă vor rămâne stocate în Contul Google administrat și vor fi disponibile pentru organizația ta. În plus, organizația ta poate să seteze politici privind utilizatorii specifice contului, care pot să modifice comportamentul browserului Chromium.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb index 81eb640f..25ee977 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
@@ -4,6 +4,7 @@ <translation id="1047130070405668746">Izberite Chromium.</translation> <translation id="1091252999271033193">To pomeni, da bo Chromium vsakič zahteval spletno mesto za mobilne naprave.</translation> <translation id="1185134272377778587">O Chromiumu</translation> +<translation id="1256849392437386613">Če želite vklopiti funkcijo »Spremljanje cene« v nastavitvah naprave omogočite obvestila za Chromium</translation> <translation id="1257458525759135959">Če želite shraniti slike, se dotaknite aplikacije Settings in dovolite, da Chromium dodaja fotografijam</translation> <translation id="1289216811211435351">Preklop na Chromium</translation> <translation id="1361748954329991663">Chromium je zastarel. Če v trgovini <ph name="BEGIN_LINK" />App Store<ph name="END_LINK" /> ni na voljo nobene posodobitve, vaša naprava morda ne podpira več novih različic Chromiuma.</translation> @@ -71,6 +72,7 @@ <translation id="5573014823074921752">Nasvet za Chromium. Če želite več možnosti za zavihke, pridržite gumb za prikaz zavihkov v orodni vrstici na dnu ali vrhu zaslona.</translation> <translation id="5700709190537129682">Chromium ne more preveriti vaših gesel</translation> <translation id="5777187867430702742">Stran Chromiuma</translation> +<translation id="5918064849477363478">Obvestila za Chromium so izklopljena v nastavitvah naprave. Najprej morate omogočiti obvestila.</translation> <translation id="5945387852661427312">Prijavljate se z računom, ki ga upravlja <ph name="DOMAIN" />, in nadzor nad podatki v Chromiumu predajate skrbniku. Vaši podatki bodo trajno povezani s tem računom. Če se odjavite iz Chromiuma, boste izbrisali podatke iz te naprave, vendar bodo še naprej shranjeni v Google Računu.</translation> <translation id="5983312940147103417">Izboljšajte Chromium</translation> <translation id="6062449165341879460">Vaša organizacija <ph name="DOMAIN" /> bo imela dostop do podatkov Chromiuma, zaznamkov, zgodovine, gesel in drugih nastavitev, ki jih shranite v tem računu. Ko se odjavite, bodo podatki izbrisani iz te naprave. Vaši podatki bodo kljub temu še naprej shranjeni v upravljanem računu Google in bodo na voljo vaši organizaciji. Vaša organizacija lahko nastavi tudi uporabniške pravilnike, specifične za ta račun, to pa lahko spremeni način delovanja Chromiuma.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb index a5b37d6..4840da0 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb
@@ -4,6 +4,7 @@ <translation id="1047130070405668746">Chromium'u seçin</translation> <translation id="1091252999271033193">Bu durumda Chromium her seferinde mobil siteyi ister.</translation> <translation id="1185134272377778587">Chromium hakkında</translation> +<translation id="1256849392437386613">"Fiyatı Takip Et" Seçeneğini Etkinleştirmek için Cihaz Ayarlarında Chromium Bildirimlerine İzin Verin</translation> <translation id="1257458525759135959">Resimleri kaydetmek için Ayarlar'a dokunup Chromium'un resimlerinize eklemesine izin verin</translation> <translation id="1289216811211435351">Chromium'a geçin</translation> <translation id="1361748954329991663">Chromium sürümü eski. <ph name="BEGIN_LINK" />App Store<ph name="END_LINK" />'da güncelleme yoksa cihazınız artık Chromium'un yeni sürümlerini desteklemiyor olabilir.</translation> @@ -71,6 +72,7 @@ <translation id="5573014823074921752">Chromium için ipucu. Sekmelerle ilgili daha fazla seçenek görmek için ekranınızın altında veya üstünde görünen araç çubuğunda Sekmeleri Göster düğmesine dokunup basılı tutun.</translation> <translation id="5700709190537129682">Chromium, şifrelerinizi kontrol edemiyor</translation> <translation id="5777187867430702742">Chromium Sayfası</translation> +<translation id="5918064849477363478">Chromium bildirimleri, cihaz ayarlarınızda devre dışı bırakılmış. Öncelikle bildirimlere izin vermeniz gerekli.</translation> <translation id="5945387852661427312"><ph name="DOMAIN" /> tarafından yönetilen bir hesapla oturum açıyor ve yöneticiye tüm Chromium verileriniz üzerinde denetim olanağı veriyorsunuz. Verileriniz kalıcı olarak bu hesaba bağlanacaktır. Chromium'da oturumu kapattığınızda verileriniz bu cihazdan silinir ancak Google Hesabınızda kalmaya devam eder.</translation> <translation id="5983312940147103417">Chromium'u Daha İyi Hale Getirin</translation> <translation id="6062449165341879460">Chromium verilerinize, yer işaretlerinize, geçmişinize, şifrelerinize ve bu hesapta sakladığınız diğer ayarlara kuruluşunuz <ph name="DOMAIN" /> erişebilir. Oturumunuzu kapattığınızda verileriniz bu cihazdan silinir. Ancak verileriniz, yönetilen Google Hesabınızda saklanır ve kuruluşunuzun kullanımına açıktır. Kuruluşunuz ayrıca, söz konusu hesaba özel olup Chromium'un davranışını değiştirebilecek kullanıcı politikaları belirleyebilir.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_af.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_af.xtb index 8e69dc4..b7ff348 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_af.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_af.xtb
@@ -113,6 +113,7 @@ <translation id="7780154209050837198">Meld met jou Google-rekening by Chrome aan om die meeste voordeel daaruit te trek.</translation> <translation id="7855730255114109580">Google Chrome is op datum</translation> <translation id="7939179037291298976">Maak “Wagwoordopsies” oop en kies “Chrome” in jou iPhone se instellings</translation> +<translation id="7975131781538454817">Chrome-kennisgewings is in jou toestelinstellings afgeskakel. Jy sal eers kennisgewings moet toelaat.</translation> <translation id="8022947259858476807">Gebruik by verstek Chrome om skakels oop te maak, van legstukke af te soek, en wagwoorde outomaties by ander programme in te vul</translation> <translation id="81358522153858150">Chrome steun nou gebruikerbeleide vir jou bestuurde rekening</translation> <translation id="8160472928944011082">Chrome kan nie opdateer nie</translation> @@ -142,6 +143,7 @@ • As Chrome omval, kan besonderhede oor die omval sekere persoonlike inligting insluit. • As jy sinkronisering aanskakel, kan maatstawwe inligting insluit oor URL'e wat jy besoek.<ph name="END_INDENT" /></translation> +<translation id="9101160735177453133">Laat Chrome-kennisgewings in toestelinstellings toe om “Spoor prys na” aan te skakel</translation> <translation id="9103442491611662960">Jy kry tans standaardsekuriteitbeskerming vir hierdie Chrome-profiel</translation> <translation id="9112744793181547300">Stel Chrome as verstek?</translation> <translation id="9122931302567044771">Dit beteken dat Chrome elke keer die rekenaarwerf sal versoek.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb index cee4991c..98e4d75 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
@@ -113,6 +113,7 @@ <translation id="7780154209050837198">للاستفادة إلى أقصى حدّ من Chrome، سجِّل الدخول إلى متصفِّح Chrome باستخدام حسابك على Google.</translation> <translation id="7855730255114109580">Google Chrome محدّث</translation> <translation id="7939179037291298976">في إعدادات iPhone، افتح "خيارات كلمات المرور" واختَر "Chrome"</translation> +<translation id="7975131781538454817">إنّ إشعارات Chrome غير مُفعَّلة في إعدادات جهازك. يجب تفعيلها أولاً لتفعيل الميزة.</translation> <translation id="8022947259858476807">يمكنك استخدام Chrome كمتصفّح تلقائي لفتح الروابط والبحث من خلال الأدوات وملء كلمات المرور تلقائيًا في التطبيقات الأخرى.</translation> <translation id="81358522153858150">يمكن الآن في Chrome ضبط سياسات المستخدم للحساب المُدارَ</translation> <translation id="8160472928944011082">يتعذّر تحديث Chrome.</translation> @@ -142,6 +143,7 @@ • في حال تعطُّل متصفِّح Chrome، قد تشتمل تفاصيل التعطُّل على بعض المعلومات الشخصية. • في حال تفعيل المزامنة، قد تتضمّن المقاييس أيضًا معلومات عن عناوين URL التي تنتقل إليها.<ph name="END_INDENT" /></translation> +<translation id="9101160735177453133">يجب السماح بإشعارات Chrome في إعدادات الجهاز لتفعيل ميزة "تتبُّع السعر"</translation> <translation id="9103442491611662960">يتم توفير حماية أمنية عادية لهذا الملف الشخصي على Chrome.</translation> <translation id="9112744793181547300">هل تريد ضبط Chrome كمتصفّح تلقائي؟</translation> <translation id="9122931302567044771">يعني هذا أنّ Chrome سيطلب دائمًا استخدام الموقع الإلكتروني المتوافق مع الكمبيوتر المكتبي.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ka.xtb index ecc68c7..c83d50d 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ka.xtb
@@ -113,6 +113,7 @@ <translation id="7780154209050837198">Chrome-ის შესაძლებლობები მაქსიმალურად რომ გამოიყენოთ, შედით Chrome-ში თქვენი Google ანგარიშით.</translation> <translation id="7855730255114109580">Google Chrome განახლებულია</translation> <translation id="7939179037291298976">თქვენი iPhone-ის პარამეტრებიდან გახსენით „პაროლების ვარიანტები“ და აირჩიეთ „Chrome“</translation> +<translation id="7975131781538454817">Chrome-ისგან შეტყობინებების მიღება გამორთულია თქვენი მოწყობილობის პარამეტრებიდან. პირველ რიგში, საჭიროა შეტყობინებების მიღების დაშვება.</translation> <translation id="8022947259858476807">გამოიყენეთ Chrome ნაგულისხმევ ბრაუზერად, რომ გახსნათ ბმულები, მოიძიოთ ვიჯეტებიდან და ავტომატურად შეავსოთ პაროლები სხვა აპებში</translation> <translation id="81358522153858150">Chrome-ის მიერ ახლა მხარდაჭერილია მართულ ანგარიშში მომხმარებლის წესების გამოყენება</translation> <translation id="8160472928944011082">Chrome ვერ განახლდება</translation> @@ -142,6 +143,7 @@ • Chrome-ის ავარიულად გათიშვის შემთხვევაში, გათიშვის დეტალები შეიძლება გარკვეულ პერსონალურ ინფორმაციას შეიცავდეს. • თუ სინქრონიზაციას ჩართავთ, მეტრიკა შეიძლება შეიცავდეს ინფორმაციას თქვენ მიერ მონახულებული URL-ების შესახებ.<ph name="END_INDENT" /></translation> +<translation id="9101160735177453133">ფასისთვის თვალის მიდევნება რომ ჩართოთ, მოწყობილობის პარამეტრებიდან დაუშვით Chrome-ისთვის შეტყობინებების გამოგზავნა</translation> <translation id="9103442491611662960">თქვენ სარგებლობთ უსაფრთხოების სტანდარტული საშუალებებით Chrome-ის ამ პროფილში</translation> <translation id="9112744793181547300">გსურთ, ნაგულისხმევად დააყენოთ Chrome?</translation> <translation id="9122931302567044771">ეს იმას ნიშნავს, რომ Chrome ყოველ ჯერზე მოითხოვს დესკტოპის საიტს.</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 30cd737..260570d2 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
@@ -113,6 +113,7 @@ <translation id="7780154209050837198">Chrome-ды барынша пайдалану үшін оған Google аккаунтыңызбен кіріңіз.</translation> <translation id="7855730255114109580">Google Chrome жаңартылған</translation> <translation id="7939179037291298976">iPhone параметрлерінен "Құпия сөз опциялары" бөлімін ашып, "Chrome" параметрін таңдаңыз</translation> +<translation id="7975131781538454817">Құрылғы параметрлерінде Chrome хабарландырулары өшірілген. Алдымен хабарландыруларға рұқсат беруіңіз керек.</translation> <translation id="8022947259858476807">Сілтемелерді ашу, виджеттерден іздеу және басқа қолданбаларда құпия сөздерді автотолтыру үшін Chrome браузерін әдепкісінше пайдаланыңыз.</translation> <translation id="81358522153858150">Chrome енді басқарылатын аккаунттар үшін пайдаланушы саясаттарына қолдау көрсетеді</translation> <translation id="8160472928944011082">Chrome жаңартылмайды.</translation> @@ -142,6 +143,7 @@ • Егер Chrome бұзылса, бұзылу туралы мәліметтерде кейбір жеке ақпаратыңыз қамтылуы мүмкін. • Егер синхрондауды қоссаңыз, көрсеткіштерде сіз кіретін URL мекенжайлары туралы ақпарат қамтылуы мүмкін.<ph name="END_INDENT" /></translation> +<translation id="9101160735177453133">"Бағаны бақылау" функциясын қосу үшін құрылғы параметрлерінде Chrome хабарландыруларына рұқсат беру</translation> <translation id="9103442491611662960">Chrome профилі үшін стандартты қауіпсіздік жүйесі қолданылады.</translation> <translation id="9112744793181547300">Chrome-ды әдепкі браузер ретінде орнату керек пе?</translation> <translation id="9122931302567044771">Chrome браузерін әрдайым компьютерде ашу қажет болады.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_km.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_km.xtb index 2b6d59d6..fad5f2c9 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_km.xtb
@@ -113,6 +113,7 @@ <translation id="7780154209050837198">ដើម្បីទទួលបានអត្ថប្រយោជន៍ច្រើនបំផុតពី Chrome សូមចូល Chrome ដោយប្រើគណនី Google របស់អ្នក។</translation> <translation id="7855730255114109580">Google Chrome នេះជាកំណែថ្មីហើយ</translation> <translation id="7939179037291298976">ពីការកំណត់ iPhone របស់អ្នក សូមបើក "ជម្រើសពាក្យសម្ងាត់" រួចជ្រើសរើស "Chrome"</translation> +<translation id="7975131781538454817">ការជូនដំណឹងនៅលើ Chrome ត្រូវបានបិទនៅក្នុងការកំណត់ឧបករណ៍របស់អ្នក។ អ្នកនឹងត្រូវអនុញ្ញាតការជូនដំណឹងជាមុនសិន។</translation> <translation id="8022947259858476807">ប្រើ Chrome តាមលំនាំដើម ដើម្បីបើកតំណ ស្វែងរកពីធាតុក្រាហ្វិក និងបំពេញពាក្យសម្ងាត់ដោយស្វ័យប្រវត្តិនៅក្នុងកម្មវិធីផ្សេងទៀត</translation> <translation id="81358522153858150">ឥឡូវនេះ Chrome អាចដំណើរការគោលការណ៍អ្នកប្រើប្រាស់សម្រាប់គណនីរបស់អ្នកដែលស្ថិតក្រោមការគ្រប់គ្រងបានហើយ</translation> <translation id="8160472928944011082">Chrome មិនអាចដំឡើងកំណែបានទេ</translation> @@ -142,6 +143,7 @@ • ប្រសិនបើ Chrome គាំង ព័ត៌មានលម្អិតអំពីការគាំងអាចរួមបញ្ចូលព័ត៌មានផ្ទាល់ខ្លួនមួយចំនួន។ • ប្រសិនបើអ្នកបើកសមកាលកម្ម មេទ្រិកក៏អាចរួមបញ្ចូលព័ត៌មានអំពី URL ដែលអ្នកចូលផងដែរ។<ph name="END_INDENT" /></translation> +<translation id="9101160735177453133">ដើម្បីបើក `តាមដានតម្លៃ` សូមអនុញ្ញាតការជូនដំណឹងនៅលើ Chrome នៅក្នុងការកំណត់ឧបករណ៍</translation> <translation id="9103442491611662960">អ្នកកំពុងទទួលបានការការពារសុវត្ថិភាពស្តង់ដារសម្រាប់កម្រងព័ត៌មាន Chrome នេះ</translation> <translation id="9112744793181547300">កំណត់ Chrome ជាលំនាំដើមដែរទេ?</translation> <translation id="9122931302567044771">មានន័យថា Chrome នឹងស្នើសុំទំព័រកុំព្យូទ័រគ្រប់ពេល។</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb index 181bcd0a..1e8f951 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb
@@ -113,6 +113,7 @@ <translation id="7780154209050837198">Chrome ನಿಂದ ಹೆಚ್ಚಿನ ಪ್ರಯೋಜನ ಪಡೆದುಕೊಳ್ಳಲು, ನಿಮ್ಮ Google ಖಾತೆಯ ಮೂಲಕ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation> <translation id="7855730255114109580">Google Chrome ಅನ್ನು ಅಪ್ ಟು ಡೇಟ್ ಆಗಿದೆ</translation> <translation id="7939179037291298976">ನಿಮ್ಮ iPhone ನ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿನ, "ಪಾಸ್ವರ್ಡ್ ಆಯ್ಕೆಗಳು" ತೆರೆಯಿರಿ ಮತ್ತು "Chrome" ಆಯ್ಕೆಮಾಡಿ</translation> +<translation id="7975131781538454817">ನಿಮ್ಮ ಸಾಧನದ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ Chrome ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ. ಮೊದಲು ನೀವು ಅಧಿಸೂಚನೆಗಳನ್ನು ಅನುಮತಿಸಬೇಕಾಗುತ್ತದೆ.</translation> <translation id="8022947259858476807">ಲಿಂಕ್ಗಳನ್ನು ತೆರೆಯಲು, ವಿಜೆಟ್ಗಳಿಂದ ಹುಡುಕಲು ಮತ್ತು ಇತರ ಆ್ಯಪ್ಗಳಲ್ಲಿ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಭರ್ತಿ ಮಾಡಲು ಡೀಫಾಲ್ಟ್ ಆಗಿ Chrome ಬಳಸಿ</translation> <translation id="81358522153858150">Chrome ಈಗ ನಿಮ್ಮ ನಿರ್ವಹಿಸಿದ ಖಾತೆಗಾಗಿ ಬಳಕೆದಾರರ ನೀತಿಗಳನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ</translation> <translation id="8160472928944011082">Chrome ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> @@ -142,6 +143,7 @@ • Chrome ಕ್ರ್ಯಾಶ್ ಆದರೆ, ಕ್ರ್ಯಾಶ್ ಕುರಿತ ವಿವರಗಳು ಕೆಲವು ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಿರಬಹುದು. • ನೀವು ಸಿಂಕ್ ಆನ್ ಮಾಡಿದರೆ, ಮೆಟ್ರಿಕ್ಗಳು ನೀವು ಭೇಟಿ ನೀಡುವ URL ಗಳ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಿರಬಹುದು.<ph name="END_INDENT" /></translation> +<translation id="9101160735177453133">`ಬೆಲೆ ಟ್ರ್ಯಾಕ್ ಮಾಡಿ' ಅನ್ನು ಆನ್ ಮಾಡಲು ಸಾಧನ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ Chrome ಅಧಿಸೂಚನೆಗಳನ್ನು ಅನುಮತಿಸಿ</translation> <translation id="9103442491611662960">ಈ Chrome ಪ್ರೊಫೈಲ್ಗಾಗಿ ನೀವು ಪ್ರಮಾಣಿತ ಭದ್ರತಾ ರಕ್ಷಣೆಯನ್ನು ಪಡೆಯುತ್ತಿದ್ದೀರಿ</translation> <translation id="9112744793181547300">Chrome ಅನ್ನು ಡೀಫಾಲ್ಟ್ ಆಗಿ ಹೊಂದಿಸುವುದೇ?</translation> <translation id="9122931302567044771">ಇದರರ್ಥ Chrome ಪ್ರತಿ ಬಾರಿ ಡೆಸ್ಕ್ಟಾಪ್ ಸೈಟ್ ಅನ್ನು ವಿನಂತಿಸುತ್ತದೆ.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb index 17e1e90..b4b7671 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb
@@ -113,6 +113,7 @@ <translation id="7780154209050837198">Aby w pełni wykorzystać możliwości Chrome, zaloguj się na konto Google.</translation> <translation id="7855730255114109580">Masz aktualną wersję Google Chrome</translation> <translation id="7939179037291298976">W ustawieniach iPhone'a otwórz „Hasła” i wybierz „Chrome”</translation> +<translation id="7975131781538454817">Powiadomienia Chrome są wyłączone w ustawieniach urządzenia. Najpierw musisz na nie zezwolić.</translation> <translation id="8022947259858476807">Używaj domyślnie Chrome, aby otwierać linki, wyszukiwać z widżetów i korzystać z autouzupełniania haseł w innych aplikacjach</translation> <translation id="81358522153858150">Chrome obsługuje teraz zasady dotyczące użytkowników na koncie zarządzanym</translation> <translation id="8160472928944011082">Nie udało się zaktualizować Chrome</translation> @@ -142,6 +143,7 @@ • Jeśli Chrome ulegnie awarii, szczegółowe informacje o problemie mogą zawierać niektóre dane osobowe. • Jeśli włączysz synchronizację, dane mogą też zawierać informacje o adresach URL, które odwiedzasz.<ph name="END_INDENT" /></translation> +<translation id="9101160735177453133">Aby włączyć opcję „Monitoruj cenę”, zezwól na powiadomienia Chrome w ustawieniach urządzenia</translation> <translation id="9103442491611662960">Na tym profilu Chrome korzystasz ze standardowej ochrony</translation> <translation id="9112744793181547300">Ustawić Chrome jako domyślną przeglądarkę?</translation> <translation id="9122931302567044771">Oznacza to, że Chrome będzie za każdym razem wyświetlać witrynę w wersji na komputery.</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 517e47a..b4f7b71 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
@@ -113,6 +113,7 @@ <translation id="7780154209050837198">Pentru a profita din plin de Chrome, conectează-te la Chrome folosind Contul Google.</translation> <translation id="7855730255114109580">Google Chrome este actualizat</translation> <translation id="7939179037291298976">Din setările iPhone-ului, deschide Opțiuni pentru parolă și selectează Chrome</translation> +<translation id="7975131781538454817">Notificările din Chrome sunt dezactivate în setările dispozitivului. Mai întâi trebuie să permiți notificările.</translation> <translation id="8022947259858476807">Folosește Chrome în mod prestabilit ca să deschizi linkuri, să cauți din widgeturi și să completezi automat parolele în alte aplicații</translation> <translation id="81358522153858150">Chrome acceptă acum politicile privind utilizatorii pentru contul tău gestionat</translation> <translation id="8160472928944011082">Chrome nu se poate actualiza</translation> @@ -142,6 +143,7 @@ • Dacă Chrome se blochează, detaliile despre blocare pot include unele informații cu caracter personal. • Dacă activezi sincronizarea, valorile pot să includă și informații despre adresele URL pe care le accesezi.<ph name="END_INDENT" /></translation> +<translation id="9101160735177453133">Pentru a activa opțiunea Urmărește prețul, permite notificările în Chrome din setările dispozitivului</translation> <translation id="9103442491611662960">Beneficiezi de protecție de securitate standard pentru acest profil Chrome</translation> <translation id="9112744793181547300">Setezi Chrome ca browser prestabilit?</translation> <translation id="9122931302567044771">Aceasta înseamnă că Chrome va solicita de fiecare dată versiunea pentru desktop a site-urilor.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb index de17c23d..a87d2d9 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
@@ -113,6 +113,7 @@ <translation id="7780154209050837198">Če želite kar najbolje izkoristiti Chrome, se prijavite vanj z računom Google.</translation> <translation id="7855730255114109580">Google Chrome je posodobljen</translation> <translation id="7939179037291298976">V nastavitvah iPhona odprite »Password Options« (Možnosti gesla) in izberite »Chrome«</translation> +<translation id="7975131781538454817">Obvestila za Chrome so izklopljena v nastavitvah naprave. Najprej morate omogočiti obvestila.</translation> <translation id="8022947259858476807">Uporabljajte Chrome kot privzeto možnost odpiranja povezav, iskanja v pripomočkih in samodejnega izpolnjevanja gesel v drugih aplikacijah.</translation> <translation id="81358522153858150">Chrome zdaj podpira uporabniške pravilnike za vaš upravljani račun</translation> <translation id="8160472928944011082">Chroma ni mogoče posodobiti</translation> @@ -142,6 +143,7 @@ • Če se Chrome zruši, bodo med podatki o zrušitvi morda nekateri osebni podatki. • Če vklopite sinhronizacijo, bodo meritve vključevale tudi podatke o URL-jih, ki jih obiščete.<ph name="END_INDENT" /></translation> +<translation id="9101160735177453133">Če želite vklopiti funkcijo »Spremljanje cene« v nastavitvah naprave omogočite obvestila za Chrome</translation> <translation id="9103442491611662960">V tem profilu za Chrome uporabljate standardno varnostno zaščito.</translation> <translation id="9112744793181547300">Želite nastaviti Chrome kot privzeto možnost?</translation> <translation id="9122931302567044771">To pomeni, da bo Chrome vsakič zahteval spletno mesto za namizne naprave.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb index b03b07b..9d983575 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb
@@ -113,6 +113,7 @@ <translation id="7780154209050837198">Chrome'dan en iyi şekilde yararlanmak için Google Hesabı'nızla Chrome'da oturum açın.</translation> <translation id="7855730255114109580">Google Chrome güncel durumda</translation> <translation id="7939179037291298976">iPhone'unuzun Ayarlar bölümünde "Şifre Seçenekleri"ni açıp "Chrome"u seçin</translation> +<translation id="7975131781538454817">Chrome bildirimleri, cihaz ayarlarınızda devre dışı bırakılmış. Öncelikle bildirimlere izin vermeniz gerekli.</translation> <translation id="8022947259858476807">Bağlantıları açmak, widget'lardan arama yapmak ve diğer uygulamalarda şifreleri otomatik doldurmak için varsayılan olarak Chrome'u kullanın</translation> <translation id="81358522153858150">Chrome artık yönetilen hesabınız için kullanıcı politikalarını destekliyor</translation> <translation id="8160472928944011082">Chrome güncellenemiyor</translation> @@ -142,6 +143,7 @@ • Chrome kilitlenirse bu kilitlenmeyle ilgili ayrıntılarda bazı kişisel bilgiler yer alabilir. • Senkronizasyonu açarsanız ziyaret ettiğiniz URL'ler hakkındaki bilgiler de metriklerde yer alabilir.<ph name="END_INDENT" /></translation> +<translation id="9101160735177453133">"Fiyatı Takip Et" Seçeneğini Etkinleştirmek için Cihaz Ayarlarında Chrome Bildirimlerine İzin Verin</translation> <translation id="9103442491611662960">Bu Chrome profilinde standart güvenlik korumasına sahipsiniz</translation> <translation id="9112744793181547300">Chrome Varsayılan olarak ayarlansın mı?</translation> <translation id="9122931302567044771">Bu durumda Chrome her seferinde masaüstü siteyi ister.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb index 869424c0..a705775 100644 --- a/ios/chrome/app/strings/resources/ios_strings_af.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -561,6 +561,7 @@ <translation id="5118713593561876160">Belangstellings</translation> <translation id="5118764316110575523">Af</translation> <translation id="5119391094379141756">Kies Chrome</translation> +<translation id="5121618895923301719">Jy spoor reeds hierdie produk na. Hierdie bladsy is in <ph name="BEGIN_LINK" />Mobielboekmerke<ph name="END_LINK" /> gestoor.</translation> <translation id="5132942445612118989">Sinkroniseer jou wagwoorde, geskiedenis en meer op alle toestelle</translation> <translation id="5142890110117755815">{COUNT,plural, =1{{COUNT} swak wagwoord}other{{COUNT} swak wagwoorde}}</translation> <translation id="5149188072385105201">Voeg wagwoord by …</translation> @@ -591,6 +592,7 @@ <translation id="5386314158584363703">Jy sal die werwe wat jy volg, hier vind</translation> <translation id="5388358297987318779">Maak prent oop</translation> <translation id="5407969256130905701">Gooi veranderinge weg</translation> +<translation id="5414763847370083940">Jy sal ’n opletberig kry as die prys op enige werf daal.</translation> <translation id="5416022985862681400">Afgelope 7 dae</translation> <translation id="5423269318075950257">Spoor prys na</translation> <translation id="543338862236136125">Wysig wagwoord</translation> @@ -1133,6 +1135,7 @@ <translation id="952704832371081537">Kanselleer</translation> <translation id="953008885340860025">Chrome is afgemeld</translation> <translation id="959066944189734975">Jy volg tans <ph name="CHANNEL_NAME" /></translation> +<translation id="973493300226275298">Spoor die prys van ’n produk in aanlyn winkels na. Jy sal opletberigte ontvang wanneer die prys verlaag word.</translation> <translation id="980712131080209571">N</translation> <translation id="981498610235328462">Jou organisasie laat jou toe om net met sekere rekeninge aan te meld. Rekeninge wat nie toegelaat word nie, word versteek.</translation> <translation id="984509647832111802">Sinkronisering werk nie.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index e45e223..8b6d19b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -564,6 +564,7 @@ <translation id="5118713593561876160">الاهتمامات</translation> <translation id="5118764316110575523">غير مفعَّل</translation> <translation id="5119391094379141756">اختيار Chrome</translation> +<translation id="5121618895923301719">يتم تتبُّع هذا المنتج حاليًا. تم حفظ هذه الصفحة في قائمة <ph name="BEGIN_LINK" />الإشارات المرجعية على الجوّال<ph name="END_LINK" />.</translation> <translation id="5132942445612118989">مزامنة كلمات المرور والسجلّ والمزيد على جميع الأجهزة</translation> <translation id="5142890110117755815">{COUNT,plural, =1{كلمة مرور واحدة ضعيفة ({COUNT})}zero{{COUNT} كلمة مرور ضعيفة}two{كلِمتا مرور ضعيفتان ({COUNT})}few{{COUNT} كلمات مرور ضعيفة}many{{COUNT} كلمة مرور ضعيفة}other{{COUNT} كلمة مرور ضعيفة}}</translation> <translation id="5149188072385105201">إضافة كلمة مرور…</translation> @@ -594,6 +595,7 @@ <translation id="5386314158584363703">ستظهر لك هنا المواقع الإلكترونية التي تتابعها</translation> <translation id="5388358297987318779">فتح الصورة</translation> <translation id="5407969256130905701">تجاهل التغييرات</translation> +<translation id="5414763847370083940">ستتلقَّى تنبيهًا في حال انخفاض السعر على أي موقع إلكتروني.</translation> <translation id="5416022985862681400">آخر 7 أيام</translation> <translation id="5423269318075950257">تتبُّع السعر</translation> <translation id="543338862236136125">تعديل كلمة المرور</translation> @@ -1136,6 +1138,7 @@ <translation id="952704832371081537">إلغاء</translation> <translation id="953008885340860025">تم تسجيل الخروج من Chrome</translation> <translation id="959066944189734975">تتم حاليًا متابعة <ph name="CHANNEL_NAME" /></translation> +<translation id="973493300226275298">يمكنك تتبُّع سعر منتج معيَّن في المتاجر على الإنترنت. وستتلقّى تنبيهات عند انخفاض السعر.</translation> <translation id="980712131080209571">جديدة</translation> <translation id="981498610235328462">تتيح لك مؤسستك تسجيل الدخول باستخدام حسابات معيَّنة فقط. ويتم إخفاء الحسابات غير المسموح بها.</translation> <translation id="984509647832111802">المزامنة لا تعمل.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index f2c0962..503ad71 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Připnout kartu</translation> <translation id="2116625576999540962">Počet přesunutých položek: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> <translation id="2122754583996902531">Váš prohlížeč je spravován. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">Zapnout upozornění na ceny?</translation> <translation id="2139867232736819575">Vyhledat zkopírovaný text</translation> <translation id="214201757571129614">Přihlásit se…</translation> <translation id="2149973817440762519">Upravit záložku</translation> @@ -250,6 +251,7 @@ <translation id="2797029671965852011">Zobrazit historii</translation> <translation id="2800683595868705743">Opustit přepínač karet</translation> <translation id="2815198996063984598">2. Klepněte na Výchozí prohlížeč.</translation> +<translation id="2822917246944009066">Karta připnuta</translation> <translation id="2830972654601096923">Spravovat adresy...</translation> <translation id="2834399722155632105">3. Klepněte na Volby hesel.</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -314,6 +316,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3240426699337459095">Odkaz byl zkopírován</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">Změnu nebylo možné uložit.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> z <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Otevřené karty</translation> <translation id="3272527697863656322">Zrušit</translation> @@ -336,6 +339,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Režim Split View</translation> <translation id="345565170154308620">Spravovat hesla...</translation> +<translation id="3464194322481586217">Cenu nelze sledovat.</translation> <translation id="3469166899695866866">Zastavit stahování?</translation> <translation id="3470502288861289375">Kopírování...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{pro {COUNT} web nebo aplikaci}few{pro {COUNT} weby nebo aplikace}many{pro {COUNT} webu nebo aplikací}other{pro {COUNT} webů nebo aplikací}}</translation> @@ -761,6 +765,7 @@ <translation id="6464397691496239022">Weby mohou používat soubory cookie ke zlepšování prostředí při prohlížení, například si pomocí nich mohou pamatovat vaše přihlášení a položky v nákupním košíku. Weby pomocí souborů cookie nemohou sledovat vaši aktivitu prohlížení mezi různými weby, například kvůli personalizaci reklam.</translation> +<translation id="6476253015009698798">Sledování ceny pro tuto stránku není k dispozici.</translation> <translation id="6476800141292307438">Stránka se překládá do jazyka <ph name="LANGUAGE" />. Možnosti jsou k dispozici u dolního okraje obrazovky.</translation> <translation id="648164694371393720">Chyba ověření</translation> <translation id="6482629121755362506">Počet smazaných položek: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> @@ -812,6 +817,7 @@ <translation id="6780034285637185932">PSČ</translation> <translation id="6781260999953472352">Zapnout synchronizaci?</translation> <translation id="6785453220513215166">Odesílání zprávy o selhání...</translation> +<translation id="6790502149545262384">Brzy se vám po otevření nové karty začnou zobrazovat články z webu <ph name="CHANNEL_NAME" />.</translation> <translation id="6797885426782475225">Hlasové vyhledávání</translation> <translation id="6801927553864092214">K prohlížení v soukromí otevřete anonymní kartu</translation> <translation id="6807889908376551050">Zobrazit vše…</translation> @@ -891,6 +897,7 @@ <translation id="7431991332293347422">Nastavte, jak se má vaše historie prohlížení používat k personalizaci Vyhledávání a dalších služeb</translation> <translation id="7435356471928173109">Vypnuto administrátorem</translation> <translation id="7438481509621345350">Když otevřete novou kartu, budou se teď zobrazovat články z webu <ph name="CHANNEL_NAME" />.</translation> +<translation id="7446583256109515732">Karta odepnuta</translation> <translation id="7454057999980797137">Stát / země</translation> <translation id="7459628154744868585">Je zapnutá vylepšená ochrana</translation> <translation id="746684838091935575">3. Vyberte Chrome.</translation> @@ -1121,6 +1128,8 @@ <translation id="9137526406337347448">Služby Google</translation> <translation id="9148126808321036104">Znovu přihlásit</translation> <translation id="9157836665414082580">Potlačit dialogová okna</translation> +<translation id="9162432979321511934">Zapněte Automatické vyplnění hesel</translation> +<translation id="9165320910061267720">Pokud chcete dostávat upozornění na pokles ceny, v nastavení systému iOS zapněte oznámení.</translation> <translation id="9177438225260810839">Vyhledávejte v otevřených kartách</translation> <translation id="9188680907066685419">Odhlásit se ze spravovaného účtu</translation> <translation id="9193147658040604536">Přetažením sem kartu připnete</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index 876c24b..920ed17 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -314,6 +314,7 @@ <translation id="3227137524299004712">მიკროფონი</translation> <translation id="3240426699337459095">ბმული დაკოპირდა</translation> <translation id="3244271242291266297">თთ</translation> +<translation id="3245744387817103524">ცვლილების შენახვა ვერ მოხერხდა.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> / <ph name="NUM_SUGGESTIONS" />-დან</translation> <translation id="3268451620468152448">გახსნილი ჩანართები</translation> <translation id="3272527697863656322">გაუქმება</translation> @@ -336,6 +337,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> წთ</translation> <translation id="3448016392200048164">გაყოფილი ხედი</translation> <translation id="345565170154308620">პაროლების მართვა…</translation> +<translation id="3464194322481586217">ფასისთვის თვალის მიდევნება ვერ მოხერხდა.</translation> <translation id="3469166899695866866">გსურთ ჩამოტვირთვის შეწყვეტა?</translation> <translation id="3470502288861289375">კოპირება…</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} საიტისთვის ან აპისთვის}other{{COUNT} საიტისთვის ან აპისთვის}}</translation> @@ -561,6 +563,7 @@ <translation id="5118713593561876160">ინტერესები</translation> <translation id="5118764316110575523">გამორთული</translation> <translation id="5119391094379141756">აირჩიეთ Chrome</translation> +<translation id="5121618895923301719">ამ პროდუქტს თვალს უკვე ადევნებთ. ეს გვერდი შენახულია <ph name="BEGIN_LINK" />მობილურ სანიშნეებში<ph name="END_LINK" />.</translation> <translation id="5132942445612118989">მოახდინეთ თქვენი პაროლების, ისტორიისა და სხვა კონტენტის სინქრონიზაცია თქვენს ყველა მოწყობილობაზე</translation> <translation id="5142890110117755815">{COUNT,plural, =1{{COUNT} სუსტი პაროლი}other{{COUNT} სუსტი პაროლი}}</translation> <translation id="5149188072385105201">პაროლის დამატება...</translation> @@ -591,6 +594,7 @@ <translation id="5386314158584363703">აქ იპოვით თქვენს თვალმიდევნებულ საიტებს</translation> <translation id="5388358297987318779">გამოსახულების გახსნა</translation> <translation id="5407969256130905701">ცვლილებების გაუქმება</translation> +<translation id="5414763847370083940">თქვენ მიიღებთ გაფრთხილებას, როცა რომელიმე საიტზე ფასი დაიკლებს.</translation> <translation id="5416022985862681400">ბოლო 7 დღე</translation> <translation id="5423269318075950257">ფასისთვის თვალის მიდევნება</translation> <translation id="543338862236136125">პაროლის რედაქტირება</translation> @@ -761,6 +765,7 @@ <translation id="6464397691496239022">საიტებს შეუძლია ქუქი-ჩანაწერების გამოყენება ვების დათვალიერების პროცესის გასაუმჯობესებლად, მაგალითად, სისტემაში შესული მდგომარეობის შესანარჩუნებლად ან საყიდლების კალათაში დამატებული ერთეულების დასამახსოვრებლად. საიტებს არ შეუძლია ქუქი-ჩანაწერების გამოყენება სხვადასხვა საიტის თქვენ მიერ დათვალიერების აქტივობის სანახავად, მაგალითად, რეკლამის თქვენზე მოსარგებად.</translation> +<translation id="6476253015009698798">ფასისთვის თვალის მიდევნება მიუწვდომელია ამ გვერდისთვის.</translation> <translation id="6476800141292307438">მიმდინარეობს გვერდის <ph name="LANGUAGE" /> ვერსიის მომზადება. ვარიანტებს იპოვით ეკრანის ქვედა ნაწილთან.</translation> <translation id="648164694371393720">ავტორიზაციის შეცდომა</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> ელემენტი წაშლილია</translation> @@ -812,6 +817,7 @@ <translation id="6780034285637185932">საფოსტო კოდი</translation> <translation id="6781260999953472352">გსურთ სინქრონიზაციის ჩართვა?</translation> <translation id="6785453220513215166">შეცდომების შესახებ მოხსენების გაგზავნა…</translation> +<translation id="6790502149545262384">მალე, ახალი ჩანართის გახსნისას, იხილავთ ამბებს <ph name="CHANNEL_NAME" />-დან.</translation> <translation id="6797885426782475225">ხმოვანი ძიება</translation> <translation id="6801927553864092214">ვების კონფიდენციალურად დასათვალიერებლად გახსენით ინკოგნიტო ჩანართი</translation> <translation id="6807889908376551050">ყველას ჩვენება…</translation> @@ -1121,6 +1127,7 @@ <translation id="9137526406337347448">Google სერვისები</translation> <translation id="9148126808321036104">ხელახლა შედით</translation> <translation id="9157836665414082580">დიალოგების შეჩერება</translation> +<translation id="9162432979321511934">ჩართეთ პაროლების ავტომატური შევსება</translation> <translation id="9177438225260810839">ღია ჩანართებში ძიება</translation> <translation id="9188680907066685419">მართული ანგარიშიდან გასვლა</translation> <translation id="9193147658040604536">ჩანართის ჩასამაგრებლად ჩავლებით გადმოიტანეთ აქ</translation> @@ -1133,6 +1140,7 @@ <translation id="952704832371081537">გაუქმება</translation> <translation id="953008885340860025">Chrome სისტემიდან გამოსულია</translation> <translation id="959066944189734975">თქვენ თვალს ადევნებთ <ph name="CHANNEL_NAME" />-ს</translation> +<translation id="973493300226275298">თვალი მიადევნეთ პროდუქტის ფასს სხვადასხვა ონლაინმაღაზიაში. თქვენ მიიღებთ გაფრთხილებას, როცა ფასი დაიკლებს.</translation> <translation id="980712131080209571">ა</translation> <translation id="981498610235328462">თქვენი ორგანიზაცია სისტემაში მხოლოდ კონკრეტული ანგარიშებით შესვლის უფლებას გაძლებთ. ანგარიშები, რომელთა გამოყენებაც ნებადართული არ არის, დამალულია.</translation> <translation id="984509647832111802">სინქრონიზაცია არ მუშაობს.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index d26f5cb9..396055051 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -561,6 +561,7 @@ <translation id="5118713593561876160">Қызығушылықтар</translation> <translation id="5118764316110575523">Өшірулі</translation> <translation id="5119391094379141756">Chrome браузерін таңдаңыз.</translation> +<translation id="5121618895923301719">Бұл өнімді бұрыннан бақылап жатырсыз. Бұл бет <ph name="BEGIN_LINK" />Мобильді құрылғының бетбелгілері<ph name="END_LINK" /> ішінде сақталады</translation> <translation id="5132942445612118989">Құпия сөздеріңізді, әрекеттеріңіздің тарихын және басқа деректерді барлық құрылғыда синхрондау</translation> <translation id="5142890110117755815">{COUNT,plural, =1{{COUNT} оңай құпия сөз}other{{COUNT} оңай құпия сөз}}</translation> <translation id="5149188072385105201">Құпия сөз қосу…</translation> @@ -591,6 +592,7 @@ <translation id="5386314158584363703">Жазылған сайттарды осы жерден табасыз</translation> <translation id="5388358297987318779">Кескінді ашу</translation> <translation id="5407969256130905701">Өзгертулерді алып тастау</translation> +<translation id="5414763847370083940">Қандай да бір сайтта баға төмендесе, ескерту аласыз.</translation> <translation id="5416022985862681400">Соңғы 7 күн</translation> <translation id="5423269318075950257">Бағаны бақылау</translation> <translation id="543338862236136125">Құпия сөзді өзгерту</translation> @@ -1133,6 +1135,7 @@ <translation id="952704832371081537">Бас тарту</translation> <translation id="953008885340860025">Chrome аккаунтынан шықтыңыз</translation> <translation id="959066944189734975">Сіз <ph name="CHANNEL_NAME" /> сайтына жазылғансыз</translation> +<translation id="973493300226275298">Онлайн дүкендерде өнім бағасын бақылаңыз. Баға төмендеген кезде хабарландырулар аласыз.</translation> <translation id="980712131080209571">N</translation> <translation id="981498610235328462">Ұйымыңыз сізге белгілі бір аккаунттармен ғана кіруге рұқсат етеді. Рұқсат етілмеген аккаунттар жасырылған.</translation> <translation id="984509647832111802">Синхрондалмай жатыр.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb index 40aea1f8..b129db7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -561,6 +561,7 @@ <translation id="5118713593561876160">ចំណាប់អារម្មណ៍</translation> <translation id="5118764316110575523">បិទ</translation> <translation id="5119391094379141756">ជ្រើសរើស Chrome</translation> +<translation id="5121618895923301719">អ្នកកំពុងតាមដានផលិតផលនេះស្រាប់ហើយ។ ទំព័រនេះត្រូវបានរក្សាទុកនៅក្នុង<ph name="BEGIN_LINK" />ចំណាំរបស់ឧបករណ៍ចល័ត<ph name="END_LINK" />។</translation> <translation id="5132942445612118989">ធ្វើសមកាលកម្មពាក្យសម្ងាត់ ប្រវត្តិ និងអ្វីៗជាច្រើនទៀតនៅលើឧបករណ៍ទាំងអស់របស់អ្នក</translation> <translation id="5142890110117755815">{COUNT,plural, =1{ពាក្យសម្ងាត់ខ្សោយ {COUNT}}other{ពាក្យសម្ងាត់ខ្សោយ {COUNT}}}</translation> <translation id="5149188072385105201">បញ្ចូលពាក្យសម្ងាត់...</translation> @@ -591,6 +592,7 @@ <translation id="5386314158584363703">អ្នកនឹងរកឃើញគេហទំព័រដែលត្រូវបានតាមដានរបស់អ្នកនៅទីនេះ</translation> <translation id="5388358297987318779">បើករូបភាព</translation> <translation id="5407969256130905701">លុបចោលការផ្លាស់ប្ដូរ</translation> +<translation id="5414763847370083940">អ្នកនឹងទទួលបានការជូនដំណឹង ប្រសិនបើមានការធ្លាក់តម្លៃនៅលើគេហទំព័រណាមួយ។</translation> <translation id="5416022985862681400">7 ថ្ងៃមុន</translation> <translation id="5423269318075950257">តាមដានតម្លៃ</translation> <translation id="543338862236136125">កែពាក្យសម្ងាត់</translation> @@ -1133,6 +1135,7 @@ <translation id="952704832371081537">បោះបង់</translation> <translation id="953008885340860025">បានចេញពី Chrome</translation> <translation id="959066944189734975">អ្នកកំពុងតាមដាន <ph name="CHANNEL_NAME" /></translation> +<translation id="973493300226275298">តាមដានតម្លៃផលិតផលនៅលើហាងលើអ៊ីនធឺណិតទាំងអស់។ អ្នកនឹងទទួលបានការជូនដំណឹងនៅពេលតម្លៃធ្លាក់ចុះ។</translation> <translation id="980712131080209571">ថ្មី</translation> <translation id="981498610235328462">ស្ថាប័នរបស់អ្នកអនុញ្ញាតឱ្យអ្នកចូលដោយប្រើគណនីជាក់លាក់តែប៉ុណ្ណោះ។ គណនីដែលមិនមានការអនុញ្ញាតត្រូវបានលាក់។</translation> <translation id="984509647832111802">សមកាលកម្មមិនកំពុងដំណើរការទេ។</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index c56aadd..55bb595b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -561,6 +561,7 @@ <translation id="5118713593561876160">ಆಸಕ್ತಿಗಳು</translation> <translation id="5118764316110575523">ಆಫ್ ಆಗಿದೆ</translation> <translation id="5119391094379141756">Chrome ಆಯ್ಕೆಮಾಡಿ</translation> +<translation id="5121618895923301719">ನೀವು ಈ ಉತ್ಪನ್ನವನ್ನು ಈಗಾಗಲೇ ಟ್ರ್ಯಾಕ್ ಮಾಡುತ್ತಿದ್ದೀರಿ. ಈ ಪುಟವನ್ನು <ph name="BEGIN_LINK" />ಮೊಬೈಲ್ Bookmarks<ph name="END_LINK" /> ನಲ್ಲಿ ಉಳಿಸಲಾಗಿದೆ.</translation> <translation id="5132942445612118989">ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲೂ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳು, ಇತಿಹಾಸ ಹಾಗೂ ಇನ್ನೂ ಹೆಚ್ಚಿನವುಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಿ</translation> <translation id="5142890110117755815">{COUNT,plural, =1{{COUNT} ದುರ್ಬಲ ಪಾಸ್ವರ್ಡ್}one{{COUNT} ದುರ್ಬಲ ಪಾಸ್ವರ್ಡ್ಗಳು}other{{COUNT} ದುರ್ಬಲ ಪಾಸ್ವರ್ಡ್ಗಳು}}</translation> <translation id="5149188072385105201">ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಸೇರಿಸಿ...</translation> @@ -591,6 +592,7 @@ <translation id="5386314158584363703">ನೀವು ಫಾಲೋ ಮಾಡಿರುವ ಸೈಟ್ಗಳನ್ನು ನೀವು ಇಲ್ಲಿ ಕಾಣಬಹುದು</translation> <translation id="5388358297987318779">ಚಿತ್ರವನ್ನು ತೆರೆಯಿರಿ</translation> <translation id="5407969256130905701">ಬದಲಾವಣೆಗಳನ್ನು ತ್ಯಜಿಸಿ</translation> +<translation id="5414763847370083940">ಯಾವುದಾದರೂ ಸೈಟ್ನಲ್ಲಿ ಬೆಲೆ ಕುಸಿತವಾದರೆ ನೀವು ಎಚ್ಚರಿಕೆ ಪಡೆಯುತ್ತೀರಿ.</translation> <translation id="5416022985862681400">ಕಳೆದ 7 ದಿನಗಳಲ್ಲಿ</translation> <translation id="5423269318075950257">ಬೆಲೆಯನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಿ</translation> <translation id="543338862236136125">ಪಾಸ್ವರ್ಡ್ ಎಡಿಟ್ ಮಾಡಿ</translation> @@ -1133,6 +1135,7 @@ <translation id="952704832371081537">ರದ್ದುಮಾಡಿ</translation> <translation id="953008885340860025">Chrome ನಿಂದ ಸೈನ್ಔಟ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="959066944189734975">ನೀವು <ph name="CHANNEL_NAME" /> ಅನ್ನು ಫಾಲೋ ಮಾಡುತ್ತಿದ್ದೀರಿ</translation> +<translation id="973493300226275298">ಆನ್ಲೈನ್ ಸ್ಟೋರ್ಗಳಾದ್ಯಂತ ಉತ್ಪನ್ನದ ಬೆಲೆಯನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಿ. ಬೆಲೆ ಕುಸಿತವಾದರೆ ನೀವು ಎಚ್ಚರಿಕೆ ಪಡೆಯುತ್ತೀರಿ.</translation> <translation id="980712131080209571">N</translation> <translation id="981498610235328462">ಕೆಲವು ಖಾತೆಗಳ ಮೂಲಕ ಮಾತ್ರ ಸೈನ್ ಇನ್ ಮಾಡಲು ನಿಮ್ಮ ಸಂಸ್ಥೆ ನಿಮಗೆ ಅನುಮತಿ ನೀಡುತ್ತದೆ. ಅನುಮತಿಸದ ಖಾತೆಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ.</translation> <translation id="984509647832111802">ಸಿಂಕ್ ಕೆಲಸ ಮಾಡುತ್ತಿಲ್ಲ.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index b630c87..50795be 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -314,6 +314,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3240426699337459095">Linken er kopiert</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">Kunne ikke lagre endringen.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> av <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Åpne faner</translation> <translation id="3272527697863656322">Avbryt</translation> @@ -336,6 +337,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Delt visning</translation> <translation id="345565170154308620">Administrer passord</translation> +<translation id="3464194322481586217">Kunne ikke spore prisen.</translation> <translation id="3469166899695866866">Vil du stoppe nedlastingen?</translation> <translation id="3470502288861289375">Kopierer ...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{For {COUNT} nettsted eller app}other{for {COUNT} nettsteder og apper}}</translation> @@ -761,6 +763,7 @@ <translation id="6464397691496239022">Nettsteder kan bruke informasjonskapsler for å gi deg en bedre surfeopplevelse, for eksempel for å holde deg pålogget eller huske varene i handlekurven din. Nettsteder kan ikke bruke informasjonskapsler til å se nettleseraktiviteten din på andre nettsteder, for eksempel for å vise deg personlig tilpassede annonser.</translation> +<translation id="6476253015009698798">Prissporing er ikke tilgjengelig for denne siden.</translation> <translation id="6476800141292307438">Oversetter siden til <ph name="LANGUAGE" />. Du finner alternativer på nedre del av skjermen.</translation> <translation id="648164694371393720">Autentiseringsfeil</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elementer slettet</translation> @@ -812,6 +815,7 @@ <translation id="6780034285637185932">Postnummer</translation> <translation id="6781260999953472352">Vil du slå på synkronisering?</translation> <translation id="6785453220513215166">Sender krasjrapport …</translation> +<translation id="6790502149545262384">Snart ser du artikler fra <ph name="CHANNEL_NAME" /> når du åpner nye faner.</translation> <translation id="6797885426782475225">Talesøk</translation> <translation id="6801927553864092214">For å surfe privat på nettet, åpne en inkognitofane</translation> <translation id="6807889908376551050">Vis alle</translation> @@ -1121,6 +1125,7 @@ <translation id="9137526406337347448">Google-tjenester</translation> <translation id="9148126808321036104">Logg på igjen</translation> <translation id="9157836665414082580">Ignorer dialogbokser</translation> +<translation id="9162432979321511934">Slå på Autofyll-passord.</translation> <translation id="9177438225260810839">Søk i åpne faner</translation> <translation id="9188680907066685419">Logg av administrert konto</translation> <translation id="9193147658040604536">Dra hit for å feste fanen</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index 1c4fb8be..c30bf63 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -561,6 +561,7 @@ <translation id="5118713593561876160">Zainteresowania</translation> <translation id="5118764316110575523">Wyłączono</translation> <translation id="5119391094379141756">Wybierz Chrome.</translation> +<translation id="5121618895923301719">Śledzisz już ten produkt. Ta strona jest zapisana w <ph name="BEGIN_LINK" />Zakładkach na komórce<ph name="END_LINK" />.</translation> <translation id="5132942445612118989">Synchronizuj swoje hasła, historię i inne dane na wszystkich swoich urządzeniach</translation> <translation id="5142890110117755815">{COUNT,plural, =1{{COUNT} słabe hasło}few{{COUNT} słabe hasła}many{{COUNT} słabych haseł}other{{COUNT} słabego hasła}}</translation> <translation id="5149188072385105201">Dodaj hasło…</translation> @@ -591,6 +592,7 @@ <translation id="5386314158584363703">Tu znajdziesz swoje ulubione witryny</translation> <translation id="5388358297987318779">Otwórz obraz</translation> <translation id="5407969256130905701">Odrzuć zmiany</translation> +<translation id="5414763847370083940">Otrzymasz alert, jeśli cena w którejkolwiek witrynie spadnie.</translation> <translation id="5416022985862681400">Ostatnie 7 dni</translation> <translation id="5423269318075950257">Monitoruj cenę</translation> <translation id="543338862236136125">Edytuj hasło</translation> @@ -1133,6 +1135,7 @@ <translation id="952704832371081537">Anuluj</translation> <translation id="953008885340860025">Wylogowano z Chrome</translation> <translation id="959066944189734975">Obserwujesz kanał <ph name="CHANNEL_NAME" /></translation> +<translation id="973493300226275298">Monitoruj cenę produktu w sklepach internetowych. Gdy cena spadnie, otrzymasz alert.</translation> <translation id="980712131080209571">N</translation> <translation id="981498610235328462">Twoja organizacja pozwala logować się tylko na określone konta. Niedozwolone konta zostały ukryte.</translation> <translation id="984509647832111802">Synchronizacja nie działa.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index 5f6295b..46d40f4d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -561,6 +561,7 @@ <translation id="5118713593561876160">Interese</translation> <translation id="5118764316110575523">Dezactivat</translation> <translation id="5119391094379141756">Selectează Chrome.</translation> +<translation id="5121618895923301719">Urmărești deja acest produs. Pagina se salvează în <ph name="BEGIN_LINK" />Marcaje mobile<ph name="END_LINK" />.</translation> <translation id="5132942445612118989">Sincronizează parolele, istoricul și alte date pe toate dispozitivele</translation> <translation id="5142890110117755815">{COUNT,plural, =1{{COUNT} parolă slabă}few{{COUNT} parole slabe}other{{COUNT} de parole slabe}}</translation> <translation id="5149188072385105201">adaugă parola…</translation> @@ -591,6 +592,7 @@ <translation id="5386314158584363703">Vei găsi site-urile urmărite aici</translation> <translation id="5388358297987318779">Deschide imaginea</translation> <translation id="5407969256130905701">Renunță la modificări</translation> +<translation id="5414763847370083940">Vei primi o alertă dacă prețul scade pe orice site.</translation> <translation id="5416022985862681400">Ultimele șapte zile</translation> <translation id="5423269318075950257">Urmărește prețul</translation> <translation id="543338862236136125">Editează parola</translation> @@ -1133,6 +1135,7 @@ <translation id="952704832371081537">Anulează</translation> <translation id="953008885340860025">Te-ai deconectat de la Chrome</translation> <translation id="959066944189734975">Urmărești <ph name="CHANNEL_NAME" /></translation> +<translation id="973493300226275298">Urmărește prețul unui produs în mai multe magazine online. Vei primi alerte când scade prețul.</translation> <translation id="980712131080209571">N</translation> <translation id="981498610235328462">Organizația îți permite să te conectezi doar cu anumite conturi. Conturile nepermise sunt ascunse.</translation> <translation id="984509647832111802">Sincronizarea nu funcționează.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index 97ceba37..47e3df0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -314,6 +314,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3240426699337459095">Povezava kopirana</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">Spremembe ni bilo mogoče shraniti.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> od <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Odprti zavihki</translation> <translation id="3272527697863656322">Prekliči</translation> @@ -336,6 +337,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Razdeljeni pogled</translation> <translation id="345565170154308620">Upravljanje gesel ...</translation> +<translation id="3464194322481586217">Cene ni bilo mogoče spremljati.</translation> <translation id="3469166899695866866">Želite ustaviti prenos?</translation> <translation id="3470502288861289375">Kopiranje ...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{za {COUNT} spletno mesto ali aplikacijo}one{za {COUNT} spletno mesto ali aplikacijo}two{za {COUNT} spletni mesti ali aplikaciji}few{za {COUNT} spletna mesta ali aplikacije}other{za {COUNT} spletnih mest ali aplikacij}}</translation> @@ -561,6 +563,7 @@ <translation id="5118713593561876160">Zanimanja</translation> <translation id="5118764316110575523">Izklopljeno</translation> <translation id="5119391094379141756">Izberite Chrome.</translation> +<translation id="5121618895923301719">Ta izdelek že spremljate. Ta stran je shranjena v <ph name="BEGIN_LINK" />Zaznamkih v mobilni napravi<ph name="END_LINK" />.</translation> <translation id="5132942445612118989">Sinhronizirajte gesla, zgodovino in drugo v vseh napravah</translation> <translation id="5142890110117755815">{COUNT,plural, =1{{COUNT} šibko geslo}one{{COUNT} šibko geslo}two{{COUNT} šibki gesli}few{{COUNT} šibka gesla}other{{COUNT} šibkih gesel}}</translation> <translation id="5149188072385105201">Dodaj geslo …</translation> @@ -591,6 +594,7 @@ <translation id="5386314158584363703">Spletna mesta, ki jih spremljate, bodo na voljo tukaj</translation> <translation id="5388358297987318779">Odpri sliko</translation> <translation id="5407969256130905701">Zavrzi spremembe</translation> +<translation id="5414763847370083940">Če se cena zniža na katerem koli spletnem mestu, boste prejeli opozorilo.</translation> <translation id="5416022985862681400">Zadnjih 7 dni</translation> <translation id="5423269318075950257">Spremljanje cene</translation> <translation id="543338862236136125">Uredi geslo</translation> @@ -761,6 +765,7 @@ <translation id="6464397691496239022">Spletna mesta lahko uporabljajo piškotke za izboljšanje izkušnje brskanja, na primer tako, da poskrbijo, da ostanete prijavljeni, ali si zapomnijo izdelke v nakupovalnem vozičku. Spletna mesta ne smejo uporabljati piškotkov za ogled dejavnosti brskanja na različnih spletnih mestih, na primer za osebno prilagajanje oglasov.</translation> +<translation id="6476253015009698798">Spremljanje cen ni na voljo za to spletno mesto.</translation> <translation id="6476800141292307438">Prevajanje strani v ta jezik: <ph name="LANGUAGE" />. Možnosti so na voljo blizu dna zaslona.</translation> <translation id="648164694371393720">Napaka pri preverjanju pristnosti</translation> <translation id="6482629121755362506">Št. izbrisanih elementov: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> @@ -812,6 +817,7 @@ <translation id="6780034285637185932">Poštna številka</translation> <translation id="6781260999953472352">Želite vklopiti sinhronizacijo?</translation> <translation id="6785453220513215166">Pošiljanje poročila o zrušitvi ...</translation> +<translation id="6790502149545262384">Kmalu bodo prikazane novice s spletnega mesta <ph name="CHANNEL_NAME" />, ko boste odprli nov zavihek.</translation> <translation id="6797885426782475225">Glasovno iskanje</translation> <translation id="6801927553864092214">Če želite zasebno brskati, odprite anonimni zavihek.</translation> <translation id="6807889908376551050">Pokaži vse ...</translation> @@ -1121,6 +1127,7 @@ <translation id="9137526406337347448">Googlove storitve</translation> <translation id="9148126808321036104">Prijavite se znova</translation> <translation id="9157836665414082580">Onemogoči pogovorna okna</translation> +<translation id="9162432979321511934">Vklopite AutoFill Passwords (Samodejno izpolnjevanje gesel).</translation> <translation id="9177438225260810839">Iskanje po odprtih zavihkih</translation> <translation id="9188680907066685419">Odjava iz upravljanega računa</translation> <translation id="9193147658040604536">Povlecite sem, če želite pripeti zavihek</translation> @@ -1133,6 +1140,7 @@ <translation id="952704832371081537">Preklic</translation> <translation id="953008885340860025">Chrome je odjavljen</translation> <translation id="959066944189734975">Spremljate kanal <ph name="CHANNEL_NAME" /></translation> +<translation id="973493300226275298">Spremljajte ceno izdelka v več spletnih trgovinah. Ko se cena zniža, boste prejeli opozorilo.</translation> <translation id="980712131080209571">N</translation> <translation id="981498610235328462">Organizacija dovoli prijavo samo z nekaterimi računi. Nedovoljeni računi so skriti.</translation> <translation id="984509647832111802">Sinhronizacija ne deluje.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index 941d874f..a834a900e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">ปักหมุดแท็บ</translation> <translation id="2116625576999540962">ย้ายแล้ว <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> รายการ</translation> <translation id="2122754583996902531">เบราว์เซอร์ของคุณมีการจัดการ <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">เปิดการแจ้งเตือนราคาไหม</translation> <translation id="2139867232736819575">ค้นหาข้อความที่คุณคัดลอก</translation> <translation id="214201757571129614">กำลังลงชื่อเข้าใช้…</translation> <translation id="2149973817440762519">แก้ไขบุ๊กมาร์ก</translation> @@ -250,6 +251,7 @@ <translation id="2797029671965852011">แสดงประวัติ</translation> <translation id="2800683595868705743">ออกจากมุมมองตัวสลับแท็บ</translation> <translation id="2815198996063984598">2. แตะแอปเบราว์เซอร์เริ่มต้น</translation> +<translation id="2822917246944009066">ปักหมุดแท็บแล้ว</translation> <translation id="2830972654601096923">จัดการที่อยู่...</translation> <translation id="2834399722155632105">3. แตะตัวเลือกรหัสผ่าน</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -314,6 +316,7 @@ <translation id="3227137524299004712">ไมโครโฟน</translation> <translation id="3240426699337459095">คัดลอกลิงก์แล้ว</translation> <translation id="3244271242291266297">ดด</translation> +<translation id="3245744387817103524">บันทึกการเปลี่ยนแปลงไม่ได้</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> จาก <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">แท็บที่เปิดอยู่</translation> <translation id="3272527697863656322">ยกเลิก</translation> @@ -336,6 +339,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> นาที</translation> <translation id="3448016392200048164">Split View</translation> <translation id="345565170154308620">จัดการรหัสผ่าน...</translation> +<translation id="3464194322481586217">ติดตามราคาไม่ได้</translation> <translation id="3469166899695866866">หยุดดาวน์โหลดไหม</translation> <translation id="3470502288861289375">กำลังคัดลอก...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{สำหรับเว็บไซต์หรือแอป {COUNT} รายการ}other{สําหรับเว็บไซต์และแอป {COUNT} รายการ}}</translation> @@ -763,6 +767,7 @@ <translation id="6464397691496239022">เว็บไซต์จะใช้คุกกี้เพื่อปรับปรุงประสบการณ์การท่องเว็บ เช่น ให้คุณลงชื่อเข้าใช้ต่อไปเรื่อยๆ หรือจดจำรายการในรถเข็นช็อปปิ้ง เว็บไซต์ไม่อาจใช้คุกกี้เพื่อดูกิจกรรมการท่องเว็บของคุณในเว็บไซต์และดำเนินการต่างๆ เช่น เพื่อปรับโฆษณาตามโปรไฟล์ของคุณได้อีก</translation> +<translation id="6476253015009698798">การติดตามราคาใช้ไม่ได้กับหน้านี้</translation> <translation id="6476800141292307438">กำลังแปลหน้าเว็บเป็นภาษา<ph name="LANGUAGE" /> ตัวเลือกจะอยู่ทางด้านล่างของหน้าจอ</translation> <translation id="648164694371393720">ข้อผิดพลาดในการตรวจสอบสิทธิ์</translation> <translation id="6482629121755362506">ลบแล้ว <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> รายการ</translation> @@ -814,6 +819,7 @@ <translation id="6780034285637185932">รหัสไปรษณีย์</translation> <translation id="6781260999953472352">เปิดการซิงค์ไหม</translation> <translation id="6785453220513215166">กำลังส่งรายงานข้อขัดข้อง...</translation> +<translation id="6790502149545262384">เร็วๆ นี้คุณจะเห็นเรื่องราวจาก <ph name="CHANNEL_NAME" /> เมื่อเปิดแท็บใหม่</translation> <translation id="6797885426782475225">ค้นหาด้วยเสียง</translation> <translation id="6801927553864092214">หากต้องการท่องเว็บแบบส่วนตัว ให้เปิดแท็บที่ไม่ระบุตัวตน</translation> <translation id="6807889908376551050">แสดงทั้งหมด...</translation> @@ -893,6 +899,7 @@ <translation id="7431991332293347422">ควบคุมการใช้ประวัติการท่องเว็บเพื่อปรับเปลี่ยน Search และบริการอื่นๆ ในแบบของคุณ</translation> <translation id="7435356471928173109">ปิดโดยผู้ดูแลระบบ</translation> <translation id="7438481509621345350">ตอนนี้คุณจะเห็นเรื่องราวจาก <ph name="CHANNEL_NAME" /> เมื่อเปิดแท็บใหม่</translation> +<translation id="7446583256109515732">เลิกปักหมุดแท็บแล้ว</translation> <translation id="7454057999980797137">เขต/แขวง</translation> <translation id="7459628154744868585">การปกป้องที่ดียิ่งขึ้นเปิดอยู่</translation> <translation id="746684838091935575">3. เลือก Chrome</translation> @@ -1123,6 +1130,8 @@ <translation id="9137526406337347448">Google Services</translation> <translation id="9148126808321036104">ลงชื่อเข้าใช้อีกครั้ง</translation> <translation id="9157836665414082580">ระงับกล่องโต้ตอบ</translation> +<translation id="9162432979321511934">เปิดการป้อนรหัสผ่านอัตโนมัติ</translation> +<translation id="9165320910061267720">หากต้องการรับการแจ้งเตือนราคาลดลง คุณจะต้องเปิดการแจ้งเตือนในการตั้งค่า iOS</translation> <translation id="9177438225260810839">ค้นหาในแท็บที่เปิดอยู่</translation> <translation id="9188680907066685419">ออกจากระบบบัญชีที่มีการจัดการ</translation> <translation id="9193147658040604536">ลากมาที่นี่เพื่อปักหมุดแท็บ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index 0226622..a877168f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -561,6 +561,7 @@ <translation id="5118713593561876160">İlgi alanları</translation> <translation id="5118764316110575523">Kapalı</translation> <translation id="5119391094379141756">Chrome'u seçin</translation> +<translation id="5121618895923301719">Bu ürünü zaten takip ediyorsunuz. Bu sayfa <ph name="BEGIN_LINK" />Mobil Yer İşaretleri<ph name="END_LINK" />'ne kaydedildi.</translation> <translation id="5132942445612118989">Tüm cihazlardaki şifreleriniz, geçmişiniz ve diğer öğelerinizi senkronize edin</translation> <translation id="5142890110117755815">{COUNT,plural, =1{{COUNT} Zayıf Şifre}other{{COUNT} Zayıf Şifre}}</translation> <translation id="5149188072385105201">Şifre Ekleyin..</translation> @@ -591,6 +592,7 @@ <translation id="5386314158584363703">Takip ettiğiniz siteleri burada görebilirsiniz</translation> <translation id="5388358297987318779">Resmi Aç</translation> <translation id="5407969256130905701">Değişiklikleri Sil</translation> +<translation id="5414763847370083940">Herhangi bir sitede fiyatı düştüğünde uyarı alırsınız.</translation> <translation id="5416022985862681400">Son 7 Gün</translation> <translation id="5423269318075950257">Fiyatı Takip Et</translation> <translation id="543338862236136125">Şifreyi düzenle</translation> @@ -1133,6 +1135,7 @@ <translation id="952704832371081537">İptal</translation> <translation id="953008885340860025">Chrome Oturumu Kapatıldı</translation> <translation id="959066944189734975"><ph name="CHANNEL_NAME" /> kanalını takip ediyorsunuz</translation> +<translation id="973493300226275298">Bir ürünün online mağazalardaki fiyatını takip edebilirsiniz. Fiyatı düştüğünde uyarı alırsınız.</translation> <translation id="980712131080209571">Y</translation> <translation id="981498610235328462">Kuruluşunuz yalnızca belirli hesaplarla oturum açmanıza izin vermektedir. İzin verilmeyen hesaplar gösterilmez.</translation> <translation id="984509647832111802">Senkronizasyon Çalışmıyor.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb index fa87558..45ce97d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -314,6 +314,7 @@ <translation id="3227137524299004712">麦克风</translation> <translation id="3240426699337459095">已复制链接</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">无法保存您的更改。</translation> <translation id="3252394070589632019"><ph name="VALUE" />,<ph name="ADDITIONAL_INFO" />,第 <ph name="INDEX" /> 项建议(共 <ph name="NUM_SUGGESTIONS" /> 项)</translation> <translation id="3268451620468152448">打开的标签页</translation> <translation id="3272527697863656322">取消</translation> @@ -336,6 +337,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" />分钟</translation> <translation id="3448016392200048164">分割视图</translation> <translation id="345565170154308620">管理密码…</translation> +<translation id="3464194322481586217">无法跟踪价格。</translation> <translation id="3469166899695866866">是否停止下载?</translation> <translation id="3470502288861289375">正在复制…</translation> <translation id="3474048842645761983">{COUNT,plural, =1{涉及 {COUNT} 个网站或应用}other{涉及 {COUNT} 个网站和应用}}</translation> @@ -761,6 +763,7 @@ <translation id="6464397691496239022">网站可以使用 Cookie 来提升您的浏览体验,例如让您保持登录状态或记住您购物车中的商品。 不过,网站无法使用 Cookie 查看您在各个不同网站上的浏览活动,因而无法实现某些功能或目的(例如为您展示个性化广告)。</translation> +<translation id="6476253015009698798">无法在此网页上跟踪价格。</translation> <translation id="6476800141292307438">将页面翻译成<ph name="LANGUAGE" />。选项位于屏幕底部附近。</translation> <translation id="648164694371393720">身份验证出错</translation> <translation id="6482629121755362506">删除了<ph name="NUMBER_OF_SELECTED_BOOKMARKS" />项</translation> @@ -812,6 +815,7 @@ <translation id="6780034285637185932">邮编</translation> <translation id="6781260999953472352">开启同步功能?</translation> <translation id="6785453220513215166">正在发送崩溃报告…</translation> +<translation id="6790502149545262384">不久之后,当打开新标签页时,您会看到来自<ph name="CHANNEL_NAME" />的故事。</translation> <translation id="6797885426782475225">语音搜索</translation> <translation id="6801927553864092214">若要私密地浏览网页,请打开一个无痕式标签页</translation> <translation id="6807889908376551050">全部显示...</translation> @@ -1121,6 +1125,7 @@ <translation id="9137526406337347448">Google 服务</translation> <translation id="9148126808321036104">重新登录</translation> <translation id="9157836665414082580">禁止显示对话框</translation> +<translation id="9162432979321511934">开启“自动填充密码”</translation> <translation id="9177438225260810839">在打开的标签页中搜索</translation> <translation id="9188680907066685419">退出受管理的帐号</translation> <translation id="9193147658040604536">拖到此处即可固定标签页</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 0bc366b..ab45a22 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -314,6 +314,7 @@ <translation id="3227137524299004712">麥克風</translation> <translation id="3240426699337459095">已複製連結</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">無法儲存您的變更。</translation> <translation id="3252394070589632019"><ph name="VALUE" />,<ph name="ADDITIONAL_INFO" /> (第 <ph name="INDEX" /> 項建議,共 <ph name="NUM_SUGGESTIONS" /> 項)</translation> <translation id="3268451620468152448">開啟的分頁</translation> <translation id="3272527697863656322">取消</translation> @@ -336,6 +337,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> 分鐘</translation> <translation id="3448016392200048164">分割檢視</translation> <translation id="345565170154308620">管理密碼…</translation> +<translation id="3464194322481586217">無法追蹤價格。</translation> <translation id="3469166899695866866">要停止下載嗎?</translation> <translation id="3470502288861289375">複製中…</translation> <translation id="3474048842645761983">{COUNT,plural, =1{來自 {COUNT} 個網站或應用程式}other{來自 {COUNT} 個網站或應用程式}}</translation> @@ -761,6 +763,7 @@ <translation id="6464397691496239022">網站可使用 Cookie 來改善瀏覽體驗,例如讓您保持登入狀態或記住購物車中的商品。 網站不可使用 Cookie 來查看您在各網站的瀏覽活動,例如放送個人化廣告。</translation> +<translation id="6476253015009698798">無法追蹤此頁面上的價格。</translation> <translation id="6476800141292307438">將網頁翻譯成<ph name="LANGUAGE" />。翻譯選項喺喺接近畫面底部附近。</translation> <translation id="648164694371393720">驗證錯誤</translation> <translation id="6482629121755362506">已刪除 <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> 個項目</translation> @@ -810,6 +813,7 @@ <translation id="6780034285637185932">郵遞區號</translation> <translation id="6781260999953472352">要開啟同步處理功能嗎?</translation> <translation id="6785453220513215166">正在傳送當機報告…</translation> +<translation id="6790502149545262384">不久後,您將會在開啟新分頁時看到 <ph name="CHANNEL_NAME" /> 的內容。</translation> <translation id="6797885426782475225">語音搜尋</translation> <translation id="6801927553864092214">如要私密瀏覽,請開啟無痕式分頁</translation> <translation id="6807889908376551050">全部顯示…</translation> @@ -1119,6 +1123,7 @@ <translation id="9137526406337347448">Google 服務</translation> <translation id="9148126808321036104">重新登入</translation> <translation id="9157836665414082580">隱藏對話框</translation> +<translation id="9162432979321511934">開啟「自動填入密碼」功能</translation> <translation id="9177438225260810839">在開啟的分頁中搜尋</translation> <translation id="9188680907066685419">登出受管理的帳戶</translation> <translation id="9193147658040604536">拖曳至此處以固定分頁</translation>
diff --git a/ios/chrome/browser/discover_feed/discover_feed_refresher.h b/ios/chrome/browser/discover_feed/discover_feed_refresher.h index 1817c4b5e..99b403d 100644 --- a/ios/chrome/browser/discover_feed/discover_feed_refresher.h +++ b/ios/chrome/browser/discover_feed/discover_feed_refresher.h
@@ -8,13 +8,9 @@ // An interface to refresh the Discover Feed. class DiscoverFeedRefresher { public: - // Refreshes the Discover Feed. - // DEPRECATED: use `RefreshFeed(bool feed_visible)`. - virtual void RefreshFeed() = 0; - // Refreshes the Discover Feed, indicating whether the feed is visible at the // time of the request. - virtual void RefreshFeed(bool feed_visible) {} + virtual void RefreshFeed(bool feed_visible) = 0; // Refreshes the Discover Feed if needed. The implementer decides if a refresh // is needed or not. This should only be called when the feed is visible to
diff --git a/ios/chrome/browser/find_in_page/BUILD.gn b/ios/chrome/browser/find_in_page/BUILD.gn index 79e6fb2..e148989 100644 --- a/ios/chrome/browser/find_in_page/BUILD.gn +++ b/ios/chrome/browser/find_in_page/BUILD.gn
@@ -58,3 +58,29 @@ ] public_deps = [ "//base:base" ] } + +source_set("eg_app_support+eg2") { + configs += [ + "//build/config/compiler:enable_arc", + "//build/config/ios:xctest_config", + ] + testonly = true + sources = [ + "find_in_page_app_interface.h", + "find_in_page_app_interface.mm", + ] + deps = [ ":find_in_page" ] +} + +source_set("eg_test_support+eg2") { + configs += [ + "//build/config/compiler:enable_arc", + "//build/config/ios:xctest_config", + ] + testonly = true + sources = [ + "find_in_page_app_interface.h", + "find_in_page_app_interface_stub.mm", + ] + deps = [ "//ios/third_party/earl_grey2:test_lib" ] +}
diff --git a/ios/chrome/browser/find_in_page/find_in_page_app_interface.h b/ios/chrome/browser/find_in_page/find_in_page_app_interface.h new file mode 100644 index 0000000..24226490 --- /dev/null +++ b/ios/chrome/browser/find_in_page/find_in_page_app_interface.h
@@ -0,0 +1,19 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_FIND_IN_PAGE_FIND_IN_PAGE_APP_INTERFACE_H_ +#define IOS_CHROME_BROWSER_FIND_IN_PAGE_FIND_IN_PAGE_APP_INTERFACE_H_ + +#import <Foundation/Foundation.h> + +// Contains the app-side implementation of helpers for Native Find in Page. For +// JavaScript Find in Page, see JavaScriptFindInPageControllerAppInterface. +@interface FindInPageAppInterface : NSObject + +// Clears the search term in FindInPageController. ++ (void)clearSearchTerm; + +@end + +#endif // IOS_CHROME_BROWSER_FIND_IN_PAGE_FIND_IN_PAGE_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/find_in_page/find_in_page_app_interface.mm b/ios/chrome/browser/find_in_page/find_in_page_app_interface.mm new file mode 100644 index 0000000..3a8af19 --- /dev/null +++ b/ios/chrome/browser/find_in_page/find_in_page_app_interface.mm
@@ -0,0 +1,19 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/find_in_page/find_in_page_app_interface.h" + +#import "ios/chrome/browser/find_in_page/find_in_page_controller.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation FindInPageAppInterface + ++ (void)clearSearchTerm { + [FindInPageController clearSearchTerm]; +} + +@end
diff --git a/ios/chrome/browser/find_in_page/find_in_page_app_interface_stub.mm b/ios/chrome/browser/find_in_page/find_in_page_app_interface_stub.mm new file mode 100644 index 0000000..47094a1 --- /dev/null +++ b/ios/chrome/browser/find_in_page/find_in_page_app_interface_stub.mm
@@ -0,0 +1,13 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/find_in_page/find_in_page_app_interface.h" + +#import <TestLib/EarlGreyImpl/EarlGrey.h> + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +GREY_STUB_CLASS_IN_APP_MAIN_QUEUE(FindInPageAppInterface)
diff --git a/ios/chrome/browser/find_in_page/find_in_page_controller.h b/ios/chrome/browser/find_in_page/find_in_page_controller.h index 51f7a5a..462b552 100644 --- a/ios/chrome/browser/find_in_page/find_in_page_controller.h +++ b/ios/chrome/browser/find_in_page/find_in_page_controller.h
@@ -18,6 +18,9 @@ // associated web state is realized, and deinstantiated when it is not. @interface FindInPageController : NSObject +// Clear search term. ++ (void)clearSearchTerm; + #pragma mark - Properties // Find In Page model reported to the delegate when the Find session is updated.
diff --git a/ios/chrome/browser/find_in_page/find_in_page_controller.mm b/ios/chrome/browser/find_in_page/find_in_page_controller.mm index c55bed6..e7e48ac 100644 --- a/ios/chrome/browser/find_in_page/find_in_page_controller.mm +++ b/ios/chrome/browser/find_in_page/find_in_page_controller.mm
@@ -43,6 +43,10 @@ _findInPageDelegateBridge; } ++ (void)clearSearchTerm { + gSearchTerm = nil; +} + - (instancetype)initWithWebState:(web::WebState*)webState { self = [super init]; if (self) {
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 7ce67514..ec69301 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -1358,6 +1358,10 @@ {"password-notes", flag_descriptions::kPasswordNotesWithBackupName, flag_descriptions::kPasswordNotesWithBackupDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(syncer::kPasswordNotesWithBackup)}, + {"feed-experiment-tagging-ios", + flag_descriptions::kFeedExperimentTaggingName, + flag_descriptions::kFeedExperimentTaggingDescription, flags_ui::kOsIos, + FEATURE_VALUE_TYPE(kEnableFeedExperimentTagging)}, }; bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) { @@ -1404,8 +1408,6 @@ base::SysUTF8ToNSString(policy::key::kNTPContentSuggestionsEnabled) : @NO, - base::SysUTF8ToNSString(policy::key::kPasswordManagerEnabled) : @NO, - base::SysUTF8ToNSString(policy::key::kTranslateEnabled) : @NO, // 2 = Enhanced safe browsing protection @@ -1508,6 +1510,13 @@ [allowed_experimental_policies addObject:allow_backups_key]; } + if ([defaults boolForKey:@"DisablePasswordManagerPolicy"]) { + NSString* password_manager_key = + base::SysUTF8ToNSString(policy::key::kPasswordManagerEnabled); + [testing_policies addEntriesFromDictionary:@{password_manager_key : @NO}]; + [allowed_experimental_policies addObject:password_manager_key]; + } + // If any experimental policy was allowed, set the EnableExperimentalPolicies // policy. if ([allowed_experimental_policies count] > 0) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index 7bbafdde..d889790e 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -387,6 +387,10 @@ "Schedules a feed background refresh after some minimum period of time has " "passed after the last refresh."; +const char kFeedExperimentTaggingName[] = "Enable Feed experiment tagging"; +const char kFeedExperimentTaggingDescription[] = + "Makes server experiments visible as client-side experiments."; + const char kFeedForegroundRefreshName[] = "Enable feed foreground refresh"; const char kFeedForegroundRefreshDescription[] = "Foreground refresh has two variations. The first is when the Feed is "
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 0f80701..0d6ab11 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -328,6 +328,10 @@ extern const char kFeedBackgroundRefreshName[]; extern const char kFeedBackgroundRefreshDescription[]; +// Title and description for the flag to enable feed experiment tagging. +extern const char kFeedExperimentTaggingName[]; +extern const char kFeedExperimentTaggingDescription[]; + // Title and description for the flag to enable feed foreground refresh. extern const char kFeedForegroundRefreshName[]; extern const char kFeedForegroundRefreshDescription[];
diff --git a/ios/chrome/browser/main/test_browser_list_observer.h b/ios/chrome/browser/main/test_browser_list_observer.h index 018a727..36f6b58 100644 --- a/ios/chrome/browser/main/test_browser_list_observer.h +++ b/ios/chrome/browser/main/test_browser_list_observer.h
@@ -24,11 +24,11 @@ // A weak pointer to the last Browser that was observed being added to the // BrowserList's regular browsers. Browser* GetLastAddedBrowser() { return last_added_browser_; } - // A weak pointer to the last Browser that was observed being added to the - // BrowserList's incognito browsers. - Browser* GetLastRemovedBrowser() { return last_removed_browser_; } // A weak pointer to the last Browser that was observed being removed from the // BrowserList's regular browsers. + Browser* GetLastRemovedBrowser() { return last_removed_browser_; } + // A weak pointer to the last Browser that was observed being added to the + // BrowserList's incognito browsers. Browser* GetLastAddedIncognitoBrowser() { return last_added_incognito_browser_; }
diff --git a/ios/chrome/browser/ntp/features.h b/ios/chrome/browser/ntp/features.h index 020cc9d..af04bc4d 100644 --- a/ios/chrome/browser/ntp/features.h +++ b/ios/chrome/browser/ntp/features.h
@@ -36,6 +36,9 @@ // Feature flag to disable the feed. BASE_DECLARE_FEATURE(kEnableFeedAblation); +// Feature flag to enable feed experiment tagging. +BASE_DECLARE_FEATURE(kEnableFeedExperimentTagging); + // Feature param under `kEnableFeedBackgroundRefresh` to also enable background // refresh for the Following feed. extern const char kEnableFollowingFeedBackgroundRefresh[]; @@ -141,4 +144,7 @@ // Whether the feed is disabled. bool IsFeedAblationEnabled(); +// Whether the feed experiment tagging is enabled. +bool IsFeedExperimentTaggingEnabled(); + #endif // IOS_CHROME_BROWSER_NTP_FEATURES_H_
diff --git a/ios/chrome/browser/ntp/features.mm b/ios/chrome/browser/ntp/features.mm index b92419f..ac0b1cb 100644 --- a/ios/chrome/browser/ntp/features.mm +++ b/ios/chrome/browser/ntp/features.mm
@@ -48,6 +48,10 @@ "EnableFeedAblation", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kEnableFeedExperimentTagging, + "EnableFeedExperimentTagging", + base::FEATURE_ENABLED_BY_DEFAULT); + // Key for NSUserDefaults containing a bool indicating whether the next run // should enable feed background refresh. This is used because registering for // background refreshes must happen early in app initialization and FeatureList @@ -211,3 +215,7 @@ bool IsFeedAblationEnabled() { return base::FeatureList::IsEnabled(kEnableFeedAblation); } + +bool IsFeedExperimentTaggingEnabled() { + return base::FeatureList::IsEnabled(kEnableFeedExperimentTagging); +}
diff --git a/ios/chrome/browser/providers/BUILD.gn b/ios/chrome/browser/providers/BUILD.gn index 86d12d0..a2bb268 100644 --- a/ios/chrome/browser/providers/BUILD.gn +++ b/ios/chrome/browser/providers/BUILD.gn
@@ -20,6 +20,7 @@ "//ios/chrome/browser/providers/modals:chromium_modals", "//ios/chrome/browser/providers/omaha:chromium_omaha", "//ios/chrome/browser/providers/overrides:chromium_overrides", + "//ios/chrome/browser/providers/partial_translate:chromium_partial_translate", "//ios/chrome/browser/providers/password_auto_fill:chromium_password_auto_fill", "//ios/chrome/browser/providers/primes:chromium_primes", "//ios/chrome/browser/providers/push_notification:chromium_push_notification",
diff --git a/ios/chrome/browser/providers/discover_feed/chromium_discover_feed.mm b/ios/chrome/browser/providers/discover_feed/chromium_discover_feed.mm index 56766cc..48df11e 100644 --- a/ios/chrome/browser/providers/discover_feed/chromium_discover_feed.mm +++ b/ios/chrome/browser/providers/discover_feed/chromium_discover_feed.mm
@@ -32,7 +32,7 @@ void RemoveFeedViewController(UIViewController* feed_view_controller) final {} void UpdateTheme() final {} void RefreshFeedIfNeeded() final {} - void RefreshFeed() final {} + void RefreshFeed(bool feed_visible) final {} void PerformBackgroundRefreshes(void (^completion)(BOOL)) final {} void HandleBackgroundRefreshTaskExpiration() final {}
diff --git a/ios/chrome/browser/providers/find_in_page/BUILD.gn b/ios/chrome/browser/providers/find_in_page/BUILD.gn index 8595d77..660ab815 100644 --- a/ios/chrome/browser/providers/find_in_page/BUILD.gn +++ b/ios/chrome/browser/providers/find_in_page/BUILD.gn
@@ -8,6 +8,7 @@ frameworks = [ "Foundation.framework" ] deps = [ "//base:base", + "//ios/chrome/browser/find_in_page:features", "//ios/public/provider/chrome/browser/find_in_page:find_in_page_api", ] }
diff --git a/ios/chrome/browser/providers/find_in_page/chromium_find_in_page.mm b/ios/chrome/browser/providers/find_in_page/chromium_find_in_page.mm index 819669f..05f9e3b9 100644 --- a/ios/chrome/browser/providers/find_in_page/chromium_find_in_page.mm +++ b/ios/chrome/browser/providers/find_in_page/chromium_find_in_page.mm
@@ -5,6 +5,7 @@ #import <Foundation/Foundation.h> #import "base/notreached.h" +#import "ios/chrome/browser/find_in_page/features.h" #import "ios/public/provider/chrome/browser/find_in_page/find_in_page_api.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -15,7 +16,8 @@ namespace provider { bool IsNativeFindInPageWithSystemFindPanel() { - return false; + // Chromium only supports this variant of Native Find in Page. + return IsNativeFindInPageEnabled(); } bool IsNativeFindInPageWithChromeFindBar() { @@ -23,6 +25,11 @@ } bool IsNativeFindInPageEnabled() { + // If for iOS <16.1.1, Native Find in Page is unavailable. + if (@available(iOS 16.1.1, *)) { + return base::FeatureList::IsEnabled(kNativeFindInPage); + } + return false; }
diff --git a/ios/chrome/browser/providers/partial_translate/BUILD.gn b/ios/chrome/browser/providers/partial_translate/BUILD.gn new file mode 100644 index 0000000..0f8bef7 --- /dev/null +++ b/ios/chrome/browser/providers/partial_translate/BUILD.gn
@@ -0,0 +1,12 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("chromium_partial_translate") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ "chromium_partial_translate.mm" ] + deps = [ + "//base", + "//ios/public/provider/chrome/browser/partial_translate:partial_translate_api", + ] +}
diff --git a/ios/chrome/browser/providers/partial_translate/chromium_partial_translate.mm b/ios/chrome/browser/providers/partial_translate/chromium_partial_translate.mm new file mode 100644 index 0000000..baf9ec1 --- /dev/null +++ b/ios/chrome/browser/providers/partial_translate/chromium_partial_translate.mm
@@ -0,0 +1,23 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import <UIKit/UIKit.h> + +#import "ios/public/provider/chrome/browser/partial_translate/partial_translate_api.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +id<PartialTranslateController> NewPartialTranslateController( + NSString* source_text, + const CGRect& anchor, + BOOL incognito) { + // Partial translate is not supported in Chromium. + return nil; +} + +NSUInteger PartialTranslateLimitMaxCharacters() { + return 0; +}
diff --git a/ios/chrome/browser/providers/signin/chromium_trusted_vault.mm b/ios/chrome/browser/providers/signin/chromium_trusted_vault.mm index 1eeb1ea..176ada8 100644 --- a/ios/chrome/browser/providers/signin/chromium_trusted_vault.mm +++ b/ios/chrome/browser/providers/signin/chromium_trusted_vault.mm
@@ -42,6 +42,8 @@ void CancelDialog(BOOL animated, ProceduralBlock callback) final; void ClearLocalData(id<SystemIdentity> identity, base::OnceCallback<void(bool)> callback) final; + void GetPublicKeyForIdentity(id<SystemIdentity> identity, + GetPublicKeyCallback callback) final; }; void ChromiumTrustedVaultClientBackend::AddObserver(Observer* observer) { @@ -99,6 +101,12 @@ NOTREACHED(); } +void ChromiumTrustedVaultClientBackend::GetPublicKeyForIdentity( + id<SystemIdentity> identity, + GetPublicKeyCallback callback) { + NOTREACHED(); +} + } // anonymous namespace std::unique_ptr<TrustedVaultClientBackend> CreateTrustedVaultClientBackend(
diff --git a/ios/chrome/browser/resources/Settings.bundle/Experimental.plist b/ios/chrome/browser/resources/Settings.bundle/Experimental.plist index 9ecb3ce..ede014ce 100644 --- a/ios/chrome/browser/resources/Settings.bundle/Experimental.plist +++ b/ios/chrome/browser/resources/Settings.bundle/Experimental.plist
@@ -360,6 +360,16 @@ </dict> <dict> <key>Type</key> + <string>PSToggleSwitchSpecifier</string> + <key>Title</key> + <string>Disable password manager</string> + <key>Key</key> + <string>DisablePasswordManagerPolicy</string> + <key>DefaultValue</key> + <false/> + </dict> + <dict> + <key>Type</key> <string>PSGroupSpecifier</string> <key>Title</key> <string>Google App Ecosystem</string>
diff --git a/ios/chrome/browser/signin/trusted_vault_client_backend.h b/ios/chrome/browser/signin/trusted_vault_client_backend.h index 32eedb3..34585347 100644 --- a/ios/chrome/browser/signin/trusted_vault_client_backend.h +++ b/ios/chrome/browser/signin/trusted_vault_client_backend.h
@@ -33,13 +33,11 @@ // Types for the different callbacks. using KeyFetchedCallback = base::OnceCallback<void(const SharedKeyList&)>; using CompletionBlock = void (^)(BOOL success, NSError* error); + using GetPublicKeyCallback = base::OnceCallback<void(const PublicKey&)>; // Callback used to verify local device registration and log the result to - // UMA metrics. The first argument is the gaia ID and the second is the local - // client's public key. - using VerifierCallback = - base::OnceCallback<void(const std::string&, const PublicKey&)>; - + // UMA metrics. The argument represents the gaia ID subject to verification. + using VerifierCallback = base::OnceCallback<void(const std::string&)>; TrustedVaultClientBackend(); TrustedVaultClientBackend(const TrustedVaultClientBackend&) = delete; @@ -107,6 +105,11 @@ // TODO(crbug.com/1416626): Make abstract once all implementations land. virtual void ClearLocalData(id<SystemIdentity> identity, base::OnceCallback<void(bool)> callback); + + // Returns the member public key used to enroll the local device. + // TODO(crbug.com/1416626): Make abstract once all implementations land. + virtual void GetPublicKeyForIdentity(id<SystemIdentity> identity, + GetPublicKeyCallback callback); }; #endif // IOS_CHROME_BROWSER_SIGNIN_TRUSTED_VAULT_CLIENT_BACKEND_H_
diff --git a/ios/chrome/browser/signin/trusted_vault_client_backend.mm b/ios/chrome/browser/signin/trusted_vault_client_backend.mm index 6b744cb..71d8e22 100644 --- a/ios/chrome/browser/signin/trusted_vault_client_backend.mm +++ b/ios/chrome/browser/signin/trusted_vault_client_backend.mm
@@ -25,3 +25,9 @@ base::OnceCallback<void(bool)> callback) { NOTREACHED(); } + +void TrustedVaultClientBackend::GetPublicKeyForIdentity( + id<SystemIdentity> identity, + GetPublicKeyCallback callback) { + NOTREACHED(); +}
diff --git a/ios/chrome/browser/snapshots/snapshot_tab_helper.h b/ios/chrome/browser/snapshots/snapshot_tab_helper.h index 25a16de..9b207a0 100644 --- a/ios/chrome/browser/snapshots/snapshot_tab_helper.h +++ b/ios/chrome/browser/snapshots/snapshot_tab_helper.h
@@ -37,11 +37,11 @@ // not owned by the tab helper. void SetSnapshotCache(SnapshotCache* snapshot_cache); - // Retrieves a color snapshot for the current page, invoking `callback` - // with the image. The callback may be called synchronously is there is - // a cached snapshot available in memory, otherwise it will be invoked - // asynchronously after retrieved from disk. Invokes `callback` with nil if a - // snapshot does not exist. + // Retrieves a color snapshot for the current page, invoking `callback` with + // the image. The callback may be called synchronously if there is a cached + // snapshot available in memory, otherwise it will be invoked asynchronously + // after retrieved from disk. Invokes `callback` with nil if a snapshot does + // not exist. void RetrieveColorSnapshot(void (^callback)(UIImage*)); // Retrieves a grey snapshot for the current page, invoking `callback`
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm index 04315db..2684010 100644 --- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm +++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
@@ -258,7 +258,7 @@ DCHECK_EQ(kNonProfileImageHeightWidth, image.size.height); DCHECK_EQ(kNonProfileImageHeightWidth, image.size.width); self.imageView.image = image; - self.imageView.backgroundColor = [UIColor colorNamed:kSolidPrimaryColor]; + self.imageView.backgroundColor = [UIColor colorNamed:kSolidWhiteColor]; self.imageView.layer.cornerRadius = kNonProfileIconCornerRadius; }
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 cf40bcd8..0f2c1c5 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm +++ b/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm
@@ -64,6 +64,7 @@ using chrome_test_util::SettingsLink; using chrome_test_util::StaticTextWithAccessibilityLabelId; using l10n_util::GetNSString; +using l10n_util::GetNSStringF; using testing::ButtonWithAccessibilityLabel; typedef NS_ENUM(NSInteger, OpenSigninMethod) { @@ -858,8 +859,35 @@ [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity]; // Select the identity disc particle. - [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(GetNSString( - IDS_ACCNAME_PARTICLE_DISC))] + [[EarlGrey + selectElementWithMatcher:grey_accessibilityLabel(GetNSStringF( + IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL, + base::SysNSStringToUTF16( + fakeIdentity.userFullName), + base::SysNSStringToUTF16( + fakeIdentity.userEmail)))] + performAction:grey_tap()]; + + // Ensure the Settings menu is displayed. + [[EarlGrey selectElementWithMatcher:SettingsCollectionView()] + assertWithMatcher:grey_sufficientlyVisible()]; +} + +// Tests the accessibility string for a signed-in user whose name is not +// available yet. +- (void)testAccessiblityStringForSignedInUserWithoutName { + NSString* email = @"test@test.com"; + NSString* gaiaID = @"gaiaID"; + // Sign in to Chrome. + FakeSystemIdentity* fakeIdentity = + [FakeSystemIdentity identityWithEmail:email gaiaID:gaiaID name:nil]; + [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity]; + + // Select the identity disc particle with the correct accessibility string. + [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(GetNSStringF( + IDS_IOS_IDENTITY_DISC_WITH_EMAIL, + base::SysNSStringToUTF16( + fakeIdentity.userEmail)))] performAction:grey_tap()]; // Ensure the Settings menu is displayed. @@ -874,7 +902,7 @@ // Select the identity disc particle. [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(GetNSString( - IDS_ACCNAME_PARTICLE_DISC))] + IDS_IOS_IDENTITY_DISC_SIGNED_OUT))] performAction:grey_tap()]; // Ensure the Settings menu is displayed. @@ -895,7 +923,7 @@ // Select the identity disc particle. [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(GetNSString( - IDS_ACCNAME_PARTICLE_DISC))] + IDS_IOS_IDENTITY_DISC_SIGNED_OUT))] performAction:grey_tap()]; // Ensure the Settings menu is displayed. @@ -907,7 +935,7 @@ - (void)testOpenSignInFromNTP { // Select the identity disc particle. [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(GetNSString( - IDS_ACCNAME_PARTICLE_DISC))] + IDS_IOS_IDENTITY_DISC_SIGNED_OUT))] performAction:grey_tap()]; // Ensure the sign-in menu is displayed. The existence of the skip
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm index 497e5428..f5227e4 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm
@@ -588,6 +588,7 @@ (NSArray<ChromeTableViewController*>*)replacementViewControllers { TableViewNavigationController* navController = [[TableViewNavigationController alloc] initWithTable:viewController]; + [navController setModalPresentationStyle:UIModalPresentationFormSheet]; self.bookmarkNavigationController = navController; if (replacementViewControllers) { [navController setViewControllers:replacementViewControllers]; @@ -596,8 +597,6 @@ navController.toolbarHidden = YES; navController.presentationController.delegate = self; - [navController setModalPresentationStyle:UIModalPresentationFormSheet]; - [self.baseViewController presentViewController:navController animated:YES completion:nil]; @@ -666,6 +665,8 @@ - (void)presentationControllerDidDismiss: (UIPresentationController*)presentationController { + base::RecordAction( + base::UserMetricsAction("IOSBookmarkManagerCloseWithSwipe")); self.currentPresentedState = PresentedState::NONE; [self bookmarkBrowserDismissed]; }
diff --git a/ios/chrome/browser/ui/bookmarks/folder_chooser/BUILD.gn b/ios/chrome/browser/ui/bookmarks/folder_chooser/BUILD.gn index 76f29cf0..cfbf5a7 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_chooser/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/folder_chooser/BUILD.gn
@@ -16,7 +16,7 @@ visibility = [ ":coordinator_impl", ":folder_chooser", - "//ios/chrome/browser/ui/bookmarks/folder_editor:ui", + "//ios/chrome/browser/ui/bookmarks/folder_editor:coordinator_impl", ] sources = [ "bookmarks_folder_chooser_coordinator.h",
diff --git a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm index 60e112b..12eb38e 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm
@@ -109,22 +109,11 @@ - (void)stop { [super stop]; + // Stop child coordinator before stopping `self`. + [self stopBookmarksFolderEditorCoordinator]; DCHECK(_viewController); if (_baseNavigationController) { - // Currently when folder editor is shown from folder chooser and the user - // presses done button on the folder editor both the folder editor and - // folder chooser is supposed to be popped at the same time. However the - // folder chooser view controller also calls - // delayedNotifyDelegateOfSelection in this case, so both the view - // controllers need to be popped here at the end of that delayed - // selection. - // TODO(crbug.com/1405746): Revisit this logic after folder editor - // coordinator is finished. - if (_baseNavigationController.topViewController != _viewController) { - [_baseNavigationController popToViewController:_viewController - animated:YES]; - } DCHECK_EQ(_baseNavigationController.topViewController, _viewController); [_baseNavigationController popViewControllerAnimated:YES]; } else if (_navigationController) { @@ -139,10 +128,6 @@ DCHECK(!self.baseViewController.presentedViewController); } _viewController = nil; - - [_folderEditorCoordinator stop]; - _folderEditorCoordinator.delegate = nil; - _folderEditorCoordinator = nil; } - (void)setSelectedFolder:(const bookmarks::BookmarkNode*)folder { @@ -201,9 +186,7 @@ (const bookmarks::BookmarkNode*)folder { DCHECK(folder); DCHECK(_folderEditorCoordinator); - [_folderEditorCoordinator stop]; - _folderEditorCoordinator.delegate = nil; - _folderEditorCoordinator = nil; + [self stopBookmarksFolderEditorCoordinator]; [_viewController notifyFolderNodeAdded:folder]; } @@ -211,9 +194,7 @@ - (void)bookmarksFolderEditorCoordinatorShouldStop: (BookmarksFolderEditorCoordinator*)coordinator { DCHECK(_folderEditorCoordinator); - [_folderEditorCoordinator stop]; - _folderEditorCoordinator.delegate = nil; - _folderEditorCoordinator = nil; + [self stopBookmarksFolderEditorCoordinator]; } - (void)bookmarksFolderEditorWillCommitTitleChange: @@ -241,4 +222,12 @@ return _editedNodes; } +#pragma mark - Private + +- (void)stopBookmarksFolderEditorCoordinator { + [_folderEditorCoordinator stop]; + _folderEditorCoordinator.delegate = nil; + _folderEditorCoordinator = nil; +} + @end
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/BUILD.gn b/ios/chrome/browser/ui/bookmarks/folder_editor/BUILD.gn index 4c44683..ae8c2e11 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/BUILD.gn
@@ -40,6 +40,7 @@ "//ios/chrome/browser/bookmarks", "//ios/chrome/browser/main:public", "//ios/chrome/browser/ui/bookmarks:core", + "//ios/chrome/browser/ui/bookmarks/folder_chooser:coordinator_headers", "//ios/chrome/browser/ui/commands", ] } @@ -53,8 +54,6 @@ "bookmarks_folder_editor_view_controller.h", "bookmarks_folder_editor_view_controller.mm", ] - - # TODO(crbug.com/1409488): Move folder_chooser_coordinator_headers target to :coordinator_impl target. deps = [ "//base", "//base:i18n", @@ -67,9 +66,7 @@ "//ios/chrome/browser/ui/bookmarks:constants", "//ios/chrome/browser/ui/bookmarks:core", "//ios/chrome/browser/ui/bookmarks/cells", - "//ios/chrome/browser/ui/bookmarks/folder_chooser:coordinator_headers", "//ios/chrome/browser/ui/commands", - "//ios/chrome/browser/ui/coordinators:chrome_coordinators", "//ios/chrome/browser/ui/icons", "//ios/chrome/browser/ui/image_util", "//ios/chrome/browser/ui/keyboard",
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm index 17af6de..a1e8ee7 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm
@@ -11,7 +11,8 @@ #import "ios/chrome/browser/bookmarks/bookmark_model_factory.h" #import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.h" -#import "ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator_delegate.h" +#import "ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.h" +#import "ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator_delegate.h" #import "ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.h" #import "ios/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/chrome/browser/ui/commands/snackbar_commands.h" @@ -22,6 +23,7 @@ @interface BookmarksFolderEditorCoordinator () < BookmarksFolderEditorViewControllerDelegate, + BookmarksFolderChooserCoordinatorDelegate, UIAdaptivePresentationControllerDelegate> { // The navigation controller is `nullptr` if the folder chooser view // controller is pushed into the base navigation controller. @@ -29,6 +31,8 @@ // controller. UINavigationController* _navigationController; BookmarksFolderEditorViewController* _viewController; + // Coordinator to show the folder chooser UI. + BookmarksFolderChooserCoordinator* _folderChooserCoordinator; // `_parentFolderNode` is only used when a new folder is added. The new // folder should be added in `_parentFolderNode`. If `_parentFolderNode` is // `nullptr`, then the new folder needs to be added in the default folder. @@ -111,6 +115,8 @@ - (void)stop { [super stop]; + // Stop child coordinator before stopping `self`. + [self stopBookmarksFolderChooserCoordinator]; DCHECK(_viewController); if (_baseNavigationController) { @@ -140,6 +146,24 @@ #pragma mark - BookmarksFolderEditorViewControllerDelegate +- (void)showBookmarksFolderChooserWithParentFolder: + (const bookmarks::BookmarkNode*)parent + hiddenNodes: + (const std::set< + const bookmarks::BookmarkNode*>&) + hiddenNodes { + DCHECK(!_folderChooserCoordinator); + _folderChooserCoordinator = [[BookmarksFolderChooserCoordinator alloc] + initWithBaseNavigationController:(_baseNavigationController + ? _baseNavigationController + : _navigationController) + browser:self.browser + hiddenNodes:hiddenNodes]; + _folderChooserCoordinator.selectedFolder = parent; + _folderChooserCoordinator.delegate = self; + [_folderChooserCoordinator start]; +} + - (void)bookmarksFolderEditor:(BookmarksFolderEditorViewController*)folderEditor didFinishEditingFolder:(const bookmarks::BookmarkNode*)folder { [_delegate bookmarksFolderEditorCoordinator:self @@ -165,6 +189,25 @@ [_delegate bookmarksFolderEditorWillCommitTitleChange:self]; } +#pragma mark - BookmarksFolderChooserCoordinatorDelegate + +- (void)bookmarksFolderChooserCoordinatorDidConfirm: + (BookmarksFolderChooserCoordinator*)coordinator + withSelectedFolder: + (const bookmarks::BookmarkNode*)folder { + DCHECK(_folderChooserCoordinator); + DCHECK(folder); + [self stopBookmarksFolderChooserCoordinator]; + + [_viewController updateParentFolder:folder]; +} + +- (void)bookmarksFolderChooserCoordinatorDidCancel: + (BookmarksFolderChooserCoordinator*)coordinator { + DCHECK(_folderChooserCoordinator); + [self stopBookmarksFolderChooserCoordinator]; +} + #pragma mark - UIAdaptivePresentationControllerDelegate - (void)presentationControllerDidAttemptToDismiss: @@ -191,4 +234,12 @@ return [self canDismiss]; } +#pragma mark - Private + +- (void)stopBookmarksFolderChooserCoordinator { + [_folderChooserCoordinator stop]; + _folderChooserCoordinator.delegate = nil; + _folderChooserCoordinator = nil; +} + @end
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.h b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.h index b8730f8f..61d6d45c 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.h +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.h
@@ -5,6 +5,7 @@ #define IOS_CHROME_BROWSER_UI_BOOKMARKS_FOLDER_EDITOR_BOOKMARKS_FOLDER_EDITOR_VIEW_CONTROLLER_H_ #import <UIKit/UIKit.h> +#import <set> #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h" @@ -19,6 +20,14 @@ @protocol BookmarksFolderEditorViewControllerDelegate +// Used to show the folder chooser UI when the user decides to update the +// parent folder. +- (void)showBookmarksFolderChooserWithParentFolder: + (const bookmarks::BookmarkNode*)parent + hiddenNodes: + (const std::set< + const bookmarks::BookmarkNode*>&) + hiddenNodes; // Called when the controller successfully created or edited `folder`. - (void)bookmarksFolderEditor:(BookmarksFolderEditorViewController*)folderEditor didFinishEditingFolder:(const bookmarks::BookmarkNode*)folder; @@ -73,6 +82,9 @@ - (void)presentationControllerDidAttemptToDismiss; // Whether the bookmarks folder editor can be dismissed. - (BOOL)canDismiss; +// TODO(crbug.com/1402758): Remove this method after model code is moved to the +// mediator. +- (void)updateParentFolder:(const bookmarks::BookmarkNode*)parent; @end
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm index d192942..f4408dc 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm
@@ -24,8 +24,6 @@ #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" #import "ios/chrome/browser/ui/bookmarks/cells/bookmark_parent_folder_item.h" #import "ios/chrome/browser/ui/bookmarks/cells/bookmark_text_field_item.h" -#import "ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.h" -#import "ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator_delegate.h" #import "ios/chrome/browser/ui/commands/snackbar_commands.h" #import "ios/chrome/browser/ui/icons/chrome_icon.h" #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h" @@ -56,7 +54,6 @@ } // namespace @interface BookmarksFolderEditorViewController () < - BookmarksFolderChooserCoordinatorDelegate, BookmarkModelBridgeObserver, BookmarkTextFieldItemDelegate> { std::unique_ptr<BookmarkModelBridge> _modelBridge; @@ -72,10 +69,6 @@ // Whether the folder name was edited. @property(nonatomic, assign) BOOL edited; @property(nonatomic, assign) const BookmarkNode* folder; -// TODO(crbug.com/1402758): Move this to BookmarksFolderEditorCoordinator. -// A reference to the presented folder chooser. -@property(nonatomic, strong) - BookmarksFolderChooserCoordinator* folderChooserCoordinator; @property(nonatomic, assign) const BookmarkNode* parentFolder; @property(nonatomic, weak) UIBarButtonItem* doneItem; @property(nonatomic, strong) BookmarkTextFieldItem* titleItem; @@ -164,7 +157,6 @@ - (void)dealloc { _titleItem.delegate = nil; - DCHECK(!_folderChooserCoordinator); } #pragma mark - Public @@ -209,13 +201,13 @@ // Whether the bookmarks folder editor can be dismissed. - (BOOL)canDismiss { - if (self.edited) { - return NO; - } - if (self.folderChooserCoordinator) { - return [self.folderChooserCoordinator canDismiss]; - } - return YES; + return !self.edited; +} + +- (void)updateParentFolder:(const bookmarks::BookmarkNode*)parent { + DCHECK(parent); + self.parentFolder = parent; + [self updateParentFolderState]; } #pragma mark - UIViewController @@ -330,38 +322,8 @@ if (self.folder) { hiddenNodes.insert(self.folder); } - _folderChooserCoordinator = [[BookmarksFolderChooserCoordinator alloc] - initWithBaseNavigationController:self.navigationController - browser:_browser - hiddenNodes:hiddenNodes]; - _folderChooserCoordinator.selectedFolder = self.parentFolder; - _folderChooserCoordinator.delegate = self; - [_folderChooserCoordinator start]; -} - -#pragma mark - BookmarksFolderChooserCoordinatorDelegate - -- (void)bookmarksFolderChooserCoordinatorDidConfirm: - (BookmarksFolderChooserCoordinator*)coordinator - withSelectedFolder: - (const bookmarks::BookmarkNode*)folder { - DCHECK(_folderChooserCoordinator); - DCHECK(folder); - - [_folderChooserCoordinator stop]; - _folderChooserCoordinator.delegate = nil; - _folderChooserCoordinator = nil; - - self.parentFolder = folder; - [self updateParentFolderState]; -} - -- (void)bookmarksFolderChooserCoordinatorDidCancel: - (BookmarksFolderChooserCoordinator*)coordinator { - DCHECK(_folderChooserCoordinator); - [_folderChooserCoordinator stop]; - _folderChooserCoordinator.delegate = nil; - _folderChooserCoordinator = nil; + [self.delegate showBookmarksFolderChooserWithParentFolder:self.folder + hiddenNodes:hiddenNodes]; } #pragma mark - BookmarkModelBridgeObserver
diff --git a/ios/chrome/browser/ui/commands/browser_coordinator_commands.h b/ios/chrome/browser/ui/commands/browser_coordinator_commands.h index cb06277..12e960c 100644 --- a/ios/chrome/browser/ui/commands/browser_coordinator_commands.h +++ b/ios/chrome/browser/ui/commands/browser_coordinator_commands.h
@@ -6,6 +6,7 @@ #define IOS_CHROME_BROWSER_UI_COMMANDS_BROWSER_COORDINATOR_COMMANDS_H_ #import <Foundation/Foundation.h> +#import <UIKit/UIKit.h> @protocol BadgeItem; class GURL;
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm index df15271..fba8f23 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
@@ -70,6 +70,7 @@ @property(nonatomic, strong) ContentSuggestionsHeaderView* headerView; @property(nonatomic, strong) UIButton* fakeOmnibox; @property(nonatomic, strong) UIButton* accessibilityButton; +@property(nonatomic, strong) NSString* identityDiscAccessibilityLabel; @property(nonatomic, strong, readwrite) UIButton* identityDiscButton; @property(nonatomic, strong) UIImage* identityDiscImage; @property(nonatomic, strong) UIButton* fakeTapButton; @@ -290,6 +291,17 @@ } } +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + // Check if the identity disc button was properly set before the view appears. + DCHECK(self.identityDiscButton); + if (base::FeatureList::IsEnabled(switches::kIdentityStatusConsistency)) { + DCHECK(self.identityDiscImage); + DCHECK(self.identityDiscButton.accessibilityLabel); + DCHECK([self.identityDiscButton imageForState:UIControlStateNormal]); + } +} + #pragma mark - Private // Initialize and add a search field tap target and a voice search button. @@ -372,8 +384,6 @@ // Set up a button. Details for the button will be set through delegate // implementation of UserAccountImageUpdateDelegate. self.identityDiscButton = [UIButton buttonWithType:UIButtonTypeCustom]; - self.identityDiscButton.accessibilityLabel = - l10n_util::GetNSString(IDS_ACCNAME_PARTICLE_DISC); [self.identityDiscButton addTarget:self.commandHandler action:@selector(identityDiscWasTapped) forControlEvents:UIControlEventTouchUpInside]; @@ -394,18 +404,33 @@ return [UIPointerStyle styleWithEffect:proposedEffect shape:shape]; }; - [self updateIdentityDiscState]; - // TODO(crbug.com/965958): Set action on button to launch into Settings. + if (base::FeatureList::IsEnabled(switches::kIdentityStatusConsistency)) { + // `self.identityDiscButton` should not be updated if + // `self.identityDiscImage` is not available yet. + if (self.identityDiscImage) { + [self updateIdentityDiscState]; + } + } else { + // `self.identityDiscButton` should not be updated if + // `self.identityDiscAccessibilityLabel` is not available yet. + if (self.identityDiscAccessibilityLabel) { + [self updateIdentityDiscState]; + } + } [self.headerView setIdentityDiscView:self.identityDiscButton]; } // Configures `identityDiscButton` with the current state of // `identityDiscImage`. - (void)updateIdentityDiscState { - // TODO(crbug.com/1385758): Update this logic after - // kIdentityStatusConsistency is rolled out as image can't be - // null when the user is signed-in. - self.identityDiscButton.hidden = !self.identityDiscImage; + if (base::FeatureList::IsEnabled(switches::kIdentityStatusConsistency)) { + DCHECK(self.identityDiscImage); + } else { + self.identityDiscButton.hidden = !self.identityDiscImage; + } + DCHECK(self.identityDiscAccessibilityLabel); + self.identityDiscButton.accessibilityLabel = + self.identityDiscAccessibilityLabel; [self.identityDiscButton setImage:self.identityDiscImage forState:UIControlStateNormal]; self.identityDiscButton.imageView.layer.cornerRadius = @@ -658,23 +683,45 @@ #pragma mark - UserAccountImageUpdateDelegate -- (void)updateAccountImage:(UIImage*)image { - // If `image` is null, then that means the user is not signed in. - if (!image && - base::FeatureList::IsEnabled(switches::kIdentityStatusConsistency)) { +- (void)setSignedOutAccountImage { + if (base::FeatureList::IsEnabled(switches::kIdentityStatusConsistency)) { if (UseSymbols()) { - image = DefaultSymbolTemplateWithPointSize( + self.identityDiscImage = DefaultSymbolTemplateWithPointSize( kPersonCropCircleSymbol, ntp_home::kSignedOutIdentityIconDimension); } else { - image = [UIImage imageNamed:kSignOutIdentityIconName]; + self.identityDiscImage = [UIImage imageNamed:kSignOutIdentityIconName]; } + self.identityDiscAccessibilityLabel = + l10n_util::GetNSString(IDS_IOS_IDENTITY_DISC_SIGNED_OUT); } else { - DCHECK(image == nil || - (image.size.width == ntp_home::kIdentityAvatarDimension && - image.size.height == ntp_home::kIdentityAvatarDimension)) - << base::SysNSStringToUTF8([image description]); + self.identityDiscImage = nil; } + // `self.identityDiscButton` should not be updated if the view has not been + // created yet. + if (self.identityDiscButton) { + [self updateIdentityDiscState]; + } +} + +- (void)updateAccountImage:(UIImage*)image + name:(NSString*)name + email:(NSString*)email { + DCHECK(image && image.size.width == ntp_home::kIdentityAvatarDimension && + image.size.height == ntp_home::kIdentityAvatarDimension) + << base::SysNSStringToUTF8([image description]); + DCHECK(email); + self.identityDiscImage = image; + if (name) { + self.identityDiscAccessibilityLabel = l10n_util::GetNSStringF( + IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL, + base::SysNSStringToUTF16(name), base::SysNSStringToUTF16(email)); + } else { + self.identityDiscAccessibilityLabel = l10n_util::GetNSStringF( + IDS_IOS_IDENTITY_DISC_WITH_EMAIL, base::SysNSStringToUTF16(email)); + } + // `self.identityDiscButton` should not be updated if the view has not been + // created yet. if (self.identityDiscButton) { [self updateIdentityDiscState]; }
diff --git a/ios/chrome/browser/ui/content_suggestions/user_account_image_update_delegate.h b/ios/chrome/browser/ui/content_suggestions/user_account_image_update_delegate.h index c939e33..aefe4b1 100644 --- a/ios/chrome/browser/ui/content_suggestions/user_account_image_update_delegate.h +++ b/ios/chrome/browser/ui/content_suggestions/user_account_image_update_delegate.h
@@ -8,8 +8,13 @@ // Delegate protocol to update UI with current user account avatar. @protocol UserAccountImageUpdateDelegate -// Updates current user account avatar with supplied image. -- (void)updateAccountImage:(UIImage*)image; +// Sets up an avatar for signed-out state. +- (void)setSignedOutAccountImage; +// Updates current signed-in user account avatar with supplied image. +// `image` and `email` must not be nil. +- (void)updateAccountImage:(UIImage*)image + name:(NSString*)name + email:(NSString*)email; @end
diff --git a/ios/chrome/browser/ui/find_bar/BUILD.gn b/ios/chrome/browser/ui/find_bar/BUILD.gn index c102c2e..13bc03d 100644 --- a/ios/chrome/browser/ui/find_bar/BUILD.gn +++ b/ios/chrome/browser/ui/find_bar/BUILD.gn
@@ -64,19 +64,21 @@ "//build/config/ios:xctest_config", ] testonly = true - sources = [ "find_in_page_egtest.mm" ] + sources = [ "java_script_find_in_page_egtest.mm" ] deps = [ ":constants", ":eg_test_support+eg2", "//base", "//base/test:test_support", "//components/strings", + "//ios/chrome/browser/find_in_page:features", "//ios/chrome/browser/ui/popup_menu:constants", "//ios/chrome/browser/ui/toolbar/accessory:constants", "//ios/chrome/test/earl_grey:eg_test_support+eg2", "//ios/testing/earl_grey:eg_test_support+eg2", "//ios/third_party/earl_grey2:test_lib", "//ios/web/public/test/http_server", + "//net:test_support", "//ui/base", ] frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/find_bar/find_bar_constants.h b/ios/chrome/browser/ui/find_bar/find_bar_constants.h index 8176f52..558610b 100644 --- a/ios/chrome/browser/ui/find_bar/find_bar_constants.h +++ b/ios/chrome/browser/ui/find_bar/find_bar_constants.h
@@ -19,4 +19,7 @@ // The a11y ID of the "close" button in the find-in-page bar. extern NSString* const kFindInPageCloseButtonId; +// The a11y ID of the results count label in the find-in-page bar. +extern NSString* const kFindInPageResultsCountLabelId; + #endif // IOS_CHROME_BROWSER_UI_FIND_BAR_FIND_BAR_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/find_bar/find_bar_constants.mm b/ios/chrome/browser/ui/find_bar/find_bar_constants.mm index 67c5a9b..23b8cb8d 100644 --- a/ios/chrome/browser/ui/find_bar/find_bar_constants.mm +++ b/ios/chrome/browser/ui/find_bar/find_bar_constants.mm
@@ -12,3 +12,5 @@ NSString* const kFindInPageNextButtonId = @"kFindInPageNextButtonId"; NSString* const kFindInPagePreviousButtonId = @"kFindInPagePreviousButtonId"; NSString* const kFindInPageCloseButtonId = @"kFindInPageCloseButtonId"; +NSString* const kFindInPageResultsCountLabelId = + @"kFindInPageResultsCountLabelId";
diff --git a/ios/chrome/browser/ui/find_bar/find_bar_view.mm b/ios/chrome/browser/ui/find_bar/find_bar_view.mm index 6bd5a6d..d99e8d7 100644 --- a/ios/chrome/browser/ui/find_bar/find_bar_view.mm +++ b/ios/chrome/browser/ui/find_bar/find_bar_view.mm
@@ -238,6 +238,7 @@ _resultsCountLabel.font = [UIFont systemFontOfSize:kFontSize]; } _resultsCountLabel.accessibilityElementsHidden = YES; + _resultsCountLabel.accessibilityIdentifier = kFindInPageResultsCountLabelId; } return _resultsCountLabel;
diff --git a/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm b/ios/chrome/browser/ui/find_bar/java_script_find_in_page_egtest.mm similarity index 82% rename from ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm rename to ios/chrome/browser/ui/find_bar/java_script_find_in_page_egtest.mm index fd6d71f..9c06774a 100644 --- a/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm +++ b/ios/chrome/browser/ui/find_bar/java_script_find_in_page_egtest.mm
@@ -8,6 +8,7 @@ #import "base/strings/string_number_conversions.h" #import "base/test/ios/wait_util.h" #import "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/find_in_page/features.h" #import "ios/chrome/browser/ui/find_bar/find_bar_constants.h" #import "ios/chrome/browser/ui/find_bar/java_script_find_in_page_controller_app_interface.h" #import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h" @@ -15,11 +16,10 @@ #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" +#import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/chrome/test/earl_grey/chrome_xcui_actions.h" -#import "ios/chrome/test/earl_grey/web_http_server_chrome_test_case.h" #import "ios/testing/earl_grey/earl_grey_test.h" -#import "ios/web/public/test/http_server/http_server.h" -#import "ios/web/public/test/http_server/http_server_util.h" +#import "net/test/embedded_test_server/embedded_test_server.h" #import "ui/base/l10n/l10n_util_mac.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -31,13 +31,27 @@ // Test web page content. const std::string kFindInPageResponse = "Find in page. Find in page."; +// Test web page URL. +const std::string kFindInPageTestURL = "/findinpage.html"; + +// Response handler that serves a test page for Find in Page. +std::unique_ptr<net::test_server::HttpResponse> FindInPageTestPageHttpResponse( + const net::test_server::HttpRequest& request) { + if (request.relative_url != kFindInPageTestURL) { + return nullptr; + } + std::unique_ptr<net::test_server::BasicHttpResponse> http_response = + std::make_unique<net::test_server::BasicHttpResponse>(); + http_response->set_code(net::HTTP_OK); + http_response->set_content(kFindInPageResponse); + http_response->set_content_type("text/html"); + return std::move(http_response); +} + } // namespace -// Tests for Find in Page. -@interface FindInPageTestCase : WebHttpServerChromeTestCase - -// URL for a test page with `kFindInPageResponse`. -@property(nonatomic, assign) GURL testURL; +// Tests for JavaScript Find in Page. +@interface JavaScriptFindInPageTestCase : ChromeTestCase // Opens Find in Page. - (void)openFindInPage; @@ -54,16 +68,21 @@ - (void)advanceToNextResult; // Taps Previous button in Find in page. - (void)advanceToPreviousResult; -// Navigates to `self.testURL` and waits for the page to load. +// Navigates to `kFindInPageTestURL` and waits for the page to load. - (void)navigateToTestPage; @end -@implementation FindInPageTestCase -@synthesize testURL = _testURL; +@implementation JavaScriptFindInPageTestCase #pragma mark - XCTest. +- (AppLaunchConfiguration)appConfigurationForTestCase { + AppLaunchConfiguration config = [super appConfigurationForTestCase]; + config.features_disabled.push_back(kNativeFindInPage); + return config; +} + // After setup, a page with `kFindInPageResponse` is displayed and Find In Page // bar is opened. - (void)setUp { @@ -72,17 +91,15 @@ // Clear saved search term. [JavaScriptFindInPageControllerAppInterface clearSearchTerm]; - // Setup find in page test URL. - std::map<GURL, std::string> responses; - self.testURL = web::test::HttpServer::MakeUrl("http://findinpage"); - responses[self.testURL] = kFindInPageResponse; - web::test::SetUpSimpleHttpServer(responses); + // Setup find in page test server. + self.testServer->RegisterRequestHandler( + base::BindRepeating(&FindInPageTestPageHttpResponse)); + GREYAssertTrue(self.testServer->Start(), @"Server did not start."); [self navigateToTestPage]; // Open Find in Page view. [self openFindInPage]; - } - (void)tearDown { @@ -233,7 +250,7 @@ - (void)navigateToTestPage { // Navigate to a page with some text. - [ChromeEarlGrey loadURL:self.testURL]; + [ChromeEarlGrey loadURL:self.testServer->GetURL(kFindInPageTestURL)]; // Verify web page finished loading. [ChromeEarlGrey waitForWebStateContainingText:kFindInPageResponse];
diff --git a/ios/chrome/browser/ui/icons/colorful_background_symbol_view.mm b/ios/chrome/browser/ui/icons/colorful_background_symbol_view.mm index 6bf0f2d..bf89ac8 100644 --- a/ios/chrome/browser/ui/icons/colorful_background_symbol_view.mm +++ b/ios/chrome/browser/ui/icons/colorful_background_symbol_view.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/icons/colorful_background_symbol_view.h" #import "ios/chrome/browser/ui/icons/symbols.h" +#import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/table_view/table_view_cells_constants.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" @@ -27,7 +28,7 @@ _symbolView = [[UIImageView alloc] init]; _symbolView.translatesAutoresizingMaskIntoConstraints = NO; _symbolView.contentMode = UIViewContentModeCenter; - _symbolView.tintColor = UIColor.whiteColor; + _symbolView.tintColor = [UIColor colorNamed:kSolidWhiteColor]; [self addSubview:_symbolView]; self.layer.cornerRadius = kColorfulBackgroundSymbolCornerRadius;
diff --git a/ios/chrome/browser/ui/icons/symbol_names.h b/ios/chrome/browser/ui/icons/symbol_names.h index 96566ec..efec282 100644 --- a/ios/chrome/browser/ui/icons/symbol_names.h +++ b/ios/chrome/browser/ui/icons/symbol_names.h
@@ -15,12 +15,14 @@ /// ******* // Custom symbol names. +#if BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) +extern NSString* const kGoogleIconSymbol; +extern NSString* const kGoogleShieldSymbol; +extern NSString* const kChromeSymbol; +#endif // BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) extern NSString* const kPrivacySymbol; extern NSString* const kSyncDisabledSymbol; extern NSString* const kSafetyCheckSymbol; -#if BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) -extern NSString* const kGoogleIconSymbol; -#endif // BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) extern NSString* const kArrowClockWiseSymbol; extern NSString* const kIncognitoSymbol; extern NSString* const kSquareNumberSymbol; @@ -43,9 +45,6 @@ #endif // BUILDFLAG(IS_IOS_MACCATALYST) extern NSString* const kCameraLensSymbol; extern NSString* const kDownTrendSymbol; -#if BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) -extern NSString* const kGoogleShieldSymbol; -#endif // BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) extern NSString* const kShieldSymbol; extern NSString* const kCloudSlashSymbol; extern NSString* const kCloudAndArrowUpSymbol; @@ -97,6 +96,7 @@ extern NSString* const kMicrophoneSymbol; extern NSString* const kMagnifyingglassSymbol; extern NSString* const kEllipsisCircleFillSymbol; +extern NSString* const kPinSymbol; extern NSString* const kPinSlashSymbol; extern NSString* const kSettingsSymbol; extern NSString* const kSettingsFilledSymbol;
diff --git a/ios/chrome/browser/ui/icons/symbol_names.mm b/ios/chrome/browser/ui/icons/symbol_names.mm index bed26e9..b44875a 100644 --- a/ios/chrome/browser/ui/icons/symbol_names.mm +++ b/ios/chrome/browser/ui/icons/symbol_names.mm
@@ -9,12 +9,14 @@ #endif // Custom symbol names. +#if BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) +NSString* const kGoogleIconSymbol = @"google_icon"; +NSString* const kGoogleShieldSymbol = @"google_shield"; +NSString* const kChromeSymbol = @"chrome_symbol"; +#endif // BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) NSString* const kPrivacySymbol = @"checkerboard_shield"; NSString* const kSyncDisabledSymbol = @"arrow_triangle_slash_circlepath"; NSString* const kSafetyCheckSymbol = @"checkermark_shield"; -#if BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) -NSString* const kGoogleIconSymbol = @"google_icon"; -#endif // BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) NSString* const kArrowClockWiseSymbol = @"arrow_clockwise"; NSString* const kIncognitoSymbol = @"incognito"; NSString* const kSquareNumberSymbol = @"square_number"; @@ -40,9 +42,6 @@ NSString* const kDownTrendSymbol = @"line_downtrend"; NSString* const kIncognitoCircleFilliOS14Symbol = @"incognito_circle_fill_ios14"; -#if BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) -NSString* const kGoogleShieldSymbol = @"google_shield"; -#endif // BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) NSString* const kShieldSymbol = @"shield"; NSString* const kCloudSlashSymbol = @"cloud_slash"; NSString* const kCloudAndArrowUpSymbol = @"cloud_and_arrow_up"; @@ -89,6 +88,7 @@ NSString* const kMicrophoneSymbol = @"mic"; NSString* const kMagnifyingglassSymbol = @"magnifyingglass"; NSString* const kEllipsisCircleFillSymbol = @"ellipsis.circle.fill"; +NSString* const kPinSymbol = @"pin"; NSString* const kPinSlashSymbol = @"pin.slash"; NSString* const kSettingsSymbol = @"gearshape"; NSString* const kSettingsFilledSymbol = @"gearshape.fill";
diff --git a/ios/chrome/browser/ui/menu/action_factory.mm b/ios/chrome/browser/ui/menu/action_factory.mm index 64c5484..d8c72103 100644 --- a/ios/chrome/browser/ui/menu/action_factory.mm +++ b/ios/chrome/browser/ui/menu/action_factory.mm
@@ -78,7 +78,7 @@ - (UIAction*)actionToPinTabWithBlock:(ProceduralBlock)block { UIImage* image = UseSymbols() ? CustomSymbolWithPointSize( - kLocationSymbol, kSymbolActionPointSize) + kPinSymbol, kSymbolActionPointSize) : [UIImage imageNamed:@"pin"]; return [self actionWithTitle:l10n_util::GetNSString(IDS_IOS_CONTENT_CONTEXT_PINTAB)
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm index f1866b0..973a5cd 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -453,7 +453,7 @@ if (self.browser->GetBrowserState()->IsOffTheRecord()) { return; } - self.discoverFeedService->RefreshFeed(); + self.discoverFeedService->RefreshFeed(/*feed_visible=*/true); [self reloadContentSuggestions]; }
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_mediator.mm b/ios/chrome/browser/ui/ntp/new_tab_page_mediator.mm index dcab2b5..89426d4 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_mediator.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_mediator.mm
@@ -346,16 +346,19 @@ // Fetches and update user's avatar on NTP, or use default avatar if user is // not signed in. - (void)updateAccountImage { - UIImage* image = nil; // Fetches user's identity from Authentication Service. id<SystemIdentity> identity = self.authService->GetPrimaryIdentity(signin::ConsentLevel::kSignin); if (identity) { // Only show an avatar if the user is signed in. - image = self.accountManagerService->GetIdentityAvatarWithIdentity( + UIImage* image = self.accountManagerService->GetIdentityAvatarWithIdentity( identity, IdentityAvatarSize::SmallSize); + [self.imageUpdater updateAccountImage:image + name:identity.userFullName + email:identity.userEmail]; + } else { + [self.imageUpdater setSignedOutAccountImage]; } - [self.imageUpdater updateAccountImage:image]; } @end
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_icon.h b/ios/chrome/browser/ui/omnibox/popup/omnibox_icon.h index d80f9bf1..a63575e 100644 --- a/ios/chrome/browser/ui/omnibox/popup/omnibox_icon.h +++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_icon.h
@@ -28,8 +28,6 @@ @property(nonatomic, strong, readonly) UIColor* iconImageTintColor; @property(nonatomic, strong, readonly) UIImage* backgroundImage; @property(nonatomic, strong, readonly) UIColor* backgroundImageTintColor; -@property(nonatomic, strong, readonly) UIImage* overlayImage; -@property(nonatomic, strong, readonly) UIColor* overlayImageTintColor; @end
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_icon_view.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_icon_view.mm index 9f571da..909c853 100644 --- a/ios/chrome/browser/ui/omnibox/popup/omnibox_icon_view.mm +++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_icon_view.mm
@@ -19,7 +19,6 @@ @property(nonatomic, strong) UIImageView* backgroundImageView; @property(nonatomic, strong) UIImageView* mainImageView; -@property(nonatomic, strong) UIImageView* overlayImageView; @property(nonatomic, strong) id<OmniboxIcon> omniboxIcon; @@ -36,9 +35,6 @@ _mainImageView = [[UIImageView alloc] initWithImage:nil]; _mainImageView.translatesAutoresizingMaskIntoConstraints = NO; - _overlayImageView = [[UIImageView alloc] initWithImage:nil]; - _overlayImageView.translatesAutoresizingMaskIntoConstraints = NO; - UIImageView* mask = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background_solid"]]; self.maskView = mask; @@ -49,7 +45,6 @@ - (void)prepareForReuse { self.backgroundImageView.image = nil; self.mainImageView.image = nil; - [self.overlayImageView removeFromSuperview]; self.mainImageView.contentMode = UIViewContentModeCenter; } @@ -84,19 +79,6 @@ ]]; } -- (void)addOverlayImageView { - [self addSubview:self.overlayImageView]; - [NSLayoutConstraint activateConstraints:@[ - [self.overlayImageView.leadingAnchor - constraintEqualToAnchor:self.leadingAnchor], - [self.overlayImageView.trailingAnchor - constraintEqualToAnchor:self.trailingAnchor], - [self.overlayImageView.topAnchor constraintEqualToAnchor:self.topAnchor], - [self.overlayImageView.bottomAnchor - constraintEqualToAnchor:self.bottomAnchor], - ]]; -} - - (void)setOmniboxIcon:(id<OmniboxIcon>)omniboxIcon { _omniboxIcon = omniboxIcon; @@ -119,11 +101,6 @@ imageURL) { return; } - [weakSelf addOverlayImageView]; - weakSelf.overlayImageView.image = - omniboxIcon.overlayImage; - weakSelf.overlayImageView.tintColor = - omniboxIcon.overlayImageTintColor; weakSelf.mainImageView.image = image; }]; break; @@ -164,7 +141,6 @@ _highlighted = highlighted; self.backgroundImageView.highlighted = highlighted; self.mainImageView.highlighted = highlighted; - self.overlayImageView.highlighted = highlighted; self.mainImageView.tintColor = highlighted ? UIColor.whiteColor : self.omniboxIcon.iconImageTintColor;
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_pedal_annotator.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_pedal_annotator.mm index 67524e96..2eabe0f 100644 --- a/ios/chrome/browser/ui/omnibox/popup/omnibox_pedal_annotator.mm +++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_pedal_annotator.mm
@@ -258,7 +258,7 @@ #if BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) symbolView.backgroundColor = UIColor.whiteColor; [symbolView setSymbol:MakeSymbolMulticolor(CustomSymbolWithPointSize( - kGoogleIconSymbol, 22))]; + kChromeSymbol, 22))]; symbolView.borderColor = [UIColor colorNamed:kGrey200Color]; #else [symbolView setSymbolName:kDefaultBrowserSymbol systemSymbol:YES];
diff --git a/ios/chrome/browser/ui/omnibox/popup/shared/omnibox_pedal.swift b/ios/chrome/browser/ui/omnibox/popup/shared/omnibox_pedal.swift index c4ecef4..0f26225 100644 --- a/ios/chrome/browser/ui/omnibox/popup/shared/omnibox_pedal.swift +++ b/ios/chrome/browser/ui/omnibox/popup/shared/omnibox_pedal.swift
@@ -48,7 +48,5 @@ public var iconImageTintColor: UIColor? { return nil } public var backgroundImage: UIImage? { return nil } public var backgroundImageTintColor: UIColor? { return nil } - public var overlayImage: UIImage? { return nil } - public var overlayImageTintColor: UIColor? { return nil } }
diff --git a/ios/chrome/browser/ui/omnibox/popup/simple_omnibox_icon.mm b/ios/chrome/browser/ui/omnibox/popup/simple_omnibox_icon.mm index cf5b65b..012f55b 100644 --- a/ios/chrome/browser/ui/omnibox/popup/simple_omnibox_icon.mm +++ b/ios/chrome/browser/ui/omnibox/popup/simple_omnibox_icon.mm
@@ -142,17 +142,4 @@ } } -- (UIImage*)overlayImage { - switch (self.iconType) { - case OmniboxIconTypeImage: - case OmniboxIconTypeSuggestionIcon: - case OmniboxIconTypeFavicon: - return nil; - } -} - -- (UIColor*)overlayImageTintColor { - return nil; -} - @end
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm index aeef45e..7411fe19 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm
@@ -727,7 +727,7 @@ }); self.pinTabAction = CreateOverflowMenuAction( - IDS_IOS_TOOLS_MENU_PIN_TAB, kLocationSymbol, + IDS_IOS_TOOLS_MENU_PIN_TAB, kPinSymbol, /*systemSymbol=*/NO, /*monochromeSymbol=*/NO, kToolsMenuPinTabId, ^{ [weakSelf pinTab]; });
diff --git a/ios/chrome/browser/ui/settings/autofill/BUILD.gn b/ios/chrome/browser/ui/settings/autofill/BUILD.gn index aca1173..4a57198 100644 --- a/ios/chrome/browser/ui/settings/autofill/BUILD.gn +++ b/ios/chrome/browser/ui/settings/autofill/BUILD.gn
@@ -104,6 +104,7 @@ "//components/autofill/core/browser", "//components/autofill/core/browser:test_support", "//components/strings", + "//ios/chrome/app/strings", "//ios/chrome/browser/application_context", "//ios/chrome/browser/autofill", "//ios/chrome/browser/browser_state",
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_country_selection_table_view_controller.mm b/ios/chrome/browser/ui/settings/autofill/autofill_country_selection_table_view_controller.mm index e2810d8..f2d392ea 100644 --- a/ios/chrome/browser/ui/settings/autofill/autofill_country_selection_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/autofill/autofill_country_selection_table_view_controller.mm
@@ -79,8 +79,7 @@ - (void)viewDidLoad { [super viewDidLoad]; - // TODO(crbug.com/1167099): Replace with proper i18n string. - self.title = @"Test Edit Address"; + self.title = l10n_util::GetNSString(IDS_IOS_AUTOFILL_EDIT_ADDRESS); self.shouldHideDoneButton = YES; // Search controller.
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_profile_edit_table_view_controller.mm b/ios/chrome/browser/ui/settings/autofill/autofill_profile_edit_table_view_controller.mm index 5b437e8..d081d7a 100644 --- a/ios/chrome/browser/ui/settings/autofill/autofill_profile_edit_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/autofill/autofill_profile_edit_table_view_controller.mm
@@ -16,6 +16,7 @@ #import "ios/chrome/browser/ui/settings/autofill/autofill_constants.h" #import "ios/chrome/browser/ui/settings/autofill/autofill_profile_edit_table_view_controller_delegate.h" #import "ios/chrome/browser/ui/settings/autofill/cells/country_item.h" +#import "ios/chrome/browser/ui/table_view/cells/table_view_attributed_string_header_footer_item.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_multi_detail_text_item.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_text_edit_item_delegate.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h" @@ -37,7 +38,7 @@ typedef NS_ENUM(NSInteger, SectionIdentifier) { SectionIdentifierFields = kSectionIdentifierEnumZero, - SectionIdentifierError, + SectionIdentifierErrorFooter, SectionIdentifierFooter }; @@ -52,6 +53,9 @@ ItemTypeFooter }; +// A constant to separate the error and the footer text. +const CGFloat kLineSpacingBetweenErrorAndFooter = 12.0f; + } // namespace @interface AutofillProfileEditTableViewController () < @@ -140,9 +144,6 @@ NSIndexPath* path = [NSIndexPath indexPathForItem:itemIndex inSection:section]; NSInteger itemType = [self.tableViewModel itemTypeForIndexPath:path]; - if (itemType == ItemTypeFooter || itemType == ItemTypeError) { - continue; - } if (itemType == ItemTypeCountry) { _autofillProfile->SetInfoWithVerificationStatus( autofill::AutofillType( @@ -218,7 +219,6 @@ autofill::AutofillProfile::Source::kAccount && _userEmail != nil) { [model addSectionWithIdentifier:SectionIdentifierFooter]; - // TODO(crbug.com/1407666): Fix the extra spacing between the footers. [model setFooter:[self footerItem] forSectionWithIdentifier:SectionIdentifierFooter]; } @@ -272,7 +272,7 @@ [self.tableViewModel sectionIdentifierForSectionIndex:section]; if (sectionIdentifier == SectionIdentifierFooter || - sectionIdentifier == SectionIdentifierError) { + sectionIdentifier == SectionIdentifierErrorFooter) { return 0; } return [super tableView:tableView heightForHeaderInSection:section]; @@ -355,17 +355,31 @@ // Returns true if the itemType belongs to a required field. - (BOOL)isItemTypeRequiredField:(ItemType)itemType { - return (itemType == ItemTypeLine1 && self.line1Required) || - (itemType == ItemTypeCity && self.cityRequired) || - (itemType == ItemTypeState && self.stateRequired) || - (itemType == ItemTypeZip && self.zipRequired); + switch (itemType) { + case ItemTypeLine1: + return self.line1Required; + case ItemTypeCity: + return self.cityRequired; + case ItemTypeState: + return self.stateRequired; + case ItemTypeZip: + return self.zipRequired; + case ItemTypeField: + case ItemTypeCountry: + case ItemTypeError: + case ItemTypeFooter: + break; + } + return NO; } // Computes whether the `tableViewItem` is a required field and empty. - (void)computeErrorIfRequiredTextField:(TableViewTextEditItem*)tableViewItem { ItemType itemType = static_cast<ItemType>(tableViewItem.type); - if (![self isItemTypeRequiredField:itemType]) { - // Early return if the text field is not a required field. + if (![self isItemTypeRequiredField:itemType] || + [self requiredFieldWasEmptyOnProfileLoadForItemType:itemType]) { + // Early return if the text field is not a required field or contained an + // empty value when the profile was loaded. tableViewItem.hasValidText = YES; return; } @@ -391,46 +405,184 @@ } } +// Returns YES if the profile contained an empty value for the required +// `itemType`. +- (BOOL)requiredFieldWasEmptyOnProfileLoadForItemType:(ItemType)itemType { + DCHECK([self isItemTypeRequiredField:itemType]); + + return _autofillProfile + ->GetInfo([self serverFieldTypeCorrespondingToRequiredItemType:itemType], + GetApplicationContext() -> GetApplicationLocale()) + .empty(); +} + +// Returns `autofill::ServerFieldType` corresponding to the `itemType`. +- (autofill::ServerFieldType)serverFieldTypeCorrespondingToRequiredItemType: + (ItemType)itemType { + switch (itemType) { + case ItemTypeLine1: + return autofill::ADDRESS_HOME_LINE1; + case ItemTypeCity: + return autofill::ADDRESS_HOME_CITY; + case ItemTypeState: + return autofill::ADDRESS_HOME_STATE; + case ItemTypeZip: + return autofill::ADDRESS_HOME_ZIP; + case ItemTypeField: + case ItemTypeCountry: + case ItemTypeError: + case ItemTypeFooter: + break; + } + NOTREACHED(); + return autofill::UNKNOWN_TYPE; +} + // Returns the label corresponding to the item type for a required field. - (NSString*)labelCorrespondingToRequiredItemType:(ItemType)itemType { - DCHECK([self isItemTypeRequiredField:itemType]); - if (itemType == ItemTypeLine1) { - return l10n_util::GetNSString(IDS_IOS_AUTOFILL_ADDRESS1); + switch (itemType) { + case ItemTypeLine1: + return l10n_util::GetNSString(IDS_IOS_AUTOFILL_ADDRESS1); + case ItemTypeCity: + return l10n_util::GetNSString(IDS_IOS_AUTOFILL_CITY); + case ItemTypeState: + return l10n_util::GetNSString(IDS_IOS_AUTOFILL_STATE); + case ItemTypeZip: + return l10n_util::GetNSString(IDS_IOS_AUTOFILL_ZIP); + case ItemTypeField: + case ItemTypeCountry: + case ItemTypeError: + case ItemTypeFooter: + break; } - if (itemType == ItemTypeCity) { - return l10n_util::GetNSString(IDS_IOS_AUTOFILL_CITY); + NOTREACHED(); + return @""; +} + +// Removes the given section if it exists. +- (void)removeSectionWithIdentifier:(NSInteger)sectionIdentifier + withRowAnimation:(UITableViewRowAnimation)animation { + TableViewModel* model = self.tableViewModel; + if ([model hasSectionForSectionIdentifier:sectionIdentifier]) { + NSInteger section = [model sectionForSectionIdentifier:sectionIdentifier]; + [model removeSectionWithIdentifier:sectionIdentifier]; + [[self tableView] deleteSections:[NSIndexSet indexSetWithIndex:section] + withRowAnimation:animation]; } - if (itemType == ItemTypeState) { - return l10n_util::GetNSString(IDS_IOS_AUTOFILL_STATE); +} + +// If the error status has changed, displays the footer accordingly. +- (void)changeFooterStatusToRemoveSection:(SectionIdentifier)removeSection + addSection:(SectionIdentifier)addSection { + TableViewModel* model = self.tableViewModel; + [self + performBatchTableViewUpdates:^{ + [self removeSectionWithIdentifier:removeSection + withRowAnimation:UITableViewRowAnimationTop]; + NSUInteger fieldsSectionIndex = + [model sectionForSectionIdentifier:SectionIdentifierFields]; + [model insertSectionWithIdentifier:addSection + atIndex:fieldsSectionIndex + 1]; + [self.tableView + insertSections:[NSIndexSet + indexSetWithIndex:fieldsSectionIndex + 1] + withRowAnimation:UITableViewRowAnimationTop]; + [self.tableViewModel setFooter:(([self.requiredFieldsWithEmptyValue + count] > 0) + ? [self errorMessageItem] + : [self footerItem]) + forSectionWithIdentifier:addSection]; + } + completion:nil]; +} + +// Updates the Done button status based on `self.requiredFieldsWithEmptyValue` +// and shows/removes the error footer if required. +- (void)updateDoneButtonStatus { + BOOL shouldShowError = ([self.requiredFieldsWithEmptyValue count] > 0); + self.navigationItem.rightBarButtonItem.enabled = !shouldShowError; + if (shouldShowError != self.errorSectionPresented) { + SectionIdentifier addSection = shouldShowError + ? SectionIdentifierErrorFooter + : SectionIdentifierFooter; + SectionIdentifier removeSection = shouldShowError + ? SectionIdentifierFooter + : SectionIdentifierErrorFooter; + [self changeFooterStatusToRemoveSection:removeSection + addSection:addSection]; + self.errorSectionPresented = shouldShowError; + } else if (shouldShowError && [self shouldChangeErrorMessage]) { + [self changeFooterStatusToRemoveSection:SectionIdentifierErrorFooter + addSection:SectionIdentifierErrorFooter]; } - return l10n_util::GetNSString(IDS_IOS_AUTOFILL_ZIP); +} + +// Returns YES, if the error message needs to be changed. This happens when +// there are multiple required fields that become empty. +- (BOOL)shouldChangeErrorMessage { + TableViewHeaderFooterItem* currentFooter = [self.tableViewModel + footerForSectionWithIdentifier:SectionIdentifierErrorFooter]; + TableViewAttributedStringHeaderFooterItem* attributedFooterItem = + base::mac::ObjCCastStrict<TableViewAttributedStringHeaderFooterItem>( + currentFooter); + NSAttributedString* newFooter = [self errorAndFooterMessage]; + return ![attributedFooterItem.attributedString + isEqualToAttributedString:newFooter]; } // Returns the error message item as a footer. -- (TableViewLinkHeaderFooterItem*)errorMessageItem { - TableViewLinkHeaderFooterItem* item = - [[TableViewLinkHeaderFooterItem alloc] initWithType:ItemTypeFooter]; - // TODO(crbug.com/1407666): Add string compatible with i18n. - if ([self.requiredFieldsWithEmptyValue count] > 1) { - item.text = - @"Test Some required fields are empty. Fill them before saving."; - } else { - item.text = @"Test A required field is empty. Fill it before saving."; - } - item.textColor = [UIColor colorNamed:kRedColor]; +- (TableViewAttributedStringHeaderFooterItem*)errorMessageItem { + TableViewAttributedStringHeaderFooterItem* item = + [[TableViewAttributedStringHeaderFooterItem alloc] + initWithType:ItemTypeError]; + [item setAttributedString:[self errorAndFooterMessage]]; return item; } +// Returns the footer message. +- (NSString*)footerMessage { + return l10n_util::GetNSStringF( + IDS_IOS_SETTINGS_AUTOFILL_ACCOUNT_ADDRESS_FOOTER_TEXT, + base::SysNSStringToUTF16(_userEmail)); +} + +// Returns the error message combined with footer. +- (NSAttributedString*)errorAndFooterMessage { + DCHECK([self.requiredFieldsWithEmptyValue count] > 0); + NSString* error = l10n_util::GetPluralNSStringF( + IDS_IOS_SETTINGS_EDIT_AUTOFILL_ADDRESS_REQUIREMENT_ERROR, + (int)[self.requiredFieldsWithEmptyValue count]); + + NSString* finalErrorString = error; + if (_userEmail != nil) { + finalErrorString = + [NSString stringWithFormat:@"%@\n%@", error, [self footerMessage]]; + } + + NSMutableParagraphStyle* paragraphStyle = + [[NSMutableParagraphStyle alloc] init]; + paragraphStyle.paragraphSpacing = kLineSpacingBetweenErrorAndFooter; + + NSMutableAttributedString* attributedText = [[NSMutableAttributedString alloc] + initWithString:finalErrorString + attributes:@{ + NSFontAttributeName : + [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote], + NSForegroundColorAttributeName : + [UIColor colorNamed:kTextSecondaryColor], + NSParagraphStyleAttributeName : paragraphStyle + }]; + [attributedText addAttribute:NSForegroundColorAttributeName + value:[UIColor colorNamed:kRedColor] + range:NSMakeRange(0, error.length)]; + return attributedText; +} + // Creates and returns the `TableViewLinkHeaderFooterItem` footer item. - (TableViewLinkHeaderFooterItem*)footerItem { TableViewLinkHeaderFooterItem* item = [[TableViewLinkHeaderFooterItem alloc] initWithType:ItemTypeFooter]; - // TODO(crbug.com/1407666): Add footer string compatible with i18n. - item.text = [NSString - stringWithFormat: - @"Test The address is saved in your Google Account(%@). " - @"You can use the address across Google products on any device", - _userEmail]; + item.text = [self footerMessage]; return item; } @@ -476,71 +628,4 @@ return item; } -// Removes the given section if it exists. -- (void)removeSectionWithIdentifier:(NSInteger)sectionIdentifier - withRowAnimation:(UITableViewRowAnimation)animation { - TableViewModel* model = self.tableViewModel; - if ([model hasSectionForSectionIdentifier:sectionIdentifier]) { - NSInteger section = [model sectionForSectionIdentifier:sectionIdentifier]; - [model removeSectionWithIdentifier:sectionIdentifier]; - [[self tableView] deleteSections:[NSIndexSet indexSetWithIndex:section] - withRowAnimation:animation]; - } -} - -// Displays the error section if it is not shown. Returns YES, if it was not -// presented. -- (BOOL)showErrorSection { - if (self.errorSectionPresented) { - return NO; - } - - TableViewModel* model = self.tableViewModel; - [self - performBatchTableViewUpdates:^{ - NSUInteger fieldsSectionIndex = - [model sectionForSectionIdentifier:SectionIdentifierFields]; - [model insertSectionWithIdentifier:SectionIdentifierError - atIndex:fieldsSectionIndex + 1]; - [self.tableView - insertSections:[NSIndexSet - indexSetWithIndex:fieldsSectionIndex + 1] - withRowAnimation:UITableViewRowAnimationTop]; - [model setFooter:[self errorMessageItem] - forSectionWithIdentifier:SectionIdentifierError]; - } - completion:nil]; - - self.errorSectionPresented = YES; - return YES; -} - -// Removes the error section if it is shown and there are no required empty -// fields. -- (BOOL)removeErrorSection { - if (!self.errorSectionPresented || - [self.requiredFieldsWithEmptyValue count] > 0) { - return NO; - } - [self - performBatchTableViewUpdates:^{ - [self removeSectionWithIdentifier:SectionIdentifierError - withRowAnimation:UITableViewRowAnimationTop]; - } - completion:nil]; - self.errorSectionPresented = NO; - return YES; -} - -// Updates the Done button status based on `self.requiredFieldsWithEmptyValue`. -- (void)updateDoneButtonStatus { - if ([self.requiredFieldsWithEmptyValue count] > 0) { - self.navigationItem.rightBarButtonItem.enabled = NO; - [self showErrorSection]; - } else { - self.navigationItem.rightBarButtonItem.enabled = YES; - [self removeErrorSection]; - } -} - @end
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_profile_edit_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/autofill/autofill_profile_edit_table_view_controller_unittest.mm index ebb78f60..7d709c3 100644 --- a/ios/chrome/browser/ui/settings/autofill/autofill_profile_edit_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/autofill/autofill_profile_edit_table_view_controller_unittest.mm
@@ -22,10 +22,12 @@ #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.h" #import "ios/chrome/browser/ui/table_view/table_view_model.h" #import "ios/chrome/browser/webdata_services/web_data_service_factory.h" +#import "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" #import "ios/web/public/test/web_task_environment.h" #import "testing/gtest_mac.h" #import "testing/platform_test.h" +#import "ui/base/l10n/l10n_util_mac.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -68,7 +70,6 @@ @interface AutofillProfileEditTableViewControllerTestDelegate : NSObject <AutofillProfileEditTableViewControllerDelegate> -@property(nonatomic, assign) BOOL isAnyRequiredFieldEmpty; @end @implementation AutofillProfileEditTableViewControllerTestDelegate @@ -217,11 +218,8 @@ TableViewModel* model = [autofill_profile_edit_controller_ tableViewModel]; - NSString* expected_footer_text = [NSString - stringWithFormat: - @"Test The address is saved in your Google Account(%@). You can " - @"use the address across Google products on any device", - base::SysUTF16ToNSString(kTestEmail)]; + NSString* expected_footer_text = l10n_util::GetNSStringF( + IDS_IOS_SETTINGS_AUTOFILL_ACCOUNT_ADDRESS_FOOTER_TEXT, kTestEmail); TableViewLinkHeaderFooterItem* footer = [model footerForSectionIndex:1]; EXPECT_NSEQ(expected_footer_text, footer.text); }
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_profile_settings_egtest.mm b/ios/chrome/browser/ui/settings/autofill/autofill_profile_settings_egtest.mm index e630e1db..9acbac6 100644 --- a/ios/chrome/browser/ui/settings/autofill/autofill_profile_settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/autofill/autofill_profile_settings_egtest.mm
@@ -139,7 +139,8 @@ [self isRunningTest:@selector(testCountrySelection)] || [self isRunningTest:@selector(testRequiredFields)] || [self isRunningTest:@selector(testAutoScrollInCountrySelector)] || - [self isRunningTest:@selector(testDoneButtonByRequirementsOfCountries)]) { + [self isRunningTest:@selector(testDoneButtonByRequirementsOfCountries)] || + [self isRunningTest:@selector(testFooterWithMultipleErrors)]) { config.features_enabled.push_back( autofill::features::kAutofillAccountProfilesUnionView); } @@ -183,9 +184,21 @@ // Returns the delete button on the deletion confirmation action sheet. - (id<GREYMatcher>)confirmDeleteAddressButton { - return grey_allOf(grey_accessibilityLabel(@"Test Delete Address"), - grey_accessibilityTrait(UIAccessibilityTraitButton), - grey_userInteractionEnabled(), nil); + return grey_allOf( + grey_accessibilityLabel(l10n_util::GetNSString( + IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON)), + grey_accessibilityTrait(UIAccessibilityTraitButton), + grey_userInteractionEnabled(), nil); +} + +// Returns the footer based on the count of errors due to the empty required +// fields. +- (id<GREYMatcher>)footerWithCountOfEmptyRequiredFields:(int)countOfrrors { + return grey_allOf( + grey_accessibilityLabel(l10n_util::GetPluralNSStringF( + IDS_IOS_SETTINGS_EDIT_AUTOFILL_ADDRESS_REQUIREMENT_ERROR, + countOfrrors)), + grey_sufficientlyVisible(), nil); } // Test that the page for viewing Autofill profile details is as expected. @@ -627,4 +640,31 @@ assertWithMatcher:grey_not(grey_enabled())]; } +// Tests that the footer text is correctly displayed when there are multiple +// required empty fields. +- (void)testFooterWithMultipleErrors { + [AutofillAppInterface saveExampleAccountProfile]; + [self openEditProfile:kProfileLabel]; + + // Change text of city to empty. + [[EarlGrey + selectElementWithMatcher:chrome_test_util::TextFieldForCellWithLabelId( + IDS_IOS_AUTOFILL_CITY)] + performAction:grey_replaceText(@"")]; + + [[EarlGrey + selectElementWithMatcher:[self footerWithCountOfEmptyRequiredFields:1]] + assertWithMatcher:grey_nil()]; + + // Change text of state to empty. + [[EarlGrey + selectElementWithMatcher:chrome_test_util::TextFieldForCellWithLabelId( + IDS_IOS_AUTOFILL_STATE)] + performAction:grey_replaceText(@"")]; + + [[EarlGrey + selectElementWithMatcher:[self footerWithCountOfEmptyRequiredFields:2]] + assertWithMatcher:grey_nil()]; +} + @end
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm b/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm index cd139539..7e3bce3 100644 --- a/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.h" #import "base/check.h" +#import "base/i18n/message_formatter.h" #import "base/mac/foundation_util.h" #import "base/metrics/user_metrics.h" #import "base/metrics/user_metrics_action.h" @@ -302,9 +303,12 @@ - (BOOL)shouldHideToolbar { // Hide the toolbar if the visible view controller is not the current view // controller or the `deletionSheetCoordinator` is shown. - return self.navigationController.visibleViewController != self && - self.deletionSheetCoordinator != nil && - ![self.deletionSheetCoordinator isVisible]; + if (self.navigationController.visibleViewController == self) { + return NO; + } else if (self.deletionSheetCoordinator != nil) { + return ![self.deletionSheetCoordinator isVisible]; + } + return YES; } - (BOOL)shouldShowEditDoneButton { @@ -664,9 +668,10 @@ self.deletionSheetCoordinator.popoverArrowDirection = UIPopoverArrowDirectionAny; __weak AutofillProfileTableViewController* weakSelf = self; - // TODO(crbug.com/1407666): Add i18n string. [self.deletionSheetCoordinator - addItemWithTitle:@"Test Delete Address" + addItemWithTitle: + l10n_util::GetNSString( + IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON) action:^{ [weakSelf willDeleteItemsAtIndexPaths:indexPaths]; // TODO(crbug.com/650390) Generalize removing empty sections @@ -684,7 +689,7 @@ BOOL hasAccountProfiles = NO; BOOL hasSyncProfiles = NO; - NSInteger profileCount = 0; + int profileCount = 0; for (NSIndexPath* indexPath in indexPaths) { if (![self isItemTypeForIndexPathAddress:indexPath]) { @@ -705,15 +710,26 @@ } } - BOOL hasMultipleProfiles = profileCount > 1; - if (hasAccountProfiles) { - return hasMultipleProfiles ? @"These GAS address" : @"This GAS address"; - } else if (hasSyncProfiles) { - return hasMultipleProfiles ? @"These Sync address" : @"This Sync address"; - } else if (profileCount > 0) { - return hasMultipleProfiles ? @"These Local address" : @"This Local address"; + std::u16string pattern = l10n_util::GetStringUTF16( + IDS_IOS_SETTINGS_AUTOFILL_DELETE_ACCOUNT_ADDRESS_CONFIRMATION_TITLE); + std::u16string confirmationString = + base::i18n::MessageFormatter::FormatWithNamedArgs( + pattern, "email", base::SysNSStringToUTF16(self.syncingUserEmail), + "count", profileCount); + return base::SysUTF16ToNSString(confirmationString); } + if (hasSyncProfiles) { + return l10n_util::GetPluralNSStringF( + IDS_IOS_SETTINGS_AUTOFILL_DELETE_SYNC_ADDRESS_CONFIRMATION_TITLE, + profileCount); + } + if (profileCount > 0) { + return l10n_util::GetPluralNSStringF( + IDS_IOS_SETTINGS_AUTOFILL_DELETE_LOCAL_ADDRESS_CONFIRMATION_TITLE, + profileCount); + } + // Can happen if user presses delete in quick succesion. return nil; }
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/time_range_selector_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/time_range_selector_table_view_controller.mm index f390c21..91e32da0 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/time_range_selector_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/time_range_selector_table_view_controller.mm
@@ -43,9 +43,14 @@ IDS_IOS_CLEAR_BROWSING_DATA_TIME_RANGE_OPTION_BEGINNING_OF_TIME, IDS_IOS_CLEAR_BROWSING_DATA_TIME_RANGE_OPTION_OLDER_THAN_30_DAYS}; +const browsing_data::TimePeriod kTimePeriodUnused[]{ + // Last 15 Minutes is not yet available on iOS. + browsing_data::TimePeriod::LAST_15_MINUTES}; + static_assert( std::size(kStringIDS) == - static_cast<int>(browsing_data::TimePeriod::TIME_PERIOD_LAST) + 1, + static_cast<int>(browsing_data::TimePeriod::TIME_PERIOD_LAST) - + std::size(kTimePeriodUnused) + 1, "Strings have to match the enum values."); } // namespace
diff --git a/ios/chrome/browser/ui/settings/password/password_details/add_password_mediator.mm b/ios/chrome/browser/ui/settings/password/password_details/add_password_mediator.mm index 5ef4cdb3..39b38a0 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/add_password_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/add_password_mediator.mm
@@ -14,6 +14,7 @@ #import "components/password_manager/core/browser/password_form.h" #import "components/password_manager/core/browser/password_manager_util.h" #import "components/password_manager/core/browser/ui/credential_ui_entry.h" +#import "components/sync/base/features.h" #import "ios/chrome/browser/passwords/password_check_observer_bridge.h" #import "ios/chrome/browser/ui/settings/password/password_details/add_password_details_consumer.h" #import "ios/chrome/browser/ui/settings/password/password_details/add_password_mediator_delegate.h" @@ -109,7 +110,8 @@ - (void)addPasswordViewController:(AddPasswordViewController*)viewController didAddPasswordDetails:(NSString*)username - password:(NSString*)password { + password:(NSString*)password + note:(NSString*)note { if (_validationTaskTracker->HasTrackedTasks()) { // If the task tracker has pending tasks and the "Save" button is pressed, // don't do anything. @@ -122,6 +124,9 @@ std::string signonRealm = password_manager::GetSignonRealm(self.URL); credential.username = SysNSStringToUTF16(username); credential.password = SysNSStringToUTF16(password); + if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { + credential.note = SysNSStringToUTF16(note); + } credential.stored_in = {password_manager::PasswordForm::Store::kProfileStore}; password_manager::CredentialFacet facet;
diff --git a/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller.mm index 03f343e4..9ee9e413 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller.mm
@@ -13,6 +13,7 @@ #import "base/strings/sys_string_conversions.h" #import "components/password_manager/core/browser/password_manager_metrics_util.h" #import "components/password_manager/core/common/password_manager_features.h" +#import "components/sync/base/features.h" #import "ios/chrome/browser/ui/icons/symbols.h" #import "ios/chrome/browser/ui/keyboard/UIKeyCommand+Chrome.h" #import "ios/chrome/browser/ui/settings/cells/settings_image_detail_text_item.h" @@ -22,6 +23,8 @@ #import "ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_constants.h" #import "ios/chrome/browser/ui/settings/password/passwords_table_view_constants.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_link_header_footer_item.h" +#import "ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.h" +#import "ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item_delegate.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_text_edit_item.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_text_edit_item_delegate.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h" @@ -60,6 +63,7 @@ ItemTypeUsername, ItemTypePassword, ItemTypeFooter, + ItemTypeNote, ItemTypeDuplicateCredentialButton, ItemTypeDuplicateCredentialMessage }; @@ -69,7 +73,8 @@ } // namespace -@interface AddPasswordViewController () <TableViewTextEditItemDelegate> +@interface AddPasswordViewController () <TableViewTextEditItemDelegate, + TableViewMultiLineTextEditItemDelegate> // Whether the password is shown in plain text form or in masked form. @property(nonatomic, assign, getter=isPasswordShown) BOOL passwordShown; @@ -83,6 +88,9 @@ // The text item related to the password value. @property(nonatomic, strong) TableViewTextEditItem* passwordTextItem; +// The text item related to the password note value. +@property(nonatomic, strong) TableViewMultiLineTextEditItem* noteTextItem; + // The view used to anchor error alert which is shown for the username. This is // image icon in the `usernameTextItem` cell. @property(nonatomic, weak) UIView* usernameErrorAnchorView; @@ -195,6 +203,12 @@ [model addItem:self.passwordTextItem toSectionWithIdentifier:SectionIdentifierPassword]; + if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { + self.noteTextItem = [self noteItem]; + [model addItem:self.noteTextItem + toSectionWithIdentifier:SectionIdentifierPassword]; + } + [model addSectionWithIdentifier:SectionIdentifierFooter]; [model setFooter:[self footerItem] forSectionWithIdentifier:SectionIdentifierFooter]; @@ -276,6 +290,16 @@ return item; } +// TODO(crbug.com/1414897): Adjust item specs to the defined mocks. +- (TableViewMultiLineTextEditItem*)noteItem { + TableViewMultiLineTextEditItem* item = + [[TableViewMultiLineTextEditItem alloc] initWithType:ItemTypeNote]; + item.label = l10n_util::GetNSString(IDS_IOS_SHOW_PASSWORD_VIEW_NOTE); + item.editingEnabled = YES; + item.delegate = self; + return item; +} + - (TableViewTextItem*)duplicatePasswordViewButtonItem { TableViewTextItem* item = [[TableViewTextItem alloc] initWithType:ItemTypeDuplicateCredentialButton]; @@ -437,12 +461,13 @@ textFieldCell.textField.delegate = self; break; } - case ItemTypeDuplicateCredentialMessage: - case ItemTypeFooter: - break; case ItemTypeDuplicateCredentialButton: cell.selectionStyle = UITableViewCellSelectionStyleNone; break; + case ItemTypeNote: + case ItemTypeDuplicateCredentialMessage: + case ItemTypeFooter: + break; } return cell; } @@ -458,6 +483,7 @@ return NO; case ItemTypeUsername: case ItemTypePassword: + case ItemTypeNote: return YES; } return NO; @@ -572,6 +598,14 @@ } } +#pragma mark - TableViewMultiLineTextEditItemDelegate + +- (void)textViewItemDidChange:(TableViewMultiLineTextEditItem*)tableViewItem { + // Refresh the cells' height. + [self.tableView beginUpdates]; + [self.tableView endUpdates]; +} + #pragma mark - Actions // Dimisses this view controller when Cancel button is tapped. @@ -590,10 +624,10 @@ LogUserInteractionsWhenAddingCredentialFromSettings( password_manager::metrics_util:: AddCredentialFromSettingsUserInteractions::kCredentialAdded); - [self.delegate - addPasswordViewController:self - didAddPasswordDetails:self.usernameTextItem.textFieldValue - password:self.passwordTextItem.textFieldValue]; + [self.delegate addPasswordViewController:self + didAddPasswordDetails:self.usernameTextItem.textFieldValue + password:self.passwordTextItem.textFieldValue + note:self.noteTextItem.text]; } #pragma mark - SettingsRootTableViewController @@ -610,6 +644,7 @@ case ItemTypeUsername: case ItemTypePassword: case ItemTypeWebsite: + case ItemTypeNote: return YES; case ItemTypeDuplicateCredentialMessage: case ItemTypeDuplicateCredentialButton:
diff --git a/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller_delegate.h b/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller_delegate.h index 3200f80..6a732a7 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller_delegate.h +++ b/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller_delegate.h
@@ -13,7 +13,8 @@ // Called when user finished adding a new password credential. - (void)addPasswordViewController:(AddPasswordViewController*)viewController didAddPasswordDetails:(NSString*)username - password:(NSString*)password; + password:(NSString*)password + note:(NSString*)note; // Called on every keystroke to check whether duplicates exist before adding a // new credential.
diff --git a/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller_unittest.mm index 050d8354..ed93700 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller_unittest.mm
@@ -11,8 +11,10 @@ #import "base/strings/sys_string_conversions.h" #import "base/strings/utf_string_conversions.h" #import "base/test/metrics/histogram_tester.h" +#import "base/test/scoped_feature_list.h" #import "components/password_manager/core/browser/password_form.h" #import "components/password_manager/core/browser/ui/credential_ui_entry.h" +#import "components/sync/base/features.h" #import "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/ui/settings/cells/settings_image_detail_text_item.h" #import "ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller_delegate.h" @@ -62,7 +64,8 @@ - (void)addPasswordViewController:(AddPasswordViewController*)viewController didAddPasswordDetails:(NSString*)username - password:(NSString*)password { + password:(NSString*)password + note:(NSString*)note { } - (void)checkForDuplicates:(NSString*)username { @@ -185,6 +188,54 @@ } // Tests the layout of the view controller when adding a new credential with +// notes features disabled. +TEST_F(AddPasswordViewControllerTest, TestSectionsInAddWithNotesDisabled) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature(syncer::kPasswordNotesWithBackup); + + AddPasswordViewController* passwords_controller = + static_cast<AddPasswordViewController*>(controller()); + [passwords_controller loadModel]; + + EXPECT_EQ(4, NumberOfSections()); + EXPECT_EQ(1, NumberOfItemsInSection(0)); + EXPECT_EQ(0, NumberOfItemsInSection(1)); + EXPECT_EQ(2, NumberOfItemsInSection(2)); + + CheckSectionFooter( + [NSString stringWithFormat:@"%@\n\n%@", + l10n_util::GetNSString( + IDS_IOS_SETTINGS_ADD_PASSWORD_DESCRIPTION), + l10n_util::GetNSString( + IDS_IOS_SAVE_PASSWORD_FOOTER_NOT_SYNCING)], + 3); +} + +// Tests the layout of the view controller when adding a new credential with +// notes features enabled. +TEST_F(AddPasswordViewControllerTest, TestSectionsInAddWithNotesEnabled) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(syncer::kPasswordNotesWithBackup); + + AddPasswordViewController* passwords_controller = + static_cast<AddPasswordViewController*>(controller()); + [passwords_controller loadModel]; + + EXPECT_EQ(4, NumberOfSections()); + EXPECT_EQ(1, NumberOfItemsInSection(0)); + EXPECT_EQ(0, NumberOfItemsInSection(1)); + EXPECT_EQ(3, NumberOfItemsInSection(2)); + + CheckSectionFooter( + [NSString stringWithFormat:@"%@\n\n%@", + l10n_util::GetNSString( + IDS_IOS_SETTINGS_ADD_PASSWORD_DESCRIPTION), + l10n_util::GetNSString( + IDS_IOS_SAVE_PASSWORD_FOOTER_NOT_SYNCING)], + 3); +} + +// Tests the layout of the view controller when adding a new credential with // duplicate website/username combination. TEST_F(AddPasswordViewControllerTest, TestSectionsInAddDuplicated) { SetPassword();
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm index fd5dfcc..b3052ae 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm
@@ -4,7 +4,12 @@ #import "ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.h" +#import <memory> +#import <utility> +#import <vector> + #import "base/containers/contains.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "components/password_manager/core/browser/move_password_to_account_store_helper.h" #import "components/password_manager/core/browser/password_manager_metrics_util.h" @@ -33,7 +38,7 @@ PasswordCheckObserver, PasswordDetailsTableViewControllerDelegate> { // Password Check manager. - IOSChromePasswordCheckManager* _manager; + raw_ptr<IOSChromePasswordCheckManager> _manager; // Listens to compromised passwords changes. std::unique_ptr<PasswordCheckObserverBridge> _passwordCheckObserver; @@ -62,8 +67,8 @@ _manager = manager; _credentials = credentials; _displayName = displayName; - _passwordCheckObserver.reset( - new PasswordCheckObserverBridge(self, manager)); + _passwordCheckObserver = + std::make_unique<PasswordCheckObserverBridge>(self, manager); DCHECK(!_credentials.empty()); // TODO(crbug.com/1400692): Improve saved passwords logic when helper is @@ -107,7 +112,7 @@ return; _consumer = consumer; - [self fetchPasswordWith:_manager->GetInsecureCredentials()]; + [self providePasswordsToConsumer]; if (_credentials[0].blocked_by_user) { DCHECK_EQ(_credentials.size(), 1u); @@ -116,7 +121,8 @@ } - (void)disconnect { - _manager->RemoveObserver(_passwordCheckObserver.get()); + _passwordCheckObserver.reset(); + _manager = nullptr; } - (void)removeCredential: @@ -199,7 +205,7 @@ } - (void)didFinishEditingPasswordDetails { - [self fetchPasswordWith:_manager->GetInsecureCredentials()]; + [self providePasswordsToConsumer]; } - (void)passwordDetailsViewController: @@ -248,16 +254,16 @@ } - (void)insecureCredentialsDidChange { - [self fetchPasswordWith:_manager->GetInsecureCredentials()]; + [self providePasswordsToConsumer]; } #pragma mark - Private -// Updates password details and sets it to a consumer. -- (void)fetchPasswordWith: - (const std::vector<password_manager::CredentialUIEntry>&) - insecureCredentials { +// Pushes password details to the consumer. +- (void)providePasswordsToConsumer { NSMutableArray<PasswordDetails*>* passwords = [NSMutableArray array]; + std::vector<password_manager::CredentialUIEntry> insecureCredentials = + _manager->GetInsecureCredentials(); for (password_manager::CredentialUIEntry credential : _credentials) { PasswordDetails* password = [[PasswordDetails alloc] initWithCredential:credential];
diff --git a/ios/chrome/browser/ui/settings/password/password_issues_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_issues_coordinator.mm index 1efb27e..9c6251a6 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_issues_coordinator.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/settings/password/password_issues_coordinator.h" #import "base/mac/foundation_util.h" +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/favicon/favicon_loader.h" #import "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h" #import "ios/chrome/browser/main/browser.h" @@ -29,7 +30,7 @@ @interface PasswordIssuesCoordinator () <PasswordDetailsCoordinatorDelegate, PasswordIssuesPresenter> { // Password check manager to power mediator. - IOSChromePasswordCheckManager* _manager; + raw_ptr<IOSChromePasswordCheckManager> _manager; } // Main view controller for this coordinator. @@ -100,6 +101,7 @@ } - (void)stop { + [self.mediator disconnect]; self.mediator = nil; self.viewController = nil;
diff --git a/ios/chrome/browser/ui/settings/password/password_issues_mediator.h b/ios/chrome/browser/ui/settings/password/password_issues_mediator.h index 40e83b12..bc10781 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues_mediator.h +++ b/ios/chrome/browser/ui/settings/password/password_issues_mediator.h
@@ -31,6 +31,9 @@ - (instancetype)init NS_UNAVAILABLE; +// Disconnects from all observers. Must be called before destroying. +- (void)disconnect; + @property(nonatomic, weak) id<PasswordIssuesConsumer> consumer; // Deletes password from the password store.
diff --git a/ios/chrome/browser/ui/settings/password/password_issues_mediator.mm b/ios/chrome/browser/ui/settings/password/password_issues_mediator.mm index 4d0312ea..dc3d207 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/password_issues_mediator.mm
@@ -4,6 +4,10 @@ #import "ios/chrome/browser/ui/settings/password/password_issues_mediator.h" +#import <memory> +#import <utility> + +#import "base/memory/raw_ptr.h" #import "components/password_manager/core/browser/ui/insecure_credentials_manager.h" #import "components/sync/driver/sync_service.h" #import "ios/chrome/browser/favicon/favicon_loader.h" @@ -18,26 +22,26 @@ #endif @interface PasswordIssuesMediator () <PasswordCheckObserver> { - IOSChromePasswordCheckManager* _manager; + raw_ptr<IOSChromePasswordCheckManager> _manager; std::unique_ptr<PasswordCheckObserverBridge> _passwordCheckObserver; std::vector<password_manager::CredentialUIEntry> _insecureCredentials; + + // Object storing the time of the previous successful re-authentication. + // This is meant to be used by the `ReauthenticationModule` for keeping + // re-authentications valid for a certain time interval within the scope + // of the Password Issues Screen. + __strong NSDate* _successfulReauthTime; + + // FaviconLoader is a keyed service that uses LargeIconService to retrieve + // favicon images. + raw_ptr<FaviconLoader> _faviconLoader; + + // Service to know whether passwords are synced. + raw_ptr<syncer::SyncService> _syncService; } -// Object storing the time of the previous successful re-authentication. -// This is meant to be used by the `ReauthenticationModule` for keeping -// re-authentications valid for a certain time interval within the scope -// of the Password Issues Screen. -@property(nonatomic, strong, readonly) NSDate* successfulReauthTime; - -// FaviconLoader is a keyed service that uses LargeIconService to retrieve -// favicon images. -@property(nonatomic, assign) FaviconLoader* faviconLoader; - -// Service to know whether passwords are synced. -@property(nonatomic, assign) syncer::SyncService* syncService; - @end @implementation PasswordIssuesMediator @@ -51,17 +55,25 @@ _syncService = syncService; _faviconLoader = faviconLoader; _manager = manager; - _passwordCheckObserver.reset( - new PasswordCheckObserverBridge(self, manager)); + _passwordCheckObserver = + std::make_unique<PasswordCheckObserverBridge>(self, manager); } return self; } +- (void)disconnect { + _passwordCheckObserver.reset(); + + _manager = nullptr; + _faviconLoader = nullptr; + _syncService = nullptr; +} + - (void)setConsumer:(id<PasswordIssuesConsumer>)consumer { if (_consumer == consumer) return; _consumer = consumer; - [self fetchPasswordIssues]; + [self providePasswordsToConsumer]; } - (void)deleteCredential: @@ -78,12 +90,12 @@ } - (void)insecureCredentialsDidChange { - [self fetchPasswordIssues]; + [self providePasswordsToConsumer]; } #pragma mark - Private Methods -- (void)fetchPasswordIssues { +- (void)providePasswordsToConsumer { DCHECK(self.consumer); _insecureCredentials = _manager->GetInsecureCredentials(); NSMutableArray* passwords = [[NSMutableArray alloc] init]; @@ -108,17 +120,17 @@ } - (NSDate*)lastSuccessfulReauthTime { - return [self successfulReauthTime]; + return _successfulReauthTime; } #pragma mark - TableViewFaviconDataSource - (void)faviconForURL:(CrURL*)URL completion:(void (^)(FaviconAttributes*))completion { - syncer::SyncService* syncService = self.syncService; BOOL isPasswordSyncEnabled = - password_manager_util::IsPasswordSyncNormalEncryptionEnabled(syncService); - self.faviconLoader->FaviconForPageUrl( + password_manager_util::IsPasswordSyncNormalEncryptionEnabled( + _syncService); + _faviconLoader->FaviconForPageUrl( URL.gurl, kDesiredMediumFaviconSizePt, kMinFaviconSizePt, /*fallback_to_google_server=*/isPasswordSyncEnabled, completion); }
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm index b48f9a4..6b78d0a4a 100644 --- a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm +++ b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm
@@ -175,6 +175,13 @@ return TextFieldForCellWithLabelId(IDS_IOS_SHOW_PASSWORD_VIEW_PASSWORD); } +// Matcher for the note in Password Details view. +id<GREYMatcher> PasswordDetailNote() { + return grey_allOf( + grey_accessibilityID(GetTextFieldForID(IDS_IOS_SHOW_PASSWORD_VIEW_NOTE)), + grey_kindOfClassName(@"UITextView"), nil); +} + // Matcher for the federation details in Password Details view. id<GREYMatcher> PasswordDetailFederation() { return grey_allOf(grey_accessibilityID(GetTextFieldForID( @@ -382,6 +389,16 @@ @"Stored form was not found in the PasswordStore results."); } +// Saves an example form with note in the store. +void SaveExamplePasswordFormWithNote() { + GREYAssert( + [PasswordSettingsAppInterface saveExampleNote:@"concrete note" + password:@"concrete password" + userName:@"concrete username" + origin:@"https://example.com"], + @"Stored form was not found in the PasswordStore results."); +} + // Saves two example blocked forms in the store. void SaveExampleBlockedForms() { GREYAssert([PasswordSettingsAppInterface @@ -531,6 +548,13 @@ password_manager::features::kEnablePasswordsAccountStorage); } + if ([self isRunningTest:@selector(testLayoutWithNotesDisabled)]) { + config.features_disabled.push_back(syncer::kPasswordNotesWithBackup); + } + if ([self isRunningTest:@selector(testLayoutWithNotesEnabled)]) { + config.features_enabled.push_back(syncer::kPasswordNotesWithBackup); + } + return config; } @@ -1266,6 +1290,86 @@ performAction:grey_tap()]; } +// Checks the order of the elements in the detail view layout for a +// non-federated, non-blocked credential with notes feature disabled. +- (void)testLayoutWithNotesDisabled { + SaveExamplePasswordForm(); + + OpenPasswordManager(); + + [[self interactionForSinglePasswordEntryWithDomain:@"example.com" + username:@"concrete username"] + performAction:grey_tap()]; + + [[EarlGrey + selectElementWithMatcher:[self matcherForPasswordDetailCellWithWebsites: + @"https://example.com/"]] + assertWithMatcher:grey_notNil()]; + [[EarlGrey selectElementWithMatcher:PasswordDetailUsername()] + assertWithMatcher:grey_textFieldValue(@"concrete username")]; + [[EarlGrey selectElementWithMatcher:PasswordDetailPassword()] + assertWithMatcher:grey_textFieldValue(kMaskedPassword)]; + [[EarlGrey selectElementWithMatcher:PasswordDetailNote()] + assertWithMatcher:grey_nil()]; + + [[EarlGrey selectElementWithMatcher:PasswordDetailFederation()] + assertWithMatcher:grey_nil()]; + [GetInteractionForPasswordDetailItem(PasswordDetailUsername()) + assertWithMatcher:grey_layout( + @[ Below() ], + [self matcherForPasswordDetailCellWithWebsites: + @"https://example.com/"])]; + [GetInteractionForPasswordDetailItem(PasswordDetailPassword()) + assertWithMatcher:grey_layout(@[ Below() ], PasswordDetailUsername())]; + + [[EarlGrey selectElementWithMatcher:SettingsMenuBackButton()] + performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:SettingsMenuBackButton()] + performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:SettingsDoneButton()] + performAction:grey_tap()]; +} + +// Checks the order of the elements in the detail view layout for a +// non-federated, non-blocked credential with notes feature enabled. +- (void)testLayoutWithNotesEnabled { + SaveExamplePasswordFormWithNote(); + + OpenPasswordManager(); + + [[self interactionForSinglePasswordEntryWithDomain:@"example.com" + username:@"concrete username"] + performAction:grey_tap()]; + + [[EarlGrey + selectElementWithMatcher:[self matcherForPasswordDetailCellWithWebsites: + @"https://example.com/"]] + assertWithMatcher:grey_notNil()]; + [[EarlGrey selectElementWithMatcher:PasswordDetailUsername()] + assertWithMatcher:grey_textFieldValue(@"concrete username")]; + [[EarlGrey selectElementWithMatcher:PasswordDetailPassword()] + assertWithMatcher:grey_textFieldValue(kMaskedPassword)]; + [[EarlGrey selectElementWithMatcher:PasswordDetailNote()] + assertWithMatcher:grey_text(@"concrete note")]; + + [[EarlGrey selectElementWithMatcher:PasswordDetailFederation()] + assertWithMatcher:grey_nil()]; + [GetInteractionForPasswordDetailItem(PasswordDetailUsername()) + assertWithMatcher:grey_layout( + @[ Below() ], + [self matcherForPasswordDetailCellWithWebsites: + @"https://example.com/"])]; + [GetInteractionForPasswordDetailItem(PasswordDetailPassword()) + assertWithMatcher:grey_layout(@[ Below() ], PasswordDetailUsername())]; + + [[EarlGrey selectElementWithMatcher:SettingsMenuBackButton()] + performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:SettingsMenuBackButton()] + performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:SettingsDoneButton()] + performAction:grey_tap()]; +} + // Checks the order of the elements in the detail view layout for a blocked // credential. - (void)testLayoutForBlockedCredential {
diff --git a/ios/chrome/browser/ui/settings/password/password_settings_app_interface.h b/ios/chrome/browser/ui/settings/password/password_settings_app_interface.h index 75dd2588..44ad5d4 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings_app_interface.h +++ b/ios/chrome/browser/ui/settings/password/password_settings_app_interface.h
@@ -42,6 +42,12 @@ userName:(NSString*)userName origin:(NSString*)origin; +// Creates password form for given fields. ++ (BOOL)saveExampleNote:(NSString*)note + password:(NSString*)password + userName:(NSString*)userName + origin:(NSString*)origin; + // Creates password form which is leaked. + (BOOL)saveInsecurePassword:(NSString*)password userName:(NSString*)userName
diff --git a/ios/chrome/browser/ui/settings/password/password_settings_app_interface.mm b/ios/chrome/browser/ui/settings/password/password_settings_app_interface.mm index f1ca3390f..53fa731 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings_app_interface.mm +++ b/ios/chrome/browser/ui/settings/password/password_settings_app_interface.mm
@@ -217,6 +217,20 @@ return SaveToPasswordStore(example); } ++ (BOOL)saveExampleNote:(NSString*)note + password:(NSString*)password + userName:(NSString*)userName + origin:(NSString*)origin { + PasswordForm example; + example.username_value = base::SysNSStringToUTF16(userName); + example.password_value = base::SysNSStringToUTF16(password); + example.url = GURL(base::SysNSStringToUTF16(origin)); + example.signon_realm = example.url.spec(); + example.notes = {password_manager::PasswordNote( + base::SysNSStringToUTF16(note), base::Time::Now())}; + return SaveToPasswordStore(example); +} + + (BOOL)saveInsecurePassword:(NSString*)password userName:(NSString*)userName origin:(NSString*)origin {
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm index 6280baa..45186aa4 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/settings/password/passwords_mediator.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "base/strings/utf_string_conversions.h" #import "base/time/time.h" @@ -57,9 +58,9 @@ scoped_refptr<IOSChromePasswordCheckManager> _passwordCheckManager; // Service to check if passwords are synced. - SyncSetupService* _syncSetupService; + raw_ptr<SyncSetupService> _syncSetupService; - password_manager::SavedPasswordsPresenter* _savedPasswordsPresenter; + raw_ptr<password_manager::SavedPasswordsPresenter> _savedPasswordsPresenter; // A helper object for passing data about changes in password check status // and changes to compromised credentials list. @@ -77,23 +78,23 @@ std::unique_ptr<signin::IdentityManagerObserverBridge> _identityManagerObserver; - // Sync observer + // Sync observer. std::unique_ptr<SyncObserverBridge> _syncObserver; + + // Object storing the time of the previous successful re-authentication. + // This is meant to be used by the `ReauthenticationModule` for keeping + // re-authentications valid for a certain time interval within the scope + // of the Passwords Screen. + __strong NSDate* _successfulReauthTime; + + // FaviconLoader is a keyed service that uses LargeIconService to retrieve + // favicon images. + raw_ptr<FaviconLoader> _faviconLoader; + + // Service to know whether passwords are synced. + raw_ptr<syncer::SyncService> _syncService; } -// Object storing the time of the previous successful re-authentication. -// This is meant to be used by the `ReauthenticationModule` for keeping -// re-authentications valid for a certain time interval within the scope -// of the Passwords Screen. -@property(nonatomic, strong, readonly) NSDate* successfulReauthTime; - -// FaviconLoader is a keyed service that uses LargeIconService to retrieve -// favicon images. -@property(nonatomic, assign) FaviconLoader* faviconLoader; - -// Service to know whether passwords are synced. -@property(nonatomic, assign) syncer::SyncService* syncService; - @end @implementation PasswordsMediator @@ -131,16 +132,6 @@ return self; } -- (void)dealloc { - if (_passwordsPresenterObserver) { - _savedPasswordsPresenter->RemoveObserver(_passwordsPresenterObserver.get()); - } - if (_passwordCheckObserver) { - _passwordCheckManager->RemoveObserver(_passwordCheckObserver.get()); - } - [[PasswordAutoFillStatusManager sharedManager] removeObserver:self]; -} - - (void)setConsumer:(id<PasswordsConsumer>)consumer { if (_consumer == consumer) return; @@ -160,6 +151,14 @@ - (void)disconnect { _identityManagerObserver.reset(); _syncObserver.reset(); + _passwordsPresenterObserver.reset(); + _passwordCheckObserver.reset(); + [[PasswordAutoFillStatusManager sharedManager] removeObserver:self]; + + _passwordCheckManager.reset(); + _syncSetupService = nullptr; + _savedPasswordsPresenter = nullptr; + _faviconLoader = nullptr; _syncService = nullptr; } @@ -444,17 +443,17 @@ } - (NSDate*)lastSuccessfulReauthTime { - return [self successfulReauthTime]; + return _successfulReauthTime; } #pragma mark - TableViewFaviconDataSource - (void)faviconForURL:(CrURL*)URL completion:(void (^)(FaviconAttributes*))completion { - syncer::SyncService* syncService = self.syncService; BOOL isPasswordSyncEnabled = - password_manager_util::IsPasswordSyncNormalEncryptionEnabled(syncService); - self.faviconLoader->FaviconForPageUrl( + password_manager_util::IsPasswordSyncNormalEncryptionEnabled( + _syncService); + _faviconLoader->FaviconForPageUrl( URL.gurl, kDesiredMediumFaviconSizePt, kMinFaviconSizePt, /*fallback_to_google_server=*/isPasswordSyncEnabled, completion); }
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/BUILD.gn index db005032..b3213987 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/BUILD.gn +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/BUILD.gn
@@ -11,6 +11,7 @@ deps = [ ":inactive_tabs_ui", "//base", + "//ios/chrome/browser/tabs/inactive_tabs:features", "//ios/chrome/browser/ui/coordinators:chrome_coordinators", "//ios/chrome/browser/ui/tab_switcher/tab_grid/grid:grid_ui", ] @@ -24,6 +25,7 @@ ] deps = [ "//ios/chrome/app/strings", + "//ios/chrome/browser/tabs/inactive_tabs:features", "//ios/chrome/browser/ui/tab_switcher/tab_grid:tab_grid_ui_constants", "//ios/chrome/browser/ui/tab_switcher/tab_grid/grid:grid_ui", "//ui/base",
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_button_header.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_button_header.mm index cd366e4..12194ee 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_button_header.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_button_header.mm
@@ -6,6 +6,7 @@ #import <QuartzCore/QuartzCore.h> +#import "ios/chrome/browser/tabs/inactive_tabs/features.h" #import "ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_button.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -22,6 +23,7 @@ @implementation InactiveTabsButtonHeader - (instancetype)initWithFrame:(CGRect)frame { + DCHECK(IsInactiveTabsEnabled()); self = [super initWithFrame:frame]; if (self) { _button = [[InactiveTabsButton alloc] init];
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_coordinator.mm index 810a53d..8bd92e2 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_coordinator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_coordinator.mm
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> #import "base/notreached.h" +#import "ios/chrome/browser/tabs/inactive_tabs/features.h" #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.h" #import "ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_view_controller.h" @@ -36,6 +37,12 @@ #pragma mark - ChromeCoordinator +- (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser { + DCHECK(IsInactiveTabsEnabled()); + return [super initWithBaseViewController:viewController browser:browser]; +} + - (void)start { [super start];
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_view_controller.mm index f40a03f2..100b5faa 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_view_controller.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_view_controller.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_view_controller.h" +#import "ios/chrome/browser/tabs/inactive_tabs/features.h" #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.h" #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_constants.h" #import "ios/chrome/grit/ios_strings.h" @@ -20,6 +21,7 @@ - (instancetype)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil { + DCHECK(IsInactiveTabsEnabled()); self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { _gridViewController = [[GridViewController alloc] init];
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm index 944933a..f90837b1 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm
@@ -1019,8 +1019,9 @@ continue; } + __weak __typeof(self) weakSelf = self; auto cacheImage = ^(UIImage* image) { - self.appearanceCache[identifier] = image; + weakSelf.appearanceCache[identifier] = image; }; [self snapshotForIdentifier:identifier completion:cacheImage];
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.mm index 2a0098fd..a843581 100644 --- a/ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.mm +++ b/ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.mm
@@ -34,6 +34,11 @@ cell.textView.text = self.text; cell.textView.editable = self.editingEnabled; cell.textView.delegate = self; + + if (self.label.length) { + cell.textView.accessibilityIdentifier = + [NSString stringWithFormat:@"%@_textField", self.label]; + } } #pragma mark - UITextViewDelegate
diff --git a/ios/chrome/browser/web/annotations/annotations_tab_helper.mm b/ios/chrome/browser/web/annotations/annotations_tab_helper.mm index 0c114e39..248a4ad 100644 --- a/ios/chrome/browser/web/annotations/annotations_tab_helper.mm +++ b/ios/chrome/browser/web/annotations/annotations_tab_helper.mm
@@ -78,7 +78,7 @@ {base::MayBlock(), base::TaskPriority::USER_VISIBLE, base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, base::BindOnce(&ios::provider::ExtractDataElementsFromText, text, - ios::provider::GetHandledIntentTypes(web_state), + ios::provider::GetHandledIntentTypesForOneTap(web_state), std::move(model_path)), base::BindOnce(&AnnotationsTabHelper::ApplyDeferredProcessing, weak_factory_.GetWeakPtr()));
diff --git a/ios/chrome/common/ui/colors/resources/BUILD.gn b/ios/chrome/common/ui/colors/resources/BUILD.gn index a6370c2..e7c7ec77 100644 --- a/ios/chrome/common/ui/colors/resources/BUILD.gn +++ b/ios/chrome/common/ui/colors/resources/BUILD.gn
@@ -49,8 +49,9 @@ ":scrim_background_color", ":secondary_background_color", ":separator_color", + ":solid_black_color", ":solid_button_text_color", - ":solid_primary_color", + ":solid_white_color", ":static_blue_400_color", ":static_grey_300_color", ":table_view_row_highlight_color", @@ -234,8 +235,12 @@ sources = [ "solid_button_text_color.colorset/Contents.json" ] } -colorset("solid_primary_color") { - sources = [ "solid_primary_color.colorset/Contents.json" ] +colorset("solid_black_color") { + sources = [ "solid_black_color.colorset/Contents.json" ] +} + +colorset("solid_white_color") { + sources = [ "solid_white_color.colorset/Contents.json" ] } colorset("table_view_row_highlight_color") {
diff --git a/ios/chrome/common/ui/colors/resources/solid_black_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/solid_black_color.colorset/Contents.json new file mode 100644 index 0000000..f86e1a49 --- /dev/null +++ b/ios/chrome/common/ui/colors/resources/solid_black_color.colorset/Contents.json
@@ -0,0 +1,38 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "red" : "0x00", + "green" : "0x00", + "blue" : "0x00" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "red" : "0xFF", + "green" : "0xFF", + "blue" : "0xFF" + } + } + } + ] +}
diff --git a/ios/chrome/common/ui/colors/resources/solid_primary_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/solid_white_color.colorset/Contents.json similarity index 100% rename from ios/chrome/common/ui/colors/resources/solid_primary_color.colorset/Contents.json rename to ios/chrome/common/ui/colors/resources/solid_white_color.colorset/Contents.json
diff --git a/ios/chrome/common/ui/colors/semantic_color_names.h b/ios/chrome/common/ui/colors/semantic_color_names.h index ad9f9ef..3a313870 100644 --- a/ios/chrome/common/ui/colors/semantic_color_names.h +++ b/ios/chrome/common/ui/colors/semantic_color_names.h
@@ -48,12 +48,13 @@ extern NSString* const kToolbarButtonColor; // Color used for a shadow/separator next to a toolbar. extern NSString* const kToolbarShadowColor; -// Simple primary color based on theme. White for light theme, black for dark -// theme. -extern NSString* const kSolidPrimaryColor; // Standard Colors +// Black/White and White/Black colors for light/dark styles. +extern NSString* const kSolidBlackColor; +extern NSString* const kSolidWhiteColor; + // Standard blue color. This is most commonly used for the tint color on // standard buttons and controls. extern NSString* const kBlueColor;
diff --git a/ios/chrome/common/ui/colors/semantic_color_names.mm b/ios/chrome/common/ui/colors/semantic_color_names.mm index 112fcd7e..f91e13cc 100644 --- a/ios/chrome/common/ui/colors/semantic_color_names.mm +++ b/ios/chrome/common/ui/colors/semantic_color_names.mm
@@ -42,9 +42,10 @@ NSString* const kTextfieldPlaceholderColor = @"textfield_placeholder_color"; NSString* const kToolbarButtonColor = @"toolbar_button_color"; NSString* const kToolbarShadowColor = @"toolbar_shadow_color"; -NSString* const kSolidPrimaryColor = @"solid_primary_color"; #pragma mark - Standard Colors +NSString* const kSolidBlackColor = @"solid_black_color"; +NSString* const kSolidWhiteColor = @"solid_white_color"; NSString* const kBlueColor = @"blue_color"; NSString* const kBlueHaloColor = @"blue_halo_color"; NSString* const kBlue400Color = @"blue_400_color";
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn index 5e99ffa..f973da7 100644 --- a/ios/chrome/test/earl_grey/BUILD.gn +++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -89,6 +89,7 @@ "//ios/chrome/browser/device_sharing:eg_app_support+eg2", "//ios/chrome/browser/feature_engagement:eg_app_support+eg2", "//ios/chrome/browser/find_in_page", + "//ios/chrome/browser/find_in_page:eg_app_support+eg2", "//ios/chrome/browser/https_upgrades:eg_app_support+eg2", "//ios/chrome/browser/metrics:eg_app_support+eg2", "//ios/chrome/browser/ntp:features",
diff --git a/ios/chrome/test/providers/BUILD.gn b/ios/chrome/test/providers/BUILD.gn index ce04afe..e2ab1ea 100644 --- a/ios/chrome/test/providers/BUILD.gn +++ b/ios/chrome/test/providers/BUILD.gn
@@ -21,6 +21,7 @@ "//ios/chrome/test/providers/modals", "//ios/chrome/test/providers/omaha", "//ios/chrome/test/providers/overrides", + "//ios/chrome/test/providers/partial_translate", "//ios/chrome/test/providers/password_auto_fill", "//ios/chrome/test/providers/primes", "//ios/chrome/test/providers/push_notification",
diff --git a/ios/chrome/test/providers/discover_feed/test_discover_feed.mm b/ios/chrome/test/providers/discover_feed/test_discover_feed.mm index efe8a33..020c11a 100644 --- a/ios/chrome/test/providers/discover_feed/test_discover_feed.mm +++ b/ios/chrome/test/providers/discover_feed/test_discover_feed.mm
@@ -33,7 +33,7 @@ void RemoveFeedViewController(UIViewController* feed_view_controller) final {} void UpdateTheme() final {} void RefreshFeedIfNeeded() final {} - void RefreshFeed() final {} + void RefreshFeed(bool feed_visible) final {} void PerformBackgroundRefreshes(void (^completion)(BOOL)) final {} void HandleBackgroundRefreshTaskExpiration() final {} NSDate* GetEarliestBackgroundRefreshBeginDate() final { return nil; }
diff --git a/ios/chrome/test/providers/partial_translate/BUILD.gn b/ios/chrome/test/providers/partial_translate/BUILD.gn new file mode 100644 index 0000000..51c7cb4 --- /dev/null +++ b/ios/chrome/test/providers/partial_translate/BUILD.gn
@@ -0,0 +1,12 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("partial_translate") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ "test_partial_translate.mm" ] + deps = [ + "//base", + "//ios/public/provider/chrome/browser/partial_translate:partial_translate_api", + ] +}
diff --git a/ios/chrome/test/providers/partial_translate/test_partial_translate.mm b/ios/chrome/test/providers/partial_translate/test_partial_translate.mm new file mode 100644 index 0000000..4c866cd --- /dev/null +++ b/ios/chrome/test/providers/partial_translate/test_partial_translate.mm
@@ -0,0 +1,23 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import <UIKit/UIKit.h> + +#import "ios/public/provider/chrome/browser/partial_translate/partial_translate_api.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +id<PartialTranslateController> NewPartialTranslateController( + NSString* source_text, + const CGRect& anchor, + BOOL incognito) { + // Partial translate is not supported in tests. + return nil; +} + +NSUInteger PartialTranslateLimitMaxCharacters() { + return 0; +}
diff --git a/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.h b/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.h index eaa5e1d..5fd4494 100644 --- a/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.h +++ b/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.h
@@ -36,6 +36,8 @@ void CancelDialog(BOOL animated, ProceduralBlock callback) final; void ClearLocalData(id<SystemIdentity> identity, base::OnceCallback<void(bool)> callback) final; + void GetPublicKeyForIdentity(id<SystemIdentity> identity, + GetPublicKeyCallback callback) final; // Simulates user cancelling the reauth dialog. void SimulateUserCancel();
diff --git a/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.mm b/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.mm index a6ce15ae..5703bf2 100644 --- a/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.mm +++ b/ios/chrome/test/providers/signin/fake_trusted_vault_client_backend.mm
@@ -113,12 +113,6 @@ // Do nothing. } -void FakeTrustedVaultClientBackend::ClearLocalData( - id<SystemIdentity> identity, - base::OnceCallback<void(bool)> callback) { - // Do nothing. -} - void FakeTrustedVaultClientBackend::CancelDialog(BOOL animated, ProceduralBlock callback) { DCHECK(view_controller_); @@ -128,6 +122,18 @@ view_controller_ = nil; } +void FakeTrustedVaultClientBackend::ClearLocalData( + id<SystemIdentity> identity, + base::OnceCallback<void(bool)> callback) { + // Do nothing. +} + +void FakeTrustedVaultClientBackend::GetPublicKeyForIdentity( + id<SystemIdentity> identity, + GetPublicKeyCallback callback) { + // Do nothing. +} + void FakeTrustedVaultClientBackend::SimulateUserCancel() { DCHECK(view_controller_); [view_controller_ simulateUserCancel];
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 index fcb460b..3d20a1b1 100644 --- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -1e7dec3d222c814ff86a5dc5b63fe74168f2458a \ No newline at end of file +1f8ccb265fd34b64c6c1c0877f0047e95a6a2111 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 index c656e34..29f4f32 100644 --- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -f66c174fae6228fbe5a9ac73c813d476cb9bf129 \ No newline at end of file +0e1c8e90c522c74cd6250600b3ba0711cc1b9004 \ No newline at end of file
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 cc3c3f4..06cc63c 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 @@ -ebb70545aec109920ccb3dbfce5223834706aeac \ No newline at end of file +dd53f8c5dbe5a141a415667d27f6bf477bbf4a3c \ 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 6081d8d..6b7b80e 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 @@ -e32062e8fab7ee4f985b7c3a064654c67da055b1 \ No newline at end of file +cb9fec179a92b8f0149e2e72f378d486240a1486 \ 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 b58f9be7..d231647 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 @@ -8672244b98e4a3975fa7c1c53d5a48c0139e6e39 \ No newline at end of file +4fc7129a4a52a2b06683cfcee34a1efa852cd583 \ 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 c40f812da..e94dd763 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 @@ -2c7095dff4783943028543ba6a8a48e16188c744 \ No newline at end of file +792f27787f17dc75ce631b95e056dc8e1f08f696 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 index 551e85996..de692249 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -30437f6ba59c1eeb0cb250997c3401cb380ee6e3 \ No newline at end of file +c28d49a1dd0276994794c82ec70ac0ac7c6b117c \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 index 1db77e77..86288825 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -5d87d3157f4e89adc54f3c6b76305c02f8d785d3 \ No newline at end of file +26d0dd6f10fae3fc5827ab04d22125e4af68f3a5 \ 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 21fc13d06..59b6396 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 @@ -b85cbe8e6f32bfbe70f62f07e794ebf830ad9b7c \ No newline at end of file +2654d4307949347128417ac5e703c1e043ba33c8 \ 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 08a0939..235972f 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 @@ -e6c8d194ed5172874cafdcb87bec2c90babc423f \ No newline at end of file +d14bf35cb01a4cf037b2022043692def599f740a \ 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 f9c126ac..d4900414 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 @@ -ae493416838834cb49a9f846651431f447b844cf \ No newline at end of file +e75fd0dd6355608eec2843c254182d1591f6d014 \ 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 3725ec25..954ade9 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 @@ -6764296f9cc51a66d6fe41529aa7becbcd1d70ec \ No newline at end of file +530acfab35a43dab840e1add4ab63b67bd3ab1c9 \ No newline at end of file
diff --git a/ios/public/provider/chrome/browser/BUILD.gn b/ios/public/provider/chrome/browser/BUILD.gn index fffa85ea..a5cbedb 100644 --- a/ios/public/provider/chrome/browser/BUILD.gn +++ b/ios/public/provider/chrome/browser/BUILD.gn
@@ -21,6 +21,7 @@ "//ios/public/provider/chrome/browser/modals:modals_api", "//ios/public/provider/chrome/browser/omaha:omaha_api", "//ios/public/provider/chrome/browser/overrides:overrides_api", + "//ios/public/provider/chrome/browser/partial_translate:partial_translate_api", "//ios/public/provider/chrome/browser/password_auto_fill:password_auto_fill_api", "//ios/public/provider/chrome/browser/push_notification:push_notification_api", "//ios/public/provider/chrome/browser/risk_data:risk_data_api",
diff --git a/ios/public/provider/chrome/browser/partial_translate/BUILD.gn b/ios/public/provider/chrome/browser/partial_translate/BUILD.gn new file mode 100644 index 0000000..8094b14 --- /dev/null +++ b/ios/public/provider/chrome/browser/partial_translate/BUILD.gn
@@ -0,0 +1,9 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("partial_translate_api") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ "partial_translate_api.h" ] + deps = [ "//base" ] +}
diff --git a/ios/public/provider/chrome/browser/partial_translate/partial_translate_api.h b/ios/public/provider/chrome/browser/partial_translate/partial_translate_api.h new file mode 100644 index 0000000..f37130b --- /dev/null +++ b/ios/public/provider/chrome/browser/partial_translate/partial_translate_api.h
@@ -0,0 +1,38 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_PUBLIC_PROVIDER_CHROME_BROWSER_PARTIAL_TRANSLATE_PARTIAL_TRANSLATE_API_H_ +#define IOS_PUBLIC_PROVIDER_CHROME_BROWSER_PARTIAL_TRANSLATE_PARTIAL_TRANSLATE_API_H_ + +#import <UIKit/UIKit.h> + +@protocol PartialTranslateController <NSObject> + +// Presents the PartialTranslateController on top of viewController. +// `flowCompletionHandler` will be called at the end of the feature either +// - immediately with a value of NO if it fails +// - after the PartialTranslateController is dismissed with a value of YES if it +// succeeded. Note: Once this method is called, it is the responsibility of the +// caller to retain the PartialTranslateController until `flowCompletionHandler` +// is called. +- (void)presentOnViewController:(UIViewController*)viewController + flowCompletionHandler:(void (^)(BOOL))flowCompletionHandler; + +@end + +// Creates a PartialTranslateController to present the translate string for +// `source_text`. `anchor` is the position of `sourceText` in window +// coordinates. `incognito` is true if `source_text` was retrieved in an +// incognito tab. +id<PartialTranslateController> NewPartialTranslateController( + NSString* source_text, + const CGRect& anchor, + BOOL incognito); + +// The maximum length for the partial translate feature. Creating a +// PartialTranslateController with a longer string and trying to present it will +// fail. +NSUInteger PartialTranslateLimitMaxCharacters(); + +#endif // IOS_PUBLIC_PROVIDER_CHROME_BROWSER_PARTIAL_TRANSLATE_PARTIAL_TRANSLATE_API_H_
diff --git a/ios/web/find_in_page/find_in_page_manager_impl.mm b/ios/web/find_in_page/find_in_page_manager_impl.mm index ec6f237..501b63fe 100644 --- a/ios/web/find_in_page/find_in_page_manager_impl.mm +++ b/ios/web/find_in_page/find_in_page_manager_impl.mm
@@ -113,7 +113,7 @@ // query is different. if (!find_interaction.isFindNavigatorVisible || ![query isEqualToString:current_query_]) { - // For some reason, in automated tests, presenting the Find navigator + // For some reason, in some cases, presenting the Find navigator // synchronously results in inability to type in the Find navigator input // field. Presenting asynchronously instead solves this issue. dispatch_async(dispatch_get_main_queue(), ^{
diff --git a/media/audio/win/audio_low_latency_output_win.cc b/media/audio/win/audio_low_latency_output_win.cc index 3396a49..e9a6de0 100644 --- a/media/audio/win/audio_low_latency_output_win.cc +++ b/media/audio/win/audio_low_latency_output_win.cc
@@ -29,6 +29,7 @@ #include "media/audio/win/audio_session_event_listener_win.h" #include "media/audio/win/avrt_wrapper_win.h" #include "media/audio/win/core_audio_util_win.h" +#include "media/base/audio_glitch_info.h" #include "media/base/audio_sample_types.h" #include "media/base/limits.h" #include "media/base/media_switches.h" @@ -670,6 +671,8 @@ UINT64 qpc_position = 0; base::TimeDelta delay; base::TimeTicks delay_timestamp; + // Stores glitch info to be passed on to OnMoreData(). + AudioGlitchInfo::Accumulator glitch_info_accumulator; hr = audio_clock_->GetPosition(&position, &qpc_position); if (SUCCEEDED(hr)) { // Number of frames already played out through the speaker. @@ -699,9 +702,16 @@ const int64_t gap_duration_us = qpc_position_diff_us - position_diff_us; - glitch_reporter_.UpdateStats(gap_duration_us > buffer_duration_us / 2 + // TODO(crbug.com/1417946): Investigate precisely what gap duration + // should be counted as a glitch. + bool is_glitch = gap_duration_us > buffer_duration_us / 2; + glitch_reporter_.UpdateStats(is_glitch ? base::Microseconds(gap_duration_us) : base::TimeDelta()); + if (is_glitch) { + glitch_info_accumulator.Add( + {.duration = base::Microseconds(gap_duration_us), .count = 1}); + } } last_position_ = position; @@ -736,8 +746,9 @@ std::unique_ptr<AudioBus> audio_bus( AudioBus::WrapMemory(params_, audio_data)); audio_bus_->set_is_bitstream_format(true); - int frames_filled = - source_->OnMoreData(delay, delay_timestamp, {}, audio_bus.get()); + int frames_filled = source_->OnMoreData( + delay, delay_timestamp, glitch_info_accumulator.GetAndReset(), + audio_bus.get()); // During pause/seek, keep the pipeline filled with zero'ed frames. if (!frames_filled) @@ -750,8 +761,9 @@ return true; } #endif // BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO) - int frames_filled = - source_->OnMoreData(delay, delay_timestamp, {}, audio_bus_.get()); + int frames_filled = source_->OnMoreData( + delay, delay_timestamp, glitch_info_accumulator.GetAndReset(), + audio_bus_.get()); uint32_t num_filled_bytes = frames_filled * format_.Format.nBlockAlign; DCHECK_LE(num_filled_bytes, packet_size_bytes_); audio_bus_->Scale(volume_);
diff --git a/media/capture/BUILD.gn b/media/capture/BUILD.gn index d7f2207..ff550de1 100644 --- a/media/capture/BUILD.gn +++ b/media/capture/BUILD.gn
@@ -269,6 +269,8 @@ "video/linux/v4l2_capture_device_impl.h", "video/linux/video_capture_device_factory_linux.cc", "video/linux/video_capture_device_factory_linux.h", + "video/linux/video_capture_device_factory_v4l2.cc", + "video/linux/video_capture_device_factory_v4l2.h", "video/linux/video_capture_device_linux.cc", "video/linux/video_capture_device_linux.h", ] @@ -457,7 +459,7 @@ if (is_linux || is_chromeos_lacros) { sources += [ "video/linux/v4l2_capture_delegate_unittest.cc", - "video/linux/video_capture_device_factory_linux_unittest.cc", + "video/linux/video_capture_device_factory_v4l2_unittest.cc", ] }
diff --git a/media/capture/video/linux/fake_device_provider.h b/media/capture/video/linux/fake_device_provider.h index ad08bce..88d97f62 100644 --- a/media/capture/video/linux/fake_device_provider.h +++ b/media/capture/video/linux/fake_device_provider.h
@@ -8,14 +8,14 @@ #include <string> #include <vector> -#include "media/capture/video/linux/video_capture_device_factory_linux.h" +#include "media/capture/video/linux/video_capture_device_factory_v4l2.h" #include "media/capture/video/video_capture_device_descriptor.h" #include "media/capture/video_capture_types.h" namespace media { class FakeDeviceProvider - : public VideoCaptureDeviceFactoryLinux::DeviceProvider { + : public VideoCaptureDeviceFactoryV4L2::DeviceProvider { public: FakeDeviceProvider(); ~FakeDeviceProvider() override;
diff --git a/media/capture/video/linux/video_capture_device_factory_linux.cc b/media/capture/video/linux/video_capture_device_factory_linux.cc index a726e2f..e92f181 100644 --- a/media/capture/video/linux/video_capture_device_factory_linux.cc +++ b/media/capture/video/linux/video_capture_device_factory_linux.cc
@@ -1,330 +1,29 @@ -// Copyright 2014 The Chromium Authors +// Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "media/capture/video/linux/video_capture_device_factory_linux.h" -#include <errno.h> -#include <fcntl.h> -#include <stdint.h> -#include <sys/ioctl.h> - -#include <algorithm> -#include <utility> - -#include "base/containers/contains.h" -#include "base/files/file_enumerator.h" -#include "base/files/file_util.h" -#include "base/posix/eintr_wrapper.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "base/task/single_thread_task_runner.h" -#include "build/build_config.h" -#include "media/capture/video/linux/scoped_v4l2_device_fd.h" -#include "media/capture/video/linux/video_capture_device_linux.h" - -#if BUILDFLAG(IS_OPENBSD) -#include <sys/videoio.h> -#else -#include <linux/videodev2.h> -#endif +#include "media/capture/video/linux/video_capture_device_factory_v4l2.h" namespace media { -namespace { - -bool CompareCaptureDevices(const VideoCaptureDeviceInfo& a, - const VideoCaptureDeviceInfo& b) { - return a.descriptor < b.descriptor; -} - -// USB VID and PID are both 4 bytes long. -const size_t kVidPidSize = 4; -const size_t kMaxInterfaceNameSize = 256; - -// /sys/class/video4linux/video{N}/device is a symlink to the corresponding -// USB device info directory. -const char kVidPathTemplate[] = "/sys/class/video4linux/%s/device/../idVendor"; -const char kPidPathTemplate[] = "/sys/class/video4linux/%s/device/../idProduct"; -const char kInterfacePathTemplate[] = - "/sys/class/video4linux/%s/device/interface"; - -bool ReadIdFile(const std::string& path, std::string* id) { - char id_buf[kVidPidSize]; - FILE* file = fopen(path.c_str(), "rb"); - if (!file) - return false; - const bool success = fread(id_buf, kVidPidSize, 1, file) == 1; - fclose(file); - if (!success) - return false; - id->append(id_buf, kVidPidSize); - return true; -} - -std::string ExtractFileNameFromDeviceId(const std::string& device_id) { - // |unique_id| is of the form "/dev/video2". |file_name| is "video2". - const char kDevDir[] = "/dev/"; - DCHECK(base::StartsWith(device_id, kDevDir, base::CompareCase::SENSITIVE)); - return device_id.substr(strlen(kDevDir), device_id.length()); -} - -class DevVideoFilePathsDeviceProvider - : public VideoCaptureDeviceFactoryLinux::DeviceProvider { - public: - void GetDeviceIds(std::vector<std::string>* target_container) override { - const base::FilePath path("/dev/"); - base::FileEnumerator enumerator(path, false, base::FileEnumerator::FILES, - "video*"); - while (!enumerator.Next().empty()) { - const base::FileEnumerator::FileInfo info = enumerator.GetInfo(); - target_container->emplace_back(path.value() + info.GetName().value()); - } - } - - std::string GetDeviceModelId(const std::string& device_id) override { - const std::string file_name = ExtractFileNameFromDeviceId(device_id); - std::string usb_id; - const std::string vid_path = - base::StringPrintf(kVidPathTemplate, file_name.c_str()); - if (!ReadIdFile(vid_path, &usb_id)) - return usb_id; - - usb_id.append(":"); - const std::string pid_path = - base::StringPrintf(kPidPathTemplate, file_name.c_str()); - if (!ReadIdFile(pid_path, &usb_id)) - usb_id.clear(); - - return usb_id; - } - - std::string GetDeviceDisplayName(const std::string& device_id) override { - const std::string file_name = ExtractFileNameFromDeviceId(device_id); - const std::string interface_path = - base::StringPrintf(kInterfacePathTemplate, file_name.c_str()); - std::string display_name; - if (!base::ReadFileToStringWithMaxSize(base::FilePath(interface_path), - &display_name, - kMaxInterfaceNameSize)) { - return std::string(); - } - return display_name; - } -}; - -} // namespace - VideoCaptureDeviceFactoryLinux::VideoCaptureDeviceFactoryLinux( scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) - : v4l2_(base::MakeRefCounted<V4L2CaptureDeviceImpl>()), - device_provider_(std::make_unique<DevVideoFilePathsDeviceProvider>()), - ui_task_runner_(ui_task_runner) {} + : factory_( + std::make_unique<VideoCaptureDeviceFactoryV4L2>(ui_task_runner)) {} VideoCaptureDeviceFactoryLinux::~VideoCaptureDeviceFactoryLinux() = default; -void VideoCaptureDeviceFactoryLinux::SetV4L2EnvironmentForTesting( - scoped_refptr<V4L2CaptureDevice> v4l2, - std::unique_ptr<VideoCaptureDeviceFactoryLinux::DeviceProvider> - device_provider) { - v4l2_ = std::move(v4l2); - device_provider_ = std::move(device_provider); -} - VideoCaptureErrorOrDevice VideoCaptureDeviceFactoryLinux::CreateDevice( const VideoCaptureDeviceDescriptor& device_descriptor) { DCHECK(thread_checker_.CalledOnValidThread()); - auto self = - std::make_unique<VideoCaptureDeviceLinux>(v4l2_.get(), device_descriptor); - - // Test opening the device driver. This is to make sure it is available. - // We will reopen it again in our worker thread when someone - // allocates the camera. - ScopedV4L2DeviceFD fd( - v4l2_.get(), - HANDLE_EINTR(v4l2_->open(device_descriptor.device_id.c_str(), O_RDONLY))); - if (!fd.is_valid()) { - DLOG(ERROR) << "Cannot open device"; - return VideoCaptureErrorOrDevice( - VideoCaptureError::kV4L2FailedToOpenV4L2DeviceDriverFile); - } - - return VideoCaptureErrorOrDevice(std::move(self)); + return factory_->CreateDevice(device_descriptor); } void VideoCaptureDeviceFactoryLinux::GetDevicesInfo( GetDevicesInfoCallback callback) { - DCHECK(thread_checker_.CalledOnValidThread()); - std::vector<VideoCaptureDeviceInfo> devices_info; - std::vector<std::string> filepaths; - device_provider_->GetDeviceIds(&filepaths); - for (auto& unique_id : filepaths) { - const ScopedV4L2DeviceFD fd( - v4l2_.get(), HANDLE_EINTR(v4l2_->open(unique_id.c_str(), O_RDONLY))); - if (!fd.is_valid()) { - DLOG(ERROR) << "Couldn't open " << unique_id; - continue; - } - // Test if this is a V4L2CaptureDevice capture device and if it has at least - // one supported capture format. Devices that have capture and output - // capabilities at the same time are memory-to-memory and are skipped, see - // http://crbug.com/139356. - // In theory, checking for CAPTURE/OUTPUT in caps.capabilities should only - // be done if V4L2_CAP_DEVICE_CAPS is not set. However, this was not done - // in the past and it is unclear if it breaks with existing devices. And if - // a device is accepted incorrectly then it will not have any usable - // formats and is skipped anyways. - v4l2_capability cap; - if ((DoIoctl(fd.get(), VIDIOC_QUERYCAP, &cap) == 0) && - ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE && - !(cap.capabilities & V4L2_CAP_VIDEO_OUTPUT)) || - (cap.capabilities & V4L2_CAP_DEVICE_CAPS && - cap.device_caps & V4L2_CAP_VIDEO_CAPTURE && - !(cap.device_caps & V4L2_CAP_VIDEO_OUTPUT))) && - HasUsableFormats(fd.get(), cap.capabilities)) { - const std::string model_id = - device_provider_->GetDeviceModelId(unique_id); - std::string display_name = - device_provider_->GetDeviceDisplayName(unique_id); - if (display_name.empty()) - display_name = reinterpret_cast<char*>(cap.card); - - VideoFacingMode facing_mode = VideoFacingMode::MEDIA_VIDEO_FACING_NONE; - - VideoCaptureFormats supported_formats; - GetSupportedFormatsForV4L2BufferType(fd.get(), &supported_formats); - if (supported_formats.empty()) { - DVLOG(1) << "No supported formats: " << unique_id; - continue; - } - - devices_info.emplace_back(VideoCaptureDeviceDescriptor( - display_name, unique_id, model_id, - VideoCaptureApi::LINUX_V4L2_SINGLE_PLANE, GetControlSupport(fd.get()), - VideoCaptureTransportType::OTHER_TRANSPORT, facing_mode)); - - devices_info.back().supported_formats = std::move(supported_formats); - } - } - - // This is required for some applications that rely on the stable ordering of - // devices. - std::sort(devices_info.begin(), devices_info.end(), CompareCaptureDevices); - - std::move(callback).Run(std::move(devices_info)); -} - -int VideoCaptureDeviceFactoryLinux::DoIoctl(int fd, int request, void* argp) { - return HANDLE_EINTR(v4l2_->ioctl(fd, request, argp)); -} - -// Check if the video capture device supports pan, tilt and zoom controls. -VideoCaptureControlSupport VideoCaptureDeviceFactoryLinux::GetControlSupport( - int fd) { - VideoCaptureControlSupport control_support; - control_support.pan = GetControlSupport(fd, V4L2_CID_PAN_ABSOLUTE); - control_support.tilt = GetControlSupport(fd, V4L2_CID_TILT_ABSOLUTE); - control_support.zoom = GetControlSupport(fd, V4L2_CID_ZOOM_ABSOLUTE); - return control_support; -} - -bool VideoCaptureDeviceFactoryLinux::GetControlSupport(int fd, int control_id) { - v4l2_queryctrl range = {}; - range.id = control_id; - range.type = V4L2_CTRL_TYPE_INTEGER; - return DoIoctl(fd, VIDIOC_QUERYCTRL, &range) == 0 && - range.minimum < range.maximum; -} - -bool VideoCaptureDeviceFactoryLinux::HasUsableFormats(int fd, - uint32_t capabilities) { - if (!(capabilities & V4L2_CAP_VIDEO_CAPTURE)) - return false; - - const std::vector<uint32_t>& usable_fourccs = - VideoCaptureDeviceLinux::GetListOfUsableFourCCs(false); - v4l2_fmtdesc fmtdesc = {}; - fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - for (; DoIoctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) == 0; ++fmtdesc.index) { - if (base::Contains(usable_fourccs, fmtdesc.pixelformat)) - return true; - } - - DVLOG(1) << "No usable formats found"; - return false; -} - -std::vector<float> VideoCaptureDeviceFactoryLinux::GetFrameRateList( - int fd, - uint32_t fourcc, - uint32_t width, - uint32_t height) { - std::vector<float> frame_rates; - - v4l2_frmivalenum frame_interval = {}; - frame_interval.pixel_format = fourcc; - frame_interval.width = width; - frame_interval.height = height; - for (; DoIoctl(fd, VIDIOC_ENUM_FRAMEINTERVALS, &frame_interval) == 0; - ++frame_interval.index) { - if (frame_interval.type == V4L2_FRMIVAL_TYPE_DISCRETE) { - if (frame_interval.discrete.numerator != 0) { - frame_rates.push_back( - frame_interval.discrete.denominator / - static_cast<float>(frame_interval.discrete.numerator)); - } - } else if (frame_interval.type == V4L2_FRMIVAL_TYPE_CONTINUOUS || - frame_interval.type == V4L2_FRMIVAL_TYPE_STEPWISE) { - // TODO(mcasas): see http://crbug.com/249953, support these devices. - NOTIMPLEMENTED_LOG_ONCE(); - break; - } - } - // Some devices, e.g. Kinect, do not enumerate any frame rates, see - // http://crbug.com/412284. Set their frame_rate to zero. - if (frame_rates.empty()) - frame_rates.push_back(0); - return frame_rates; -} - -void VideoCaptureDeviceFactoryLinux::GetSupportedFormatsForV4L2BufferType( - int fd, - VideoCaptureFormats* supported_formats) { - v4l2_fmtdesc v4l2_format = {}; - v4l2_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - for (; DoIoctl(fd, VIDIOC_ENUM_FMT, &v4l2_format) == 0; ++v4l2_format.index) { - VideoCaptureFormat supported_format; - supported_format.pixel_format = - VideoCaptureDeviceLinux::V4l2FourCcToChromiumPixelFormat( - v4l2_format.pixelformat); - - if (supported_format.pixel_format == PIXEL_FORMAT_UNKNOWN) - continue; - - v4l2_frmsizeenum frame_size = {}; - frame_size.pixel_format = v4l2_format.pixelformat; - for (; DoIoctl(fd, VIDIOC_ENUM_FRAMESIZES, &frame_size) == 0; - ++frame_size.index) { - if (frame_size.type == V4L2_FRMSIZE_TYPE_DISCRETE) { - supported_format.frame_size.SetSize(frame_size.discrete.width, - frame_size.discrete.height); - } else if (frame_size.type == V4L2_FRMSIZE_TYPE_STEPWISE || - frame_size.type == V4L2_FRMSIZE_TYPE_CONTINUOUS) { - // TODO(mcasas): see http://crbug.com/249953, support these devices. - NOTIMPLEMENTED_LOG_ONCE(); - continue; - } - - const std::vector<float> frame_rates = GetFrameRateList( - fd, v4l2_format.pixelformat, frame_size.discrete.width, - frame_size.discrete.height); - for (const auto& frame_rate : frame_rates) { - supported_format.frame_rate = frame_rate; - supported_formats->push_back(supported_format); - DVLOG(1) << VideoCaptureFormat::ToString(supported_format); - } - } - } + factory_->GetDevicesInfo(std::move(callback)); } } // namespace media
diff --git a/media/capture/video/linux/video_capture_device_factory_linux.h b/media/capture/video/linux/video_capture_device_factory_linux.h index c1ae143..5c4cfd10 100644 --- a/media/capture/video/linux/video_capture_device_factory_linux.h +++ b/media/capture/video/linux/video_capture_device_factory_linux.h
@@ -9,14 +9,6 @@ #include "media/capture/video/video_capture_device_factory.h" -#include <memory> -#include <string> -#include <vector> - -#include "base/task/single_thread_task_runner.h" -#include "media/capture/video/linux/v4l2_capture_device.h" -#include "media/capture/video_capture_types.h" - namespace media { // Extension of VideoCaptureDeviceFactory to create and manipulate Linux @@ -24,14 +16,6 @@ class CAPTURE_EXPORT VideoCaptureDeviceFactoryLinux : public VideoCaptureDeviceFactory { public: - class CAPTURE_EXPORT DeviceProvider { - public: - virtual ~DeviceProvider() {} - virtual void GetDeviceIds(std::vector<std::string>* target_container) = 0; - virtual std::string GetDeviceModelId(const std::string& device_id) = 0; - virtual std::string GetDeviceDisplayName(const std::string& device_id) = 0; - }; - explicit VideoCaptureDeviceFactoryLinux( scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); @@ -42,32 +26,12 @@ ~VideoCaptureDeviceFactoryLinux() override; - void SetV4L2EnvironmentForTesting( - scoped_refptr<V4L2CaptureDevice> v4l2, - std::unique_ptr<DeviceProvider> device_provider); - VideoCaptureErrorOrDevice CreateDevice( const VideoCaptureDeviceDescriptor& device_descriptor) override; void GetDevicesInfo(GetDevicesInfoCallback callback) override; private: - // Simple wrapper to do HANDLE_EINTR(v4l2_->ioctl(fd, ...)). - int DoIoctl(int fd, int request, void* argp); - - VideoCaptureControlSupport GetControlSupport(int fd); - bool GetControlSupport(int fd, int control_id); - bool HasUsableFormats(int fd, uint32_t capabilities); - std::vector<float> GetFrameRateList(int fd, - uint32_t fourcc, - uint32_t width, - uint32_t height); - void GetSupportedFormatsForV4L2BufferType( - int fd, - VideoCaptureFormats* supported_formats); - - scoped_refptr<V4L2CaptureDevice> v4l2_; - std::unique_ptr<DeviceProvider> device_provider_; - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; + std::unique_ptr<VideoCaptureDeviceFactory> factory_; }; } // namespace media
diff --git a/media/capture/video/linux/video_capture_device_factory_v4l2.cc b/media/capture/video/linux/video_capture_device_factory_v4l2.cc new file mode 100644 index 0000000..3ae03cb7 --- /dev/null +++ b/media/capture/video/linux/video_capture_device_factory_v4l2.cc
@@ -0,0 +1,339 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/capture/video/linux/video_capture_device_factory_v4l2.h" + +#include <errno.h> +#include <fcntl.h> +#include <stdint.h> +#include <sys/ioctl.h> + +#include <algorithm> +#include <utility> + +#include "base/containers/contains.h" +#include "base/files/file_enumerator.h" +#include "base/files/file_util.h" +#include "base/posix/eintr_wrapper.h" +#include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" +#include "base/task/single_thread_task_runner.h" +#include "build/build_config.h" +#include "media/capture/video/linux/scoped_v4l2_device_fd.h" +#include "media/capture/video/linux/video_capture_device_linux.h" + +#if BUILDFLAG(IS_OPENBSD) +#include <sys/videoio.h> +#else +#include <linux/videodev2.h> +#endif + +namespace media { + +namespace { + +bool CompareCaptureDevices(const VideoCaptureDeviceInfo& a, + const VideoCaptureDeviceInfo& b) { + return a.descriptor < b.descriptor; +} + +// USB VID and PID are both 4 bytes long. +const size_t kVidPidSize = 4; +const size_t kMaxInterfaceNameSize = 256; + +// /sys/class/video4linux/video{N}/device is a symlink to the corresponding +// USB device info directory. +const char kVidPathTemplate[] = "/sys/class/video4linux/%s/device/../idVendor"; +const char kPidPathTemplate[] = "/sys/class/video4linux/%s/device/../idProduct"; +const char kInterfacePathTemplate[] = + "/sys/class/video4linux/%s/device/interface"; + +bool ReadIdFile(const std::string& path, std::string* id) { + char id_buf[kVidPidSize]; + FILE* file = fopen(path.c_str(), "rb"); + if (!file) { + return false; + } + const bool success = fread(id_buf, kVidPidSize, 1, file) == 1; + fclose(file); + if (!success) { + return false; + } + id->append(id_buf, kVidPidSize); + return true; +} + +std::string ExtractFileNameFromDeviceId(const std::string& device_id) { + // |unique_id| is of the form "/dev/video2". |file_name| is "video2". + const char kDevDir[] = "/dev/"; + DCHECK(base::StartsWith(device_id, kDevDir, base::CompareCase::SENSITIVE)); + return device_id.substr(strlen(kDevDir), device_id.length()); +} + +class DevVideoFilePathsDeviceProvider + : public VideoCaptureDeviceFactoryV4L2::DeviceProvider { + public: + void GetDeviceIds(std::vector<std::string>* target_container) override { + const base::FilePath path("/dev/"); + base::FileEnumerator enumerator(path, false, base::FileEnumerator::FILES, + "video*"); + while (!enumerator.Next().empty()) { + const base::FileEnumerator::FileInfo info = enumerator.GetInfo(); + target_container->emplace_back(path.value() + info.GetName().value()); + } + } + + std::string GetDeviceModelId(const std::string& device_id) override { + const std::string file_name = ExtractFileNameFromDeviceId(device_id); + std::string usb_id; + const std::string vid_path = + base::StringPrintf(kVidPathTemplate, file_name.c_str()); + if (!ReadIdFile(vid_path, &usb_id)) { + return usb_id; + } + + usb_id.append(":"); + const std::string pid_path = + base::StringPrintf(kPidPathTemplate, file_name.c_str()); + if (!ReadIdFile(pid_path, &usb_id)) { + usb_id.clear(); + } + + return usb_id; + } + + std::string GetDeviceDisplayName(const std::string& device_id) override { + const std::string file_name = ExtractFileNameFromDeviceId(device_id); + const std::string interface_path = + base::StringPrintf(kInterfacePathTemplate, file_name.c_str()); + std::string display_name; + if (!base::ReadFileToStringWithMaxSize(base::FilePath(interface_path), + &display_name, + kMaxInterfaceNameSize)) { + return std::string(); + } + return display_name; + } +}; + +} // namespace + +VideoCaptureDeviceFactoryV4L2::VideoCaptureDeviceFactoryV4L2( + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) + : v4l2_(base::MakeRefCounted<V4L2CaptureDeviceImpl>()), + device_provider_(std::make_unique<DevVideoFilePathsDeviceProvider>()), + ui_task_runner_(ui_task_runner) {} + +VideoCaptureDeviceFactoryV4L2::~VideoCaptureDeviceFactoryV4L2() = default; + +void VideoCaptureDeviceFactoryV4L2::SetV4L2EnvironmentForTesting( + scoped_refptr<V4L2CaptureDevice> v4l2, + std::unique_ptr<VideoCaptureDeviceFactoryV4L2::DeviceProvider> + device_provider) { + v4l2_ = std::move(v4l2); + device_provider_ = std::move(device_provider); +} + +VideoCaptureErrorOrDevice VideoCaptureDeviceFactoryV4L2::CreateDevice( + const VideoCaptureDeviceDescriptor& device_descriptor) { + DCHECK(thread_checker_.CalledOnValidThread()); + auto self = + std::make_unique<VideoCaptureDeviceLinux>(v4l2_.get(), device_descriptor); + + // Test opening the device driver. This is to make sure it is available. + // We will reopen it again in our worker thread when someone + // allocates the camera. + ScopedV4L2DeviceFD fd( + v4l2_.get(), + HANDLE_EINTR(v4l2_->open(device_descriptor.device_id.c_str(), O_RDONLY))); + if (!fd.is_valid()) { + DLOG(ERROR) << "Cannot open device"; + return VideoCaptureErrorOrDevice( + VideoCaptureError::kV4L2FailedToOpenV4L2DeviceDriverFile); + } + + return VideoCaptureErrorOrDevice(std::move(self)); +} + +void VideoCaptureDeviceFactoryV4L2::GetDevicesInfo( + GetDevicesInfoCallback callback) { + DCHECK(thread_checker_.CalledOnValidThread()); + std::vector<VideoCaptureDeviceInfo> devices_info; + std::vector<std::string> filepaths; + device_provider_->GetDeviceIds(&filepaths); + for (auto& unique_id : filepaths) { + const ScopedV4L2DeviceFD fd( + v4l2_.get(), HANDLE_EINTR(v4l2_->open(unique_id.c_str(), O_RDONLY))); + if (!fd.is_valid()) { + DLOG(ERROR) << "Couldn't open " << unique_id; + continue; + } + // Test if this is a V4L2CaptureDevice capture device and if it has at least + // one supported capture format. Devices that have capture and output + // capabilities at the same time are memory-to-memory and are skipped, see + // http://crbug.com/139356. + // In theory, checking for CAPTURE/OUTPUT in caps.capabilities should only + // be done if V4L2_CAP_DEVICE_CAPS is not set. However, this was not done + // in the past and it is unclear if it breaks with existing devices. And if + // a device is accepted incorrectly then it will not have any usable + // formats and is skipped anyways. + v4l2_capability cap; + if ((DoIoctl(fd.get(), VIDIOC_QUERYCAP, &cap) == 0) && + ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE && + !(cap.capabilities & V4L2_CAP_VIDEO_OUTPUT)) || + (cap.capabilities & V4L2_CAP_DEVICE_CAPS && + cap.device_caps & V4L2_CAP_VIDEO_CAPTURE && + !(cap.device_caps & V4L2_CAP_VIDEO_OUTPUT))) && + HasUsableFormats(fd.get(), cap.capabilities)) { + const std::string model_id = + device_provider_->GetDeviceModelId(unique_id); + std::string display_name = + device_provider_->GetDeviceDisplayName(unique_id); + if (display_name.empty()) { + display_name = reinterpret_cast<char*>(cap.card); + } + + VideoFacingMode facing_mode = VideoFacingMode::MEDIA_VIDEO_FACING_NONE; + + VideoCaptureFormats supported_formats; + GetSupportedFormatsForV4L2BufferType(fd.get(), &supported_formats); + if (supported_formats.empty()) { + DVLOG(1) << "No supported formats: " << unique_id; + continue; + } + + devices_info.emplace_back(VideoCaptureDeviceDescriptor( + display_name, unique_id, model_id, + VideoCaptureApi::LINUX_V4L2_SINGLE_PLANE, GetControlSupport(fd.get()), + VideoCaptureTransportType::OTHER_TRANSPORT, facing_mode)); + + devices_info.back().supported_formats = std::move(supported_formats); + } + } + + // This is required for some applications that rely on the stable ordering of + // devices. + std::sort(devices_info.begin(), devices_info.end(), CompareCaptureDevices); + + std::move(callback).Run(std::move(devices_info)); +} + +int VideoCaptureDeviceFactoryV4L2::DoIoctl(int fd, int request, void* argp) { + return HANDLE_EINTR(v4l2_->ioctl(fd, request, argp)); +} + +// Check if the video capture device supports pan, tilt and zoom controls. +VideoCaptureControlSupport VideoCaptureDeviceFactoryV4L2::GetControlSupport( + int fd) { + VideoCaptureControlSupport control_support; + control_support.pan = GetControlSupport(fd, V4L2_CID_PAN_ABSOLUTE); + control_support.tilt = GetControlSupport(fd, V4L2_CID_TILT_ABSOLUTE); + control_support.zoom = GetControlSupport(fd, V4L2_CID_ZOOM_ABSOLUTE); + return control_support; +} + +bool VideoCaptureDeviceFactoryV4L2::GetControlSupport(int fd, int control_id) { + v4l2_queryctrl range = {}; + range.id = control_id; + range.type = V4L2_CTRL_TYPE_INTEGER; + return DoIoctl(fd, VIDIOC_QUERYCTRL, &range) == 0 && + range.minimum < range.maximum; +} + +bool VideoCaptureDeviceFactoryV4L2::HasUsableFormats(int fd, + uint32_t capabilities) { + if (!(capabilities & V4L2_CAP_VIDEO_CAPTURE)) { + return false; + } + + const std::vector<uint32_t>& usable_fourccs = + VideoCaptureDeviceLinux::GetListOfUsableFourCCs(false); + v4l2_fmtdesc fmtdesc = {}; + fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + for (; DoIoctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) == 0; ++fmtdesc.index) { + if (base::Contains(usable_fourccs, fmtdesc.pixelformat)) { + return true; + } + } + + DVLOG(1) << "No usable formats found"; + return false; +} + +std::vector<float> VideoCaptureDeviceFactoryV4L2::GetFrameRateList( + int fd, + uint32_t fourcc, + uint32_t width, + uint32_t height) { + std::vector<float> frame_rates; + + v4l2_frmivalenum frame_interval = {}; + frame_interval.pixel_format = fourcc; + frame_interval.width = width; + frame_interval.height = height; + for (; DoIoctl(fd, VIDIOC_ENUM_FRAMEINTERVALS, &frame_interval) == 0; + ++frame_interval.index) { + if (frame_interval.type == V4L2_FRMIVAL_TYPE_DISCRETE) { + if (frame_interval.discrete.numerator != 0) { + frame_rates.push_back( + frame_interval.discrete.denominator / + static_cast<float>(frame_interval.discrete.numerator)); + } + } else if (frame_interval.type == V4L2_FRMIVAL_TYPE_CONTINUOUS || + frame_interval.type == V4L2_FRMIVAL_TYPE_STEPWISE) { + // TODO(mcasas): see http://crbug.com/249953, support these devices. + NOTIMPLEMENTED_LOG_ONCE(); + break; + } + } + // Some devices, e.g. Kinect, do not enumerate any frame rates, see + // http://crbug.com/412284. Set their frame_rate to zero. + if (frame_rates.empty()) { + frame_rates.push_back(0); + } + return frame_rates; +} + +void VideoCaptureDeviceFactoryV4L2::GetSupportedFormatsForV4L2BufferType( + int fd, + VideoCaptureFormats* supported_formats) { + v4l2_fmtdesc v4l2_format = {}; + v4l2_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + for (; DoIoctl(fd, VIDIOC_ENUM_FMT, &v4l2_format) == 0; ++v4l2_format.index) { + VideoCaptureFormat supported_format; + supported_format.pixel_format = + VideoCaptureDeviceLinux::V4l2FourCcToChromiumPixelFormat( + v4l2_format.pixelformat); + + if (supported_format.pixel_format == PIXEL_FORMAT_UNKNOWN) { + continue; + } + + v4l2_frmsizeenum frame_size = {}; + frame_size.pixel_format = v4l2_format.pixelformat; + for (; DoIoctl(fd, VIDIOC_ENUM_FRAMESIZES, &frame_size) == 0; + ++frame_size.index) { + if (frame_size.type == V4L2_FRMSIZE_TYPE_DISCRETE) { + supported_format.frame_size.SetSize(frame_size.discrete.width, + frame_size.discrete.height); + } else if (frame_size.type == V4L2_FRMSIZE_TYPE_STEPWISE || + frame_size.type == V4L2_FRMSIZE_TYPE_CONTINUOUS) { + // TODO(mcasas): see http://crbug.com/249953, support these devices. + NOTIMPLEMENTED_LOG_ONCE(); + continue; + } + + const std::vector<float> frame_rates = GetFrameRateList( + fd, v4l2_format.pixelformat, frame_size.discrete.width, + frame_size.discrete.height); + for (const auto& frame_rate : frame_rates) { + supported_format.frame_rate = frame_rate; + supported_formats->push_back(supported_format); + DVLOG(1) << VideoCaptureFormat::ToString(supported_format); + } + } + } +} + +} // namespace media
diff --git a/media/capture/video/linux/video_capture_device_factory_v4l2.h b/media/capture/video/linux/video_capture_device_factory_v4l2.h new file mode 100644 index 0000000..5a51b7c5 --- /dev/null +++ b/media/capture/video/linux/video_capture_device_factory_v4l2.h
@@ -0,0 +1,73 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Implementation of a VideoCaptureDeviceFactoryV4L2 class. + +#ifndef MEDIA_CAPTURE_VIDEO_LINUX_VIDEO_CAPTURE_DEVICE_FACTORY_V4L2_H_ +#define MEDIA_CAPTURE_VIDEO_LINUX_VIDEO_CAPTURE_DEVICE_FACTORY_V4L2_H_ + +#include "media/capture/video/video_capture_device_factory.h" + +#include <memory> +#include <string> +#include <vector> + +#include "base/task/single_thread_task_runner.h" +#include "media/capture/video/linux/v4l2_capture_device.h" +#include "media/capture/video_capture_types.h" + +namespace media { + +// Extension of VideoCaptureDeviceFactory to create and manipulate Linux +// devices. +class CAPTURE_EXPORT VideoCaptureDeviceFactoryV4L2 + : public VideoCaptureDeviceFactory { + public: + class CAPTURE_EXPORT DeviceProvider { + public: + virtual ~DeviceProvider() {} + virtual void GetDeviceIds(std::vector<std::string>* target_container) = 0; + virtual std::string GetDeviceModelId(const std::string& device_id) = 0; + virtual std::string GetDeviceDisplayName(const std::string& device_id) = 0; + }; + + explicit VideoCaptureDeviceFactoryV4L2( + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); + + VideoCaptureDeviceFactoryV4L2(const VideoCaptureDeviceFactoryV4L2&) = delete; + VideoCaptureDeviceFactoryV4L2& operator=( + const VideoCaptureDeviceFactoryV4L2&) = delete; + + ~VideoCaptureDeviceFactoryV4L2() override; + + void SetV4L2EnvironmentForTesting( + scoped_refptr<V4L2CaptureDevice> v4l2, + std::unique_ptr<DeviceProvider> device_provider); + + VideoCaptureErrorOrDevice CreateDevice( + const VideoCaptureDeviceDescriptor& device_descriptor) override; + void GetDevicesInfo(GetDevicesInfoCallback callback) override; + + private: + // Simple wrapper to do HANDLE_EINTR(v4l2_->ioctl(fd, ...)). + int DoIoctl(int fd, int request, void* argp); + + VideoCaptureControlSupport GetControlSupport(int fd); + bool GetControlSupport(int fd, int control_id); + bool HasUsableFormats(int fd, uint32_t capabilities); + std::vector<float> GetFrameRateList(int fd, + uint32_t fourcc, + uint32_t width, + uint32_t height); + void GetSupportedFormatsForV4L2BufferType( + int fd, + VideoCaptureFormats* supported_formats); + + scoped_refptr<V4L2CaptureDevice> v4l2_; + std::unique_ptr<DeviceProvider> device_provider_; + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; +}; + +} // namespace media +#endif // MEDIA_CAPTURE_VIDEO_LINUX_VIDEO_CAPTURE_DEVICE_FACTORY_V4L2_H_
diff --git a/media/capture/video/linux/video_capture_device_factory_linux_unittest.cc b/media/capture/video/linux/video_capture_device_factory_v4l2_unittest.cc similarity index 90% rename from media/capture/video/linux/video_capture_device_factory_linux_unittest.cc rename to media/capture/video/linux/video_capture_device_factory_v4l2_unittest.cc index 7894461..d4d3e371 100644 --- a/media/capture/video/linux/video_capture_device_factory_linux_unittest.cc +++ b/media/capture/video/linux/video_capture_device_factory_v4l2_unittest.cc
@@ -1,8 +1,8 @@ -// Copyright 2016 The Chromium Authors +// Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/capture/video/linux/video_capture_device_factory_linux.h" +#include "media/capture/video/linux/video_capture_device_factory_v4l2.h" #include "base/memory/raw_ptr.h" #include "base/run_loop.h" @@ -20,14 +20,14 @@ namespace media { -class VideoCaptureDeviceFactoryLinuxTest +class VideoCaptureDeviceFactoryV4L2Test : public ::testing::TestWithParam<VideoCaptureDeviceDescriptor> { public: - VideoCaptureDeviceFactoryLinuxTest() {} - ~VideoCaptureDeviceFactoryLinuxTest() override = default; + VideoCaptureDeviceFactoryV4L2Test() {} + ~VideoCaptureDeviceFactoryV4L2Test() override = default; void SetUp() override { - factory_ = std::make_unique<VideoCaptureDeviceFactoryLinux>( + factory_ = std::make_unique<VideoCaptureDeviceFactoryV4L2>( base::SingleThreadTaskRunner::GetCurrentDefault()); scoped_refptr<FakeV4L2Impl> fake_v4l2(new FakeV4L2Impl()); fake_v4l2_ = fake_v4l2.get(); @@ -40,12 +40,12 @@ void TearDown() override { task_environment_.RunUntilIdle(); } base::test::TaskEnvironment task_environment_; - std::unique_ptr<VideoCaptureDeviceFactoryLinux> factory_; + std::unique_ptr<VideoCaptureDeviceFactoryV4L2> factory_; raw_ptr<FakeV4L2Impl> fake_v4l2_; raw_ptr<FakeDeviceProvider> fake_device_provider_; }; -TEST_P(VideoCaptureDeviceFactoryLinuxTest, EnumerateSingleFakeV4L2DeviceUsing) { +TEST_P(VideoCaptureDeviceFactoryV4L2Test, EnumerateSingleFakeV4L2DeviceUsing) { // Setup const VideoCaptureDeviceDescriptor& descriptor = GetParam(); fake_device_provider_->AddDevice(descriptor); @@ -77,7 +77,7 @@ INSTANTIATE_TEST_SUITE_P( All, - VideoCaptureDeviceFactoryLinuxTest, + VideoCaptureDeviceFactoryV4L2Test, ::testing::Values( VideoCaptureDeviceDescriptor("Fake Device 0", "/dev/video0", @@ -92,7 +92,7 @@ VideoCaptureApi::UNKNOWN, /*control_support=*/{true, true, true}))); -TEST_F(VideoCaptureDeviceFactoryLinuxTest, +TEST_F(VideoCaptureDeviceFactoryV4L2Test, ReceiveFramesFromSinglePlaneFakeDevice) { // Setup const std::string stub_display_name = "Fake Device 0";
diff --git a/mojo/core/data_pipe_unittest.cc b/mojo/core/data_pipe_unittest.cc index 4cd6078..6102c76 100644 --- a/mojo/core/data_pipe_unittest.cc +++ b/mojo/core/data_pipe_unittest.cc
@@ -12,6 +12,7 @@ #include "base/location.h" #include "base/run_loop.h" #include "base/task/sequenced_task_runner.h" +#include "base/test/bind.h" #include "base/test/task_environment.h" #include "build/build_config.h" #include "mojo/core/embedder/embedder.h" @@ -19,6 +20,7 @@ #include "mojo/public/c/system/data_pipe.h" #include "mojo/public/c/system/functions.h" #include "mojo/public/c/system/message_pipe.h" +#include "mojo/public/cpp/system/data_pipe.h" #include "mojo/public/cpp/system/message_pipe.h" #include "mojo/public/cpp/system/simple_watcher.h" #include "testing/gtest/include/gtest/gtest.h" @@ -1761,6 +1763,101 @@ #if !BUILDFLAG(IS_IOS) +constexpr size_t kNoSpuriousEvents_NumIterations = 1000; + +TEST_F(DataPipeTest, NoSpuriousEvents) { + // Regression test for https://crbug.com/1409259. Verifies that data pipe read + // events are never spurious. + RunTestClient("NoSpuriousEventsHost", [&](MojoHandle host) { + RunTestClient("NoSpuriousEventsClient", [&](MojoHandle client) { + MojoHandle host_to_client; + MojoHandle client_to_host; + MojoCreateMessagePipe(nullptr, &host_to_client, &client_to_host); + WriteMessageWithHandles(host, "x", &host_to_client, 1); + WriteMessageWithHandles(client, "x", &client_to_host, 1); + EXPECT_EQ("done", ReadMessage(client)); + WriteMessage(client, "bye"); + }); + EXPECT_EQ("done", ReadMessage(host)); + WriteMessage(host, "bye"); + }); +} + +DEFINE_TEST_CLIENT_TEST_WITH_PIPE(NoSpuriousEventsHost, DataPipeTest, parent) { + const char kData[1024] = {'x'}; + + MojoHandle client; + EXPECT_EQ("x", ReadMessageWithHandles(parent, &client, 1)); + + for (size_t j = 0; j < kNoSpuriousEvents_NumIterations; ++j) { + ScopedDataPipeProducerHandle producer; + ScopedDataPipeConsumerHandle consumer; + CHECK_EQ(MOJO_RESULT_OK, mojo::CreateDataPipe(2048, producer, consumer)); + + MojoHandle ch = consumer.release().value(); + WriteMessageWithHandles(client, "hi", &ch, 1); + + for (size_t i = 0; i < 9; ++i) { + WaitForSignals(producer.get().value(), MOJO_HANDLE_SIGNAL_WRITABLE); + uint32_t size = 512; + producer->WriteData(kData, &size, MOJO_WRITE_DATA_FLAG_NONE); + } + } + + WriteMessage(parent, "done"); + EXPECT_EQ("bye", ReadMessage(parent)); + MojoClose(client); + MojoClose(parent); +} + +DEFINE_TEST_CLIENT_TEST_WITH_PIPE(NoSpuriousEventsClient, + DataPipeTest, + parent) { + base::test::TaskEnvironment task_environment; + + MojoHandle host; + EXPECT_EQ("x", ReadMessageWithHandles(parent, &host, 1)); + + size_t num_spurious_events = 0; + for (size_t j = 0; j < kNoSpuriousEvents_NumIterations; ++j) { + MojoHandle ch; + ASSERT_EQ("hi", ReadMessageWithHandles(host, &ch, 1)); + ScopedDataPipeConsumerHandle consumer(DataPipeConsumerHandle{ch}); + + SimpleWatcher watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::MANUAL); + base::RunLoop loop; + watcher.Watch(consumer.get(), MOJO_HANDLE_SIGNAL_READABLE, + MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED, + base::BindLambdaForTesting( + [&](MojoResult result, const HandleSignalsState& state) { + if (result == MOJO_RESULT_OK) { + if (!state.readable()) { + ++num_spurious_events; + } + + // Drain everything. + const void* buffer; + uint32_t num_bytes; + consumer->BeginReadData(&buffer, &num_bytes, 0); + consumer->EndReadData(num_bytes); + watcher.ArmOrNotify(); + } else { + CHECK(state.never_readable()); + loop.Quit(); + } + })); + watcher.ArmOrNotify(); + loop.Run(); + } + + EXPECT_EQ(0u, num_spurious_events); + + WriteMessage(parent, "done"); + EXPECT_EQ("bye", ReadMessage(parent)); + MojoClose(host); + MojoClose(parent); +} + TEST_F(DataPipeTest, Multiprocess) { const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kMultiprocessTestData));
diff --git a/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm_from_proto_macros.tmpl b/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm_from_proto_macros.tmpl index e39f4e56..749aed9 100644 --- a/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm_from_proto_macros.tmpl +++ b/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm_from_proto_macros.tmpl
@@ -215,7 +215,7 @@ output = static_cast<{{mojom_type}}>(input); return true; {%- else %} - return mojo::EnumTraits<{{enum_type}}, {{mojom_type}}>::FromMojom( + return ::mojo::EnumTraits<{{enum_type}}, {{mojom_type}}>::FromMojom( static_cast<{{enum_type}}>(input), &output); {%- endif %} } @@ -319,7 +319,7 @@ {%- set dataview_type = (union|get_qualified_name_for_kind(flatten_nested_kind=True)) ~ "DataView" %} {%- set data_type = (union|get_qualified_name_for_kind(flatten_nested_kind=True, internal=True)) %} ::mojo::Message mojolpm_message(0, 0, 0, 0, nullptr); - mojo::internal::MessageFragment<{{data_type}}> mojolpm_fragment( + ::mojo::internal::MessageFragment<{{data_type}}> mojolpm_fragment( mojolpm_message); ::mojo::internal::Serializer<{{dataview_type}}, const {{union_type}}>::Serialize(
diff --git a/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm_to_proto_macros.tmpl b/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm_to_proto_macros.tmpl index 6b498220..96355a8 100644 --- a/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm_to_proto_macros.tmpl +++ b/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm_to_proto_macros.tmpl
@@ -179,7 +179,9 @@ } {%- if kind.value_kind|is_nullable_kind %} if ({{util.not_null(kind.value_kind, 'in_entry.second')}}) { -{%- if kind.value_kind|is_move_only_kind %} +{%- if kind.value_kind|is_struct_kind %} + result = ToProto(std::move(in_entry.second), *out_entry->mutable_value()); +{%- elif kind.value_kind|is_move_only_kind %} result = ToProto(std::move(*in_entry.second), *out_entry->mutable_value()); {%- else %} result = ToProto(*in_entry.second, *out_entry->mutable_value()); @@ -286,7 +288,7 @@ return true; {%- else %} output = static_cast<{{proto_type}}>( - mojo::EnumTraits<{{enum_type}}, {{mojom_type}}>::ToMojom(input)); + ::mojo::EnumTraits<{{enum_type}}, {{mojom_type}}>::ToMojom(input)); return true; {%- endif %} }{{"\n"-}}
diff --git a/net/http/http_stream_parser.cc b/net/http/http_stream_parser.cc index 3de540bb..947e016 100644 --- a/net/http/http_stream_parser.cc +++ b/net/http/http_stream_parser.cc
@@ -166,7 +166,8 @@ data_ = real_data_; } - raw_ptr<char, AllowPtrArithmetic> real_data_; + // DanglingUntriaged because it is assigned a DanglingUntriaged pointer. + raw_ptr<char, DanglingUntriaged | AllowPtrArithmetic> real_data_; const int capacity_; int size_ = 0; int used_ = 0;
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index a894974..27fdf76 100644 --- a/net/http/transport_security_state_static.pins +++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2023-02-19 12:54 UTC +# Last updated: 2023-02-20 12:54 UTC PinsListTimestamp -1676811294 +1676897673 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/quic/quic_http_stream.h b/net/quic/quic_http_stream.h index c4d743c..812bc4e 100644 --- a/net/quic/quic_http_stream.h +++ b/net/quic/quic_http_stream.h
@@ -166,7 +166,8 @@ bool can_send_early_ = false; // The request body to send, if any, owned by the caller. - raw_ptr<UploadDataStream> request_body_stream_ = nullptr; + // DanglingUntriaged because it is assigned a DanglingUntriaged pointer. + raw_ptr<UploadDataStream, DanglingUntriaged> request_body_stream_ = nullptr; // Time the request was issued. base::Time request_time_; // The priority of the request.
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 9185403..76b4a0a 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -5818,9 +5818,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "isolate_profile_data": true, "merge": { "args": [], @@ -5832,8 +5832,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [ @@ -5989,9 +5989,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "isolate_profile_data": true, "merge": { "args": [], @@ -6003,8 +6003,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [ @@ -6141,9 +6141,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "isolate_profile_data": true, "merge": { "args": [], @@ -6155,8 +6155,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json index af4823d..256dabe 100644 --- a/testing/buildbot/chromium.coverage.json +++ b/testing/buildbot/chromium.coverage.json
@@ -20507,9 +20507,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "isolate_profile_data": true, "merge": { "args": [], @@ -20521,8 +20521,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [ @@ -20678,9 +20678,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "isolate_profile_data": true, "merge": { "args": [], @@ -20692,8 +20692,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [ @@ -20830,9 +20830,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "isolate_profile_data": true, "merge": { "args": [], @@ -20844,8 +20844,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index a3ba17b4..28ddee73 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -57176,9 +57176,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -57189,8 +57189,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [ @@ -57347,9 +57347,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -57360,8 +57360,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [ @@ -57499,9 +57499,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -57512,8 +57512,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [ @@ -59037,9 +59037,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -59050,8 +59050,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [ @@ -59208,9 +59208,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -59221,8 +59221,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [ @@ -59360,9 +59360,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -59373,8 +59373,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [ @@ -60146,9 +60146,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -60159,8 +60159,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 53f6a8f0..445204e 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -18533,12 +18533,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "isolate_profile_data": true, "merge": { "args": [], @@ -18550,8 +18550,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [ @@ -18724,12 +18724,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "isolate_profile_data": true, "merge": { "args": [], @@ -18741,8 +18741,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [ @@ -18891,12 +18891,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 112.0.5607.0", + "description": "Run with ash-chrome version 112.0.5609.0", "isolate_profile_data": true, "merge": { "args": [], @@ -18908,8 +18908,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5607.0", - "revision": "version:112.0.5607.0" + "location": "lacros_version_skew_tests_v112.0.5609.0", + "revision": "version:112.0.5609.0" } ], "dimension_sets": [
diff --git a/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter b/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter index 45b40708..363f42c 100644 --- a/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter +++ b/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter
@@ -15,6 +15,7 @@ SwitchAccess* VpnExtensionObserverBrowserTest* WebAppsCrosapiBrowserTest* +WebAppProviderBridgeBrowserTest* WebKioskAshRequiresLacrosTest* # TODO(b/262789941) Enable more accessibility tests. -ChromeVoxBackgroundTest.TabSwitchAndRefreshRecovery
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index d5d5bcf..be7c7d3 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -22,16 +22,16 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5607.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5609.0/test_ash_chrome', ], - 'description': 'Run with ash-chrome version 112.0.5607.0', + 'description': 'Run with ash-chrome version 112.0.5609.0', 'identifier': 'Lacros version skew testing ash canary', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v112.0.5607.0', - 'revision': 'version:112.0.5607.0', + 'location': 'lacros_version_skew_tests_v112.0.5609.0', + 'revision': 'version:112.0.5609.0', }, ], },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index e5f889e3..a2941ac 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -2371,6 +2371,28 @@ ] } ], + "CanvasCompressHibernatedImage": [ + { + "platforms": [ + "android", + "android_weblayer", + "android_webview", + "chromeos", + "chromeos_lacros", + "fuchsia", + "linux", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "CanvasCompressHibernatedImage" + ] + } + ] + } + ], "CanvasFreeMemoryWhenHidden": [ { "platforms": [ @@ -11845,6 +11867,28 @@ ] } ], + "ThrottleOffscreenAnimatingSvgImages": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "chromeos_lacros", + "fuchsia", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "ThrottleOffscreenAnimatingSvgImages" + ] + } + ] + } + ], "TopChromeWebUIUsesSpareRenderer": [ { "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 8da417f..8a204c7 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -1699,7 +1699,7 @@ BASE_FEATURE(kThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes, "ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); bool IsThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframesEnabled() { static bool throttling_disabled = @@ -1755,5 +1755,9 @@ "max-fcp-delay", 100); +BASE_FEATURE(kWebRtcStatsReportIdl, + "WebRtcStatsReportIdl", + base::FEATURE_DISABLED_BY_DEFAULT); + } // namespace features } // namespace blink
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 1d93cf3..9923448c 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -977,6 +977,9 @@ // See https://crbug.com/1393246. BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kExtendScriptResourceLifetime); +// Use WebIDL instead of iteration to populate RTCStatsReport. +BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kWebRtcStatsReportIdl); + // Makes preloaded fonts render-blocking up to the limits below. // See https://crbug.com/1412861 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kRenderBlockingFonts);
diff --git a/third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom b/third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom index 8536737b..3d1f9c01 100644 --- a/third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom +++ b/third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom
@@ -62,6 +62,14 @@ network.mojom.DnsQueryType.UNSPECIFIED; }; +struct DirectTCPServerSocketOptions { + network.mojom.IPEndPoint local_addr; + + // |backlog| defines the size of the OS accept queue. |backlog| = 0 represents + // an optional value that will be substituted by a reasonable default. + uint32 backlog = 0; +}; + // This wraps network.mojom.NetworkContext and handles extra work such as // permission checking, chooser showing, etc. // The browser process implements the interface, and the renderer process @@ -107,4 +115,15 @@ => (int32 result, network.mojom.IPEndPoint? local_addr, network.mojom.IPEndPoint? peer_addr); + + // Creates a listening (server) TCP socket configured with |options|. + // + // On success, |result| is net::OK and |local_addr| is set to the real local + // address used. + // On failure, |result| is a negative network error code. |local_addr| is + // null. + OpenTCPServerSocket( + DirectTCPServerSocketOptions options, + pending_receiver<network.mojom.TCPServerSocket> receiver) + => (int32 result, network.mojom.IPEndPoint? local_addr); };
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom index 9b3b21d..c0fe8e5 100644 --- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom +++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -3753,7 +3753,7 @@ kServiceWorkerSkippedForEmptyFetchHandler = 4412, kImageSet = 4413, kWindowCloseHistoryLengthOne = 4414, - kCreateNSResolverWithNonElements = 4415, + kOBSOLETE_CreateNSResolverWithNonElements = 4415, kCSSValueAppearanceNonStandard = 4416, kCSSGetComputedAnimationDelayZero = 4417, kGetEffectTimingDelayZero = 4418, @@ -3813,6 +3813,7 @@ kCSSColorColorSpecifiedSpace = 4472, kCSSColorLabOklab = 4473, kCSSColorLchOklch = 4474, + kCreateNSResolverWithNonElements2 = 4475, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni index 5307c96d..69a6a3ac 100644 --- a/third_party/blink/renderer/bindings/generated_in_modules.gni +++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -103,8 +103,6 @@ generated_dictionary_sources_in_modules = [ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_aac_encoder_config.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_aac_encoder_config.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_codec_specifics_vp_8.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_codec_specifics_vp_8.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ad_properties.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ad_properties.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ad_request_config.cc", @@ -127,10 +125,10 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_auction_ad_config.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_auction_ad_interest_group.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_auction_ad_interest_group.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_auction_report_buyers_config.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_auction_report_buyers_config.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_auction_ad_interest_group_size.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_auction_ad_interest_group_size.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_auction_report_buyers_config.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_auction_report_buyers_config.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_audio_buffer_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_audio_buffer_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_audio_buffer_source_options.cc", @@ -171,12 +169,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_client_inputs.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_client_outputs.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_client_outputs.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_inputs.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_inputs.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_outputs.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_outputs.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_values.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_values.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_device_public_key_inputs.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_device_public_key_inputs.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_device_public_key_outputs.cc", @@ -187,6 +179,12 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_large_blob_outputs.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_payment_inputs.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_payment_inputs.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_inputs.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_inputs.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_outputs.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_outputs.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_values.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_values.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authenticator_selection_criteria.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_authenticator_selection_criteria.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_avc_encoder_config.cc", @@ -555,8 +553,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_idb_transaction_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_idb_version_change_event_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_idb_version_change_event_init.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_standard_claims.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_standard_claims.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_claim_requirement.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_claim_requirement.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_logout_r_ps_request.cc", @@ -565,6 +561,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_request_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_provider_config.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_provider_config.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_standard_claims.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_standard_claims.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_user_info.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_user_info.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_idle_options.cc", @@ -675,6 +673,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_midi_permission_descriptor.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_clamp_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_clamp_options.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_compute_result.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_compute_result.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_context_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_context_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_conv_2d_options.cc", @@ -819,8 +819,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_push_subscription_change_event_init.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_push_subscription_options_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_push_subscription_options_init.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_top_level_storage_access_permission_descriptor.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_top_level_storage_access_permission_descriptor.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_query_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_query_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_registration_options.cc", @@ -835,12 +833,24 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rsa_other_primes_info.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_answer_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_answer_options.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_audio_playout_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_audio_playout_stats.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_audio_source_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_audio_source_stats.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_certificate_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_certificate_stats.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_codec_specifics_vp_8.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_codec_specifics_vp_8.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_codec_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_codec_stats.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_configuration.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_configuration.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_data_channel_event_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_data_channel_event_init.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_data_channel_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_data_channel_init.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_data_channel_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_data_channel_stats.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_dtls_fingerprint.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_dtls_fingerprint.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_dtmf_tone_change_event_init.cc", @@ -857,22 +867,44 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_candidate_init.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_candidate_pair.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_candidate_pair.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_candidate_pair_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_candidate_pair_stats.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_candidate_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_candidate_stats.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_gather_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_gather_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_parameters.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_parameters.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_server.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_server.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_inbound_rtp_stream_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_inbound_rtp_stream_stats.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_insertable_streams.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_insertable_streams.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_media_source_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_media_source_stats.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_media_stream_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_media_stream_stats.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_media_stream_track_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_media_stream_track_stats.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_offer_answer_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_offer_answer_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_offer_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_offer_options.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_outbound_rtp_stream_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_outbound_rtp_stream_stats.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_peer_connection_ice_error_event_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_peer_connection_ice_error_event_init.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_peer_connection_ice_event_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_peer_connection_ice_event_init.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_peer_connection_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_peer_connection_stats.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_received_rtp_stream_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_received_rtp_stream_stats.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_remote_inbound_rtp_stream_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_remote_inbound_rtp_stream_stats.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_remote_outbound_rtp_stream_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_remote_outbound_rtp_stream_stats.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtcp_parameters.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtcp_parameters.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_capabilities.cc", @@ -899,14 +931,24 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_receive_parameters.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_send_parameters.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_send_parameters.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_stream_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_stream_stats.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_synchronization_source.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_synchronization_source.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_transceiver_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_transceiver_init.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_sent_rtp_stream_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_sent_rtp_stream_stats.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_session_description_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_session_description_init.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_stats.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_track_event_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_track_event_init.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_transport_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_transport_stats.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_video_source_stats.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_video_source_stats.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_sanitizer_config.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_sanitizer_config.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_save_file_picker_options.cc", @@ -973,6 +1015,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_text_decoder_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_text_encoder_encode_into_result.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_text_encoder_encode_into_result.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_top_level_storage_access_permission_descriptor.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_top_level_storage_access_permission_descriptor.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_usb_connection_event_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_usb_connection_event_init.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_usb_control_transfer_parameters.cc", @@ -1324,6 +1368,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_device_preference.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_input_operand_layout.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_input_operand_layout.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_interpolation_mode.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_interpolation_mode.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_model_format.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_model_format.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_operand_type.cc", @@ -1332,8 +1378,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_power_preference.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_rounding_type.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_rounding_type.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_interpolation_mode.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ml_interpolation_mode.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_notification_action_type.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_notification_action_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_notification_direction.cc", @@ -1380,10 +1424,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_pressure_source.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_pressure_state.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_pressure_state.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_decode_target_indication.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_decode_target_indication.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_video_codec_type.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_video_codec_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_public_key_credential_type.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_public_key_credential_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_push_encryption_key_name.cc", @@ -1398,8 +1438,12 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_bundle_policy.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_data_channel_state.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_data_channel_state.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_decode_target_indication.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_decode_target_indication.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_degradation_preference.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_degradation_preference.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_dtls_role.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_dtls_role.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_dtls_transport_state.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_dtls_transport_state.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_encoded_video_frame_type.cc", @@ -1418,16 +1462,22 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_protocol.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_role.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_role.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_server_transport_protocol.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_server_transport_protocol.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_tcp_candidate_type.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_tcp_candidate_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_transport_policy.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_transport_policy.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_transport_state.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_transport_state.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_network_type.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_network_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_peer_connection_state.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_peer_connection_state.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_priority_type.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_priority_type.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_quality_limitation_reason.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_quality_limitation_reason.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtcp_mux_policy.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtcp_mux_policy.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_transceiver_direction.cc", @@ -1438,6 +1488,12 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_sdp_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_signaling_state.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_signaling_state.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_stats_ice_candidate_pair_state.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_stats_ice_candidate_pair_state.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_stats_type.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_stats_type.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_video_codec_type.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_rtc_video_codec_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_screen_idle_state.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_screen_idle_state.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_self_capture_preference_enum.cc",
diff --git a/third_party/blink/renderer/core/css/build.gni b/third_party/blink/renderer/core/css/build.gni index 6193387..c066d4c2b 100644 --- a/third_party/blink/renderer/core/css/build.gni +++ b/third_party/blink/renderer/core/css/build.gni
@@ -694,6 +694,7 @@ "ua_counter_style_map.cc", "vision_deficiency.cc", "vision_deficiency.h", + "white_space.h", "zoom_adjusted_pixel_value.h", ]
diff --git a/third_party/blink/renderer/core/css/css_image_set_value.cc b/third_party/blink/renderer/core/css/css_image_set_value.cc index b105d600..8439b55 100644 --- a/third_party/blink/renderer/core/css/css_image_set_value.cc +++ b/third_party/blink/renderer/core/css/css_image_set_value.cc
@@ -28,12 +28,14 @@ #include <algorithm> #include "third_party/blink/public/common/loader/referrer_utils.h" +#include "third_party/blink/renderer/core/css/css_gradient_value.h" #include "third_party/blink/renderer/core/css/css_image_value.h" #include "third_party/blink/renderer/core/css/css_numeric_literal_value.h" #include "third_party/blink/renderer/core/css/css_primitive_value.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/loader/resource/image_resource_content.h" +#include "third_party/blink/renderer/core/style/style_generated_image.h" #include "third_party/blink/renderer/core/style/style_image_set.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_type_names.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h" @@ -115,24 +117,50 @@ StyleImage* CSSImageSetValue::CacheImage( const Document& document, const float device_scale_factor, - FetchParameters::ImageRequestBehavior image_request_behavior, - CrossOriginAttributeValue cross_origin) { + const FetchParameters::ImageRequestBehavior image_request_behavior, + const CrossOriginAttributeValue cross_origin, + const CSSToLengthConversionData::ContainerSizes& container_sizes) { if (IsCachePending(device_scale_factor)) { - const ImageSetOption& best_option = GetBestOption(device_scale_factor); + StyleImage* style_image = + GetImageToCache(device_scale_factor, document, image_request_behavior, + cross_origin, container_sizes); - const auto& image_value = To<CSSImageValue>(Item(best_option.index)); - - cached_image_ = MakeGarbageCollected<StyleImageSet>( - const_cast<CSSImageValue*>(&image_value) - ->CacheImage(document, image_request_behavior, cross_origin, - best_option.resolution), - this); + cached_image_ = MakeGarbageCollected<StyleImageSet>(style_image, this); cached_device_scale_factor_ = device_scale_factor; } + return cached_image_.Get(); } +StyleImage* CSSImageSetValue::GetImageToCache( + const float device_scale_factor, + const Document& document, + const FetchParameters::ImageRequestBehavior image_request_behavior, + const CrossOriginAttributeValue cross_origin, + const CSSToLengthConversionData::ContainerSizes& container_sizes) { + const ImageSetOption& best_option = GetBestOption(device_scale_factor); + + const CSSValue& image_value = Item(best_option.index); + + if (auto* image = + const_cast<CSSImageValue*>(DynamicTo<CSSImageValue>(image_value))) { + return image->CacheImage(document, image_request_behavior, cross_origin, + best_option.resolution); + } + + if (!RuntimeEnabledFeatures::CSSImageSetEnabled()) { + return nullptr; + } + + if (auto* gradient = DynamicTo<cssvalue::CSSGradientValue>(image_value)) { + return MakeGarbageCollected<StyleGeneratedImage>(*gradient, + container_sizes); + } + + return nullptr; +} + String CSSImageSetValue::CustomCSSText() const { StringBuilder result; @@ -176,27 +204,39 @@ CSSValueList::TraceAfterDispatch(visitor); } -CSSImageSetValue* CSSImageSetValue::ComputedCSSValue() { +CSSImageSetValue* CSSImageSetValue::ComputedCSSValue( + const ComputedStyle& style, + const bool allow_visited_style) const { auto* value = MakeGarbageCollected<CSSImageSetValue>(); - for (auto& item : *this) { - auto* image_value = DynamicTo<CSSImageValue>(item.Get()); - if (image_value != nullptr) { - value->Append(*image_value->ComputedCSSValue()); - continue; - } - auto* resolution = DynamicTo<CSSNumericLiteralValue>(item.Get()); - if (resolution != nullptr && resolution->IsResolution() && - resolution->GetType() != CSSPrimitiveValue::UnitType::kDotsPerPixel && - RuntimeEnabledFeatures::CSSImageSetEnabled()) { - auto* canonical_resolution = CSSNumericLiteralValue::Create( + for (auto& item : *this) { + value->Append( + *ComputedCSSValueForOption(item.Get(), style, allow_visited_style)); + } + + return value; +} + +const CSSValue* CSSImageSetValue::ComputedCSSValueForOption( + const CSSValue* value, + const ComputedStyle& style, + const bool allow_visited_style) const { + if (auto* image = DynamicTo<CSSImageValue>(value)) { + return image->ComputedCSSValue(); + } + + if (RuntimeEnabledFeatures::CSSImageSetEnabled()) { + if (auto* resolution = DynamicTo<CSSNumericLiteralValue>(value); + resolution && resolution->IsResolution() && + resolution->GetType() != CSSPrimitiveValue::UnitType::kDotsPerPixel) { + return CSSNumericLiteralValue::Create( resolution->ComputeDotsPerPixel(), CSSPrimitiveValue::UnitType::kDotsPerPixel); - value->Append(*canonical_resolution); - continue; } - value->Append(*item); + if (auto* gradient = DynamicTo<cssvalue::CSSGradientValue>(value)) { + return gradient->ComputedCSSValue(style, allow_visited_style); + } } return value;
diff --git a/third_party/blink/renderer/core/css/css_image_set_value.h b/third_party/blink/renderer/core/css/css_image_set_value.h index def7ae88..54787e9 100644 --- a/third_party/blink/renderer/core/css/css_image_set_value.h +++ b/third_party/blink/renderer/core/css/css_image_set_value.h
@@ -26,6 +26,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_IMAGE_SET_VALUE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_IMAGE_SET_VALUE_H_ +#include "third_party/blink/renderer/core/css/css_to_length_conversion_data.h" #include "third_party/blink/renderer/core/css/css_value_list.h" #include "third_party/blink/renderer/platform/loader/fetch/cross_origin_attribute_value.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h" @@ -47,12 +48,15 @@ StyleImage* CacheImage( const Document& document, const float device_scale_factor, - FetchParameters::ImageRequestBehavior image_request_behavior, - CrossOriginAttributeValue = kCrossOriginAttributeNotSet); + const FetchParameters::ImageRequestBehavior image_request_behavior, + const CrossOriginAttributeValue cross_origin, + const CSSToLengthConversionData::ContainerSizes& container_sizes); String CustomCSSText() const; - CSSImageSetValue* ComputedCSSValue(); + // Gets the computed CSS value of the image-set. + CSSImageSetValue* ComputedCSSValue(const ComputedStyle& style, + const bool allow_visited_style) const; bool HasFailedOrCanceledSubresources() const; @@ -66,6 +70,19 @@ const ImageSetOption& GetBestOption(const float device_scale_factor); + StyleImage* GetImageToCache( + const float device_scale_factor, + const Document& document, + const FetchParameters::ImageRequestBehavior image_request_behavior, + const CrossOriginAttributeValue cross_origin, + const CSSToLengthConversionData::ContainerSizes& container_sizes); + + // Gets the computed CSS value of image-set-option components. + const CSSValue* ComputedCSSValueForOption( + const CSSValue* value, + const ComputedStyle& style, + const bool allow_visited_style) const; + Member<StyleImage> cached_image_; float cached_device_scale_factor_{1.0f};
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5 index 71d4a64..f2fe483d 100644 --- a/third_party/blink/renderer/core/css/css_properties.json5 +++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -5881,12 +5881,15 @@ property_methods: ["CSSValueFromComputedStyleInternal"], independent: false, // Actually true, but setting it to false saves a precious bit in ComputedStyleBase. inherited: true, - field_template: "bitset_keyword", + // This property is "keyword" but use "primitive" to use `EWhiteSpace` defined manually. + field_template: "primitive", + field_size: 4, // Ensure this is in sync with `kEWhiteSpaceBits`. + include_paths: ["third_party/blink/renderer/core/css/white_space.h"], keywords: [ "normal", "pre", "pre-wrap", "pre-line", "nowrap", "break-spaces" ], typedom_types: ["Keyword"], - default_value: "normal", + default_value: "EWhiteSpace::kNormal", valid_for_cue: true, valid_for_marker: true, },
diff --git a/third_party/blink/renderer/core/css/css_value_id_mappings.h b/third_party/blink/renderer/core/css/css_value_id_mappings.h index c4e7a1e..8f7c9f4 100644 --- a/third_party/blink/renderer/core/css/css_value_id_mappings.h +++ b/third_party/blink/renderer/core/css/css_value_id_mappings.h
@@ -366,6 +366,48 @@ return kScrollbarGutterAuto; } +template <> +inline EWhiteSpace CssValueIDToPlatformEnum(CSSValueID v) { + switch (v) { + case CSSValueID::kNormal: + return EWhiteSpace::kNormal; + case CSSValueID::kPre: + return EWhiteSpace::kPre; + case CSSValueID::kPreWrap: + return EWhiteSpace::kPreWrap; + case CSSValueID::kPreLine: + return EWhiteSpace::kPreLine; + case CSSValueID::kNowrap: + return EWhiteSpace::kNowrap; + case CSSValueID::kBreakSpaces: + return EWhiteSpace::kBreakSpaces; + default: + NOTREACHED(); + return EWhiteSpace::kNormal; + } +} + +template <> +inline CSSValueID PlatformEnumToCSSValueID(EWhiteSpace v) { + switch (v) { + case EWhiteSpace::kNormal: + return CSSValueID::kNormal; + case EWhiteSpace::kNowrap: + return CSSValueID::kNowrap; + case EWhiteSpace::kPre: + return CSSValueID::kPre; + case EWhiteSpace::kPreLine: + return CSSValueID::kPreLine; + case EWhiteSpace::kPreWrap: + return CSSValueID::kPreWrap; + case EWhiteSpace::kBreakSpaces: + return CSSValueID::kBreakSpaces; + default: + NOTREACHED(); + return CSSValueID::kNone; + } +} + } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_VALUE_ID_MAPPINGS_H_
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_token.h b/third_party/blink/renderer/core/css/parser/css_parser_token.h index 00fd49f..45401aba 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_token.h +++ b/third_party/blink/renderer/core/css/parser/css_parser_token.h
@@ -245,6 +245,12 @@ union { UChar delimiter_; HashTokenType hash_token_type_; + // NOTE: For DimensionToken, this value stores the numeric part, + // value_data_char_raw_ (or value_data_char_inline_) stores the + // unit as text, and unit_ stores the unit as enum (assuming it + // is a valid unit). So for e.g. “100px”, numeric_value_ = 100.0, + // value_length_ = 2, value_data_char_inline_ = "px", and + // unit_ = kPixels. double numeric_value_; mutable int id_;
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h b/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h index d539186..90d629e 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h +++ b/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h
@@ -174,36 +174,69 @@ // token and return false. bool ConsumeCommentOrNothing(); + // Consume tokens until one of these is true: + // + // - EOF is reached. + // - The next token would signal a premature end of the current block + // (an unbalanced } or similar). + // - The next token is of any of the given types, except if it occurs + // within a block. + // + // The range of tokens that we consume is returned. So e.g., if we ask + // to stop at semicolons, and the rest of the input looks like + // “.foo { color; } bar ; baz”, we would return “.foo { color; } bar ” + // and stop there (the semicolon would remain in the lookahead slot). + // // Invalidates any ranges created by previous calls to - // ConsumeUntilPeekedTypeIs() + // ConsumeUntilPeekedTypeIs(). template <CSSParserTokenType... Types> CSSParserTokenRange ConsumeUntilPeekedTypeIs() { EnsureLookAhead(); - buffer_.Shrink(0); - while (!UncheckedAtEnd() && - !detail::IsTokenTypeOneOf<Types...>(UncheckedPeek().GetType())) { - ConsumeTokenOrBlockAndAppendToBuffer(); + // Check if the existing lookahead token already marks the end; + // if so, try to exit as soon as possible. (This is a fairly common + // case, because some places call ConsumeUntilPeekedTypeIs() just to + // ignore garbage after a declaration, and there usually is no such + // garbage.) + if (next_.IsEOF() || TokenMarksEnd<Types...>(next_)) { + return CSSParserTokenRange(base::span<CSSParserToken>{}); } + buffer_.Shrink(0); + + // Process the lookahead token. + buffer_.push_back(next_); + unsigned nesting_level = 0; + if (next_.GetBlockType() == CSSParserToken::kBlockStart) { + nesting_level++; + } + + // Add tokens to our return vector until we see either EOF or we meet the + // return condition. (The termination condition is within the loop.) + while (true) { + buffer_.push_back(tokenizer_.TokenizeSingle()); + if (buffer_.back().IsEOF() || + (nesting_level == 0 && TokenMarksEnd<Types...>(buffer_.back()))) { + // Undo the token we just pushed; it goes into the lookahead slot + // instead. + next_ = buffer_.back(); + buffer_.pop_back(); + break; + } else if (buffer_.back().GetBlockType() == CSSParserToken::kBlockStart) { + nesting_level++; + } else if (buffer_.back().GetBlockType() == CSSParserToken::kBlockEnd) { + nesting_level--; + } + } return CSSParserTokenRange(buffer_); } private: - inline void ConsumeTokenOrBlockAndAppendToBuffer() { - // Have to use internal consume/peek in here because they can read past - // start/end of blocks - unsigned nesting_level = 0; - do { - const CSSParserToken& token = UncheckedConsumeInternal(); - buffer_.push_back(token); - - if (token.GetBlockType() == CSSParserToken::kBlockStart) { - nesting_level++; - } else if (token.GetBlockType() == CSSParserToken::kBlockEnd) { - nesting_level--; - } - } while (!PeekInternal().IsEOF() && nesting_level); + template <CSSParserTokenType... EndTypes> + ALWAYS_INLINE bool TokenMarksEnd(const CSSParserToken& token) { + return (boundaries_ & FlagForTokenType(token.GetType())) || + token.GetBlockType() == CSSParserToken::kBlockEnd || + detail::IsTokenTypeOneOf<EndTypes...>(token.GetType()); } const CSSParserToken& PeekInternal() {
diff --git a/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc b/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc index a480622..75e1554 100644 --- a/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc +++ b/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc
@@ -732,6 +732,36 @@ TestImageSetParsing("image-set('' 1x)", "image-set(url(\"\") 1x)"); } +TEST(CSSPropertyParserTest, ImageSetLinearGradient) { + TestImageSetParsing("image-set(linear-gradient(red, blue) 1x)", + "image-set(linear-gradient(red, blue) 1x)"); +} + +TEST(CSSPropertyParserTest, ImageSetRepeatingLinearGradient) { + TestImageSetParsing("image-set(repeating-linear-gradient(red, blue 25%) 1x)", + "image-set(repeating-linear-gradient(red, blue 25%) 1x)"); +} + +TEST(CSSPropertyParserTest, ImageSetRadialGradient) { + TestImageSetParsing("image-set(radial-gradient(red, blue) 1x)", + "image-set(radial-gradient(red, blue) 1x)"); +} + +TEST(CSSPropertyParserTest, ImageSetRepeatingRadialGradient) { + TestImageSetParsing("image-set(repeating-radial-gradient(red, blue 25%) 1x)", + "image-set(repeating-radial-gradient(red, blue 25%) 1x)"); +} + +TEST(CSSPropertyParserTest, ImageSetConicGradient) { + TestImageSetParsing("image-set(conic-gradient(red, blue) 1x)", + "image-set(conic-gradient(red, blue) 1x)"); +} + +TEST(CSSPropertyParserTest, ImageSetRepeatingConicGradient) { + TestImageSetParsing("image-set(repeating-conic-gradient(red, blue 25%) 1x)", + "image-set(repeating-conic-gradient(red, blue 25%) 1x)"); +} + void TestImageSetParsingFailure(const String& testValue) { const CSSValue* value = CSSParser::ParseSingleValue( CSSPropertyID::kBackgroundImage, testValue, @@ -747,6 +777,10 @@ TestImageSetParsingFailure("image-set(1x)"); } +TEST(CSSPropertyParserTest, ImageSetOnlyOneGradientColor) { + TestImageSetParsingFailure("image-set(linear-gradient(red) 1x)"); +} + TEST(CSSPropertyParserTest, InternalLightDarkAuthor) { auto* context = MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext);
diff --git a/third_party/blink/renderer/core/css/post_style_update_scope.cc b/third_party/blink/renderer/core/css/post_style_update_scope.cc index 383af82e0..2ba34f22 100644 --- a/third_party/blink/renderer/core/css/post_style_update_scope.cc +++ b/third_party/blink/renderer/core/css/post_style_update_scope.cc
@@ -43,12 +43,12 @@ } bool PostStyleUpdateScope::Apply() { - bool pseudo_needs_update = ApplyPseudo(); - if (document_.RemoveFinishedTopLayerElements() || pseudo_needs_update) { + if (ApplyPseudo()) { return true; } ApplyAnimations(); document_.ClearFocusedElementIfNeeded(); + document_.RemoveFinishedTopLayerElements(); return false; }
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc index 5ca0dcf1..fb2b6093 100644 --- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc +++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -3480,8 +3480,11 @@ context.IsAdRelated()); } -static CSSValue* ConsumeImageSet(CSSParserTokenRange& range, - const CSSParserContext& context) { +static CSSValue* ConsumeImageSet( + CSSParserTokenRange& range, + const CSSParserContext& context, + ConsumeGeneratedImagePolicy generated_image_policy = + ConsumeGeneratedImagePolicy::kAllow) { CSSParserTokenRange range_copy = range; CSSParserTokenRange args = ConsumeFunction(range_copy); auto* image_set = MakeGarbageCollected<CSSImageSetValue>(); @@ -3491,15 +3494,27 @@ ? ConsumeUrlOrStringAsStringView(args, context) : ConsumeUrlAsStringView(args, context)) .ToAtomicString(); - if (url_value.IsNull()) { - return nullptr; - } + if (!url_value.IsNull()) { + CSSImageValue* image = + CreateCSSImageValueWithReferrer(url_value, context); - CSSImageValue* image = CreateCSSImageValueWithReferrer(url_value, context); - if (context.Mode() == kUASheetMode) { - image->SetInitiator(fetch_initiator_type_names::kUacss); + if (context.Mode() == kUASheetMode) { + image->SetInitiator(fetch_initiator_type_names::kUacss); + } + + image_set->Append(*image); + } else { + if (!RuntimeEnabledFeatures::CSSImageSetEnabled()) { + return nullptr; + } + + CSSValue* gen_image = ConsumeGeneratedImage(args, context); + if (gen_image == nullptr) { + return nullptr; + } + + image_set->Append(*gen_image); } - image_set->Append(*image); if (args.Peek().GetType() != kDimensionToken && RuntimeEnabledFeatures::CSSImageSetEnabled()) { @@ -3554,7 +3569,7 @@ if (id == CSSValueID::kWebkitImageSet || (id == CSSValueID::kImageSet && RuntimeEnabledFeatures::CSSImageSetEnabled())) { - return ConsumeImageSet(range, context); + return ConsumeImageSet(range, context, generated_image_policy); } if (generated_image_policy == ConsumeGeneratedImagePolicy::kAllow && IsGeneratedImage(id)) {
diff --git a/third_party/blink/renderer/core/css/resolver/element_style_resources.cc b/third_party/blink/renderer/core/css/resolver/element_style_resources.cc index a31be32..1ee91ceb 100644 --- a/third_party/blink/renderer/core/css/resolver/element_style_resources.cc +++ b/third_party/blink/renderer/core/css/resolver/element_style_resources.cc
@@ -131,7 +131,8 @@ if (auto* image_set_value = DynamicTo<CSSImageSetValue>(value)) { return image_set_value->CacheImage(document_, device_scale_factor_, - image_request_behavior, cross_origin); + image_request_behavior, cross_origin, + container_sizes); } NOTREACHED();
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 66126f9..0fa95909 100644 --- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc +++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -188,9 +188,6 @@ if (element == element->GetDocument().documentElement()) { return true; } - if (element->IsInTopLayer()) { - return true; - } if (IsA<SVGForeignObjectElement>(*element)) { return true; } @@ -275,15 +272,6 @@ IsA<HTMLRTElement>(element); } -// FIXME: This helper is only needed because ResolveStyle passes a null -// element to AdjustComputedStyle for pseudo-element styles, so we can't just -// use element->isInTopLayer(). -static bool IsInTopLayer(const Element* element, - const ComputedStyleBuilder& builder) { - return (element && element->IsInTopLayer()) || - builder.StyleType() == kPseudoIdBackdrop; -} - static bool LayoutParentStyleForcesZIndexToCreateStackingContext( const ComputedStyle& layout_parent_style) { return layout_parent_style.IsDisplayFlexibleOrGridBox(); @@ -853,13 +841,21 @@ AdjustStyleForSvgElement(*svg_element, builder); } + if (!RuntimeEnabledFeatures::CSSTopLayerForTransitionsEnabled()) { + if ((element && element->IsInTopLayer()) || + builder.StyleType() == kPseudoIdBackdrop || + builder.StyleType() == kPseudoIdViewTransition) { + builder.SetTopLayer(ETopLayer::kBrowser); + } + } + bool is_document_element = element && element->GetDocument().documentElement() == element; // Per the spec, position 'static' and 'relative' in the top layer compute // to 'absolute'. Root elements that are in the top layer should just // be left alone because the fullscreen.css doesn't apply any style to // them. - if (IsInTopLayer(element, builder) && !is_document_element) { + if (builder.TopLayer() == ETopLayer::kBrowser && !is_document_element) { if (builder.GetPosition() == EPosition::kStatic || builder.GetPosition() == EPosition::kRelative) { builder.SetPosition(EPosition::kAbsolute); @@ -935,6 +931,10 @@ builder.SetForcesStackingContext(true); } + if (builder.TopLayer() == ETopLayer::kBrowser) { + builder.SetForcesStackingContext(true); + } + if (builder.OverflowX() != EOverflow::kVisible || builder.OverflowY() != EOverflow::kVisible) { AdjustOverflow(builder, element ? element : state.GetPseudoElement());
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc b/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc index 324c140..1492afe8 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc
@@ -13,6 +13,7 @@ #include "third_party/blink/renderer/core/animation/element_animations.h" #include "third_party/blink/renderer/core/css/calculation_expression_anchor_query_node.h" #include "third_party/blink/renderer/core/css/cascade_layer_map.h" +#include "third_party/blink/renderer/core/css/css_image_set_value.h" #include "third_party/blink/renderer/core/css/css_image_value.h" #include "third_party/blink/renderer/core/css/css_test_helpers.h" #include "third_party/blink/renderer/core/css/css_value_list.h" @@ -383,6 +384,7 @@ GetCSSPropertyBackgroundImage(), style); const CSSValueList* bg_img_list = To<CSSValueList>(computed_value); + return To<CSSImageValue>(bg_img_list->Item(0)); } @@ -391,6 +393,20 @@ return GetBackgroundImageValue(element->ComputedStyleRef()); } +const CSSImageSetValue& GetBackgroundImageSetValue(const ComputedStyle& style) { + const CSSValue* computed_value = ComputedStyleUtils::ComputedPropertyValue( + GetCSSPropertyBackgroundImage(), style); + + const CSSValueList* bg_img_list = To<CSSValueList>(computed_value); + + return To<CSSImageSetValue>(bg_img_list->Item(0)); +} + +const CSSImageSetValue& GetBackgroundImageSetValue(const Element* element) { + DCHECK(element); + return GetBackgroundImageSetValue(element->ComputedStyleRef()); +} + } // namespace TEST_F(StyleResolverTest, BackgroundImageFetch) { @@ -403,6 +419,10 @@ #inside-none { background-image: url(img-inside-none.png); } + #none-image-set { + display: none; + background-image: image-set(url(img-none.png) 1x); + } #hidden { visibility: hidden; background-image: url(img-hidden.png); @@ -446,6 +466,8 @@ <div id="none"> <div id="inside-none"></div> </div> + <div id="none-image-set"> + </div> <div id="hidden"> <div id="inside-hidden"></div> </div> @@ -473,6 +495,7 @@ auto* none = GetDocument().getElementById("none"); auto* inside_none = GetDocument().getElementById("inside-none"); + auto* none_image_set = GetDocument().getElementById("none-image-set"); auto* hidden = GetDocument().getElementById("hidden"); auto* inside_hidden = GetDocument().getElementById("inside-hidden"); auto* contents = GetDocument().getElementById("contents"); @@ -485,6 +508,7 @@ inside_none->EnsureComputedStyle(); non_slotted->EnsureComputedStyle(); + none_image_set->EnsureComputedStyle(); auto* before_style = no_pseudo->EnsureComputedStyle(kPseudoIdBefore); auto* first_line_style = first_line->EnsureComputedStyle(kPseudoIdFirstLine); auto* first_line_span_style = @@ -508,6 +532,8 @@ << "No fetch for display:none"; EXPECT_TRUE(GetBackgroundImageValue(inside_none).IsCachePending()) << "No fetch inside display:none"; + EXPECT_TRUE(GetBackgroundImageSetValue(none_image_set).IsCachePending(1.0f)) + << "No fetch for display:none"; EXPECT_FALSE(GetBackgroundImageValue(hidden).IsCachePending()) << "Fetch for visibility:hidden"; EXPECT_FALSE(GetBackgroundImageValue(inside_hidden).IsCachePending())
diff --git a/third_party/blink/renderer/core/css/rule_set.cc b/third_party/blink/renderer/core/css/rule_set.cc index 3a35aa72..8ad434b 100644 --- a/third_party/blink/renderer/core/css/rule_set.cc +++ b/third_party/blink/renderer/core/css/rule_set.cc
@@ -302,6 +302,9 @@ template <class Func> static void MarkAsCoveredByBucketing(CSSSelector& selector, Func&& should_mark_func) { + if (!RuntimeEnabledFeatures::CSSEasySelectorsEnabled()) { + return; + } for (CSSSelector* s = &selector;; ++s) { // Termination condition within loop. if (should_mark_func(*s)) { @@ -767,7 +770,9 @@ rules.bucket_number = num_buckets++; } RuleData rule_data_copy = rule_data; - rule_data_copy.ComputeEntirelyCoveredByBucketing(); + if (RuntimeEnabledFeatures::CSSEasySelectorsEnabled()) { + rule_data_copy.ComputeEntirelyCoveredByBucketing(); + } rule_data_copy.SetBucketInformation(rules.bucket_number, /*order_in_bucket=*/rules.length++); backing.push_back(std::move(rule_data_copy));
diff --git a/third_party/blink/renderer/core/css/transition.css b/third_party/blink/renderer/core/css/transition.css index a86b5a6..3438ed5 100644 --- a/third_party/blink/renderer/core/css/transition.css +++ b/third_party/blink/renderer/core/css/transition.css
@@ -13,6 +13,9 @@ position: fixed; inset: 0; pointer-events: none; + /* TODO(crbug.com/1417609): ::view-transition is not rendered in the top layer + per spec, but our implementation currently does. */ + top-layer: browser !important; } html::view-transition-group(*) {
diff --git a/third_party/blink/renderer/core/css/white_space.h b/third_party/blink/renderer/core/css/white_space.h new file mode 100644 index 0000000..cfd99d0 --- /dev/null +++ b/third_party/blink/renderer/core/css/white_space.h
@@ -0,0 +1,98 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_WHITE_SPACE_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_WHITE_SPACE_H_ + +#include <cstdint> + +namespace blink { + +// Semantic behaviors of the `white-space` property. All values of the +// `white-space` property can be expressed by combinations of these bits. +enum class WhiteSpaceBehavior : uint8_t { + kPreserveSpacesAndTabs = 1, + kPreserveBreaks = 2, + kPreserveAllWhiteSpaces = kPreserveSpacesAndTabs | kPreserveBreaks, + kNoWrapLine = 4, + kBreakSpaces = 8, + // Ensure `kWhiteSpaceBehaviorBits` has enough bits. +}; + +// Ensure this is in sync with `css_properties.json5`. +static constexpr int kWhiteSpaceBehaviorBits = 4; + +constexpr WhiteSpaceBehavior operator|(WhiteSpaceBehavior a, + WhiteSpaceBehavior b) { + return static_cast<WhiteSpaceBehavior>(static_cast<unsigned>(a) | + static_cast<unsigned>(b)); +} + +// The `white-space` property. +// https://w3c.github.io/csswg-drafts/css-text-4/#propdef-white-space +enum class EWhiteSpace : uint8_t { + kNormal = 0, + kNowrap = static_cast<uint8_t>(WhiteSpaceBehavior::kNoWrapLine), + kPre = static_cast<uint8_t>(WhiteSpaceBehavior::kPreserveAllWhiteSpaces | + WhiteSpaceBehavior::kNoWrapLine), + kPreLine = static_cast<uint8_t>(WhiteSpaceBehavior::kPreserveBreaks), + kPreWrap = static_cast<uint8_t>(WhiteSpaceBehavior::kPreserveAllWhiteSpaces), + kBreakSpaces = + static_cast<uint8_t>(WhiteSpaceBehavior::kPreserveAllWhiteSpaces | + WhiteSpaceBehavior::kBreakSpaces), +}; + +// Ensure this is in sync with `css_properties.json5`. +static constexpr int kEWhiteSpaceBits = kWhiteSpaceBehaviorBits; + +// +// Functions for semantic behaviors. +// +// Note that functions in `ComputedStyle` are preferred over these functions +// because the `white-space` property may become a shorthand in future. When +// that happens, these functions may be removed, or less performant than +// functions in `ComputedStyle`. +// https://w3c.github.io/csswg-drafts/css-text-4/#propdef-white-space +// + +inline bool IsWhiteSpaceAny(EWhiteSpace value, WhiteSpaceBehavior flags) { + return static_cast<uint8_t>(value) & static_cast<uint8_t>(flags); +} + +// `text-space-collapse`: Collapsing/preserving white-spaces. +// https://w3c.github.io/csswg-drafts/css-text-4/#propdef-text-space-collapse +// Naming TBD: https://github.com/w3c/csswg-drafts/issues/8273 +inline bool ShouldPreserveBreaks(EWhiteSpace value) { + return IsWhiteSpaceAny(value, WhiteSpaceBehavior::kPreserveBreaks); +} +inline bool ShouldPreserveSpacesAndTabs(EWhiteSpace value) { + return IsWhiteSpaceAny(value, WhiteSpaceBehavior::kPreserveSpacesAndTabs); +} +inline bool ShouldCollapseBreaks(EWhiteSpace value) { + return !ShouldPreserveBreaks(value); +} +inline bool ShouldCollapseSpacesAndTabs(EWhiteSpace value) { + return !ShouldPreserveSpacesAndTabs(value); +} + +// `text-wrap` and `white-space`: Wrap/nowrap and trailing/braeking spaces. +// https://w3c.github.io/csswg-drafts/css-text-4/#propdef-text-wrap +// `break-spaces` TBD: https://github.com/w3c/csswg-drafts/issues/3794 +inline bool ShouldWrapLine(EWhiteSpace value) { + return !IsWhiteSpaceAny(value, WhiteSpaceBehavior::kNoWrapLine); +} +inline bool ShouldWrapLineBreakingSpaces(EWhiteSpace value) { + // `ShouldWrapLine` should be `true` if `break-spaces`. + DCHECK(!IsWhiteSpaceAny(value, WhiteSpaceBehavior::kBreakSpaces) || + ShouldWrapLine(value)); + return IsWhiteSpaceAny(value, WhiteSpaceBehavior::kBreakSpaces); +} +inline bool ShouldWrapLineTrailingSpaces(EWhiteSpace value) { + return ShouldWrapLine(value) && + !IsWhiteSpaceAny(value, WhiteSpaceBehavior::kBreakSpaces); +} + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_WHITE_SPACE_H_
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index a6e4aa6..43aa8bcc 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -7786,10 +7786,9 @@ ScheduleLayoutTreeUpdateIfNeeded(); } -bool Document::RemoveFinishedTopLayerElements() { - pending_top_layer_update_ = false; +void Document::RemoveFinishedTopLayerElements() { if (top_layer_elements_pending_removal_.empty()) { - return false; + return; } DCHECK(RuntimeEnabledFeatures::CSSTopLayerForTransitionsEnabled()); HeapVector<Member<Element>> to_remove; @@ -7799,14 +7798,9 @@ to_remove.push_back(element); } } - if (to_remove.empty()) { - return false; - } for (Element* remove_element : to_remove) { RemoveFromTopLayerImmediately(remove_element); } - pending_top_layer_update_ = true; - return true; } void Document::RemoveFromTopLayerImmediately(Element* element) {
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h index 11ba2d1..c5c61af 100644 --- a/third_party/blink/renderer/core/dom/document.h +++ b/third_party/blink/renderer/core/dom/document.h
@@ -1541,7 +1541,7 @@ return top_layer_elements_; } void ScheduleForTopLayerRemoval(Element*); - bool RemoveFinishedTopLayerElements(); + void RemoveFinishedTopLayerElements(); HTMLDialogElement* ActiveModalDialog() const; @@ -1939,8 +1939,6 @@ void ResetAgent(Agent& agent); - bool PendingTopLayerUpdate() const { return pending_top_layer_update_; } - protected: void ClearXMLVersion() { xml_version_ = String(); } @@ -2580,11 +2578,6 @@ bool rendering_has_begun_ = false; - // Set to true if we are in awaiting an UpdateStyleAndLayoutTree() that is - // after removing an element from the top layer. Only used for sanity checking - // pending animation updates in StyleForLayoutObject(). - bool pending_top_layer_update_ = false; - DeclarativeShadowRootAllowState declarative_shadow_root_allow_state_ = DeclarativeShadowRootAllowState::kNotSet;
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 251bfcc2..d5744b5 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -3080,7 +3080,6 @@ // necessary if the animated property flipped back to the old style with no // change as the result. DCHECK(GetDocument().GetStyleEngine().InContainerQueryStyleRecalc() || - GetDocument().PendingTopLayerUpdate() || element_animations->CssAnimations().PendingUpdate().IsEmpty()); element_animations->CssAnimations().ClearPendingUpdate(); } @@ -3193,7 +3192,7 @@ // preceding sibling of the originating element's box which means we will not // reach the box for ::backdrop during layout. Don't skip style recalc for // children of containers in the top layer for this reason. - if (IsInTopLayer()) { + if (style.IsInTopLayer(*this)) { return false; } @@ -6515,7 +6514,7 @@ // force-updating style on the locked subtree and reach this node. Note that // we already detached layout when this element was added to top-layer, so we // simply maintain the fact that it doesn't have a layout object/subtree. - if (IsInTopLayer() && + if (style.IsInTopLayer(*this) && DisplayLockUtilities::LockedAncestorPreventingPaint(*this)) { return false; } @@ -7030,9 +7029,6 @@ DCHECK_EQ(this, GetDocument().documentElement()); return !GetDocument().GetStyleEngine().ViewTransitionTags().empty(); } - if (pseudo_id == kPseudoIdBackdrop && !IsInTopLayer()) { - return false; - } if (pseudo_id == kPseudoIdFirstLetter && IsSVGElement()) { return false; } @@ -7252,11 +7248,22 @@ if (!isConnected()) { return; } + if (!GetDocument().InStyleRecalc()) { - SetForceReattachLayoutTree(); - // Needs a style recalc to update the ForcesStackingContext flag. - SetNeedsStyleRecalc(kLocalStyleChange, StyleChangeReasonForTracing::Create( - style_change_reason::kTopLayer)); + if (in_top_layer) { + // Need to force re-attachment in case the element was removed and re- + // added between two lifecycle updates since the top-layer computed value + // would not change, but the layout object order may have. + SetForceReattachLayoutTree(); + } + + if (!RuntimeEnabledFeatures::CSSTopLayerForTransitionsEnabled()) { + // Needs a style recalc to update the top-layer property in + // StyleAdjuster. + SetNeedsStyleRecalc( + kLocalStyleChange, + StyleChangeReasonForTracing::Create(style_change_reason::kTopLayer)); + } } }
diff --git a/third_party/blink/renderer/core/dom/layout_tree_builder.cc b/third_party/blink/renderer/core/dom/layout_tree_builder.cc index 34c5166..f128756 100644 --- a/third_party/blink/renderer/core/dom/layout_tree_builder.cc +++ b/third_party/blink/renderer/core/dom/layout_tree_builder.cc
@@ -55,16 +55,19 @@ } LayoutObject* LayoutTreeBuilderForElement::NextLayoutObject() const { - if (node_->IsFirstLetterPseudoElement()) + if (node_->IsFirstLetterPseudoElement()) { return context_.next_sibling; - if (node_->IsInTopLayer()) + } + if (style_->IsInTopLayer(*node_)) { return LayoutTreeBuilderTraversal::NextInTopLayer(*node_); + } return LayoutTreeBuilder::NextLayoutObject(); } LayoutObject* LayoutTreeBuilderForElement::ParentLayoutObject() const { - if (node_->IsInTopLayer()) + if (style_->IsInTopLayer(*node_)) { return node_->GetDocument().GetLayoutView(); + } return context_.parent; } @@ -79,7 +82,7 @@ // If we are in the top layer and the parent layout object without top layer // adjustment can't have children, then don't render. // https://github.com/w3c/csswg-drafts/issues/6939#issuecomment-1016671534 - if (node_->IsInTopLayer() && context_.parent && + if (style_->IsInTopLayer(*node_) && context_.parent && !context_.parent->CanHaveChildren() && node_->GetPseudoId() != kPseudoIdBackdrop) { return;
diff --git a/third_party/blink/renderer/core/dom/layout_tree_builder_traversal.cc b/third_party/blink/renderer/core/dom/layout_tree_builder_traversal.cc index 211171c..bf3f15d 100644 --- a/third_party/blink/renderer/core/dom/layout_tree_builder_traversal.cc +++ b/third_party/blink/renderer/core/dom/layout_tree_builder_traversal.cc
@@ -28,6 +28,7 @@ #include "third_party/blink/renderer/core/css/style_engine.h" #include "third_party/blink/renderer/core/dom/flat_tree_traversal.h" +#include "third_party/blink/renderer/core/dom/node_computed_style.h" #include "third_party/blink/renderer/core/dom/pseudo_element.h" #include "third_party/blink/renderer/core/html_names.h" #include "third_party/blink/renderer/core/layout/layout_object.h" @@ -41,10 +42,7 @@ } static bool IsLayoutObjectReparented(const LayoutObject* layout_object) { - auto* element = DynamicTo<Element>(layout_object->GetNode()); - if (!element) - return false; - return element->IsInTopLayer(); + return layout_object->IsInTopLayer(); } ContainerNode* LayoutTreeBuilderTraversal::Parent(const Node& node) { @@ -346,8 +344,9 @@ LayoutObject* LayoutTreeBuilderTraversal::NextInTopLayer( const Element& element) { - if (!element.IsInTopLayer()) - return nullptr; + DCHECK(element.ComputedStyleRef().IsInTopLayer(element)) + << "This method should only be called with an element in the top layer " + "candidate list which is rendered in the top layer"; const HeapVector<Member<Element>>& top_layer_elements = element.GetDocument().TopLayerElements(); wtf_size_t position = top_layer_elements.Find(&element); @@ -357,8 +356,11 @@ // If top_layer_elements[i] is not a LayoutView child, its LayoutObject is // not re-attached and not in the top layer yet, thus we can not use it as a // sibling LayoutObject. - if (layout_object && IsA<LayoutView>(layout_object->Parent())) + if (layout_object && + layout_object->StyleRef().TopLayer() == ETopLayer::kBrowser && + IsA<LayoutView>(layout_object->Parent())) { return layout_object; + } } return nullptr; }
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc index 4bc66f4..ef222df 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -414,8 +414,6 @@ void WebFrameWidgetImpl::DragTargetDragLeave( const gfx::PointF& point_in_viewport, const gfx::PointF& screen_point) { - DCHECK(current_drag_data_); - // TODO(paulmeyer): It shouldn't be possible for |current_drag_data_| to be // null here, but this is somehow happening (rarely). This suggests that in // some cases drag-leave is happening before drag-enter, which should be
diff --git a/third_party/blink/renderer/core/html/fenced_frame/fence.cc b/third_party/blink/renderer/core/html/fenced_frame/fence.cc index ace229f..a4a4a11 100644 --- a/third_party/blink/renderer/core/html/fenced_frame/fence.cc +++ b/third_party/blink/renderer/core/html/fenced_frame/fence.cc
@@ -49,41 +49,6 @@ ExecutionContextClient::Trace(visitor); } -LocalFrame* Fence::GetAssociatedFencedFrameForReporting() { - LocalFrame* frame = DomWindow()->GetFrame(); - DCHECK(frame); - - if (blink::features::IsAllowURNsInIframeEnabled() && - !frame->IsInFencedFrameTree()) { - DCHECK(frame->GetDocument()); - return frame; - } - - // We can only reach this point if we are in a fenced frame tree. If we were - // not in a fenced frame tree and `IsAllowURNsInIframeEnabled()` were - // disabled, then `this` would not have been constructed in the first place. - DCHECK(frame->IsInFencedFrameTree()); - - if (frame->GetFencedFrameMode() != - mojom::blink::FencedFrameMode::kOpaqueAds) { - AddConsoleMessage( - "Fenced event reporting is only available in the 'opaque-ads' mode."); - return nullptr; - } - - Frame* top_frame = frame->Top(); - if (!frame->GetSecurityContext()->GetSecurityOrigin()->CanAccess( - top_frame->GetSecurityContext()->GetSecurityOrigin())) { - AddConsoleMessage( - "Fenced event reporting is only available in same-origin subframes."); - return nullptr; - } - - LocalFrame* fenced_frame = DynamicTo<LocalFrame>(top_frame); - DCHECK(fenced_frame); - return fenced_frame; -} - void Fence::reportEvent(ScriptState* script_state, const FenceEvent* event, ExceptionState& exception_state) { @@ -100,13 +65,10 @@ return; } - LocalFrame* fenced_frame = GetAssociatedFencedFrameForReporting(); - if (!fenced_frame) { - return; - } - + LocalFrame* frame = DomWindow()->GetFrame(); + DCHECK(frame->GetDocument()); bool has_fenced_frame_reporting = - fenced_frame->GetDocument()->Loader()->HasFencedFrameReporting(); + frame->GetDocument()->Loader()->HasFencedFrameReporting(); if (!has_fenced_frame_reporting) { AddConsoleMessage("This frame did not register reporting metadata."); return; @@ -114,7 +76,7 @@ for (const V8FenceReportingDestination& web_destination : event->destination()) { - fenced_frame->GetLocalFrameHostRemote().SendFencedFrameReportingBeacon( + frame->GetLocalFrameHostRemote().SendFencedFrameReportingBeacon( event->eventData(), event->eventType(), ToPublicDestination(web_destination)); } @@ -130,10 +92,6 @@ "fully active"); return; } - LocalFrame* fenced_frame = GetAssociatedFencedFrameForReporting(); - if (!fenced_frame) { - return; - } if (event->eventType() != blink::kFencedFrameTopNavigationBeaconType) { AddConsoleMessage(event->eventType() + " is not a valid automatic beacon event type."); @@ -145,8 +103,10 @@ "the maximum length, which is 64KB."); return; } + LocalFrame* frame = DomWindow()->GetFrame(); + DCHECK(frame->GetDocument()); bool has_fenced_frame_reporting = - fenced_frame->GetDocument()->Loader()->HasFencedFrameReporting(); + frame->GetDocument()->Loader()->HasFencedFrameReporting(); if (!has_fenced_frame_reporting) { AddConsoleMessage("This frame did not register reporting metadata."); return; @@ -156,9 +116,8 @@ event->destination()) { destination_vector.push_back(ToPublicDestination(web_destination)); } - fenced_frame->GetLocalFrameHostRemote() - .SetFencedFrameAutomaticBeaconReportEventData(event->eventData(), - destination_vector); + frame->GetLocalFrameHostRemote().SetFencedFrameAutomaticBeaconReportEventData( + event->eventData(), destination_vector); } HeapVector<Member<FencedFrameConfig>> Fence::getNestedConfigs(
diff --git a/third_party/blink/renderer/core/html/forms/external_popup_menu_test.cc b/third_party/blink/renderer/core/html/forms/external_popup_menu_test.cc index e6eec044..3cb9f93 100644 --- a/third_party/blink/renderer/core/html/forms/external_popup_menu_test.cc +++ b/third_party/blink/renderer/core/html/forms/external_popup_menu_test.cc
@@ -93,8 +93,8 @@ selected_item_ = selected_item; menu_items_ = std::move(menu_items); popup_client_.Bind(std::move(popup_client)); - popup_client_.set_disconnect_handler(base::BindOnce( - &TestLocalFrameExternalPopupClient::Reset, base::Unretained(this))); + popup_client_.set_disconnect_handler(WTF::BindOnce( + &TestLocalFrameExternalPopupClient::Reset, WTF::Unretained(this))); std::move(showed_callback_).Run(); }
diff --git a/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc b/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc index 5772d1b..9a19bf9 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc +++ b/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc
@@ -99,9 +99,9 @@ context_->GetTaskRunner(TaskType::kInternalMediaRealTime) ->PostDelayedTask(FROM_HERE, - base::BindOnce(&FakeWebMediaPlayer::AutoTimeIncrement, - base::Unretained(this), - auto_time_increment_delta_.value()), + WTF::BindOnce(&FakeWebMediaPlayer::AutoTimeIncrement, + WTF::Unretained(this), + auto_time_increment_delta_.value()), auto_time_increment_delta_.value()); scheduled_time_increment_ = true; }
diff --git a/third_party/blink/renderer/core/input/event_handler_test.cc b/third_party/blink/renderer/core/input/event_handler_test.cc index 46ae6125..a758345 100644 --- a/third_party/blink/renderer/core/input/event_handler_test.cc +++ b/third_party/blink/renderer/core/input/event_handler_test.cc
@@ -2254,11 +2254,12 @@ ScrollableArea* scrollable_area = GetDocument().GetLayoutView()->GetScrollableArea(); bool finished = false; - scrollable_area->SetScrollOffset( - ScrollOffset(0, 1000), mojom::blink::ScrollType::kProgrammatic, - mojom::blink::ScrollBehavior::kSmooth, - ScrollableArea::ScrollCallback( - base::BindOnce([](bool* finished) { *finished = true; }, &finished))); + scrollable_area->SetScrollOffset(ScrollOffset(0, 1000), + mojom::blink::ScrollType::kProgrammatic, + mojom::blink::ScrollBehavior::kSmooth, + ScrollableArea::ScrollCallback(WTF::BindOnce( + [](bool* finished) { *finished = true; }, + WTF::Unretained(&finished)))); Compositor().BeginFrame(); LocalFrameView* frame_view = GetDocument().View(); ASSERT_EQ(0, frame_view->LayoutViewport()->GetScrollOffset().y());
diff --git a/third_party/blink/renderer/core/input/touch_action_test.cc b/third_party/blink/renderer/core/input/touch_action_test.cc index 1f7c233b..3719a0a 100644 --- a/third_party/blink/renderer/core/input/touch_action_test.cc +++ b/third_party/blink/renderer/core/input/touch_action_test.cc
@@ -112,7 +112,7 @@ public: TouchActionTest() : base_url_("http://www.test.com/"), - web_view_helper_(base::BindRepeating( + web_view_helper_(WTF::BindRepeating( &frame_test_helpers::WebViewHelper::CreateTestWebFrameWidget< TouchActionTrackingWebFrameWidget>)) { // TODO(crbug.com/751425): We should use the mock functionality
diff --git a/third_party/blink/renderer/core/layout/anchor_scroll_data.cc b/third_party/blink/renderer/core/layout/anchor_scroll_data.cc index a80eae8..1074d88 100644 --- a/third_party/blink/renderer/core/layout/anchor_scroll_data.cc +++ b/third_party/blink/renderer/core/layout/anchor_scroll_data.cc
@@ -37,8 +37,7 @@ if (!anchor_query) return nullptr; - Element* element = DynamicTo<Element>(layout_object->GetNode()); - const bool is_in_top_layer = element ? element->IsInTopLayer() : false; + bool is_in_top_layer = layout_object->IsInTopLayer(); const NGPhysicalFragment* fragment = nullptr; if (value->IsNamed()) { @@ -48,6 +47,7 @@ } else { DCHECK(value->IsImplicit() || (value->IsDefault() && !style.AnchorDefault())); + Element* element = DynamicTo<Element>(layout_object->GetNode()); Element* anchor = element ? element->ImplicitAnchorElement() : nullptr; LayoutObject* anchor_layout_object = anchor ? anchor->GetLayoutObject() : nullptr;
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h index 76fa446..66b281d33 100644 --- a/third_party/blink/renderer/core/layout/layout_object.h +++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -755,6 +755,15 @@ IsStackingContext(style); } + // Returns true if the LayoutObject is rendered in the top layer. + bool IsInTopLayer() const { + NOT_DESTROYED(); + if (Element* element = DynamicTo<Element>(GetNode())) { + return StyleRef().IsInTopLayer(*element); + } + return false; + } + void NotifyPriorityScrollAnchorStatusChanged(); private:
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc index 5112878..3590691 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -1780,8 +1780,7 @@ } bool NGBlockNode::IsInTopLayer() const { - auto* element = DynamicTo<Element>(GetLayoutBox()->GetNode()); - return element && element->IsInTopLayer(); + return GetLayoutBox()->IsInTopLayer(); } bool NGBlockNode::HasAspectRatio() const {
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc index e6818c48..8bad0fba 100644 --- a/third_party/blink/renderer/core/loader/frame_loader.cc +++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -1056,42 +1056,6 @@ extra_data = document_loader_->TakeExtraData(); } - // Fenced frame reporting metadata persists across same-origin navigations - // initiated from inside the fenced frame. Embedder-initiated navigations - // use a unique origin (in `FencedFrame::Navigate`), so the requestor is - // always considered cross-origin by the check (in MPArch). - // TODO(crbug.com/1381158): Move the checks for whether fenced frame reporting - // metadata should be copied or not, to the browser process. - bool is_requestor_same_origin = - !navigation_params->requestor_origin.IsNull() && - navigation_params->requestor_origin.IsSameOriginWith( - WebSecurityOrigin::Create(navigation_params->url)); - if (is_requestor_same_origin) { - // Check if all redirects are same origin with `requestor_origin`. - // If there is a cross-origin redirect, renderer will mark the fenced frame - // having no associated reporting metadata. - auto has_same_origin_with_requestor = - [&requestor_origin = std::as_const( - navigation_params->requestor_origin)](const auto& redirect) { - return requestor_origin.IsSameOriginWith( - WebSecurityOrigin::Create(redirect.new_url)); - }; - is_requestor_same_origin = base::ranges::all_of( - navigation_params->redirects, has_same_origin_with_requestor); - } - if (is_requestor_same_origin) { - if (navigation_params->has_fenced_frame_reporting) { - // In urn iframes, embedder-initiated navigations may be same-origin, so - // this isn't true. - DCHECK(!frame_->IsFencedFrameRoot() && - blink::features::IsAllowURNsInIframeEnabled()); - } else if (document_loader_->HasFencedFrameReporting()) { - // Fenced frame reporting metadata persists across same-origin navigations - // initiated from inside the fenced frame. - navigation_params->has_fenced_frame_reporting = true; - } - } - // Create the OldDocumentInfoForCommit for the old document (that might be in // another FrameLoader) and save it in ScopedOldDocumentInfoForCommitCapturer, // so that the old document can access it and fill in the information as it
diff --git a/third_party/blink/renderer/core/loader/render_blocking_resource_manager.cc b/third_party/blink/renderer/core/loader/render_blocking_resource_manager.cc index a312fea..fb0100f 100644 --- a/third_party/blink/renderer/core/loader/render_blocking_resource_manager.cc +++ b/third_party/blink/renderer/core/loader/render_blocking_resource_manager.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/loader/render_blocking_resource_manager.h" #include "base/feature_list.h" +#include "base/metrics/histogram_functions.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/renderer/core/css/font_face.h" #include "third_party/blink/renderer/core/dom/document.h" @@ -124,6 +125,9 @@ if (font_preload_timer_has_fired_) { return; } + base::UmaHistogramBoolean( + "WebFont.Clients.RenderBlockingFonts.ExpiredFonts", + pending_font_preloads_.size() + imperative_font_loading_count_); font_preload_timer_has_fired_ = true; pending_font_preloads_.clear(); imperative_font_loading_count_ = 0;
diff --git a/third_party/blink/renderer/core/paint/box_border_painter.cc b/third_party/blink/renderer/core/paint/box_border_painter.cc index 2fa49b0..671e7c5 100644 --- a/third_party/blink/renderer/core/paint/box_border_painter.cc +++ b/third_party/blink/renderer/core/paint/box_border_painter.cc
@@ -1691,6 +1691,10 @@ edge_quad[1].x(), edge_quad[1].y() + inner_.GetRadii().TopLeft().height()), edge_quad[1]); + DCHECK(bound_quad1.y() <= edge_quad[1].y()); + bound_quad1.set_y(edge_quad[1].y()); + bound_quad2.set_y(edge_quad[1].y()); + if (edge_quad[1].y() > inner_points[2].y()) { FindIntersection(edge_quad[0], edge_quad[1], inner_points[3], inner_points[2], edge_quad[1]); @@ -1699,10 +1703,6 @@ FindIntersection(edge_quad[0], edge_quad[1], inner_points[1], inner_points[2], edge_quad[1]); } - DCHECK(bound_quad1.y() <= edge_quad[1].y()); - bound_quad1.set_y(edge_quad[1].y()); - bound_quad2.set_y(edge_quad[1].y()); - if (edge_quad[2].y() < edge_quad[1].y() && edge_quad[2].x() > edge_quad[1].x()) { edge_pentagon = {edge_quad[0], edge_quad[1], @@ -1720,6 +1720,11 @@ edge_quad[2].x(), edge_quad[2].y() + inner_.GetRadii().TopRight().height()), edge_quad[2]); + if (bound_quad1.y() < edge_quad[2].y()) { + bound_quad1.set_y(edge_quad[2].y()); + bound_quad2.set_y(edge_quad[2].y()); + } + if (edge_quad[2].y() > inner_points[3].y()) { FindIntersection(edge_quad[3], edge_quad[2], inner_points[3], inner_points[2], edge_quad[2]); @@ -1728,11 +1733,6 @@ FindIntersection(edge_quad[3], edge_quad[2], inner_points[0], inner_points[3], edge_quad[2]); } - if (bound_quad1.y() < edge_quad[2].y()) { - bound_quad1.set_y(edge_quad[2].y()); - bound_quad2.set_y(edge_quad[2].y()); - } - if (edge_quad[2].y() > edge_quad[1].y() && edge_quad[2].x() > edge_quad[1].x()) { edge_pentagon = {edge_quad[0], edge_quad[1], @@ -1768,6 +1768,10 @@ edge_quad[2].x(), edge_quad[2].y() + inner_.GetRadii().TopLeft().height()), edge_quad[2]); + DCHECK(bound_quad2.x() <= edge_quad[2].x()); + bound_quad1.set_x(edge_quad[2].x()); + bound_quad2.set_x(edge_quad[2].x()); + if (edge_quad[2].y() > inner_points[2].y()) { FindIntersection(edge_quad[3], edge_quad[2], inner_points[3], inner_points[2], edge_quad[2]); @@ -1776,10 +1780,6 @@ FindIntersection(edge_quad[3], edge_quad[2], inner_points[1], inner_points[2], edge_quad[2]); } - DCHECK(bound_quad2.x() <= edge_quad[2].x()); - bound_quad1.set_x(edge_quad[2].x()); - bound_quad2.set_x(edge_quad[2].x()); - if (edge_quad[2].y() < edge_quad[1].y() && edge_quad[2].x() > edge_quad[1].x()) { edge_pentagon = {edge_quad[0], edge_quad[1], @@ -1798,6 +1798,11 @@ edge_quad[1].x(), edge_quad[1].y() - inner_.GetRadii().BottomLeft().height()), edge_quad[1]); + if (bound_quad1.x() < edge_quad[1].x()) { + bound_quad1.set_x(edge_quad[1].x()); + bound_quad2.set_x(edge_quad[1].x()); + } + if (edge_quad[1].y() < inner_points[1].y()) { FindIntersection(edge_quad[0], edge_quad[1], inner_points[0], inner_points[1], edge_quad[1]); @@ -1806,11 +1811,6 @@ FindIntersection(edge_quad[0], edge_quad[1], inner_points[1], inner_points[2], edge_quad[1]); } - if (bound_quad1.x() < edge_quad[1].x()) { - bound_quad1.set_x(edge_quad[1].x()); - bound_quad2.set_x(edge_quad[1].x()); - } - if (edge_quad[2].y() < edge_quad[1].y() && edge_quad[2].x() < edge_quad[1].x()) { edge_pentagon = {edge_quad[0], edge_quad[1], @@ -1847,6 +1847,10 @@ edge_quad[2].x(), edge_quad[2].y() - inner_.GetRadii().BottomLeft().height()), edge_quad[2]); + DCHECK(bound_quad2.y() >= edge_quad[2].y()); + bound_quad1.set_y(edge_quad[2].y()); + bound_quad2.set_y(edge_quad[2].y()); + if (edge_quad[2].y() < inner_points[1].y()) { FindIntersection(edge_quad[3], edge_quad[2], inner_points[0], inner_points[1], edge_quad[2]); @@ -1855,10 +1859,6 @@ FindIntersection(edge_quad[3], edge_quad[2], inner_points[1], inner_points[2], edge_quad[2]); } - DCHECK(bound_quad2.y() >= edge_quad[2].y()); - bound_quad1.set_y(edge_quad[2].y()); - bound_quad2.set_y(edge_quad[2].y()); - if (edge_quad[2].y() < edge_quad[1].y() && edge_quad[2].x() < edge_quad[1].x()) { edge_pentagon = {edge_quad[0], edge_quad[1], @@ -1877,6 +1877,11 @@ edge_quad[1].x(), edge_quad[1].y() - inner_.GetRadii().BottomRight().height()), edge_quad[1]); + if (bound_quad1.y() > edge_quad[1].y()) { + bound_quad1.set_y(edge_quad[1].y()); + bound_quad2.set_y(edge_quad[1].y()); + } + if (edge_quad[1].y() < inner_points[0].y()) { FindIntersection(edge_quad[0], edge_quad[1], inner_points[0], inner_points[1], edge_quad[1]); @@ -1885,11 +1890,6 @@ FindIntersection(edge_quad[0], edge_quad[1], inner_points[0], inner_points[3], edge_quad[1]); } - if (bound_quad1.y() > edge_quad[1].y()) { - bound_quad1.set_y(edge_quad[1].y()); - bound_quad2.set_y(edge_quad[1].y()); - } - if (edge_quad[2].x() < edge_quad[1].x() && edge_quad[2].y() > edge_quad[1].y()) { edge_pentagon = {edge_quad[0], edge_quad[1], @@ -1923,6 +1923,10 @@ edge_quad[1].x(), edge_quad[1].y() + inner_.GetRadii().TopRight().height()), edge_quad[1]); + DCHECK(bound_quad1.x() >= edge_quad[1].x()); + bound_quad1.set_x(edge_quad[1].x()); + bound_quad2.set_x(edge_quad[1].x()); + if (edge_quad[1].y() > inner_points[3].y()) { FindIntersection(edge_quad[0], edge_quad[1], inner_points[3], inner_points[2], edge_quad[1]); @@ -1931,10 +1935,6 @@ FindIntersection(edge_quad[0], edge_quad[1], inner_points[0], inner_points[3], edge_quad[1]); } - DCHECK(bound_quad1.x() >= edge_quad[1].x()); - bound_quad1.set_x(edge_quad[1].x()); - bound_quad2.set_x(edge_quad[1].x()); - if (edge_quad[2].y() > edge_quad[1].y() && edge_quad[2].x() > edge_quad[1].x()) { edge_pentagon = {edge_quad[0], edge_quad[1], @@ -1953,6 +1953,11 @@ edge_quad[2].x(), edge_quad[2].y() - inner_.GetRadii().BottomRight().height()), edge_quad[2]); + if (bound_quad1.x() > edge_quad[2].x()) { + bound_quad1.set_x(edge_quad[2].x()); + bound_quad2.set_x(edge_quad[2].x()); + } + if (edge_quad[2].y() < inner_points[0].y()) { FindIntersection(edge_quad[3], edge_quad[2], inner_points[0], inner_points[1], edge_quad[2]); @@ -1961,11 +1966,6 @@ FindIntersection(edge_quad[3], edge_quad[2], inner_points[0], inner_points[3], edge_quad[2]); } - if (bound_quad1.x() > edge_quad[2].x()) { - bound_quad1.set_x(edge_quad[2].x()); - bound_quad2.set_x(edge_quad[2].x()); - } - if (edge_quad[2].x() < edge_quad[1].x() && edge_quad[2].y() > edge_quad[1].y()) { edge_pentagon = {edge_quad[0], edge_quad[1],
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index 42c1d63..0f7ca3c 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -1359,8 +1359,7 @@ } bool PaintLayer::IsInTopLayer() const { - auto* element = DynamicTo<Element>(GetLayoutObject().GetNode()); - return element && element->IsInTopLayer(); + return GetLayoutObject().StyleRef().TopLayer() == ETopLayer::kBrowser; } // Compute the z-offset of the point in the transformState.
diff --git a/third_party/blink/renderer/core/paint/paint_layer_stacking_node.cc b/third_party/blink/renderer/core/paint/paint_layer_stacking_node.cc index 9a80fc6..ad0e1789 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_stacking_node.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_stacking_node.cc
@@ -210,8 +210,7 @@ root_block = multi_column_flow_thread; for (LayoutObject* child = root_block->FirstChild(); child; child = child->NextSibling()) { - auto* child_element = DynamicTo<Element>(child->GetNode()); - if (child_element && child_element->IsInTopLayer() && + if (child->StyleRef().TopLayer() == ETopLayer::kBrowser && child->IsStacked()) { pos_z_order_list_.push_back(To<LayoutBoxModelObject>(child)->Layer()); }
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc index 8d0c6c4..0338383 100644 --- a/third_party/blink/renderer/core/style/computed_style.cc +++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -367,6 +367,9 @@ return true; } + if (old_style->TopLayer() != new_style->TopLayer()) { + return true; + } return false; } @@ -2465,6 +2468,10 @@ return false; } +bool ComputedStyle::IsInTopLayer(const Element& element) const { + return element.IsInTopLayer() && TopLayer() == ETopLayer::kBrowser; +} + void ComputedStyleBuilder::PropagateIndependentInheritedProperties( const ComputedStyle& parent_style) { ComputedStyleBuilderBase::PropagateIndependentInheritedProperties(
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h index 438e9e23e..303604c 100644 --- a/third_party/blink/renderer/core/style/computed_style.h +++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -2237,30 +2237,26 @@ // `white-space` property may become a shorthand in future. // https://drafts.csswg.org/css-text-4/#white-space-property static bool DeprecatedAutoWrap(EWhiteSpace ws) { - // Nowrap and pre don't automatically wrap. - return IsNot(ws, EWhiteSpace::kNowrap | EWhiteSpace::kPre); + return blink::ShouldWrapLine(ws); } static bool DeprecatedPreserveNewline(EWhiteSpace ws) { - // Normal and nowrap do not preserve newlines. - return IsNot(ws, EWhiteSpace::kNormal | EWhiteSpace::kNowrap); + return ShouldPreserveBreaks(ws); } static bool DeprecatedCollapseWhiteSpace(EWhiteSpace ws) { - // Pre and prewrap do not collapse whitespace. - return IsNot(ws, EWhiteSpace::kPre | EWhiteSpace::kPreWrap | - EWhiteSpace::kBreakSpaces); + return blink::ShouldCollapseSpacesAndTabs(ws); } bool ShouldWrapLine() const { return DeprecatedAutoWrap(WhiteSpace()); } bool ShouldWrapLineBreakingSpaces() const { - // `ShouldWrapLine` should be `true` if `break-spaces`. - DCHECK(WhiteSpace() != EWhiteSpace::kBreakSpaces || ShouldWrapLine()); - return WhiteSpace() == EWhiteSpace::kBreakSpaces; + return blink::ShouldWrapLineBreakingSpaces(WhiteSpace()); } bool ShouldWrapLineTrailingSpaces() const { - return IsNot(WhiteSpace(), EWhiteSpace::kNowrap | EWhiteSpace::kPre | - EWhiteSpace::kBreakSpaces); + return blink::ShouldWrapLineTrailingSpaces(WhiteSpace()); } + bool ShouldPreserveSpacesAndTabs() const { + return blink::ShouldPreserveSpacesAndTabs(WhiteSpace()); + } bool PreserveNewline() const { return DeprecatedPreserveNewline(WhiteSpace()); } @@ -2279,8 +2275,7 @@ } bool BreakOnlyAfterWhiteSpace() const { - return Is(WhiteSpace(), - EWhiteSpace::kPreWrap | EWhiteSpace::kBreakSpaces) || + return (ShouldPreserveSpacesAndTabs() && ShouldWrapLine()) || GetLineBreak() == LineBreak::kAfterWhiteSpace; } bool NeedsTrailingSpace() const { @@ -2395,6 +2390,9 @@ if (pseudo == kPseudoIdMarker) { return Display() == EDisplay::kListItem; } + if (pseudo == kPseudoIdBackdrop && TopLayer() == ETopLayer::kNone) { + return false; + } if (!HasPseudoElementStyle(pseudo)) { return false; } @@ -2407,6 +2405,10 @@ return pseudo == kPseudoIdBefore || pseudo == kPseudoIdAfter; } + // Returns true if the element is a top layer candidate whose top-layer + // property computes to 'browser'. + bool IsInTopLayer(const Element& element) const; + // Load the images of CSS properties that were deferred by LazyLoad. void LoadDeferredImages(Document&) const; @@ -2521,12 +2523,6 @@ display == EDisplay::kTableCaption; } - // Whitespace utility functions. - static bool Is(EWhiteSpace a, EWhiteSpace b) { - return static_cast<unsigned>(a) & static_cast<unsigned>(b); - } - static bool IsNot(EWhiteSpace a, EWhiteSpace b) { return !Is(a, b); } - bool InternalVisitedBorderLeftColorHasNotChanged( const ComputedStyle& other) const { return (InternalVisitedBorderLeftColor() ==
diff --git a/third_party/blink/renderer/core/style/style_image_set.cc b/third_party/blink/renderer/core/style/style_image_set.cc index 2e1477b..378632f 100644 --- a/third_party/blink/renderer/core/style/style_image_set.cc +++ b/third_party/blink/renderer/core/style/style_image_set.cc
@@ -57,7 +57,7 @@ CSSValue* StyleImageSet::ComputedCSSValue(const ComputedStyle& style, bool allow_visited_style) const { - return image_set_value_->ComputedCSSValue(); + return image_set_value_->ComputedCSSValue(style, allow_visited_style); } bool StyleImageSet::CanRender() const {
diff --git a/third_party/blink/renderer/core/style/style_pending_image.cc b/third_party/blink/renderer/core/style/style_pending_image.cc index f41add8b3..19ab5ff 100644 --- a/third_party/blink/renderer/core/style/style_pending_image.cc +++ b/third_party/blink/renderer/core/style/style_pending_image.cc
@@ -46,7 +46,7 @@ return image_value->ComputedCSSValue(); } if (auto* image_set_value = DynamicTo<CSSImageSetValue>(value)) { - return image_set_value->ComputedCSSValue(); + return image_set_value->ComputedCSSValue(style_, allow_visited_style_); } if (auto* image_crossfade = DynamicTo<cssvalue::CSSCrossfadeValue>(value)) { return MakeGarbageCollected<cssvalue::CSSCrossfadeValue>(
diff --git a/third_party/blink/renderer/core/xml/native_xpath_ns_resolver.cc b/third_party/blink/renderer/core/xml/native_xpath_ns_resolver.cc index 732ee57..207226c 100644 --- a/third_party/blink/renderer/core/xml/native_xpath_ns_resolver.cc +++ b/third_party/blink/renderer/core/xml/native_xpath_ns_resolver.cc
@@ -38,8 +38,9 @@ namespace { void CountNonElementResolver(const Node* node) { - if (!node || !node->IsElementNode()) + if (!node || node->IsElementNode()) { return; + } if (const auto* attr = DynamicTo<Attr>(node)) { if (attr->ownerElement()) return; @@ -47,7 +48,7 @@ if (char_data->parentElement()) return; } - node->GetDocument().CountUse(WebFeature::kCreateNSResolverWithNonElements); + node->GetDocument().CountUse(WebFeature::kCreateNSResolverWithNonElements2); } } // namespace
diff --git a/third_party/blink/renderer/modules/direct_sockets/tcp_server_socket.cc b/third_party/blink/renderer/modules/direct_sockets/tcp_server_socket.cc index d19ba1d4..d5499f2 100644 --- a/third_party/blink/renderer/modules/direct_sockets/tcp_server_socket.cc +++ b/third_party/blink/renderer/modules/direct_sockets/tcp_server_socket.cc
@@ -15,6 +15,55 @@ namespace blink { +namespace { + +mojom::blink::DirectTCPServerSocketOptionsPtr CreateTCPServerSocketOptions( + const String& local_address, + const TCPServerSocketOptions* options, + ExceptionState& exception_state) { + auto socket_options = mojom::blink::DirectTCPServerSocketOptions::New(); + + net::IPAddress address; + if (!address.AssignFromIPLiteral(local_address.Utf8())) { + exception_state.ThrowTypeError("localAddress must be a valid IP address."); + return {}; + } + + if (options->hasLocalPort() && options->localPort() == 0) { + exception_state.ThrowTypeError( + "localPort must be greater than zero. Leave this field unassigned to " + "allow the OS to pick a port on its own."); + return {}; + } + + // Port 0 allows the OS to pick an available port on its own. + net::IPEndPoint local_addr = net::IPEndPoint( + std::move(address), options->hasLocalPort() ? options->localPort() : 0U); + + if (options->hasBacklog()) { + if (options->backlog() == 0) { + exception_state.ThrowTypeError("backlog must be greater than zero."); + return {}; + } + socket_options->backlog = options->backlog(); + } + + if (options->hasIpv6Only()) { + if (local_addr.address() != net::IPAddress::IPv6AllZeros()) { + exception_state.ThrowTypeError( + "ipv6Only can only be specified when localAddress is [::] or " + "equivalent."); + return {}; + } + // TODO(crbug.com/1413161): Implement ipv6_only support. + } + + socket_options->local_addr = std::move(local_addr); + return socket_options; +} + +} // namespace + TCPServerSocket::TCPServerSocket(ScriptState* script_state) : Socket(script_state) {} @@ -25,13 +74,49 @@ const String& local_address, const TCPServerSocketOptions* options, ExceptionState& exception_state) { - NOTIMPLEMENTED(); - return nullptr; + if (!Socket::CheckContextAndPermissions(script_state, exception_state)) { + return nullptr; + } + + auto* socket = MakeGarbageCollected<TCPServerSocket>(script_state); + if (!socket->Open(local_address, options, exception_state)) { + return nullptr; + } + return socket; } ScriptPromise TCPServerSocket::close(ScriptState*, ExceptionState&) { NOTIMPLEMENTED(); - return ScriptPromise(); + return closed(GetScriptState()); +} + +bool TCPServerSocket::Open(const String& local_addr, + const TCPServerSocketOptions* options, + ExceptionState& exception_state) { + auto open_tcp_server_socket_options = + CreateTCPServerSocketOptions(local_addr, options, exception_state); + + if (exception_state.HadException()) { + return false; + } + + mojo::PendingRemote<network::mojom::blink::TCPServerSocket> tcp_server_remote; + mojo::PendingReceiver<network::mojom::blink::TCPServerSocket> + tcp_server_receiver = tcp_server_remote.InitWithNewPipeAndPassReceiver(); + + GetServiceRemote()->OpenTCPServerSocket( + std::move(open_tcp_server_socket_options), std::move(tcp_server_receiver), + WTF::BindOnce(&TCPServerSocket::OnTCPServerSocketOpened, + WrapPersistent(this), std::move(tcp_server_remote))); + return true; +} + +void TCPServerSocket::OnTCPServerSocketOpened( + mojo::PendingRemote<network::mojom::blink::TCPServerSocket> + tcp_server_remote, + int32_t result, + const absl::optional<net::IPEndPoint>& local_addr) { + NOTIMPLEMENTED(); } void TCPServerSocket::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/modules/direct_sockets/tcp_server_socket.h b/third_party/blink/renderer/modules/direct_sockets/tcp_server_socket.h index c683d36..7399df3 100644 --- a/third_party/blink/renderer/modules/direct_sockets/tcp_server_socket.h +++ b/third_party/blink/renderer/modules/direct_sockets/tcp_server_socket.h
@@ -35,6 +35,18 @@ explicit TCPServerSocket(ScriptState*); ~TCPServerSocket() override; + // Validates options and calls OpenTCPServerSocket(...). + bool Open(const String& local_address, + const TCPServerSocketOptions*, + ExceptionState&); + + // On net::OK initializes readable stream and resolves opened promise. + // Otherwise rejects the opened promise. + void OnTCPServerSocketOpened( + mojo::PendingRemote<network::mojom::blink::TCPServerSocket>, + int32_t result, + const absl::optional<net::IPEndPoint>& local_addr); + void Trace(Visitor*) const override; // Socket:
diff --git a/third_party/blink/renderer/modules/direct_sockets/udp_socket.cc b/third_party/blink/renderer/modules/direct_sockets/udp_socket.cc index 1040294..3632ec7 100644 --- a/third_party/blink/renderer/modules/direct_sockets/udp_socket.cc +++ b/third_party/blink/renderer/modules/direct_sockets/udp_socket.cc
@@ -66,17 +66,24 @@ absl::optional<net::IPEndPoint> local_addr; if (options->hasLocalAddress()) { - if (net::IPAddress address; - address.AssignFromIPLiteral(options->localAddress().Utf8())) { - // Port 0 allows the OS to pick an available port on its own. - local_addr = - net::IPEndPoint(std::move(address), - options->hasLocalPort() ? options->localPort() : 0U); - } else { + net::IPAddress address; + if (!address.AssignFromIPLiteral(options->localAddress().Utf8())) { exception_state.ThrowTypeError( "localAddress must be a valid IP address."); return {}; } + + if (options->hasLocalPort() && options->localPort() == 0) { + exception_state.ThrowTypeError( + "localPort must be greater than zero. Leave this field unassigned to " + "allow the OS to pick a port on its own."); + return {}; + } + + // Port 0 allows the OS to pick an available port on its own. + local_addr = + net::IPEndPoint(std::move(address), + options->hasLocalPort() ? options->localPort() : 0U); } else if (options->hasLocalPort()) { exception_state.ThrowTypeError( "localPort cannot be specified without localAddress."); @@ -91,9 +98,6 @@ exception_state.ThrowTypeError( "neither remoteAddress nor localAddress specified."); return {}; - } else { - socket_options->remote_addr = std::move(remote_addr); - socket_options->local_addr = std::move(local_addr); } if (options->hasDnsQueryType()) { @@ -116,6 +120,17 @@ return {}; } + if (options->hasIpv6Only()) { + if (!local_addr || + local_addr->address() != net::IPAddress::IPv6AllZeros()) { + exception_state.ThrowTypeError( + "ipv6Only can only be specified when localAddress is [::] or " + "equivalent."); + return {}; + } + // TODO(crbug.com/1413161): Implement ipv6_only support. + } + if (options->hasSendBufferSize()) { socket_options->send_buffer_size = options->sendBufferSize(); } @@ -123,6 +138,9 @@ socket_options->receive_buffer_size = options->receiveBufferSize(); } + socket_options->remote_addr = std::move(remote_addr); + socket_options->local_addr = std::move(local_addr); + return socket_options; }
diff --git a/third_party/blink/renderer/modules/media_controls/resources/mediaControls.css b/third_party/blink/renderer/modules/media_controls/resources/mediaControls.css index a32514e..bb3a01e 100644 --- a/third_party/blink/renderer/modules/media_controls/resources/mediaControls.css +++ b/third_party/blink/renderer/modules/media_controls/resources/mediaControls.css
@@ -1414,6 +1414,19 @@ transition: none !important; } +video::-internal-media-controls-overflow-menu-list, +audio::-internal-media-controls-overflow-menu-list, +video::-internal-media-controls-playback-speed-list, +audio::-internal-media-controls-playback-speed-list, +video::-internal-media-controls-text-track-list, +audio::-internal-media-controls-text-track-list { + /* Ideally, top-layer should only be set to 'browser' when IsWanted() is true, + but there is currently no way to match that with a selector. If IsWanted() + is false we force a display:none in the code, which means we will not + render these pseudo elements in the top layer anyway. */ + top-layer: browser !important; +} + @media ua-forced-colors { /* The backplate of the main controls */
diff --git a/third_party/blink/renderer/modules/ml/ml_context.cc b/third_party/blink/renderer/modules/ml/ml_context.cc index 89b784316..df6ca2ab 100644 --- a/third_party/blink/renderer/modules/ml/ml_context.cc +++ b/third_party/blink/renderer/modules/ml/ml_context.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/modules/ml/ml_context.h" +#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/modules/ml/ml.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" @@ -49,6 +50,31 @@ ScriptWrappable::Trace(visitor); } +ScriptPromise MLContext::compute(ScriptState* script_state, + MLGraph* graph, + const MLNamedArrayBufferViews& inputs, + const MLNamedArrayBufferViews& outputs, + ExceptionState& exception_state) { + if (!script_state->ContextIsValid()) { + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, + "Invalid script state"); + return ScriptPromise(); + } + + auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); + auto promise = resolver->Promise(); + + if (graph->Context() != this) { + resolver->Reject(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kDataError, + "The graph isn't built within this context.")); + } else { + graph->ComputeAsync(inputs, outputs, resolver, exception_state); + } + + return promise; +} + void MLContext::computeSync(MLGraph* graph, const MLNamedArrayBufferViews& inputs, const MLNamedArrayBufferViews& outputs,
diff --git a/third_party/blink/renderer/modules/ml/ml_context.h b/third_party/blink/renderer/modules/ml/ml_context.h index 83d6432..2509233 100644 --- a/third_party/blink/renderer/modules/ml/ml_context.h +++ b/third_party/blink/renderer/modules/ml/ml_context.h
@@ -43,6 +43,12 @@ void Trace(Visitor* visitor) const override; // IDL interface: + ScriptPromise compute(ScriptState* script_state, + MLGraph* graph, + const MLNamedArrayBufferViews& inputs, + const MLNamedArrayBufferViews& outputs, + ExceptionState& exception_state); + void computeSync(MLGraph* graph, const MLNamedArrayBufferViews& inputs, const MLNamedArrayBufferViews& outputs,
diff --git a/third_party/blink/renderer/modules/ml/ml_context.idl b/third_party/blink/renderer/modules/ml/ml_context.idl index 23d2af71..212f54d 100644 --- a/third_party/blink/renderer/modules/ml/ml_context.idl +++ b/third_party/blink/renderer/modules/ml/ml_context.idl
@@ -14,11 +14,19 @@ typedef record<DOMString, ArrayBufferView> MLNamedArrayBufferViews; +dictionary MLComputeResult { + MLNamedArrayBufferViews inputs; + MLNamedArrayBufferViews outputs; +}; + [ RuntimeEnabled=MachineLearningCommon, SecureContext, Exposed=(Window, DedicatedWorker) ] interface MLContext { + [RuntimeEnabled=MachineLearningNeuralNetwork, CallWith=ScriptState, RaisesException] Promise<MLComputeResult> compute( + MLGraph graph, MLNamedArrayBufferViews inputs, MLNamedArrayBufferViews outputs); + [RuntimeEnabled=MachineLearningNeuralNetwork, RaisesException, Exposed=DedicatedWorker] void computeSync(MLGraph graph, MLNamedArrayBufferViews inputs, MLNamedArrayBufferViews outputs); };
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph.cc index 2aebc912..d3a385ed9 100644 --- a/third_party/blink/renderer/modules/ml/webnn/ml_graph.cc +++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph.cc
@@ -7,9 +7,14 @@ #include "base/numerics/checked_math.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" +#include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" +#include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer_view.h" +#include "third_party/blink/renderer/core/typed_arrays/dom_data_view.h" +#include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h" #include "third_party/blink/renderer/modules/ml/ml_context.h" #include "third_party/blink/renderer/modules/ml/webnn/ml_operand.h" #include "third_party/blink/renderer/modules/ml/webnn/ml_operator.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/heap/collection_support/heap_deque.h" #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h" @@ -37,6 +42,12 @@ name.Utf8().c_str()); return false; } + if (array_buffer_view->IsDetached()) { + error_message = + String::Format("The array buffer view with name \"%s\" is detached.", + name.Utf8().c_str()); + return false; + } const auto& info = resources_info.at(name); if (array_buffer_view->GetType() != GetArrayBufferViewType(info.type)) { error_message = String::Format( @@ -58,6 +69,101 @@ return true; } +DOMArrayBufferView* TransferArrayBufferView( + v8::Isolate* isolate, + NotShared<DOMArrayBufferView> source_view, + ExceptionState& exception_state) { + // A detached ArrayBufferView should be caught by + // `ValidateNamedArrayBufferViews()`. + DCHECK(!source_view->IsDetached()); + + // Avoid transferring a non-detachable ArrayBuffer. + // `DOMArrayBuffer::Transfer()` would make a copy if the ArrayBuffer is not + // detachable. This behavior doesn't follow the algorithm to transfer an + // ArrayBuffer of WebIDL spec: + // https://webidl.spec.whatwg.org/#arraybuffer-transfer + if (!source_view->buffer()->IsDetachable(isolate)) { + exception_state.ThrowDOMException(DOMExceptionCode::kDataError, + "The ArrayBuffer is not detachable."); + return nullptr; + } + + // Get the offset and length of the source view before transferring it. + const auto offset = source_view->byteOffset(); + const auto length = source_view->byteLength() / source_view->TypeSize(); + + ArrayBufferContents target_contents; + // The following `DOMArrayBuffer::Transfer()` call would fail if the + // detach key of the ArrayBuffer is not `undefined`. + if (!source_view->buffer()->Transfer(isolate, target_contents, + exception_state)) { + return nullptr; + } + + auto* target_buffer = DOMArrayBuffer::Create(std::move(target_contents)); + + // Align with the ArrayBufferView types supported by WebNN MLOperandType: + // https://www.w3.org/TR/webnn/#appendices-mloperandtype-arraybufferview-compatibility + DOMArrayBufferView* target_view = nullptr; + switch (source_view->GetType()) { + case DOMArrayBufferView::kTypeFloat32: + // Float32Array is used for MLOperandType::float32. + target_view = DOMFloat32Array::Create(target_buffer, offset, length); + break; + case DOMArrayBufferView::kTypeUint16: + // Using Uint16Array for float16 is a workaround of WebNN spec issue: + // https://github.com/webmachinelearning/webnn/issues/127 + target_view = DOMUint16Array::Create(target_buffer, offset, length); + break; + case DOMArrayBufferView::kTypeInt32: + // Int32Array is used for MLOperandType::int32. + target_view = DOMInt32Array::Create(target_buffer, offset, length); + break; + case DOMArrayBufferView::kTypeUint32: + // Uint32Array is used for MLOperandType::uint32. + target_view = DOMUint32Array::Create(target_buffer, offset, length); + break; + case DOMArrayBufferView::kTypeInt8: + // Int8Array is used for MLOperandType::int8. + target_view = DOMInt8Array::Create(target_buffer, offset, length); + break; + case DOMArrayBufferView::kTypeUint8: + // Uint8Array is used for MLOperandType::uint8. + target_view = DOMUint8Array::Create(target_buffer, offset, length); + break; + default: + // Other ArrayBufferView types should not pass the + // `ValidateNamedArrayBufferViews()` and reach here. + NOTREACHED(); + } + return target_view; +} + +// Implement the MLNamedArrayBufferViews transfer algorithm of WebNN spec: +// https://www.w3.org/TR/webnn/#mlnamedarraybufferviews-transfer +// +// If it fails to transfer an ArrayBufferView of the MLNamedArrayBufferViews, +// the current implementation leaves the already-transferred views detached, the +// failing one and remaining others unchanged. +// +// TODO(crbug.com/1273291): Revisit the error handling once the WebNN spec issue +// is resolved: https://github.com/webmachinelearning/webnn/issues/351 +MLNamedArrayBufferViews* TransferNamedArrayBufferViews( + v8::Isolate* isolate, + const MLNamedArrayBufferViews& source_views, + ExceptionState& exception_state) { + auto* target_views = MakeGarbageCollected<MLNamedArrayBufferViews>(); + for (const auto& [name, source_view] : source_views) { + NotShared<DOMArrayBufferView> target_view( + TransferArrayBufferView(isolate, source_view, exception_state)); + if (!target_view.Get()) { + return nullptr; + } + target_views->push_back(std::make_pair(name, target_view)); + } + return target_views; +} + } // namespace MLGraph::MLGraph(MLContext* context) : ml_context_(context) {} @@ -83,11 +189,12 @@ void MLGraph::ComputeAsync(const MLNamedArrayBufferViews& inputs, const MLNamedArrayBufferViews& outputs, - ScriptPromiseResolver* resolver) { + ScriptPromiseResolver* resolver, + ExceptionState& exception_state) { // The MLGraph object should be initialized before computing. DCHECK(resources_info_initialized_); - // Validate the input and output MLNamedArrayBufferViews. + // Validate the MLNamedArrayBufferViews. String error_message; if (!ValidateNamedArrayBufferViews(inputs, input_resources_info_, error_message)) { @@ -101,9 +208,26 @@ DOMExceptionCode::kDataError, "Invalid outputs: " + error_message)); return; } + // Transfer the MLNamedArrayBufferViews. + auto* transferred_inputs = TransferNamedArrayBufferViews( + resolver->GetScriptState()->GetIsolate(), inputs, exception_state); + if (!transferred_inputs) { + resolver->Reject(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kDataError, + "Invalid inputs: " + exception_state.Message())); + return; + } + auto* transferred_outputs = TransferNamedArrayBufferViews( + resolver->GetScriptState()->GetIsolate(), outputs, exception_state); + if (!transferred_outputs) { + resolver->Reject(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kDataError, + "Invalid outputs: " + exception_state.Message())); + return; + } // Call ComputeAsyncImpl() implemented by an MLGraph backend. - ComputeAsyncImpl(inputs, outputs, resolver); + ComputeAsyncImpl(*transferred_inputs, *transferred_outputs, resolver); } void MLGraph::ComputeSync(const MLNamedArrayBufferViews& inputs,
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph.h b/third_party/blink/renderer/modules/ml/webnn/ml_graph.h index 271009a7..491c8ce 100644 --- a/third_party/blink/renderer/modules/ml/webnn/ml_graph.h +++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph.h
@@ -52,12 +52,14 @@ // This method validates the input and output MLNamedArrayBufferViews against // the graph's input and output resources info. If there are no errors, it - // calls ComputeAsyncImpl() implemented by an MLGraph backend that binds the + // transfers the input and output ArrayBufferViews to new ones and passes them + // ones to ComputeAsyncImpl() implemented by an MLGraph backend that binds the // array buffer views and executes the compiled platform graph. This method is // called by MLContext to implement MLContext.compute() method. void ComputeAsync(const MLNamedArrayBufferViews& inputs, const MLNamedArrayBufferViews& outputs, - ScriptPromiseResolver* resolver); + ScriptPromiseResolver* resolver, + ExceptionState& exception_state); // ComputeSync() has the similar function as ComputeAsync(). The difference is // if there are no validation errors, it calls ComputeSyncImpl() implemented @@ -108,9 +110,10 @@ // An MLGraph backend should implement this method to execute the compiled // platform graph asynchronously. The actual graph execution work should be // handled by a worker thread without blocking the main thread. If no errors - // occurred, the resolver will be resolved and results will be stored in - // output buffers. Otherwise, the resolver will be rejected with a - // DOMException accordingly. + // occurred, the results will be stored in output buffers and the resolver + // will be resolved with an MLComputeResult that contains the input and output + // buffers. Otherwise, the resolver will be rejected with a DOMException + // accordingly. virtual void ComputeAsyncImpl(const MLNamedArrayBufferViews& inputs, const MLNamedArrayBufferViews& outputs, ScriptPromiseResolver* resolver) = 0;
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_base.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_base.cc index 9dfdfbf4..3334056 100644 --- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_base.cc +++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_base.cc
@@ -67,19 +67,31 @@ } } -DOMException* MLGraphTestBase::ComputeGraph( - V8TestingScope& scope, - MLGraph* graph, - const MLNamedArrayBufferViews& inputs, - const MLNamedArrayBufferViews& outputs) { +MLComputeResult* ToMLComputeResult(V8TestingScope* scope, ScriptValue value) { + return NativeValueTraits<MLComputeResult>::NativeValue( + scope->GetIsolate(), value.V8Value(), scope->GetExceptionState()); +} + +DOMException* MLGraphTestBase::ComputeGraph(V8TestingScope& scope, + MLGraph* graph, + MLNamedArrayBufferViews& inputs, + MLNamedArrayBufferViews& outputs) { switch (GetParam()) { case ExecutionMode::kAsync: { auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(scope.GetScriptState()); ScriptPromiseTester tester(scope.GetScriptState(), resolver->Promise()); - graph->ComputeAsync(inputs, outputs, resolver); + graph->ComputeAsync(inputs, outputs, resolver, scope.GetExceptionState()); tester.WaitUntilSettled(); if (tester.IsFulfilled()) { + // For `MLGraph::ComputeAsync()`, the input and output ArrayBufferViews + // are transferred. The new ArrayBufferViews are returned via the + // MLComputeResult. Set the inputs and outputs to the returned ones, so + // the user code could check the outputs in the same way as for + // `MLGraph::ComputeSync()`. + auto* results = ToMLComputeResult(&scope, tester.Value()); + inputs = results->inputs(); + outputs = results->outputs(); return nullptr; } else { return V8DOMException::ToImplWithTypeCheck(scope.GetIsolate(), @@ -123,14 +135,15 @@ EXPECT_NE(graph, nullptr); // Compute the graph. - auto lhs_buffer = CreateArrayBufferViewForOperand(lhs_operand, lhs.values); - auto rhs_buffer = CreateArrayBufferViewForOperand(rhs_operand, rhs.values); - auto output_buffer = CreateArrayBufferViewForOperand(output_operand); - auto* compute_exception = helper->ComputeGraph( - scope, graph, {{"lhs", lhs_buffer}, {"rhs", rhs_buffer}}, - {{"output", output_buffer}}); + MLNamedArrayBufferViews inputs( + {{"lhs", CreateArrayBufferViewForOperand(lhs_operand, lhs.values)}, + {"rhs", CreateArrayBufferViewForOperand(rhs_operand, rhs.values)}}); + MLNamedArrayBufferViews outputs( + {{"output", CreateArrayBufferViewForOperand(output_operand)}}); + auto* compute_exception = + helper->ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); - auto results = GetArrayBufferViewValues<T>(output_buffer); + auto results = GetArrayBufferViewValues<T>(outputs[0].second); EXPECT_EQ(results, expected); } };
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_base.h b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_base.h index 2ae527c6..c50b8d4 100644 --- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_base.h +++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_test_base.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_ML_WEBNN_ML_GRAPH_TEST_BASE_H_ #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_ml_compute_result.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/modules/ml/webnn/ml_graph.h" #include "third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.h" @@ -42,15 +43,15 @@ MLGraphBuilder* builder, const MLNamedOperands& named_operands); - // Helper method for testinh both ComputeAsync() and ComputeSync() with the + // Helper method for testing both ComputeAsync() and ComputeSync() with the // same input/output buffers and expected results. If the graph computes // successfully, it returns nullptr and the results are produced into the // output buffers. Otherwise, it returns the pointer to the DOMException // thrown by the graph computing. DOMException* ComputeGraph(V8TestingScope& scope, MLGraph* graph, - const MLNamedArrayBufferViews& inputs, - const MLNamedArrayBufferViews& outputs); + MLNamedArrayBufferViews& inputs, + MLNamedArrayBufferViews& outputs); // Test operations with different parameters such as tensor dimensions, data // layout. Each test case will builds a graph and computes it with input data
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc index 614afea..f5d7c600 100644 --- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc +++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc
@@ -16,9 +16,11 @@ #include "build/buildflag.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_clamp_options.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_ml_compute_result.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_conv_2d_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_gemm_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_pool_2d_options.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_ml_resample_2d_options.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/modules/ml/ml.h" #include "third_party/blink/renderer/modules/ml/ml_context.h" @@ -879,6 +881,46 @@ return xnn_status_success; } +xnn_status DefineXnnNodeForResample2d( + xnn_subgraph_t subgraph, + const MLOperator* resample2d, + const OperandValueIdMap& operand_value_id_map, + String& error_message) { + const uint32_t input_id = + GetOperatorInputValueId(resample2d, operand_value_id_map); + const uint32_t output_id = + GetOperatorOutputValueId(resample2d, operand_value_id_map); + const MLResample2dOptions* options = + static_cast<const MLResample2dOptions*>(resample2d->Options()); + + if (options->mode() != V8MLInterpolationMode::Enum::kLinear) { + error_message = "Resample2d only supports Linear mode."; + return xnn_status_unsupported_parameter; + } + + const Vector<int32_t> default_axes({2, 3}); + // XNNPACK resize bilinear node only supports axes = {1, 2}. + // TODO(crbug.com/1273291): Support axes = {2, 3} by transposing the + // input tensor. + if (!(options->getAxesOr(default_axes)[0] == 1 && + options->getAxesOr(default_axes)[1] == 2)) { + error_message = "Resample2d only supports axes = {1, 2}."; + return xnn_status_unsupported_parameter; + } + + DCHECK_EQ(resample2d->Outputs()[0]->Dimensions().size(), 4U); + size_t output_height = resample2d->Outputs()[0]->Dimensions()[1]; + size_t output_width = resample2d->Outputs()[0]->Dimensions()[2]; + // Set flags = 0 and it means align_corner = false and half_pixel_center = + // true. For WebNN, we plan to support coordinate transformation modes for + // Resample2d and it's tracked by an issue - + // https://github.com/webmachinelearning/webnn/issues/270. + const uint32_t flags = 0; + XNN_CHECK_STATUS_AND_SET_ERROR_MESSAGE(xnn_define_static_resize_bilinear_2d( + subgraph, output_height, output_width, input_id, output_id, flags)); + return xnn_status_success; +} + // Define an XNNPACK Node given an MLOperator object and add it into the // Subgraph object. The operand_value_id_map is used to find the corresponding // input and output XNNPACK Values of this MLOperator object. This method calls @@ -935,6 +977,11 @@ XNN_CHECK_STATUS(DefineXnnNodeForSoftmax( subgraph, ml_operator, operand_value_id_map, error_message)); break; + case MLOperator::OperatorKind::kResample2d: { + XNN_CHECK_STATUS(DefineXnnNodeForResample2d( + subgraph, ml_operator, operand_value_id_map, error_message)); + break; + } default: { error_message = "The operator (" + MLOperator::OperatorKindToString(ml_operator->Kind()) + @@ -964,7 +1011,14 @@ named_outputs, exception_state); } -MLGraphXnnpack::MLGraphXnnpack(MLContext* context) : MLGraph(context) {} +MLGraphXnnpack::MLGraphXnnpack(MLContext* context) : MLGraph(context) { + auto* execution_context = context->GetML()->GetExecutionContext(); + DCHECK(execution_context); + // TODO(crbug.com/1273291): Get a dedicated queue when the specification + // matures. + resolver_task_runner_ = + execution_context->GetTaskRunner(TaskType::kMiscPlatformAPI); +} MLGraphXnnpack::~MLGraphXnnpack() { // Explicitly destroy XNNPACK Runtime before releasing static data buffers. It @@ -1058,11 +1112,6 @@ // TODO(crbug.com/1273291): Revisit whether the topological sorting should run // in the worker thread. auto* toposorted_operators = GetOperatorsInTopologicalOrder(named_outputs); - // TODO(crbug.com/1273291): Get a dedicated queue when the specification - // matures. - scoped_refptr<base::SequencedTaskRunner> task_runner = - ExecutionContext::From(resolver->GetScriptState()) - ->GetTaskRunner(TaskType::kMiscPlatformAPI); worker_pool::PostTask( FROM_HERE, CrossThreadBindOnce( @@ -1070,7 +1119,7 @@ WrapCrossThreadPersistent( MakeGarbageCollected<MLNamedOperands>(named_outputs)), WrapCrossThreadPersistent(toposorted_operators), - WrapCrossThreadPersistent(resolver), std::move(task_runner))); + WrapCrossThreadPersistent(resolver), resolver_task_runner_)); } // static @@ -1090,11 +1139,11 @@ graph->xnn_context_ = SharedXnnpackContext::GetInstance(error_message); if (!graph->xnn_context_) { status = xnn_status_uninitialized; + } else { + status = graph->CreateXnnSubgraphAndRuntime( + *named_outputs, *toposorted_operators, error_message); } - status = graph->CreateXnnSubgraphAndRuntime( - *named_outputs, *toposorted_operators, error_message); - PostCrossThreadTask(*resolver_task_runner, FROM_HERE, CrossThreadBindOnce(&MLGraphXnnpack::OnBuildFinished, std::move(graph), std::move(resolver), @@ -1139,14 +1188,53 @@ void MLGraphXnnpack::ComputeAsyncImpl(const MLNamedArrayBufferViews& inputs, const MLNamedArrayBufferViews& outputs, ScriptPromiseResolver* resolver) { - // TODO(crbug.com/1273291): There is an issue of current WebNN asynchronous - // execution design: https://github.com/webmachinelearning/webnn/issues/318. - // After the spec issue is fixed, implement this method by posting the inputs - // and outputs to a background thread and invoking XNNPACK Runtime object in - // the background thread. + worker_pool::PostTask( + FROM_HERE, + CrossThreadBindOnce( + &ComputeOnBackgroundThread, WrapCrossThreadPersistent(this), + WrapCrossThreadPersistent( + MakeGarbageCollected<MLNamedArrayBufferViews>(inputs)), + WrapCrossThreadPersistent( + MakeGarbageCollected<MLNamedArrayBufferViews>(outputs)), + WrapCrossThreadPersistent(resolver), resolver_task_runner_)); +} - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kNotSupportedError, "Not implemented.")); +// static +void MLGraphXnnpack::ComputeOnBackgroundThread( + CrossThreadPersistent<MLGraphXnnpack> graph, + CrossThreadPersistent<MLNamedArrayBufferViews> inputs, + CrossThreadPersistent<MLNamedArrayBufferViews> outputs, + CrossThreadPersistent<ScriptPromiseResolver> resolver, + scoped_refptr<base::SequencedTaskRunner> resolver_task_runner) { + DCHECK(!IsMainThread()); + DCHECK(graph->xnn_context_); + + String error_message; + xnn_status status = graph->InvokeXnnRuntime(*inputs, *outputs, error_message); + + PostCrossThreadTask( + *resolver_task_runner, FROM_HERE, + CrossThreadBindOnce(&MLGraphXnnpack::OnComputeFinished, std::move(graph), + std::move(inputs), std::move(outputs), + std::move(resolver), status, + std::move(error_message))); +} + +void MLGraphXnnpack::OnComputeFinished( + CrossThreadPersistent<MLNamedArrayBufferViews> inputs, + CrossThreadPersistent<MLNamedArrayBufferViews> outputs, + CrossThreadPersistent<ScriptPromiseResolver> resolver, + xnn_status status, + String error_message) { + if (status != xnn_status_success) { + resolver->Reject(MakeGarbageCollected<DOMException>( + XnnStatusToDOMExceptionCode(status), error_message)); + return; + } + auto* result = MLComputeResult::Create(); + result->setInputs(*inputs); + result->setOutputs(*outputs); + resolver->Resolve(result); } void MLGraphXnnpack::ComputeSyncImpl(const MLNamedArrayBufferViews& inputs,
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.h b/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.h index 1ddcea92..301b59e 100644 --- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.h +++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.h
@@ -92,6 +92,23 @@ const MLNamedArrayBufferViews& outputs, ScriptPromiseResolver* resolver) override; + // Invoke the XNNPACK Runtime object off the main thread. + static void ComputeOnBackgroundThread( + CrossThreadPersistent<MLGraphXnnpack> graph, + CrossThreadPersistent<MLNamedArrayBufferViews> inputs, + CrossThreadPersistent<MLNamedArrayBufferViews> outputs, + CrossThreadPersistent<ScriptPromiseResolver> resolver, + scoped_refptr<base::SequencedTaskRunner> resolver_task_runner); + + // Resolve the promise with an MLComputeResult that contains input and output + // ArrayBufferViews on the main thread after finish invoking the XNNPACK + // Runtime object. + void OnComputeFinished(CrossThreadPersistent<MLNamedArrayBufferViews> inputs, + CrossThreadPersistent<MLNamedArrayBufferViews> outputs, + CrossThreadPersistent<ScriptPromiseResolver> resolver, + xnn_status status, + String error_message = String()); + // Invoke the XNNPACK Runtime object in the caller's thread. void ComputeSyncImpl(const MLNamedArrayBufferViews& inputs, const MLNamedArrayBufferViews& outputs, @@ -140,6 +157,9 @@ const MLNamedArrayBufferViews& outputs, String& error_message); + // Schedules resolving promises of asynchronous MLGraph build and compute. + scoped_refptr<base::SequencedTaskRunner> resolver_task_runner_; + // The SharedXnnpackContext is shared and reference-counted by all instances // of MLGraphXnnpack. It initializes (and also deinitializes) the XNNPACK // library for graph building and execution.
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack_test.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack_test.cc index 8d43bc3..f35354a 100644 --- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack_test.cc +++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack_test.cc
@@ -15,6 +15,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_clamp_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_conv_2d_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_ml_pool_2d_options.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_ml_resample_2d_options.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/modules/ml/ml.h" @@ -314,13 +315,15 @@ EXPECT_NE(graph, nullptr); // Compute the graph. - auto input_buffer = - CreateArrayBufferViewForOperand(input_operand, input.values); - auto output_buffer = CreateArrayBufferViewForOperand(output_operand); - auto* compute_exception = helper->ComputeGraph( - scope, graph, {{"input", input_buffer}}, {{"output", output_buffer}}); + MLNamedArrayBufferViews inputs( + {{"input", + CreateArrayBufferViewForOperand(input_operand, input.values)}}); + MLNamedArrayBufferViews outputs( + {{"output", CreateArrayBufferViewForOperand(output_operand)}}); + auto* compute_exception = + helper->ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); - auto results = GetArrayBufferViewValues<T>(output_buffer); + auto results = GetArrayBufferViewValues<T>(outputs[0].second); EXPECT_EQ(results, expected); } }; @@ -367,6 +370,72 @@ } } +template <typename T> +struct Resample2dTester { + MLGraphXnnpackTest* helper; + OperandInfo<T> input; + Vector<T> expected; + + void Test(V8TestingScope& scope, + MLResample2dOptions* options = MLResample2dOptions::Create()) { + // Build the graph. + auto* builder = CreateMLGraphBuilder(scope.GetExecutionContext()); + auto* input_operand = BuildInput(builder, "input", input.dimensions, + input.type, scope.GetExceptionState()); + auto* output_operand = + BuildResample2d(scope, builder, input_operand, options); + auto [graph, build_exception] = + helper->BuildGraph(scope, builder, {{"output", output_operand}}); + EXPECT_NE(graph, nullptr); + + // Compute the graph. + MLNamedArrayBufferViews inputs( + {{"input", + CreateArrayBufferViewForOperand(input_operand, input.values)}}); + MLNamedArrayBufferViews outputs( + {{"output", CreateArrayBufferViewForOperand(output_operand)}}); + auto* compute_exception = + helper->ComputeGraph(scope, graph, inputs, outputs); + EXPECT_EQ(compute_exception, nullptr); + auto results = GetArrayBufferViewValues<T>(outputs[0].second); + EXPECT_EQ(results, expected); + } +}; + +TEST_P(MLGraphXnnpackTest, Resample2dTest) { + V8TestingScope scope; + { + // Test resample2d operator with axes = {1, 2}, sizes = {4, 4}. + auto* options = MLResample2dOptions::Create(); + options->setSizes({4, 4}); + options->setAxes({1, 2}); + options->setMode(V8MLInterpolationMode::Enum::kLinear); + Resample2dTester<float>{ + .helper = this, + .input = {.type = V8MLOperandType::Enum::kFloat32, + .dimensions = {1, 2, 2, 1}, + .values = {1, 2, 3, 4}}, + .expected = {1., 1.25, 1.75, 2., 1.5, 1.75, 2.25, 2.5, 2.5, 2.75, 3.25, + 3.5, 3., 3.25, 3.75, 4.}} + .Test(scope, options); + } + { + // Test resample2d operator with axes = {1, 2}, scales = {2.0, 2.0}. + auto* options = MLResample2dOptions::Create(); + options->setScales({2.0, 2.0}); + options->setAxes({1, 2}); + options->setMode(V8MLInterpolationMode::Enum::kLinear); + Resample2dTester<float>{ + .helper = this, + .input = {.type = V8MLOperandType::Enum::kFloat32, + .dimensions = {1, 2, 2, 1}, + .values = {1, 2, 3, 4}}, + .expected = {1., 1.25, 1.75, 2., 1.5, 1.75, 2.25, 2.5, 2.5, 2.75, 3.25, + 3.5, 3., 3.25, 3.75, 4.}} + .Test(scope, options); + } +} + void CheckExternalValues(const MLGraphXnnpack* xnnpack_graph, const MLNamedArrayBufferViews& inputs, const MLNamedArrayBufferViews& outputs) { @@ -433,12 +502,12 @@ auto* compute_exception = ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); CheckExternalValues(xnnpack_graph, inputs, outputs); - auto results = GetArrayBufferViewValues<float>(output_buffer); + auto results = GetArrayBufferViewValues<float>(outputs[0].second); EXPECT_EQ(results, Vector<float>({6.0, 8.0, 10.0, 12.0})); compute_exception = ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); CheckExternalValues(xnnpack_graph, inputs, outputs); - results = GetArrayBufferViewValues<float>(output_buffer); + results = GetArrayBufferViewValues<float>(outputs[0].second); EXPECT_EQ(results, Vector<float>({6.0, 8.0, 10.0, 12.0})); } { @@ -455,14 +524,14 @@ auto* compute_exception = ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); CheckExternalValues(xnnpack_graph, inputs, outputs); - auto results = GetArrayBufferViewValues<float>(output_buffer); + auto results = GetArrayBufferViewValues<float>(outputs[0].second); EXPECT_EQ(results, Vector<float>({6.0, 8.0, 10.0, 12.0})); - SetArrayBufferViewValues<float>(input0_buffer, {2.0, 3.0, 4.0, 5.0}); - SetArrayBufferViewValues<float>(input1_buffer, {6.0, 7.0, 8.0, 9.0}); + SetArrayBufferViewValues<float>(inputs[0].second, {2.0, 3.0, 4.0, 5.0}); + SetArrayBufferViewValues<float>(inputs[1].second, {6.0, 7.0, 8.0, 9.0}); compute_exception = ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); CheckExternalValues(xnnpack_graph, inputs, outputs); - results = GetArrayBufferViewValues<float>(output_buffer); + results = GetArrayBufferViewValues<float>(outputs[0].second); EXPECT_EQ(results, Vector<float>({8.0, 10.0, 12.0, 14.0})); } { @@ -478,7 +547,7 @@ auto* compute_exception = ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); CheckExternalValues(xnnpack_graph, inputs, outputs); - auto results = GetArrayBufferViewValues<float>(output_buffer); + auto results = GetArrayBufferViewValues<float>(outputs[0].second); EXPECT_EQ(results, Vector<float>({6.0, 8.0, 10.0, 12.0})); auto new_input0_buffer = CreateArrayBufferViewForOperand<float>(input0, {2.0, 3.0, 4.0, 5.0}); @@ -488,7 +557,7 @@ compute_exception = ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); CheckExternalValues(xnnpack_graph, inputs, outputs); - results = GetArrayBufferViewValues<float>(output_buffer); + results = GetArrayBufferViewValues<float>(outputs[0].second); EXPECT_EQ(results, Vector<float>({8.0, 10.0, 12.0, 14.0})); } { @@ -504,14 +573,14 @@ auto* compute_exception = ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); CheckExternalValues(xnnpack_graph, inputs, outputs); - auto results = GetArrayBufferViewValues<float>(output_buffer); + auto results = GetArrayBufferViewValues<float>(outputs[0].second); EXPECT_EQ(results, Vector<float>({6.0, 8.0, 10.0, 12.0})); auto new_output_buffer = CreateArrayBufferViewForOperand(output); outputs = {{"output", new_output_buffer}}; compute_exception = ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); CheckExternalValues(xnnpack_graph, inputs, outputs); - results = GetArrayBufferViewValues<float>(new_output_buffer); + results = GetArrayBufferViewValues<float>(outputs[0].second); EXPECT_EQ(results, Vector<float>({6.0, 8.0, 10.0, 12.0})); } } @@ -544,7 +613,7 @@ auto* compute_exception = ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); CheckExternalValues(xnnpack_graph, inputs, outputs); - auto results = GetArrayBufferViewValues<float>(output_buffer); + auto results = GetArrayBufferViewValues<float>(outputs[0].second); EXPECT_EQ(results, Vector<float>({0.0, 0.0, 0.5, 10.0})); } { @@ -576,11 +645,202 @@ auto* compute_exception = ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); CheckExternalValues(xnnpack_graph, inputs, outputs); - auto results = GetArrayBufferViewValues<float>(output_buffer); + auto results = GetArrayBufferViewValues<float>(outputs[0].second); EXPECT_EQ(results, Vector<float>({6.0, 8.0, 10.0, 12.0})); } } +TEST_F(MLGraphXnnpackTest, ComputeAsyncTest) { + V8TestingScope scope; + auto* builder = CreateMLGraphBuilder(scope.GetExecutionContext()); + // Build an MLGraphXnnpack with the following topology: + // [a] [b] + // \ / + // add + // | + // [output] + auto* a_operand = + BuildInput(builder, "a", {1, 2, 2, 1}, V8MLOperandType::Enum::kFloat32, + scope.GetExceptionState()); + auto* b_operand = + BuildInput(builder, "b", {1, 2, 2, 1}, V8MLOperandType::Enum::kFloat32, + scope.GetExceptionState()); + auto* output_operand = + builder->add(a_operand, b_operand, scope.GetExceptionState()); + ScriptPromiseTester graph_build_tester( + scope.GetScriptState(), + builder->build(scope.GetScriptState(), {{"output", output_operand}}, + scope.GetExceptionState())); + graph_build_tester.WaitUntilSettled(); + ASSERT_EQ(graph_build_tester.IsFulfilled(), true); + auto* graph = NativeValueTraits<MLGraph>::NativeValue( + scope.GetIsolate(), graph_build_tester.Value().V8Value(), + scope.GetExceptionState()); + ASSERT_NE(graph, nullptr); + { + // Test throwing exception if the first input ArrayBufferView is detached. + auto a_buffer_view = CreateArrayBufferViewForOperand(a_operand); + a_buffer_view->DetachForTesting(); + ASSERT_EQ(a_buffer_view->IsDetached(), true); + auto b_buffer_view = CreateArrayBufferViewForOperand(b_operand); + auto output_buffer_view = CreateArrayBufferViewForOperand(output_operand); + auto* resolver = + MakeGarbageCollected<ScriptPromiseResolver>(scope.GetScriptState()); + ScriptPromiseTester tester(scope.GetScriptState(), resolver->Promise()); + graph->ComputeAsync({{"a", a_buffer_view}, {"b", b_buffer_view}}, + {{"output", output_buffer_view}}, resolver, + scope.GetExceptionState()); + tester.WaitUntilSettled(); + EXPECT_NE(tester.IsFulfilled(), true); + auto* exception = V8DOMException::ToImplWithTypeCheck( + scope.GetIsolate(), tester.Value().V8Value()); + EXPECT_NE(exception, nullptr); + EXPECT_EQ(exception->name(), + DOMException::GetErrorName(DOMExceptionCode::kDataError)); + EXPECT_EQ( + exception->message(), + "Invalid inputs: The array buffer view with name \"a\" is detached."); + // Other ArrayBufferViews should not be detached. + EXPECT_EQ(b_buffer_view->IsDetached(), false); + EXPECT_EQ(output_buffer_view->IsDetached(), false); + } + { + // Test throwing exception if the second input ArrayBufferView is detached. + auto a_buffer_view = CreateArrayBufferViewForOperand(a_operand); + auto b_buffer_view = CreateArrayBufferViewForOperand(b_operand); + b_buffer_view->DetachForTesting(); + ASSERT_EQ(b_buffer_view->IsDetached(), true); + auto output_buffer_view = CreateArrayBufferViewForOperand(output_operand); + auto* resolver = + MakeGarbageCollected<ScriptPromiseResolver>(scope.GetScriptState()); + ScriptPromiseTester tester(scope.GetScriptState(), resolver->Promise()); + graph->ComputeAsync({{"a", a_buffer_view}, {"b", b_buffer_view}}, + {{"output", output_buffer_view}}, resolver, + scope.GetExceptionState()); + tester.WaitUntilSettled(); + EXPECT_NE(tester.IsFulfilled(), true); + auto* exception = V8DOMException::ToImplWithTypeCheck( + scope.GetIsolate(), tester.Value().V8Value()); + EXPECT_NE(exception, nullptr); + EXPECT_EQ(exception->name(), + DOMException::GetErrorName(DOMExceptionCode::kDataError)); + EXPECT_EQ( + exception->message(), + "Invalid inputs: The array buffer view with name \"b\" is detached."); + // Other ArrayBufferViews should not be detached. + EXPECT_EQ(a_buffer_view->IsDetached(), false); + EXPECT_EQ(output_buffer_view->IsDetached(), false); + } + { + // Test throwing exception if the output ArrayBufferView is detached. + auto a_buffer_view = CreateArrayBufferViewForOperand(a_operand); + auto b_buffer_view = CreateArrayBufferViewForOperand(b_operand); + auto output_buffer_view = CreateArrayBufferViewForOperand(output_operand); + output_buffer_view->DetachForTesting(); + ASSERT_EQ(output_buffer_view->IsDetached(), true); + auto* resolver = + MakeGarbageCollected<ScriptPromiseResolver>(scope.GetScriptState()); + ScriptPromiseTester tester(scope.GetScriptState(), resolver->Promise()); + graph->ComputeAsync({{"a", a_buffer_view}, {"b", b_buffer_view}}, + {{"output", output_buffer_view}}, resolver, + scope.GetExceptionState()); + tester.WaitUntilSettled(); + EXPECT_NE(tester.IsFulfilled(), true); + auto* exception = V8DOMException::ToImplWithTypeCheck( + scope.GetIsolate(), tester.Value().V8Value()); + EXPECT_NE(exception, nullptr); + EXPECT_EQ(exception->name(), + DOMException::GetErrorName(DOMExceptionCode::kDataError)); + EXPECT_EQ(exception->message(), + "Invalid outputs: The array buffer view with name \"output\" is " + "detached."); + // Other ArrayBufferViews should not be detached. + EXPECT_EQ(a_buffer_view->IsDetached(), false); + EXPECT_EQ(b_buffer_view->IsDetached(), false); + } + { + // Test the input and output ArrayBufferViews are detached if + // ComputeAsync() call succeeds. + auto a_buffer_view = CreateArrayBufferViewForOperand(a_operand); + auto b_buffer_view = CreateArrayBufferViewForOperand(b_operand); + auto output_buffer_view = CreateArrayBufferViewForOperand(output_operand); + auto* resolver = + MakeGarbageCollected<ScriptPromiseResolver>(scope.GetScriptState()); + ScriptPromiseTester tester(scope.GetScriptState(), resolver->Promise()); + graph->ComputeAsync({{"a", a_buffer_view}, {"b", b_buffer_view}}, + {{"output", output_buffer_view}}, resolver, + scope.GetExceptionState()); + EXPECT_EQ(a_buffer_view->IsDetached(), true); + EXPECT_EQ(b_buffer_view->IsDetached(), true); + EXPECT_EQ(output_buffer_view->IsDetached(), true); + tester.WaitUntilSettled(); + EXPECT_EQ(tester.IsFulfilled(), true); + } + { + // Test the input and output ArrayBufferViews of MLComputeResult have the + // same type, byte offset, byte length and base address of those passed to + // ComputeAsync(). + auto a_buffer_view = CreateArrayBufferViewForOperand(a_operand); + auto a_buffer_view_type = a_buffer_view->GetType(); + size_t a_buffer_view_byte_offset = a_buffer_view->byteOffset(); + size_t a_buffer_view_byte_length = a_buffer_view->byteLength(); + void* a_buffer_view_base_address = a_buffer_view->BaseAddress(); + auto b_buffer_view = CreateArrayBufferViewForOperand(b_operand); + auto b_buffer_view_type = b_buffer_view->GetType(); + size_t b_buffer_view_byte_offset = b_buffer_view->byteOffset(); + size_t b_buffer_view_byte_length = b_buffer_view->byteLength(); + void* b_buffer_view_base_address = b_buffer_view->BaseAddress(); + // Create a double-sized ArrayBuffer for output operand. + auto* array_buffer = DOMArrayBuffer::Create( + output_operand->NumberOfElements() * 2, sizeof(float)); + // Create an ArrayBufferView that views the second half of the output + // ArrayBuffer. + const size_t expected_byte_offset = + output_operand->NumberOfElements() * sizeof(float); + auto output_buffer_view = NotShared<DOMArrayBufferView>( + blink::DOMFloat32Array::Create(array_buffer, expected_byte_offset, + output_operand->NumberOfElements())); + auto output_buffer_view_type = output_buffer_view->GetType(); + size_t output_buffer_view_byte_offset = output_buffer_view->byteOffset(); + ASSERT_EQ(output_buffer_view_byte_offset, expected_byte_offset); + size_t output_buffer_view_byte_length = output_buffer_view->byteLength(); + void* output_buffer_view_base_address = output_buffer_view->BaseAddress(); + auto* resolver = + MakeGarbageCollected<ScriptPromiseResolver>(scope.GetScriptState()); + ScriptPromiseTester tester(scope.GetScriptState(), resolver->Promise()); + graph->ComputeAsync({{"a", a_buffer_view}, {"b", b_buffer_view}}, + {{"output", output_buffer_view}}, resolver, + scope.GetExceptionState()); + tester.WaitUntilSettled(); + EXPECT_EQ(tester.IsFulfilled(), true); + auto* compute_result = NativeValueTraits<MLComputeResult>::NativeValue( + scope.GetIsolate(), tester.Value().V8Value(), + scope.GetExceptionState()); + EXPECT_EQ(compute_result->inputs().size(), 2u); + EXPECT_EQ(compute_result->inputs()[0].first, "a"); + auto result_a_buffer_view = compute_result->inputs()[0].second; + EXPECT_EQ(result_a_buffer_view->GetType(), a_buffer_view_type); + EXPECT_EQ(result_a_buffer_view->byteOffset(), a_buffer_view_byte_offset); + EXPECT_EQ(result_a_buffer_view->byteLength(), a_buffer_view_byte_length); + EXPECT_EQ(result_a_buffer_view->BaseAddress(), a_buffer_view_base_address); + EXPECT_EQ(compute_result->inputs()[1].first, "b"); + auto result_b_buffer_view = compute_result->inputs()[1].second; + EXPECT_EQ(result_b_buffer_view->GetType(), b_buffer_view_type); + EXPECT_EQ(result_b_buffer_view->byteOffset(), b_buffer_view_byte_offset); + EXPECT_EQ(result_b_buffer_view->byteLength(), b_buffer_view_byte_length); + EXPECT_EQ(result_b_buffer_view->BaseAddress(), b_buffer_view_base_address); + EXPECT_EQ(compute_result->outputs()[0].first, "output"); + auto result_output_buffer_view = compute_result->outputs()[0].second; + EXPECT_EQ(result_output_buffer_view->GetType(), output_buffer_view_type); + EXPECT_EQ(result_output_buffer_view->byteOffset(), + output_buffer_view_byte_offset); + EXPECT_EQ(result_output_buffer_view->byteLength(), + output_buffer_view_byte_length); + EXPECT_EQ(result_output_buffer_view->BaseAddress(), + output_buffer_view_base_address); + } +} + template <typename T> struct ClampTester { MLGraphXnnpackTest* helper; @@ -600,13 +860,15 @@ EXPECT_NE(graph, nullptr); // Compute the graph. - auto input_buffer = - CreateArrayBufferViewForOperand(input_operand, input.values); - auto output_buffer = CreateArrayBufferViewForOperand(output_operand); - auto* compute_exception = helper->ComputeGraph( - scope, graph, {{"input", input_buffer}}, {{"output", output_buffer}}); + MLNamedArrayBufferViews inputs( + {{"input", + CreateArrayBufferViewForOperand(input_operand, input.values)}}); + MLNamedArrayBufferViews outputs( + {{"output", CreateArrayBufferViewForOperand(output_operand)}}); + auto* compute_exception = + helper->ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); - auto results = GetArrayBufferViewValues<T>(output_buffer); + auto results = GetArrayBufferViewValues<T>(outputs[0].second); EXPECT_EQ(results, expected); } }; @@ -702,13 +964,15 @@ EXPECT_NE(graph, nullptr); // Compute the graph. - auto input_buffer = - CreateArrayBufferViewForOperand(input_operand, input.values); - auto output_buffer = CreateArrayBufferViewForOperand(output_operand); - auto* compute_exception = helper->ComputeGraph( - scope, graph, {{"input", input_buffer}}, {{"output", output_buffer}}); + MLNamedArrayBufferViews inputs( + {{"input", + CreateArrayBufferViewForOperand(input_operand, input.values)}}); + MLNamedArrayBufferViews outputs( + {{"output", CreateArrayBufferViewForOperand(output_operand)}}); + auto* compute_exception = + helper->ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); - Vector<float> results = GetArrayBufferViewValues<T>(output_buffer); + auto results = GetArrayBufferViewValues<T>(outputs[0].second); EXPECT_EQ(results, expected); } }; @@ -858,13 +1122,14 @@ EXPECT_NE(graph, nullptr); // Compute the graph. - auto input_buffer = CreateArrayBufferViewForOperand(a_operand, a.values); - auto output_buffer = CreateArrayBufferViewForOperand(output_operand); - auto* compute_exception = helper->ComputeGraph( - scope, graph, {{"input", input_buffer}}, {{"output", output_buffer}}); + MLNamedArrayBufferViews inputs( + {{"input", CreateArrayBufferViewForOperand(a_operand, a.values)}}); + MLNamedArrayBufferViews outputs( + {{"output", CreateArrayBufferViewForOperand(output_operand)}}); + auto* compute_exception = + helper->ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); - Vector<float> results = GetArrayBufferViewValues<T>(output_buffer); - EXPECT_EQ(results, expected); + auto results = GetArrayBufferViewValues<T>(outputs[0].second); } }; @@ -933,13 +1198,15 @@ EXPECT_NE(graph, nullptr); // Compute the graph. - auto input_buffer = - CreateArrayBufferViewForOperand(input_operand, input.values); - auto output_buffer = CreateArrayBufferViewForOperand(output_operand); - auto* compute_exception = helper->ComputeGraph( - scope, graph, {{"input", input_buffer}}, {{"output", output_buffer}}); + MLNamedArrayBufferViews inputs( + {{"input", + CreateArrayBufferViewForOperand(input_operand, input.values)}}); + MLNamedArrayBufferViews outputs( + {{"output", CreateArrayBufferViewForOperand(output_operand)}}); + auto* compute_exception = + helper->ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); - auto results = GetArrayBufferViewValues<float>(output_buffer); + auto results = GetArrayBufferViewValues<float>(outputs[0].second); EXPECT_EQ(results.size(), expected.size()); for (wtf_size_t i = 0; i < expected.size(); ++i) { EXPECT_FLOAT_EQ(results[i], expected[i]); @@ -1008,13 +1275,15 @@ helper->BuildGraph(scope, builder, {{"output", output_operand}}); EXPECT_NE(graph, nullptr); - auto input_buffer = - CreateArrayBufferViewForOperand(input_operand, input.values); - auto output_buffer = CreateArrayBufferViewForOperand(output_operand); - auto* compute_exception = helper->ComputeGraph( - scope, graph, {{"input", input_buffer}}, {{"output", output_buffer}}); + MLNamedArrayBufferViews inputs( + {{"input", + CreateArrayBufferViewForOperand(input_operand, input.values)}}); + MLNamedArrayBufferViews outputs( + {{"output", CreateArrayBufferViewForOperand(output_operand)}}); + auto* compute_exception = + helper->ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); - Vector<float> results = GetArrayBufferViewValues<T>(output_buffer); + auto results = GetArrayBufferViewValues<T>(outputs[0].second); EXPECT_EQ(results, expected); } }; @@ -1086,13 +1355,15 @@ EXPECT_NE(graph, nullptr); // Compute the graph. - auto input_buffer = - CreateArrayBufferViewForOperand(input_operand, input.values); - auto output_buffer = CreateArrayBufferViewForOperand(output_operand); - auto* compute_exception = helper->ComputeGraph( - scope, graph, {{"input", input_buffer}}, {{"output", output_buffer}}); + MLNamedArrayBufferViews inputs( + {{"input", + CreateArrayBufferViewForOperand(input_operand, input.values)}}); + MLNamedArrayBufferViews outputs( + {{"output", CreateArrayBufferViewForOperand(output_operand)}}); + auto* compute_exception = + helper->ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); - auto results = GetArrayBufferViewValues<T>(output_buffer); + auto results = GetArrayBufferViewValues<T>(outputs[0].second); EXPECT_EQ(results, input.values); } }; @@ -1200,13 +1471,15 @@ EXPECT_NE(graph, nullptr); // Compute WebNN graph. - auto input_buffer = - CreateArrayBufferViewForOperand(input_operand, input.values); - auto output_buffer = CreateArrayBufferViewForOperand(output_operand); - auto* compute_exception = helper->ComputeGraph( - scope, graph, {{"input", input_buffer}}, {{"output", output_buffer}}); + MLNamedArrayBufferViews inputs( + {{"input", + CreateArrayBufferViewForOperand(input_operand, input.values)}}); + MLNamedArrayBufferViews outputs( + {{"output", CreateArrayBufferViewForOperand(output_operand)}}); + auto* compute_exception = + helper->ComputeGraph(scope, graph, inputs, outputs); EXPECT_EQ(compute_exception, nullptr); - auto results = GetArrayBufferViewValues<float>(output_buffer); + auto results = GetArrayBufferViewValues<float>(outputs[0].second); // Compare the results of WebNN graph and XNNPACK operator. EXPECT_EQ(results, xnnpack_output); @@ -1240,7 +1513,8 @@ // MLGraphXnnpack implements it. INSTANTIATE_TEST_SUITE_P(All, MLGraphXnnpackTest, - ::testing::Values(ExecutionMode::kSync), + ::testing::Values(ExecutionMode::kSync, + ExecutionMode::kAsync), ExecutionModeParamToString); } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc index c3e8477..5234f05 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc
@@ -956,7 +956,7 @@ int undefined_stats_count = 0; int defined_stats_count = 0; - for (std::unique_ptr<RTCStats> stats = result->Next(); stats; + for (std::unique_ptr<RTCStatsWrapper> stats = result->Next(); stats; stats = result->Next()) { EXPECT_EQ(stats->GetType().Utf8(), webrtc::RTCTestStats::kType); if (stats->Id().Utf8() == "RTCUndefinedStats") {
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc index 54d01a6..8c6800c 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc
@@ -4,15 +4,43 @@ #include "third_party/blink/renderer/modules/peerconnection/rtc_stats_report.h" +#include "base/feature_list.h" +#include "base/notreached.h" +#include "base/numerics/safe_conversions.h" +#include "third_party/blink/public/common/features.h" +#include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_object_builder.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_audio_playout_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_audio_source_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_certificate_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_codec_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_data_channel_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_candidate_pair_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_candidate_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_inbound_rtp_stream_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_media_source_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_media_stream_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_media_stream_track_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_outbound_rtp_stream_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_peer_connection_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_received_rtp_stream_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_remote_inbound_rtp_stream_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_remote_outbound_rtp_stream_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_sent_rtp_stream_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_transport_stats.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_video_source_stats.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" -#include "third_party/blink/renderer/core/fullscreen/document_fullscreen.h" #include "third_party/blink/renderer/modules/mediastream/user_media_client.h" +#include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/peerconnection/rtc_stats.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/wtf/casting.h" #include "third_party/webrtc/api/stats/rtc_stats.h" +#include "third_party/webrtc/api/stats/rtc_stats_report.h" +#include "third_party/webrtc/api/stats/rtcstats_objects.h" +#include "v8-local-handle.h" +#include "v8-object.h" namespace blink { @@ -49,7 +77,7 @@ } v8::Local<v8::Object> RTCStatsToV8Object(ScriptState* script_state, - const RTCStats* stats) { + const RTCStatsWrapper* stats) { V8ObjectBuilder builder(script_state); builder.AddString("id", stats->Id()); @@ -129,28 +157,1140 @@ return v8_object; } +RTCCodecStats* ToV8Stat(ScriptState* script_state, + const webrtc::RTCCodecStats& webrtc_stat) { + RTCCodecStats* v8_codec = + MakeGarbageCollected<RTCCodecStats>(script_state->GetIsolate()); + if (webrtc_stat.transport_id.is_defined()) { + v8_codec->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); + } + if (webrtc_stat.payload_type.is_defined()) { + v8_codec->setPayloadType(*webrtc_stat.payload_type); + } + if (webrtc_stat.channels.is_defined()) { + v8_codec->setChannels(*webrtc_stat.channels); + } + if (webrtc_stat.mime_type.is_defined()) { + v8_codec->setMimeType(String::FromUTF8(*webrtc_stat.mime_type)); + } + if (webrtc_stat.clock_rate.is_defined()) { + v8_codec->setClockRate(*webrtc_stat.clock_rate); + } + if (webrtc_stat.sdp_fmtp_line.is_defined()) { + v8_codec->setSdpFmtpLine(String::FromUTF8(*webrtc_stat.sdp_fmtp_line)); + } + return v8_codec; +} + +RTCInboundRtpStreamStats* ToV8Stat( + ScriptState* script_state, + const webrtc::RTCInboundRTPStreamStats& webrtc_stat, + bool expose_hardware_caps, + bool unship_deprecated_stats) { + RTCInboundRtpStreamStats* v8_stat = + MakeGarbageCollected<RTCInboundRtpStreamStats>( + script_state->GetIsolate()); + // RTCRtpStreamStats + if (webrtc_stat.ssrc.is_defined()) { + v8_stat->setSsrc(*webrtc_stat.ssrc); + } + if (webrtc_stat.kind.is_defined()) { + v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); + } + if (webrtc_stat.transport_id.is_defined()) { + v8_stat->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); + } + if (webrtc_stat.codec_id.is_defined()) { + v8_stat->setCodecId(String::FromUTF8(*webrtc_stat.codec_id)); + } + // RTCRtpStreamStats legacy stats + if (webrtc_stat.media_type.is_defined()) { + v8_stat->setMediaType(String::FromUTF8(*webrtc_stat.media_type)); + } + if (!unship_deprecated_stats && webrtc_stat.track_id.is_defined()) { + v8_stat->setTrackId(String::FromUTF8(*webrtc_stat.track_id)); + } + // RTCReceivedRtpStreamStats + if (webrtc_stat.packets_lost.is_defined()) { + v8_stat->setPacketsLost(*webrtc_stat.packets_lost); + } + if (webrtc_stat.jitter.is_defined()) { + v8_stat->setJitter(*webrtc_stat.jitter); + } + // RTCInboundRtpStreamStats + if (webrtc_stat.track_identifier.is_defined()) { + v8_stat->setTrackIdentifier( + String::FromUTF8(*webrtc_stat.track_identifier)); + } + if (webrtc_stat.mid.is_defined()) { + v8_stat->setMid(String::FromUTF8(*webrtc_stat.mid)); + } + if (webrtc_stat.remote_id.is_defined()) { + v8_stat->setRemoteId(String::FromUTF8(*webrtc_stat.remote_id)); + } + if (webrtc_stat.frames_decoded.is_defined()) { + v8_stat->setFramesDecoded(*webrtc_stat.frames_decoded); + } + if (webrtc_stat.key_frames_decoded.is_defined()) { + v8_stat->setKeyFramesDecoded(*webrtc_stat.key_frames_decoded); + } + if (webrtc_stat.frames_dropped.is_defined()) { + v8_stat->setFramesDropped(*webrtc_stat.frames_dropped); + } + if (webrtc_stat.frame_width.is_defined()) { + v8_stat->setFrameWidth(*webrtc_stat.frame_width); + } + if (webrtc_stat.frame_height.is_defined()) { + v8_stat->setFrameHeight(*webrtc_stat.frame_height); + } + if (webrtc_stat.frames_per_second.is_defined()) { + v8_stat->setFramesPerSecond(*webrtc_stat.frames_per_second); + } + if (webrtc_stat.qp_sum.is_defined()) { + v8_stat->setQpSum(*webrtc_stat.qp_sum); + } + if (webrtc_stat.total_decode_time.is_defined()) { + v8_stat->setTotalDecodeTime(*webrtc_stat.total_decode_time); + } + if (webrtc_stat.total_inter_frame_delay.is_defined()) { + v8_stat->setTotalInterFrameDelay(*webrtc_stat.total_inter_frame_delay); + } + if (webrtc_stat.total_squared_inter_frame_delay.is_defined()) { + v8_stat->setTotalSquaredInterFrameDelay( + *webrtc_stat.total_squared_inter_frame_delay); + } + if (webrtc_stat.pause_count.is_defined()) { + v8_stat->setPauseCount(*webrtc_stat.pause_count); + } + if (webrtc_stat.total_pauses_duration.is_defined()) { + v8_stat->setTotalPausesDuration(*webrtc_stat.total_pauses_duration); + } + if (webrtc_stat.freeze_count.is_defined()) { + v8_stat->setFreezeCount(*webrtc_stat.freeze_count); + } + if (webrtc_stat.total_freezes_duration.is_defined()) { + v8_stat->setTotalFreezesDuration(*webrtc_stat.total_freezes_duration); + } + if (webrtc_stat.last_packet_received_timestamp.is_defined()) { + v8_stat->setLastPacketReceivedTimestamp( + *webrtc_stat.last_packet_received_timestamp); + } + if (webrtc_stat.header_bytes_received.is_defined()) { + v8_stat->setHeaderBytesReceived(*webrtc_stat.header_bytes_received); + } + if (webrtc_stat.packets_discarded.is_defined()) { + v8_stat->setPacketsDiscarded(*webrtc_stat.packets_discarded); + } + if (webrtc_stat.packets_received.is_defined()) { + v8_stat->setPacketsReceived(*webrtc_stat.packets_received); + } + if (webrtc_stat.fec_packets_received.is_defined()) { + v8_stat->setFecPacketsReceived(*webrtc_stat.fec_packets_received); + } + if (webrtc_stat.fec_packets_discarded.is_defined()) { + v8_stat->setFecPacketsDiscarded(*webrtc_stat.fec_packets_discarded); + } + if (webrtc_stat.bytes_received.is_defined()) { + v8_stat->setBytesReceived(*webrtc_stat.bytes_received); + } + if (webrtc_stat.nack_count.is_defined()) { + v8_stat->setNackCount(*webrtc_stat.nack_count); + } + if (webrtc_stat.fir_count.is_defined()) { + v8_stat->setFirCount(*webrtc_stat.fir_count); + } + if (webrtc_stat.pli_count.is_defined()) { + v8_stat->setPliCount(*webrtc_stat.pli_count); + } + if (webrtc_stat.total_processing_delay.is_defined()) { + v8_stat->setTotalProcessingDelay(*webrtc_stat.total_processing_delay); + } + if (webrtc_stat.estimated_playout_timestamp.is_defined()) { + v8_stat->setEstimatedPlayoutTimestamp( + *webrtc_stat.estimated_playout_timestamp); + } + if (webrtc_stat.jitter_buffer_delay.is_defined()) { + v8_stat->setJitterBufferDelay(*webrtc_stat.jitter_buffer_delay); + } + if (webrtc_stat.jitter_buffer_target_delay.is_defined()) { + v8_stat->setJitterBufferTargetDelay( + *webrtc_stat.jitter_buffer_target_delay); + } + if (webrtc_stat.jitter_buffer_emitted_count.is_defined()) { + v8_stat->setJitterBufferEmittedCount( + *webrtc_stat.jitter_buffer_emitted_count); + } + if (webrtc_stat.jitter_buffer_minimum_delay.is_defined()) { + v8_stat->setJitterBufferMinimumDelay( + *webrtc_stat.jitter_buffer_minimum_delay); + } + if (webrtc_stat.total_samples_received.is_defined()) { + v8_stat->setTotalSamplesReceived(*webrtc_stat.total_samples_received); + } + if (webrtc_stat.concealed_samples.is_defined()) { + v8_stat->setConcealedSamples(*webrtc_stat.concealed_samples); + } + if (webrtc_stat.silent_concealed_samples.is_defined()) { + v8_stat->setSilentConcealedSamples(*webrtc_stat.silent_concealed_samples); + } + if (webrtc_stat.concealment_events.is_defined()) { + v8_stat->setConcealmentEvents(*webrtc_stat.concealment_events); + } + if (webrtc_stat.inserted_samples_for_deceleration.is_defined()) { + v8_stat->setInsertedSamplesForDeceleration( + *webrtc_stat.inserted_samples_for_deceleration); + } + if (webrtc_stat.removed_samples_for_acceleration.is_defined()) { + v8_stat->setRemovedSamplesForAcceleration( + *webrtc_stat.removed_samples_for_acceleration); + } + if (webrtc_stat.audio_level.is_defined()) { + v8_stat->setAudioLevel(*webrtc_stat.audio_level); + } + if (webrtc_stat.total_audio_energy.is_defined()) { + v8_stat->setTotalAudioEnergy(*webrtc_stat.total_audio_energy); + } + if (webrtc_stat.total_samples_duration.is_defined()) { + v8_stat->setTotalSamplesDuration(*webrtc_stat.total_samples_duration); + } + if (webrtc_stat.frames_received.is_defined()) { + v8_stat->setFramesReceived(*webrtc_stat.frames_received); + } + if (webrtc_stat.playout_id.is_defined()) { + v8_stat->setPlayoutId(String::FromUTF8(*webrtc_stat.playout_id)); + } + if (webrtc_stat.frames_assembled_from_multiple_packets.is_defined()) { + v8_stat->setFramesAssembledFromMultiplePackets( + *webrtc_stat.frames_assembled_from_multiple_packets); + } + if (webrtc_stat.total_assembly_time.is_defined()) { + v8_stat->setTotalAssemblyTime(*webrtc_stat.total_assembly_time); + } + if (expose_hardware_caps) { + if (webrtc_stat.power_efficient_decoder.is_defined()) { + v8_stat->setPowerEfficientDecoder(*webrtc_stat.power_efficient_decoder); + } + if (webrtc_stat.decoder_implementation.is_defined()) { + v8_stat->setDecoderImplementation( + String::FromUTF8(*webrtc_stat.decoder_implementation)); + } + } + // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcinboundrtpstreamstats-contenttype + if (webrtc_stat.content_type.is_defined()) { + v8_stat->setContentType(String::FromUTF8(*webrtc_stat.content_type)); + } + // https://github.com/w3c/webrtc-provisional-stats/issues/40 + if (webrtc_stat.goog_timing_frame_info.is_defined()) { + v8_stat->setGoogTimingFrameInfo( + String::FromUTF8(*webrtc_stat.goog_timing_frame_info)); + } + return v8_stat; +} + +RTCRemoteInboundRtpStreamStats* ToV8Stat( + ScriptState* script_state, + const webrtc::RTCRemoteInboundRtpStreamStats& webrtc_stat, + bool unship_deprecated_stats) { + RTCRemoteInboundRtpStreamStats* v8_stat = + MakeGarbageCollected<RTCRemoteInboundRtpStreamStats>( + script_state->GetIsolate()); + // RTCRtpStreamStats + if (webrtc_stat.ssrc.is_defined()) { + v8_stat->setSsrc(*webrtc_stat.ssrc); + } + if (webrtc_stat.kind.is_defined()) { + v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); + } + if (webrtc_stat.transport_id.is_defined()) { + v8_stat->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); + } + if (webrtc_stat.codec_id.is_defined()) { + v8_stat->setCodecId(String::FromUTF8(*webrtc_stat.codec_id)); + } + // RTCRtpStreamStats legacy stats + if (webrtc_stat.media_type.is_defined()) { + v8_stat->setMediaType(String::FromUTF8(*webrtc_stat.media_type)); + } + if (!unship_deprecated_stats && webrtc_stat.track_id.is_defined()) { + v8_stat->setTrackId(String::FromUTF8(*webrtc_stat.track_id)); + } + // RTCReceivedRtpStreamStats + if (webrtc_stat.packets_lost.is_defined()) { + v8_stat->setPacketsLost(*webrtc_stat.packets_lost); + } + if (webrtc_stat.jitter.is_defined()) { + v8_stat->setJitter(*webrtc_stat.jitter); + } + // RTCRemoteInboundRtpStreamStats + if (webrtc_stat.local_id.is_defined()) { + v8_stat->setLocalId(String::FromUTF8(*webrtc_stat.local_id)); + } + if (webrtc_stat.round_trip_time.is_defined()) { + v8_stat->setRoundTripTime(*webrtc_stat.round_trip_time); + } + if (webrtc_stat.total_round_trip_time.is_defined()) { + v8_stat->setTotalRoundTripTime(*webrtc_stat.total_round_trip_time); + } + if (webrtc_stat.fraction_lost.is_defined()) { + v8_stat->setFractionLost(*webrtc_stat.fraction_lost); + } + if (webrtc_stat.round_trip_time_measurements.is_defined()) { + v8_stat->setRoundTripTimeMeasurements( + *webrtc_stat.round_trip_time_measurements); + } + return v8_stat; +} + +RTCOutboundRtpStreamStats* ToV8Stat( + ScriptState* script_state, + const webrtc::RTCOutboundRTPStreamStats& webrtc_stat, + bool expose_hardware_caps, + bool unship_deprecated_stats) { + RTCOutboundRtpStreamStats* v8_stat = + MakeGarbageCollected<RTCOutboundRtpStreamStats>( + script_state->GetIsolate()); + // RTCRtpStreamStats + if (webrtc_stat.ssrc.is_defined()) { + v8_stat->setSsrc(*webrtc_stat.ssrc); + } + if (webrtc_stat.kind.is_defined()) { + v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); + } + if (webrtc_stat.transport_id.is_defined()) { + v8_stat->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); + } + if (webrtc_stat.codec_id.is_defined()) { + v8_stat->setCodecId(String::FromUTF8(*webrtc_stat.codec_id)); + } + // RTCRtpStreamStats legacy stats + if (webrtc_stat.media_type.is_defined()) { + v8_stat->setMediaType(String::FromUTF8(*webrtc_stat.media_type)); + } + if (!unship_deprecated_stats && webrtc_stat.track_id.is_defined()) { + v8_stat->setTrackId(String::FromUTF8(*webrtc_stat.track_id)); + } + // RTCSentRtpStreamStats + if (webrtc_stat.packets_sent.is_defined()) { + v8_stat->setPacketsSent(*webrtc_stat.packets_sent); + } + if (webrtc_stat.bytes_sent.is_defined()) { + v8_stat->setBytesSent(*webrtc_stat.bytes_sent); + } + // RTCOutboundRtpStreamStats + if (webrtc_stat.mid.is_defined()) { + v8_stat->setMid(String::FromUTF8(*webrtc_stat.mid)); + } + if (webrtc_stat.media_source_id.is_defined()) { + v8_stat->setMediaSourceId(String::FromUTF8(*webrtc_stat.media_source_id)); + } + if (webrtc_stat.remote_id.is_defined()) { + v8_stat->setRemoteId(String::FromUTF8(*webrtc_stat.remote_id)); + } + if (webrtc_stat.rid.is_defined()) { + v8_stat->setRid(String::FromUTF8(*webrtc_stat.rid)); + } + if (webrtc_stat.header_bytes_sent.is_defined()) { + v8_stat->setHeaderBytesSent(*webrtc_stat.header_bytes_sent); + } + if (webrtc_stat.retransmitted_packets_sent.is_defined()) { + v8_stat->setRetransmittedPacketsSent( + *webrtc_stat.retransmitted_packets_sent); + } + if (webrtc_stat.retransmitted_bytes_sent.is_defined()) { + v8_stat->setRetransmittedBytesSent(*webrtc_stat.retransmitted_bytes_sent); + } + if (webrtc_stat.target_bitrate.is_defined()) { + v8_stat->setTargetBitrate(*webrtc_stat.target_bitrate); + } + if (webrtc_stat.total_encoded_bytes_target.is_defined()) { + v8_stat->setTotalEncodedBytesTarget( + *webrtc_stat.total_encoded_bytes_target); + } + if (webrtc_stat.frame_width.is_defined()) { + v8_stat->setFrameWidth(*webrtc_stat.frame_width); + } + if (webrtc_stat.frame_height.is_defined()) { + v8_stat->setFrameHeight(*webrtc_stat.frame_height); + } + if (webrtc_stat.frames_per_second.is_defined()) { + v8_stat->setFramesPerSecond(*webrtc_stat.frames_per_second); + } + if (webrtc_stat.frames_sent.is_defined()) { + v8_stat->setFramesSent(*webrtc_stat.frames_sent); + } + if (webrtc_stat.huge_frames_sent.is_defined()) { + v8_stat->setHugeFramesSent(*webrtc_stat.huge_frames_sent); + } + if (webrtc_stat.frames_encoded.is_defined()) { + v8_stat->setFramesEncoded(*webrtc_stat.frames_encoded); + } + if (webrtc_stat.key_frames_encoded.is_defined()) { + v8_stat->setKeyFramesEncoded(*webrtc_stat.key_frames_encoded); + } + if (webrtc_stat.qp_sum.is_defined()) { + v8_stat->setQpSum(*webrtc_stat.qp_sum); + } + if (webrtc_stat.total_encode_time.is_defined()) { + v8_stat->setTotalEncodeTime(*webrtc_stat.total_encode_time); + } + if (webrtc_stat.total_packet_send_delay.is_defined()) { + v8_stat->setTotalPacketSendDelay(*webrtc_stat.total_packet_send_delay); + } + if (webrtc_stat.quality_limitation_reason.is_defined()) { + v8_stat->setQualityLimitationReason( + String::FromUTF8(*webrtc_stat.quality_limitation_reason)); + } + if (webrtc_stat.quality_limitation_durations.is_defined()) { + Vector<std::pair<String, double>> quality_durations; + for (const auto& [key, value] : *webrtc_stat.quality_limitation_durations) { + quality_durations.emplace_back(String::FromUTF8(key), value); + } + v8_stat->setQualityLimitationDurations(std::move(quality_durations)); + } + if (webrtc_stat.quality_limitation_resolution_changes.is_defined()) { + v8_stat->setQualityLimitationResolutionChanges( + *webrtc_stat.quality_limitation_resolution_changes); + } + if (webrtc_stat.nack_count.is_defined()) { + v8_stat->setNackCount(*webrtc_stat.nack_count); + } + if (webrtc_stat.fir_count.is_defined()) { + v8_stat->setFirCount(*webrtc_stat.fir_count); + } + if (webrtc_stat.pli_count.is_defined()) { + v8_stat->setPliCount(*webrtc_stat.pli_count); + } + if (webrtc_stat.active.is_defined()) { + v8_stat->setActive(*webrtc_stat.active); + } + if (webrtc_stat.scalability_mode.is_defined()) { + v8_stat->setScalabilityMode( + String::FromUTF8(*webrtc_stat.scalability_mode)); + } + if (expose_hardware_caps) { + if (webrtc_stat.encoder_implementation.is_defined()) { + v8_stat->setEncoderImplementation( + String::FromUTF8(*webrtc_stat.encoder_implementation)); + } + if (webrtc_stat.power_efficient_encoder.is_defined()) { + v8_stat->setPowerEfficientEncoder(*webrtc_stat.power_efficient_encoder); + } + } + // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcoutboundrtpstreamstats-contenttype + if (webrtc_stat.content_type.is_defined()) { + v8_stat->setContentType(String::FromUTF8(*webrtc_stat.content_type)); + } + return v8_stat; +} + +RTCRemoteOutboundRtpStreamStats* ToV8Stat( + ScriptState* script_state, + const webrtc::RTCRemoteOutboundRtpStreamStats& webrtc_stat, + bool unship_deprecated_stats) { + RTCRemoteOutboundRtpStreamStats* v8_stat = + MakeGarbageCollected<RTCRemoteOutboundRtpStreamStats>( + script_state->GetIsolate()); + // RTCRtpStreamStats + if (webrtc_stat.ssrc.is_defined()) { + v8_stat->setSsrc(*webrtc_stat.ssrc); + } + if (webrtc_stat.kind.is_defined()) { + v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); + } + if (webrtc_stat.transport_id.is_defined()) { + v8_stat->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); + } + if (webrtc_stat.codec_id.is_defined()) { + v8_stat->setCodecId(String::FromUTF8(*webrtc_stat.codec_id)); + } + // RTCRtpStreamStats legacy stats + if (webrtc_stat.media_type.is_defined()) { + v8_stat->setMediaType(String::FromUTF8(*webrtc_stat.media_type)); + } + if (!unship_deprecated_stats && webrtc_stat.track_id.is_defined()) { + v8_stat->setTrackId(String::FromUTF8(*webrtc_stat.track_id)); + } + // RTCSendRtpStreamStats + if (webrtc_stat.packets_sent.is_defined()) { + v8_stat->setPacketsSent(*webrtc_stat.packets_sent); + } + if (webrtc_stat.bytes_sent.is_defined()) { + v8_stat->setBytesSent(*webrtc_stat.bytes_sent); + } + // RTCRemoteOutboundRtpStreamStats + if (webrtc_stat.local_id.is_defined()) { + v8_stat->setLocalId(String::FromUTF8(*webrtc_stat.local_id)); + } + if (webrtc_stat.remote_timestamp.is_defined()) { + v8_stat->setRemoteTimestamp(*webrtc_stat.remote_timestamp); + } + if (webrtc_stat.reports_sent.is_defined()) { + v8_stat->setReportsSent(*webrtc_stat.reports_sent); + } + if (webrtc_stat.round_trip_time.is_defined()) { + v8_stat->setRoundTripTime(*webrtc_stat.round_trip_time); + } + if (webrtc_stat.total_round_trip_time.is_defined()) { + v8_stat->setTotalRoundTripTime(*webrtc_stat.total_round_trip_time); + } + if (webrtc_stat.round_trip_time_measurements.is_defined()) { + v8_stat->setRoundTripTimeMeasurements( + *webrtc_stat.round_trip_time_measurements); + } + return v8_stat; +} + +RTCAudioSourceStats* ToV8Stat(ScriptState* script_state, + const webrtc::RTCAudioSourceStats& webrtc_stat) { + RTCAudioSourceStats* v8_stat = + MakeGarbageCollected<RTCAudioSourceStats>(script_state->GetIsolate()); + // RTCMediaSourceStats + if (webrtc_stat.track_identifier.is_defined()) { + v8_stat->setTrackIdentifier( + String::FromUTF8(*webrtc_stat.track_identifier)); + } + if (webrtc_stat.kind.is_defined()) { + v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); + } + // RTCAudioSourceStats + if (webrtc_stat.audio_level.is_defined()) { + v8_stat->setAudioLevel(*webrtc_stat.audio_level); + } + if (webrtc_stat.total_audio_energy.is_defined()) { + v8_stat->setTotalAudioEnergy(*webrtc_stat.total_audio_energy); + } + if (webrtc_stat.total_samples_duration.is_defined()) { + v8_stat->setTotalSamplesDuration(*webrtc_stat.total_samples_duration); + } + if (webrtc_stat.echo_return_loss.is_defined()) { + v8_stat->setEchoReturnLoss(*webrtc_stat.echo_return_loss); + } + if (webrtc_stat.echo_return_loss_enhancement.is_defined()) { + v8_stat->setEchoReturnLossEnhancement( + *webrtc_stat.echo_return_loss_enhancement); + } + return v8_stat; +} + +// https://w3c.github.io/webrtc-stats/#videosourcestats-dict* +RTCVideoSourceStats* ToV8Stat(ScriptState* script_state, + const webrtc::RTCVideoSourceStats& webrtc_stat) { + RTCVideoSourceStats* v8_stat = + MakeGarbageCollected<RTCVideoSourceStats>(script_state->GetIsolate()); + // RTCMediaSourceStats + if (webrtc_stat.track_identifier.is_defined()) { + v8_stat->setTrackIdentifier( + String::FromUTF8(*webrtc_stat.track_identifier)); + } + if (webrtc_stat.kind.is_defined()) { + v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); + } + // RTCVideoSourceStats + if (webrtc_stat.width.is_defined()) { + v8_stat->setWidth(*webrtc_stat.width); + } + if (webrtc_stat.height.is_defined()) { + v8_stat->setHeight(*webrtc_stat.height); + } + if (webrtc_stat.frames.is_defined()) { + v8_stat->setFrames(*webrtc_stat.frames); + } + if (webrtc_stat.frames_per_second.is_defined()) { + v8_stat->setFramesPerSecond(*webrtc_stat.frames_per_second); + } + return v8_stat; +} + +// https://w3c.github.io/webrtc-stats/#playoutstats-dict* +RTCAudioPlayoutStats* ToV8Stat( + ScriptState* script_state, + const webrtc::RTCAudioPlayoutStats& webrtc_stat) { + RTCAudioPlayoutStats* v8_stat = + MakeGarbageCollected<RTCAudioPlayoutStats>(script_state->GetIsolate()); + + if (webrtc_stat.kind.is_defined()) { + v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); + } + if (webrtc_stat.synthesized_samples_duration.is_defined()) { + v8_stat->setSynthesizedSamplesDuration( + *webrtc_stat.synthesized_samples_duration); + } + if (webrtc_stat.synthesized_samples_events.is_defined()) { + v8_stat->setSynthesizedSamplesEvents(base::saturated_cast<uint32_t>( + *webrtc_stat.synthesized_samples_events)); + } + if (webrtc_stat.total_samples_duration.is_defined()) { + v8_stat->setTotalSamplesDuration(*webrtc_stat.total_samples_duration); + } + if (webrtc_stat.total_playout_delay.is_defined()) { + v8_stat->setTotalPlayoutDelay(*webrtc_stat.total_playout_delay); + } + if (webrtc_stat.total_samples_count.is_defined()) { + v8_stat->setTotalSamplesCount(*webrtc_stat.total_samples_count); + } + return v8_stat; +} + +// https://w3c.github.io/webrtc-stats/#pcstats-dict* +RTCPeerConnectionStats* ToV8Stat( + ScriptState* script_state, + const webrtc::RTCPeerConnectionStats& webrtc_stat) { + RTCPeerConnectionStats* v8_stat = + MakeGarbageCollected<RTCPeerConnectionStats>(script_state->GetIsolate()); + + if (webrtc_stat.data_channels_opened.is_defined()) { + v8_stat->setDataChannelsOpened(*webrtc_stat.data_channels_opened); + } + if (webrtc_stat.data_channels_closed.is_defined()) { + v8_stat->setDataChannelsClosed(*webrtc_stat.data_channels_closed); + } + return v8_stat; +} + +// https://w3c.github.io/webrtc-stats/#dcstats-dict* +RTCDataChannelStats* ToV8Stat(ScriptState* script_state, + const webrtc::RTCDataChannelStats& webrtc_stat) { + RTCDataChannelStats* v8_stat = + MakeGarbageCollected<RTCDataChannelStats>(script_state->GetIsolate()); + + if (webrtc_stat.label.is_defined()) { + v8_stat->setLabel(String::FromUTF8(*webrtc_stat.label)); + } + if (webrtc_stat.protocol.is_defined()) { + v8_stat->setProtocol(String::FromUTF8(*webrtc_stat.protocol)); + } + if (webrtc_stat.data_channel_identifier.is_defined()) { + v8_stat->setDataChannelIdentifier(*webrtc_stat.data_channel_identifier); + } + if (webrtc_stat.state.is_defined()) { + v8_stat->setState(String::FromUTF8(*webrtc_stat.state)); + } + if (webrtc_stat.messages_sent.is_defined()) { + v8_stat->setMessagesSent(*webrtc_stat.messages_sent); + } + if (webrtc_stat.bytes_sent.is_defined()) { + v8_stat->setBytesSent(*webrtc_stat.bytes_sent); + } + if (webrtc_stat.messages_received.is_defined()) { + v8_stat->setMessagesReceived(*webrtc_stat.messages_received); + } + if (webrtc_stat.bytes_received.is_defined()) { + v8_stat->setBytesReceived(*webrtc_stat.bytes_received); + } + return v8_stat; +} + +// https://w3c.github.io/webrtc-stats/#transportstats-dict* +RTCTransportStats* ToV8Stat(ScriptState* script_state, + const webrtc::RTCTransportStats& webrtc_stat) { + RTCTransportStats* v8_stat = + MakeGarbageCollected<RTCTransportStats>(script_state->GetIsolate()); + + if (webrtc_stat.packets_sent.is_defined()) { + v8_stat->setPacketsSent(*webrtc_stat.packets_sent); + } + if (webrtc_stat.packets_received.is_defined()) { + v8_stat->setPacketsReceived(*webrtc_stat.packets_received); + } + if (webrtc_stat.bytes_sent.is_defined()) { + v8_stat->setBytesSent(*webrtc_stat.bytes_sent); + } + if (webrtc_stat.bytes_received.is_defined()) { + v8_stat->setBytesReceived(*webrtc_stat.bytes_received); + } + if (webrtc_stat.ice_role.is_defined()) { + v8_stat->setIceRole(String::FromUTF8(*webrtc_stat.ice_role)); + } + if (webrtc_stat.ice_local_username_fragment.is_defined()) { + v8_stat->setIceLocalUsernameFragment( + String::FromUTF8(*webrtc_stat.ice_local_username_fragment)); + } + if (webrtc_stat.dtls_state.is_defined()) { + v8_stat->setDtlsState(String::FromUTF8(*webrtc_stat.dtls_state)); + } + if (webrtc_stat.ice_state.is_defined()) { + v8_stat->setIceState(String::FromUTF8(*webrtc_stat.ice_state)); + } + if (webrtc_stat.selected_candidate_pair_id.is_defined()) { + v8_stat->setSelectedCandidatePairId( + String::FromUTF8(*webrtc_stat.selected_candidate_pair_id)); + } + if (webrtc_stat.local_certificate_id.is_defined()) { + v8_stat->setLocalCertificateId( + String::FromUTF8(*webrtc_stat.local_certificate_id)); + } + if (webrtc_stat.remote_certificate_id.is_defined()) { + v8_stat->setRemoteCertificateId( + String::FromUTF8(*webrtc_stat.remote_certificate_id)); + } + if (webrtc_stat.tls_version.is_defined()) { + v8_stat->setTlsVersion(String::FromUTF8(*webrtc_stat.tls_version)); + } + if (webrtc_stat.dtls_cipher.is_defined()) { + v8_stat->setDtlsCipher(String::FromUTF8(*webrtc_stat.dtls_cipher)); + } + if (webrtc_stat.dtls_role.is_defined()) { + v8_stat->setDtlsRole(String::FromUTF8(*webrtc_stat.dtls_role)); + } + if (webrtc_stat.srtp_cipher.is_defined()) { + v8_stat->setSrtpCipher(String::FromUTF8(*webrtc_stat.srtp_cipher)); + } + if (webrtc_stat.selected_candidate_pair_changes.is_defined()) { + v8_stat->setSelectedCandidatePairChanges( + *webrtc_stat.selected_candidate_pair_changes); + } + // https://w3c.github.io/webrtc-provisional-stats/#dom-rtctransportstats-rtcptransportstatsid + if (webrtc_stat.rtcp_transport_stats_id.is_defined()) { + v8_stat->setRtcpTransportStatsId( + String::FromUTF8(*webrtc_stat.rtcp_transport_stats_id)); + } + return v8_stat; +} + +// https://w3c.github.io/webrtc-stats/#icecandidate-dict* +RTCIceCandidateStats* ToV8Stat( + ScriptState* script_state, + const webrtc::RTCIceCandidateStats& webrtc_stat) { + RTCIceCandidateStats* v8_stat = + MakeGarbageCollected<RTCIceCandidateStats>(script_state->GetIsolate()); + if (webrtc_stat.transport_id.is_defined()) { + v8_stat->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); + } + if (webrtc_stat.address.is_defined()) { + v8_stat->setAddress(String::FromUTF8(*webrtc_stat.address)); + } + if (webrtc_stat.port.is_defined()) { + v8_stat->setPort(*webrtc_stat.port); + } + if (webrtc_stat.protocol.is_defined()) { + v8_stat->setProtocol(String::FromUTF8(*webrtc_stat.protocol)); + } + if (webrtc_stat.candidate_type.is_defined()) { + v8_stat->setCandidateType(String::FromUTF8(*webrtc_stat.candidate_type)); + } + if (webrtc_stat.priority.is_defined()) { + v8_stat->setPriority(*webrtc_stat.priority); + } + if (webrtc_stat.url.is_defined()) { + v8_stat->setUrl(String::FromUTF8(*webrtc_stat.url)); + } + if (webrtc_stat.relay_protocol.is_defined()) { + v8_stat->setRelayProtocol(String::FromUTF8(*webrtc_stat.relay_protocol)); + } + if (webrtc_stat.foundation.is_defined()) { + v8_stat->setFoundation(String::FromUTF8(*webrtc_stat.foundation)); + } + if (webrtc_stat.related_address.is_defined()) { + v8_stat->setRelatedAddress(String::FromUTF8(*webrtc_stat.related_address)); + } + if (webrtc_stat.related_port.is_defined()) { + v8_stat->setRelatedPort(*webrtc_stat.related_port); + } + if (webrtc_stat.username_fragment.is_defined()) { + v8_stat->setUsernameFragment( + String::FromUTF8(*webrtc_stat.username_fragment)); + } + if (webrtc_stat.tcp_type.is_defined()) { + v8_stat->setTcpType(String::FromUTF8(*webrtc_stat.tcp_type)); + } + // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcicecandidatestats-networktype + // Note: additional work needed to reach consensus on the privacy model. + if (webrtc_stat.network_type.is_defined()) { + v8_stat->setNetworkType(String::FromUTF8(*webrtc_stat.network_type)); + } + // Non-standard and obsolete stats. + if (webrtc_stat.is_remote.is_defined()) { + v8_stat->setIsRemote(*webrtc_stat.is_remote); + } + return v8_stat; +} + +// https://w3c.github.io/webrtc-stats/#candidatepair-dict* +RTCIceCandidatePairStats* ToV8Stat( + ScriptState* script_state, + const webrtc::RTCIceCandidatePairStats& webrtc_stat) { + RTCIceCandidatePairStats* v8_stat = + MakeGarbageCollected<RTCIceCandidatePairStats>( + script_state->GetIsolate()); + if (webrtc_stat.transport_id.is_defined()) { + v8_stat->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); + } + if (webrtc_stat.local_candidate_id.is_defined()) { + v8_stat->setLocalCandidateId( + String::FromUTF8(*webrtc_stat.local_candidate_id)); + } + if (webrtc_stat.remote_candidate_id.is_defined()) { + v8_stat->setRemoteCandidateId( + String::FromUTF8(*webrtc_stat.remote_candidate_id)); + } + if (webrtc_stat.state.is_defined()) { + v8_stat->setState(String::FromUTF8(*webrtc_stat.state)); + } + if (webrtc_stat.nominated.is_defined()) { + v8_stat->setNominated(*webrtc_stat.nominated); + } + if (webrtc_stat.packets_sent.is_defined()) { + v8_stat->setPacketsSent(*webrtc_stat.packets_sent); + } + if (webrtc_stat.packets_received.is_defined()) { + v8_stat->setPacketsReceived(*webrtc_stat.packets_received); + } + if (webrtc_stat.bytes_sent.is_defined()) { + v8_stat->setBytesSent(*webrtc_stat.bytes_sent); + } + if (webrtc_stat.bytes_received.is_defined()) { + v8_stat->setBytesReceived(*webrtc_stat.bytes_received); + } + if (webrtc_stat.last_packet_sent_timestamp.is_defined()) { + v8_stat->setLastPacketSentTimestamp( + *webrtc_stat.last_packet_sent_timestamp); + } + if (webrtc_stat.last_packet_received_timestamp.is_defined()) { + v8_stat->setLastPacketReceivedTimestamp( + *webrtc_stat.last_packet_received_timestamp); + } + if (webrtc_stat.total_round_trip_time.is_defined()) { + v8_stat->setTotalRoundTripTime(*webrtc_stat.total_round_trip_time); + } + if (webrtc_stat.current_round_trip_time.is_defined()) { + v8_stat->setCurrentRoundTripTime(*webrtc_stat.current_round_trip_time); + } + if (webrtc_stat.available_outgoing_bitrate.is_defined()) { + v8_stat->setAvailableOutgoingBitrate( + *webrtc_stat.available_outgoing_bitrate); + } + if (webrtc_stat.available_incoming_bitrate.is_defined()) { + v8_stat->setAvailableIncomingBitrate( + *webrtc_stat.available_incoming_bitrate); + } + if (webrtc_stat.requests_received.is_defined()) { + v8_stat->setRequestsReceived(*webrtc_stat.requests_received); + } + if (webrtc_stat.requests_sent.is_defined()) { + v8_stat->setRequestsSent(*webrtc_stat.requests_sent); + } + if (webrtc_stat.responses_received.is_defined()) { + v8_stat->setResponsesReceived(*webrtc_stat.responses_received); + } + if (webrtc_stat.responses_sent.is_defined()) { + v8_stat->setResponsesSent(*webrtc_stat.responses_sent); + } + if (webrtc_stat.consent_requests_sent.is_defined()) { + v8_stat->setConsentRequestsSent(*webrtc_stat.consent_requests_sent); + } + if (webrtc_stat.packets_discarded_on_send.is_defined()) { + v8_stat->setPacketsDiscardedOnSend( + base::saturated_cast<uint32_t>(*webrtc_stat.packets_discarded_on_send)); + } + if (webrtc_stat.bytes_discarded_on_send.is_defined()) { + v8_stat->setBytesDiscardedOnSend(*webrtc_stat.bytes_discarded_on_send); + } + // Non-standard and obsolete stats. + if (webrtc_stat.writable.is_defined()) { + v8_stat->setWritable(*webrtc_stat.writable); + } + if (webrtc_stat.priority.is_defined()) { + v8_stat->setPriority(*webrtc_stat.priority); + } + return v8_stat; +} + +// https://w3c.github.io/webrtc-stats/#certificatestats-dict* +RTCCertificateStats* ToV8Stat(ScriptState* script_state, + const webrtc::RTCCertificateStats& webrtc_stat) { + RTCCertificateStats* v8_stat = + MakeGarbageCollected<RTCCertificateStats>(script_state->GetIsolate()); + if (webrtc_stat.fingerprint.is_defined()) { + v8_stat->setFingerprint(String::FromUTF8(*webrtc_stat.fingerprint)); + } + if (webrtc_stat.fingerprint_algorithm.is_defined()) { + v8_stat->setFingerprintAlgorithm( + String::FromUTF8(*webrtc_stat.fingerprint_algorithm)); + } + if (webrtc_stat.base64_certificate.is_defined()) { + v8_stat->setBase64Certificate( + String::FromUTF8(*webrtc_stat.base64_certificate)); + } + if (webrtc_stat.issuer_certificate_id.is_defined()) { + v8_stat->setIssuerCertificateId( + String::FromUTF8(*webrtc_stat.issuer_certificate_id)); + } + return v8_stat; +} + +// https://w3c.github.io/webrtc-stats/#obsolete-rtcmediastreamstats-members +// TODO(https://crbug.com/1374215): Delete when "track" and "stream" have been +// unshipped. +RTCMediaStreamStats* ToV8Stat( + ScriptState* script_state, + const webrtc::DEPRECATED_RTCMediaStreamStats& webrtc_stat) { + RTCMediaStreamStats* v8_stat = + MakeGarbageCollected<RTCMediaStreamStats>(script_state->GetIsolate()); + if (webrtc_stat.stream_identifier.is_defined()) { + v8_stat->setStreamIdentifier( + String::FromUTF8(*webrtc_stat.stream_identifier)); + } + if (webrtc_stat.track_ids.is_defined()) { + Vector<String> track_ids; + for (const std::string& track_id : *webrtc_stat.track_ids) { + track_ids.emplace_back(String::FromUTF8(track_id)); + } + v8_stat->setTrackIds(std::move(track_ids)); + } + return v8_stat; +} + +// https://w3c.github.io/webrtc-stats/#obsolete-rtcmediastreamtrackstats-members +// TODO(https://crbug.com/1374215): Delete when "track" and "stream" have been +// unshipped. +RTCMediaStreamTrackStats* ToV8Stat( + ScriptState* script_state, + const webrtc::DEPRECATED_RTCMediaStreamTrackStats& webrtc_stat) { + RTCMediaStreamTrackStats* v8_stat = + MakeGarbageCollected<RTCMediaStreamTrackStats>( + script_state->GetIsolate()); + if (webrtc_stat.track_identifier.is_defined()) { + v8_stat->setTrackIdentifier( + String::FromUTF8(*webrtc_stat.track_identifier)); + } + if (webrtc_stat.ended.is_defined()) { + v8_stat->setEnded(*webrtc_stat.ended); + } + if (webrtc_stat.kind.is_defined()) { + v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); + } + if (webrtc_stat.remote_source.is_defined()) { + v8_stat->setRemoteSource(*webrtc_stat.remote_source); + } + if (webrtc_stat.jitter_buffer_delay.is_defined()) { + v8_stat->setJitterBufferDelay(*webrtc_stat.jitter_buffer_delay); + } + if (webrtc_stat.jitter_buffer_emitted_count.is_defined()) { + v8_stat->setJitterBufferEmittedCount( + *webrtc_stat.jitter_buffer_emitted_count); + } + // Audio-only, send and receive side. + if (webrtc_stat.audio_level.is_defined()) { + v8_stat->setAudioLevel(*webrtc_stat.audio_level); + } + if (webrtc_stat.total_audio_energy.is_defined()) { + v8_stat->setTotalAudioEnergy(*webrtc_stat.total_audio_energy); + } + if (webrtc_stat.total_samples_duration.is_defined()) { + v8_stat->setTotalSamplesDuration(*webrtc_stat.total_samples_duration); + } + // Audio-only, send side. + if (webrtc_stat.echo_return_loss.is_defined()) { + v8_stat->setEchoReturnLoss(*webrtc_stat.echo_return_loss); + } + if (webrtc_stat.echo_return_loss_enhancement.is_defined()) { + v8_stat->setEchoReturnLossEnhancement( + *webrtc_stat.echo_return_loss_enhancement); + } + // Audio-only, receive side. + if (webrtc_stat.total_samples_received.is_defined()) { + v8_stat->setTotalSamplesReceived(*webrtc_stat.total_samples_received); + } + if (webrtc_stat.concealed_samples.is_defined()) { + v8_stat->setConcealedSamples(*webrtc_stat.concealed_samples); + } + if (webrtc_stat.silent_concealed_samples.is_defined()) { + v8_stat->setSilentConcealedSamples(*webrtc_stat.silent_concealed_samples); + } + if (webrtc_stat.concealment_events.is_defined()) { + v8_stat->setConcealmentEvents(*webrtc_stat.concealment_events); + } + if (webrtc_stat.inserted_samples_for_deceleration.is_defined()) { + v8_stat->setInsertedSamplesForDeceleration( + *webrtc_stat.inserted_samples_for_deceleration); + } + if (webrtc_stat.removed_samples_for_acceleration.is_defined()) { + v8_stat->setRemovedSamplesForAcceleration( + *webrtc_stat.removed_samples_for_acceleration); + } + // Video-only, send and receive side. + if (webrtc_stat.frame_width.is_defined()) { + v8_stat->setFrameWidth(*webrtc_stat.frame_width); + } + if (webrtc_stat.frame_height.is_defined()) { + v8_stat->setFrameHeight(*webrtc_stat.frame_height); + } + // Video-only, send side. + if (webrtc_stat.frames_sent.is_defined()) { + v8_stat->setFramesSent(*webrtc_stat.frames_sent); + } + if (webrtc_stat.huge_frames_sent.is_defined()) { + v8_stat->setHugeFramesSent(*webrtc_stat.huge_frames_sent); + } + // Video-only, receive side. + if (webrtc_stat.frames_received.is_defined()) { + v8_stat->setFramesReceived(*webrtc_stat.frames_received); + } + if (webrtc_stat.frames_decoded.is_defined()) { + v8_stat->setFramesDecoded(*webrtc_stat.frames_decoded); + } + if (webrtc_stat.frames_dropped.is_defined()) { + v8_stat->setFramesDropped(*webrtc_stat.frames_dropped); + } + // Non-standard and obsolete stats. + if (webrtc_stat.media_source_id.is_defined()) { + v8_stat->setMediaSourceId(String::FromUTF8(*webrtc_stat.media_source_id)); + } + if (webrtc_stat.detached.is_defined()) { + v8_stat->setDetached(*webrtc_stat.detached); + } + return v8_stat; +} + +RTCStats* RTCStatsToIDL(ScriptState* script_state, + const webrtc::RTCStats& stat, + bool expose_hardware_caps, + bool unship_deprecated_stats) { + RTCStats* v8_stats = nullptr; + if (strcmp(stat.type(), "codec") == 0) { + v8_stats = ToV8Stat(script_state, stat.cast_to<webrtc::RTCCodecStats>()); + } else if (strcmp(stat.type(), "inbound-rtp") == 0) { + v8_stats = + ToV8Stat(script_state, stat.cast_to<webrtc::RTCInboundRTPStreamStats>(), + expose_hardware_caps, unship_deprecated_stats); + } else if (strcmp(stat.type(), "outbound-rtp") == 0) { + v8_stats = ToV8Stat(script_state, + stat.cast_to<webrtc::RTCOutboundRTPStreamStats>(), + expose_hardware_caps, unship_deprecated_stats); + } else if (strcmp(stat.type(), "remote-inbound-rtp") == 0) { + v8_stats = ToV8Stat(script_state, + stat.cast_to<webrtc::RTCRemoteInboundRtpStreamStats>(), + unship_deprecated_stats); + } else if (strcmp(stat.type(), "remote-outbound-rtp") == 0) { + v8_stats = ToV8Stat(script_state, + stat.cast_to<webrtc::RTCRemoteOutboundRtpStreamStats>(), + unship_deprecated_stats); + } else if (strcmp(stat.type(), "media-source") == 0) { + // Type media-source indicates a parent type. The actual stats are based on + // the kind. + const auto& media_source = + static_cast<const webrtc::RTCMediaSourceStats&>(stat); + DCHECK(media_source.kind.is_defined()); + std::string kind = media_source.kind.ValueOrDefault(""); + if (kind == "audio") { + v8_stats = + ToV8Stat(script_state, stat.cast_to<webrtc::RTCAudioSourceStats>()); + } else if (kind == "video") { + v8_stats = + ToV8Stat(script_state, stat.cast_to<webrtc::RTCVideoSourceStats>()); + } else { + NOTIMPLEMENTED() << "Unhandled media source stat type: " << kind; + return nullptr; + } + } else if (strcmp(stat.type(), "media-playout") == 0) { + v8_stats = + ToV8Stat(script_state, stat.cast_to<webrtc::RTCAudioPlayoutStats>()); + } else if (strcmp(stat.type(), "peer-connection") == 0) { + v8_stats = + ToV8Stat(script_state, stat.cast_to<webrtc::RTCPeerConnectionStats>()); + } else if (strcmp(stat.type(), "data-channel") == 0) { + v8_stats = + ToV8Stat(script_state, stat.cast_to<webrtc::RTCDataChannelStats>()); + } else if (strcmp(stat.type(), "stream") == 0) { + if (unship_deprecated_stats) { + return nullptr; + } + v8_stats = ToV8Stat(script_state, + stat.cast_to<webrtc::DEPRECATED_RTCMediaStreamStats>()); + } else if (strcmp(stat.type(), "track") == 0) { + if (unship_deprecated_stats) { + return nullptr; + } + v8_stats = + ToV8Stat(script_state, + stat.cast_to<webrtc::DEPRECATED_RTCMediaStreamTrackStats>()); + } else if (strcmp(stat.type(), "transport") == 0) { + v8_stats = + ToV8Stat(script_state, stat.cast_to<webrtc::RTCTransportStats>()); + } else if (strcmp(stat.type(), "candidate-pair") == 0) { + v8_stats = ToV8Stat(script_state, + stat.cast_to<webrtc::RTCIceCandidatePairStats>()); + } else if (strcmp(stat.type(), "local-candidate") == 0) { + v8_stats = ToV8Stat(script_state, + stat.cast_to<webrtc::RTCLocalIceCandidateStats>()); + } else if (strcmp(stat.type(), "remote-candidate") == 0) { + v8_stats = ToV8Stat(script_state, + stat.cast_to<webrtc::RTCRemoteIceCandidateStats>()); + } else if (strcmp(stat.type(), "certificate") == 0) { + v8_stats = + ToV8Stat(script_state, stat.cast_to<webrtc::RTCCertificateStats>()); + } else { + DVLOG(2) << "Unhandled stat-type " << stat.type(); + return nullptr; + } + + v8_stats->setId(String::FromUTF8(stat.id())); + v8_stats->setTimestamp(stat.timestamp().ms<double>()); + v8_stats->setType(String::FromUTF8(stat.type())); + return v8_stats; +} + class RTCStatsReportIterationSource final : public PairSyncIterable<RTCStatsReport>::IterationSource { public: explicit RTCStatsReportIterationSource( - std::unique_ptr<RTCStatsReportPlatform> report) - : report_(std::move(report)) {} + std::unique_ptr<RTCStatsReportPlatform> report, + bool use_web_idl, + bool unship_deprecated_stats) + : report_(std::move(report)), + use_web_idl_(use_web_idl), + unship_deprecated_stats_(unship_deprecated_stats) {} bool FetchNextItem(ScriptState* script_state, String& key, ScriptValue& value, ExceptionState& exception_state) override { - std::unique_ptr<RTCStats> stats = report_->Next(); - if (!stats) + if (use_web_idl_) { + return FetchNextItemIdl(script_state, key, value, exception_state); + } + std::unique_ptr<RTCStatsWrapper> stats = report_->Next(); + if (!stats) { return false; + } key = stats->Id(); value = ScriptValue(script_state->GetIsolate(), RTCStatsToV8Object(script_state, stats.get())); return true; } + bool FetchNextItemIdl(ScriptState* script_state, + String& key, + ScriptValue& value, + ExceptionState& exception_state) { + const bool expose_hardware_caps = + ExposeHardwareCapabilityStats(script_state); + const webrtc::RTCStats* rtc_stats = report_->NextStats(); + RTCStats* v8_stat = nullptr; + // Loop until a stat can be converted. + while (rtc_stats) { + v8_stat = RTCStatsToIDL(script_state, *rtc_stats, expose_hardware_caps, + unship_deprecated_stats_); + if (v8_stat) { + break; + } + LOG(WARNING) << "Skipping stat for id=" << rtc_stats->id() + << " as there is no conversion to that stat type " + << rtc_stats->type(); + rtc_stats = report_->NextStats(); + } + if (!rtc_stats) { + return false; + } + key = String::FromUTF8(rtc_stats->id()); + value = ScriptValue(script_state->GetIsolate(), + v8_stat->ToV8Value(script_state)); + return true; + } + private: std::unique_ptr<RTCStatsReportPlatform> report_; + const bool use_web_idl_; + const bool unship_deprecated_stats_; }; } // namespace @@ -173,7 +1313,11 @@ } RTCStatsReport::RTCStatsReport(std::unique_ptr<RTCStatsReportPlatform> report) - : report_(std::move(report)) {} + : report_(std::move(report)), + use_web_idl_( + base::FeatureList::IsEnabled(features::kWebRtcStatsReportIdl)), + unship_deprecated_stats_( + base::FeatureList::IsEnabled(WebRtcUnshipDeprecatedStats)) {} uint32_t RTCStatsReport::size() const { return base::saturated_cast<uint32_t>(report_->Size()); @@ -182,16 +1326,40 @@ PairSyncIterable<RTCStatsReport>::IterationSource* RTCStatsReport::CreateIterationSource(ScriptState*, ExceptionState&) { return MakeGarbageCollected<RTCStatsReportIterationSource>( - report_->CopyHandle()); + report_->CopyHandle(), use_web_idl_, unship_deprecated_stats_); +} + +bool RTCStatsReport::GetMapEntryIdl(ScriptState* script_state, + const String& key, + ScriptValue& value, + ExceptionState&) { + const webrtc::RTCStats* stats = report_->stats_report().Get(key.Utf8()); + if (!stats) { + return false; + } + + RTCStats* v8_stats = RTCStatsToIDL( + script_state, *stats, ExposeHardwareCapabilityStats(script_state), + unship_deprecated_stats_); + if (!v8_stats) { + return false; + } + value = ScriptValue(script_state->GetIsolate(), + v8_stats->ToV8Value(script_state)); + return true; } bool RTCStatsReport::GetMapEntry(ScriptState* script_state, const String& key, ScriptValue& value, - ExceptionState&) { - std::unique_ptr<RTCStats> stats = report_->GetStats(key); - if (!stats) + ExceptionState& exception_state) { + if (use_web_idl_) { + return GetMapEntryIdl(script_state, key, value, exception_state); + } + std::unique_ptr<RTCStatsWrapper> stats = report_->GetStats(key); + if (!stats) { return false; + } value = ScriptValue(script_state->GetIsolate(), RTCStatsToV8Object(script_state, stats.get())); return true;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.h b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.h index 7a10ec4e..e18a80e 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.h +++ b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.h
@@ -41,7 +41,14 @@ ExceptionState&) override; private: + bool GetMapEntryIdl(ScriptState*, + const String& key, + ScriptValue&, + ExceptionState&); + std::unique_ptr<RTCStatsReportPlatform> report_; + const bool use_web_idl_; + const bool unship_deprecated_stats_; }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.idl b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.idl index 8912cd7..6f20bf4 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.idl +++ b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.idl
@@ -5,5 +5,413 @@ // https://w3c.github.io/webrtc-pc/#rtcstatsreport-object [Exposed=Window] interface RTCStatsReport { - readonly maplike<DOMString, object>; + readonly maplike<DOMString, object>; +}; + +// https://w3c.github.io/webrtc-stats/#rtcstatstype-str* +enum RTCStatsType { + "codec", + "inbound-rtp", + "outbound-rtp", + "remote-inbound-rtp", + "remote-outbound-rtp", + "media-source", + "media-playout", + "peer-connection", + "data-channel", + "stream", + "track", + "transport", + "candidate-pair", + "local-candidate", + "remote-candidate", + "certificate" +}; + +enum RTCIceServerTransportProtocol { + "udp", + "tcp", + "tls", +}; + +// https://w3c.github.io/webrtc-pc/#rtcstats-dictionary +dictionary RTCStats { + required DOMHighResTimeStamp timestamp; + required RTCStatsType type; + required DOMString id; +}; + +// https://www.w3.org/TR/webrtc-stats/#codec-dict* +dictionary RTCCodecStats : RTCStats { + required unsigned long payloadType; + required DOMString transportId; + required DOMString mimeType; + unsigned long clockRate; + unsigned long channels; + DOMString sdpFmtpLine; +}; + +// https://w3c.github.io/webrtc-stats/#streamstats-dict* +dictionary RTCRtpStreamStats : RTCStats { + required unsigned long ssrc; + required DOMString kind; + DOMString transportId; + DOMString codecId; + // Non-standard and obsolete stats. + DOMString trackId; + DOMString mediaType; +}; + +// https://w3c.github.io/webrtc-stats/#receivedrtpstats-dict* +dictionary RTCReceivedRtpStreamStats : RTCRtpStreamStats { + unsigned long long packetsReceived; + long long packetsLost; + double jitter; +}; + +// https://w3c.github.io/webrtc-stats/#inboundrtpstats-dict* +dictionary RTCInboundRtpStreamStats : RTCReceivedRtpStreamStats { + required DOMString trackIdentifier; + required DOMString kind; + DOMString mid; + DOMString remoteId; + unsigned long framesDecoded; + unsigned long keyFramesDecoded; + // Not implemented: unsigned long framesRendered; + unsigned long framesDropped; + unsigned long frameWidth; + unsigned long frameHeight; + double framesPerSecond; + unsigned long long qpSum; + double totalDecodeTime; + double totalInterFrameDelay; + double totalSquaredInterFrameDelay; + unsigned long pauseCount; + double totalPausesDuration; + unsigned long freezeCount; + double totalFreezesDuration; + DOMHighResTimeStamp lastPacketReceivedTimestamp; + unsigned long long headerBytesReceived; + unsigned long long packetsDiscarded; + unsigned long long fecPacketsReceived; + unsigned long long fecPacketsDiscarded; + unsigned long long bytesReceived; + unsigned long nackCount; + unsigned long firCount; + unsigned long pliCount; + double totalProcessingDelay; + DOMHighResTimeStamp estimatedPlayoutTimestamp; + double jitterBufferDelay; + double jitterBufferTargetDelay; + unsigned long long jitterBufferEmittedCount; + double jitterBufferMinimumDelay; + unsigned long long totalSamplesReceived; + unsigned long long concealedSamples; + unsigned long long silentConcealedSamples; + unsigned long long concealmentEvents; + unsigned long long insertedSamplesForDeceleration; + unsigned long long removedSamplesForAcceleration; + double audioLevel; + double totalAudioEnergy; + double totalSamplesDuration; + unsigned long framesReceived; + DOMString decoderImplementation; + DOMString playoutId; + boolean powerEfficientDecoder; + unsigned long framesAssembledFromMultiplePackets; + double totalAssemblyTime; + // https://w3c.github.io/webrtc-provisional-stats/#RTCInboundRtpStreamStats-dict* + DOMString contentType; + // https://github.com/w3c/webrtc-provisional-stats/issues/40 + DOMString googTimingFrameInfo; +}; + +// https://w3c.github.io/webrtc-stats/#remoteinboundrtpstats-dict* +dictionary RTCRemoteInboundRtpStreamStats : RTCReceivedRtpStreamStats { + DOMString localId; + double roundTripTime; + double totalRoundTripTime; + double fractionLost; + unsigned long long roundTripTimeMeasurements; +}; + +// https://w3c.github.io/webrtc-stats/#sentrtpstats-dict* +dictionary RTCSentRtpStreamStats : RTCRtpStreamStats { + unsigned long packetsSent; + unsigned long long bytesSent; +}; + +// https://w3c.github.io/webrtc-stats/#outboundrtpstats-dict* +dictionary RTCOutboundRtpStreamStats : RTCSentRtpStreamStats { + DOMString mid; + DOMString mediaSourceId; + DOMString remoteId; + DOMString rid; + unsigned long long headerBytesSent; + unsigned long long retransmittedPacketsSent; + unsigned long long retransmittedBytesSent; + double targetBitrate; + unsigned long long totalEncodedBytesTarget; + unsigned long frameWidth; + unsigned long frameHeight; + double framesPerSecond; + unsigned long framesSent; + unsigned long hugeFramesSent; + unsigned long framesEncoded; + unsigned long keyFramesEncoded; + unsigned long long qpSum; + double totalEncodeTime; + double totalPacketSendDelay; + RTCQualityLimitationReason qualityLimitationReason; + record<DOMString, double> qualityLimitationDurations; + unsigned long qualityLimitationResolutionChanges; + unsigned long nackCount; + unsigned long firCount; + unsigned long pliCount; + DOMString encoderImplementation; + boolean powerEfficientEncoder; + boolean active; + DOMString scalabilityMode; + // https://w3c.github.io/webrtc-provisional-stats/#RTCOutboundRtpStreamStats-dict* + DOMString contentType; +}; + +// https://w3c.github.io/webrtc-stats/#rtcqualitylimitationreason-enum +enum RTCQualityLimitationReason { + "none", + "cpu", + "bandwidth", + "other", + }; + +// https://w3c.github.io/webrtc-stats/#remoteoutboundrtpstats-dict* +dictionary RTCRemoteOutboundRtpStreamStats : RTCSentRtpStreamStats { + DOMString localId; + DOMHighResTimeStamp remoteTimestamp; + unsigned long long reportsSent; + double roundTripTime; + double totalRoundTripTime; + unsigned long long roundTripTimeMeasurements; +}; + +// https://w3c.github.io/webrtc-stats/#mediasourcestats-dict* +dictionary RTCMediaSourceStats : RTCStats { + required DOMString trackIdentifier; + required DOMString kind; +}; + +// https://w3c.github.io/webrtc-stats/#audiosourcestats-dict* +dictionary RTCAudioSourceStats : RTCMediaSourceStats { + double audioLevel; + double totalAudioEnergy; + double totalSamplesDuration; + double echoReturnLoss; + double echoReturnLossEnhancement; + // Not implemented: double droppedSamplesDuration; + // Not implemented: unsigned long droppedSamplesEvents; + // Not implemented: double totalCaptureDelay; + // Not implemented: unsigned long long totalSamplesCaptured; +}; + +// https://w3c.github.io/webrtc-stats/#videosourcestats-dict* +dictionary RTCVideoSourceStats : RTCMediaSourceStats { + unsigned long width; + unsigned long height; + unsigned long frames; + double framesPerSecond; +}; + +// https://w3c.github.io/webrtc-stats/#playoutstats-dict* +dictionary RTCAudioPlayoutStats : RTCStats { + required DOMString kind; + double synthesizedSamplesDuration; + unsigned long synthesizedSamplesEvents; + double totalSamplesDuration; + double totalPlayoutDelay; + unsigned long long totalSamplesCount; +}; + +// https://w3c.github.io/webrtc-stats/#pcstats-dict* +dictionary RTCPeerConnectionStats : RTCStats { + unsigned long dataChannelsOpened; + unsigned long dataChannelsClosed; +}; + +// https://w3c.github.io/webrtc-stats/#dcstats-dict* +dictionary RTCDataChannelStats : RTCStats { + DOMString label; + DOMString protocol; + unsigned short dataChannelIdentifier; + required RTCDataChannelState state; + unsigned long messagesSent; + unsigned long long bytesSent; + unsigned long messagesReceived; + unsigned long long bytesReceived; +}; + +// https://w3c.github.io/webrtc-stats/#transportstats-dict* +dictionary RTCTransportStats : RTCStats { + unsigned long long packetsSent; + unsigned long long packetsReceived; + unsigned long long bytesSent; + unsigned long long bytesReceived; + RTCIceRole iceRole; + DOMString iceLocalUsernameFragment; + required RTCDtlsTransportState dtlsState; + RTCIceTransportState iceState; + DOMString selectedCandidatePairId; + DOMString localCertificateId; + DOMString remoteCertificateId; + DOMString tlsVersion; + DOMString dtlsCipher; + RTCDtlsRole dtlsRole; + DOMString srtpCipher; + unsigned long selectedCandidatePairChanges; + // https://w3c.github.io/webrtc-provisional-stats/#RTCTransportStats-dict* + DOMString rtcpTransportStatsId; +}; + +// https://w3c.github.io/webrtc-stats/#rtcdtlsrole-enum +enum RTCDtlsRole { + "client", + "server", + "unknown", +}; + +// https://w3c.github.io/webrtc-stats/#icecandidate-dict* +dictionary RTCIceCandidateStats : RTCStats { + required DOMString transportId; + DOMString? address; + long port; + DOMString protocol; + required RTCIceCandidateType candidateType; + long priority; + DOMString url; + RTCIceServerTransportProtocol relayProtocol; + DOMString foundation; + DOMString relatedAddress; + long relatedPort; + DOMString usernameFragment; + RTCIceTcpCandidateType tcpType; + // https://w3c.github.io/webrtc-provisional-stats/#RTCIceCandidateStats-stat* + RTCNetworkType networkType; + // Non-standard and obsolete stats. + boolean isRemote; +}; + +// https://w3c.github.io/webrtc-stats/#candidatepair-dict* +dictionary RTCIceCandidatePairStats : RTCStats { + required DOMString transportId; + required DOMString localCandidateId; + required DOMString remoteCandidateId; + required RTCStatsIceCandidatePairState state; + boolean nominated; + unsigned long long packetsSent; + unsigned long long packetsReceived; + unsigned long long bytesSent; + unsigned long long bytesReceived; + DOMHighResTimeStamp lastPacketSentTimestamp; + DOMHighResTimeStamp lastPacketReceivedTimestamp; + double totalRoundTripTime; + double currentRoundTripTime; + double availableOutgoingBitrate; + double availableIncomingBitrate; + unsigned long long requestsReceived; + unsigned long long requestsSent; + unsigned long long responsesReceived; + unsigned long long responsesSent; + unsigned long long consentRequestsSent; + unsigned long packetsDiscardedOnSend; + unsigned long long bytesDiscardedOnSend; + // Non-standard and obsolete stats. + boolean writable; + unsigned long long priority; +}; + +// https://w3c.github.io/webrtc-stats/#rtcstatsicecandidatepairstate-enum +enum RTCStatsIceCandidatePairState { + "frozen", + "waiting", + "in-progress", + "failed", + "succeeded" +}; + +// https://w3c.github.io/webrtc-stats/#certificatestats-dict* +dictionary RTCCertificateStats : RTCStats { + required DOMString fingerprint; + required DOMString fingerprintAlgorithm; + required DOMString base64Certificate; + DOMString issuerCertificateId; +}; + +// https://w3c.github.io/webrtc-provisional-stats/#rtcnetworktype-enum +enum RTCNetworkType { + "bluetooth", + "cellular", + "ethernet", + "wifi", + "wimax", + "vpn", + "unknown" +}; + +// ----- Obsolete Stats ----- + +// https://w3c.github.io/webrtc-stats/#obsolete-rtcmediastreamstats-members +// TODO(https://crbug.com/1374215): Delete when "track" and "stream" have been unshipped. +dictionary RTCMediaStreamStats : RTCStats { + DOMString streamIdentifier; + sequence<DOMString> trackIds; +}; + +// https://w3c.github.io/webrtc-stats/#obsolete-rtcmediastreamtrackstats-members +// TODO(https://crbug.com/1374215): Delete when "track" and "stream" have been unshipped. +dictionary RTCMediaStreamTrackStats : RTCStats { + DOMString trackIdentifier; + boolean ended; + required DOMString kind; + // Not implemented: RTCPriorityType priority; + boolean remoteSource; + // Not implemented: DOMHighResTimeStamp estimatedPlayoutTimestamp; + double jitterBufferDelay; + unsigned long long jitterBufferEmittedCount; + + // Audio-only, send and receive side. + double audioLevel; + double totalAudioEnergy; + double totalSamplesDuration; + + // Audio-only, send side. + double echoReturnLoss; + double echoReturnLossEnhancement; + + // Audio-only, receive side. + unsigned long long totalSamplesReceived; + unsigned long long concealedSamples; + unsigned long long silentConcealedSamples; + unsigned long long concealmentEvents; + unsigned long long insertedSamplesForDeceleration; + unsigned long long removedSamplesForAcceleration; + + // Video-only, send and receive side. + unsigned long frameWidth; + unsigned long frameHeight; + // Not implemented: double framesPerSecond; + + // Video-only, send side. + // Not implemented: unsigned long keyFramesSent; + // Not implemented: unsigned long framesCaptured; + unsigned long framesSent; + unsigned long hugeFramesSent; + + // Video-only, receive side. + // Not implemented: unsigned long keyFramesReceived; + unsigned long framesReceived; + unsigned long framesDecoded; + unsigned long framesDropped; + + // Non-standard and obsolete stats. + DOMString mediaSourceId; + boolean detached; };
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc index fb0c22b..d88f7b6 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -32,7 +32,6 @@ #include <utility> #include "base/auto_reset.h" -#include "base/debug/dump_without_crashing.h" #include "base/feature_list.h" #include "base/logging.h" #include "base/metrics/histogram_functions.h"
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_stats.cc b/third_party/blink/renderer/platform/peerconnection/rtc_stats.cc index 6f5a74a..7814d02 100644 --- a/third_party/blink/renderer/platform/peerconnection/rtc_stats.cc +++ b/third_party/blink/renderer/platform/peerconnection/rtc_stats.cc
@@ -4,6 +4,8 @@ #include "third_party/blink/renderer/platform/peerconnection/rtc_stats.h" +#include <cstddef> +#include <memory> #include <set> #include <string> @@ -142,32 +144,41 @@ is_track_stats_deprecation_trial_enabled_); } -std::unique_ptr<RTCStats> RTCStatsReportPlatform::GetStats( +std::unique_ptr<RTCStatsWrapper> RTCStatsReportPlatform::GetStats( const String& id) const { const webrtc::RTCStats* stats = stats_report_->Get(id.Utf8()); if (!stats || !ShouldExposeStatsObject(*stats, unship_deprecated_stats_)) - return std::unique_ptr<RTCStats>(); - return std::make_unique<RTCStats>(stats_report_, stats, exposed_group_ids_, - unship_deprecated_stats_); + return std::unique_ptr<RTCStatsWrapper>(); + return std::make_unique<RTCStatsWrapper>( + stats_report_, stats, exposed_group_ids_, unship_deprecated_stats_); } -std::unique_ptr<RTCStats> RTCStatsReportPlatform::Next() { +std::unique_ptr<RTCStatsWrapper> RTCStatsReportPlatform::Next() { while (it_ != end_) { const webrtc::RTCStats& next = *it_; ++it_; if (ShouldExposeStatsObject(next, unship_deprecated_stats_)) { - return std::make_unique<RTCStats>( + return std::make_unique<RTCStatsWrapper>( stats_report_, &next, exposed_group_ids_, unship_deprecated_stats_); } } - return std::unique_ptr<RTCStats>(); + return std::unique_ptr<RTCStatsWrapper>(); +} + +const webrtc::RTCStats* RTCStatsReportPlatform::NextStats() { + while (it_ != end_) { + const webrtc::RTCStats& stat = *it_; + ++it_; + return &stat; + } + return nullptr; } size_t RTCStatsReportPlatform::Size() const { return size_; } -RTCStats::RTCStats( +RTCStatsWrapper::RTCStatsWrapper( const scoped_refptr<const webrtc::RTCStatsReport>& stats_owner, const webrtc::RTCStats* stats, const Vector<webrtc::NonStandardGroupId>& exposed_group_ids, @@ -182,28 +193,28 @@ DCHECK(stats_owner_->Get(stats_->id())); } -RTCStats::~RTCStats() = default; +RTCStatsWrapper::~RTCStatsWrapper() = default; -String RTCStats::Id() const { +String RTCStatsWrapper::Id() const { return String::FromUTF8(stats_->id()); } -String RTCStats::GetType() const { +String RTCStatsWrapper::GetType() const { return String::FromUTF8(stats_->type()); } -double RTCStats::TimestampMs() const { +double RTCStatsWrapper::TimestampMs() const { // The timestamp unit is milliseconds but we want decimal // precision so we convert ourselves. return stats_->timestamp().us() / static_cast<double>(base::Time::kMicrosecondsPerMillisecond); } -size_t RTCStats::MembersCount() const { +size_t RTCStatsWrapper::MembersCount() const { return stats_members_.size(); } -std::unique_ptr<RTCStatsMember> RTCStats::GetMember(size_t i) const { +std::unique_ptr<RTCStatsMember> RTCStatsWrapper::GetMember(size_t i) const { DCHECK_LT(i, stats_members_.size()); return std::make_unique<RTCStatsMember>(stats_owner_, stats_members_[i]); }
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_stats.h b/third_party/blink/renderer/platform/peerconnection/rtc_stats.h index cb64427..bb539c2 100644 --- a/third_party/blink/renderer/platform/peerconnection/rtc_stats.h +++ b/third_party/blink/renderer/platform/peerconnection/rtc_stats.h
@@ -29,7 +29,7 @@ namespace blink { -class RTCStats; +class RTCStatsWrapper; class RTCStatsMember; PLATFORM_EXPORT BASE_DECLARE_FEATURE(WebRtcUnshipDeprecatedStats); @@ -54,10 +54,13 @@ std::unique_ptr<RTCStatsReportPlatform> CopyHandle() const; // Gets stats object by |id|, or null if no stats with that |id| exists. - std::unique_ptr<RTCStats> GetStats(const String& id) const; + std::unique_ptr<RTCStatsWrapper> GetStats(const String& id) const; // The next stats object, or null if the end has been reached. - std::unique_ptr<RTCStats> Next(); + std::unique_ptr<RTCStatsWrapper> Next(); + + const webrtc::RTCStatsReport& stats_report() const { return *stats_report_; } + const webrtc::RTCStats* NextStats(); // The number of stats objects. size_t Size() const; @@ -73,13 +76,14 @@ const size_t size_; }; -class PLATFORM_EXPORT RTCStats { +class PLATFORM_EXPORT RTCStatsWrapper { public: - RTCStats(const scoped_refptr<const webrtc::RTCStatsReport>& stats_owner, - const webrtc::RTCStats* stats, - const Vector<webrtc::NonStandardGroupId>& exposed_group_ids, - bool unship_deprecated_stats); - virtual ~RTCStats(); + RTCStatsWrapper( + const scoped_refptr<const webrtc::RTCStatsReport>& stats_owner, + const webrtc::RTCStats* stats, + const Vector<webrtc::NonStandardGroupId>& exposed_group_ids, + bool unship_deprecated_stats); + virtual ~RTCStatsWrapper(); String Id() const; String GetType() const;
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_stats_test.cc b/third_party/blink/renderer/platform/peerconnection/rtc_stats_test.cc index f8da649d..7c8f4854 100644 --- a/third_party/blink/renderer/platform/peerconnection/rtc_stats_test.cc +++ b/third_party/blink/renderer/platform/peerconnection/rtc_stats_test.cc
@@ -52,7 +52,7 @@ foo_id("fooId"), hw_stat("hwStat") {} -bool MemberIsDefined(const RTCStats& stats, const char* name) { +bool MemberIsDefined(const RTCStatsWrapper& stats, const char* name) { for (size_t i = 0; i < stats.MembersCount(); ++i) { std::unique_ptr<RTCStatsMember> member = stats.GetMember(i); if (member->GetName() == name && member->IsDefined()) { @@ -95,7 +95,7 @@ RTCStatsReportPlatform report(webrtc_report.get(), {}, false); EXPECT_EQ(report.Size(), 2u); - std::unique_ptr<RTCStats> stats = report.Next(); + std::unique_ptr<RTCStatsWrapper> stats = report.Next(); EXPECT_TRUE(stats); EXPECT_EQ(stats->Id(), kFirstId); stats = report.Next(); @@ -115,7 +115,7 @@ // TestStats has three members, but the non-standard member should be filtered // out. RTCStatsReportPlatform report(webrtc_report.get(), {}, false); - std::unique_ptr<RTCStats> stats = report.Next(); + std::unique_ptr<RTCStatsWrapper> stats = report.Next(); ASSERT_NE(nullptr, stats); ASSERT_EQ(3u, stats->MembersCount()); EXPECT_EQ("standardized", stats->GetMember(0)->GetName()); @@ -134,7 +134,7 @@ Vector<webrtc::NonStandardGroupId>{ webrtc::NonStandardGroupId::kGroupIdForTesting}, false); - std::unique_ptr<RTCStats> stats = report.GetStats("id"); + std::unique_ptr<RTCStatsWrapper> stats = report.GetStats("id"); ASSERT_NE(nullptr, stats); ASSERT_EQ(4u, stats->MembersCount()); EXPECT_EQ("standardized", stats->GetMember(0)->GetName()); @@ -158,7 +158,7 @@ Vector<webrtc::NonStandardGroupId>{ webrtc::NonStandardGroupId::kGroupIdForTesting}, false); - std::unique_ptr<RTCStats> stats = report.GetStats("id"); + std::unique_ptr<RTCStatsWrapper> stats = report.GetStats("id"); ASSERT_NE(nullptr, stats); ASSERT_EQ(4u, stats->MembersCount()); EXPECT_EQ("standardized", stats->GetMember(0)->GetName()); @@ -250,7 +250,7 @@ RTCStatsReportPlatform report( webrtc_report.get(), {}, /*is_track_stats_deprecation_trial_enabled=*/false); - std::unique_ptr<RTCStats> test_stats = report.GetStats("test"); + std::unique_ptr<RTCStatsWrapper> test_stats = report.GetStats("test"); EXPECT_FALSE(MemberIsDefined(*test_stats, "fooId")); } // Deprecated stats are accessible when disabling WebRtcUnshipDeprecatedStats. @@ -260,7 +260,7 @@ RTCStatsReportPlatform report( webrtc_report.get(), {}, /*is_track_stats_deprecation_trial_enabled=*/false); - std::unique_ptr<RTCStats> test_stats = report.GetStats("test"); + std::unique_ptr<RTCStatsWrapper> test_stats = report.GetStats("test"); EXPECT_TRUE(MemberIsDefined(*test_stats, "fooId")); } // Deprecated stats are accessible when @@ -269,7 +269,7 @@ RTCStatsReportPlatform report( webrtc_report.get(), {}, /*is_track_stats_deprecation_trial_enabled=*/true); - std::unique_ptr<RTCStats> test_stats = report.GetStats("test"); + std::unique_ptr<RTCStatsWrapper> test_stats = report.GetStats("test"); EXPECT_TRUE(MemberIsDefined(*test_stats, "fooId")); } }
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc index 6ada2f6..7c8d3a2c 100644 --- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc +++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
@@ -648,9 +648,10 @@ // we don't care about ordering. Vector<int> input_buffers_free_; - // The number of output buffers ready to be filled with output from the - // encoder. - int output_buffers_free_count_{0}; + // The number of output buffers that have been sent to a hardware video + // encoder by VideoEncodeAccelerator::UseOutputBitstreamBuffer() and the + // encoder holds them. + size_t output_buffers_in_encoder_count_{0}; // Whether to send the frames to VEA as native buffer. Native buffer allows // VEA to pass the buffer to the encoder directly without further processing. @@ -872,7 +873,7 @@ // continue. If this is a key frame, WebRTC will request a key frame again. // Besides, webrtc will drop a frame if Encode() blocks too long. if (!use_native_input_ && input_buffers_free_.empty() && - output_buffers_free_count_ == 0) { + output_buffers_in_encoder_count_ == 0u) { DVLOG(2) << "Run out of input and output buffers. Drop the frame."; encode_event.Set(WEBRTC_VIDEO_CODEC_ERROR); encode_event.Signal(); @@ -907,7 +908,7 @@ bitstream_buffer_id, output_buffers_[bitstream_buffer_id].first.Duplicate(), output_buffers_[bitstream_buffer_id].first.GetSize())); - output_buffers_free_count_++; + output_buffers_in_encoder_count_++; } } @@ -1022,7 +1023,7 @@ video_encoder_->UseOutputBitstreamBuffer( media::BitstreamBuffer(i, output_buffers_[i].first.Duplicate(), output_buffers_[i].first.GetSize())); - output_buffers_free_count_++; + output_buffers_in_encoder_count_++; } DCHECK_EQ(status_, WEBRTC_VIDEO_CODEC_UNINITIALIZED); status_ = WEBRTC_VIDEO_CODEC_OK; @@ -1054,7 +1055,8 @@ media::VideoEncodeAccelerator::kPlatformFailureError); return; } - output_buffers_free_count_--; + DCHECK_NE(output_buffers_in_encoder_count_, 0u); + output_buffers_in_encoder_count_--; // Find RTP and capture timestamps by going through |pending_timestamps_|. // Derive it from current time otherwise.
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.h b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.h index d0c0ee2..f3a5af72 100644 --- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.h +++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.h
@@ -78,7 +78,6 @@ private: class Impl; - friend class RTCVideoEncoder::Impl; void UpdateEncoderInfo( media::VideoEncoderInfo encoder_info,
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_test.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_test.cc index db7754e..f7096eb 100644 --- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_test.cc +++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_test.cc
@@ -868,11 +868,6 @@ EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, rtc_encoder_->InitEncode(&tl_codec, kVideoEncoderSettings)); size_t kNumEncodeFrames = 5u; - EXPECT_CALL(*mock_vea_, Encode(_, _)) - .Times(kNumEncodeFrames) - .WillRepeatedly(Invoke( - this, &RTCVideoEncoderTest::ReturnSVCLayerFrameWithVp9Metadata)); - for (size_t i = 0; i < kNumEncodeFrames; i++) { const rtc::scoped_refptr<webrtc::I420Buffer> buffer = webrtc::I420Buffer::Create(kInputFrameWidth, kInputFrameHeight); @@ -880,6 +875,13 @@ std::vector<webrtc::VideoFrameType> frame_types; if (i == 0) frame_types.emplace_back(webrtc::VideoFrameType::kVideoFrameKey); + base::WaitableEvent event; + EXPECT_CALL(*mock_vea_, Encode(_, _)) + .WillOnce(Invoke( + this, &RTCVideoEncoderTest::ReturnSVCLayerFrameWithVp9Metadata)); + EXPECT_CALL(*mock_vea_, UseOutputBitstreamBuffer(_)).WillOnce([&event]() { + event.Signal(); + }); EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, rtc_encoder_->Encode(webrtc::VideoFrame::Builder() .set_video_frame_buffer(buffer) @@ -888,6 +890,7 @@ .set_rotation(webrtc::kVideoRotation_0) .build(), &frame_types)); + event.Wait(); } } @@ -913,8 +916,9 @@ TEST_P(RTCVideoEncoderEncodeTest, EncodeSpatialLayer) { const webrtc::VideoCodecType codec_type = webrtc::kVideoCodecVP9; CreateEncoder(codec_type); - webrtc::VideoCodec sl_codec = GetSVCLayerCodec(webrtc::kVideoCodecVP9, - /*num_spatial_layers=*/3); + constexpr size_t kNumSpatialLayers = 3; + webrtc::VideoCodec sl_codec = + GetSVCLayerCodec(webrtc::kVideoCodecVP9, kNumSpatialLayers); EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, rtc_encoder_->InitEncode(&sl_codec, kVideoEncoderSettings)); @@ -952,12 +956,6 @@ }; CodecSpecificVerifier sl_verifier(sl_codec); rtc_encoder_->RegisterEncodeCompleteCallback(&sl_verifier); - - EXPECT_CALL(*mock_vea_, Encode) - .Times(kNumEncodeFrames) - .WillRepeatedly(Invoke( - this, &RTCVideoEncoderTest::ReturnSVCLayerFrameWithVp9Metadata)); - for (size_t i = 0; i < kNumEncodeFrames; i++) { const rtc::scoped_refptr<webrtc::I420Buffer> buffer = webrtc::I420Buffer::Create(kInputFrameWidth, kInputFrameHeight); @@ -965,6 +963,17 @@ std::vector<webrtc::VideoFrameType> frame_types; if (i == 0) frame_types.emplace_back(webrtc::VideoFrameType::kVideoFrameKey); + base::WaitableEvent event; + EXPECT_CALL(*mock_vea_, Encode) + .WillOnce(Invoke( + this, &RTCVideoEncoderTest::ReturnSVCLayerFrameWithVp9Metadata)); + ::testing::Sequence s; + EXPECT_CALL(*mock_vea_, UseOutputBitstreamBuffer(_)) + .Times(kNumSpatialLayers - 1) + .InSequence(s); + EXPECT_CALL(*mock_vea_, UseOutputBitstreamBuffer(_)) + .InSequence(s) + .WillOnce([&event]() { event.Signal(); }); EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, rtc_encoder_->Encode(webrtc::VideoFrame::Builder() .set_video_frame_buffer(buffer) @@ -973,6 +982,7 @@ .set_rotation(webrtc::kVideoRotation_0) .build(), &frame_types)); + event.Wait(); } sl_verifier.Wait(); RunUntilIdle();
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 4015c7e..55e59a9 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -746,6 +746,11 @@ status: "test", base_feature: "none", }, + // Exists so that we can run a reverse-Finch experiment to assess its performance. + { + name: "CSSEasySelectors", + status: "stable", + }, { // Include custom properties in CSSComputedStyleDeclaration::item/length. // https://crbug.com/949807 @@ -1029,6 +1034,11 @@ status: "experimental", base_feature: "none", }, + // `text-wrap: balance`. crbug.com/1251079 + { + name: "CSSTextWrap", + status: "test", + }, // Support for CSS Toggles, https://tabatkins.github.io/css-toggle/ { name: "CSSToggles",
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 1e337c7e..3103230 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -2301,14 +2301,6 @@ crbug.com/876485 fast/performance/performance-measure-null-exception.html [ Failure ] -# image-set() does not yet support gradient images -crbug.com/1400902 external/wpt/css/css-images/image-set/image-set-linear-gradient-rendering.html [ Failure ] -crbug.com/1400902 external/wpt/css/css-images/image-set/image-set-radial-gradient-rendering.html [ Failure ] -crbug.com/1400902 external/wpt/css/css-images/image-set/image-set-conic-gradient-rendering.html [ Failure ] -crbug.com/1400902 external/wpt/css/css-images/image-set/image-set-repeating-conic-gradient-rendering.html [ Failure ] -crbug.com/1400902 external/wpt/css/css-images/image-set/image-set-repeating-linear-gradient-rendering.html [ Failure ] -crbug.com/1400902 external/wpt/css/css-images/image-set/image-set-repeating-radial-gradient-rendering.html [ Failure ] - # image-set() type function not yet supported crbug.com/1399341 external/wpt/css/css-images/image-set/image-set-type-rendering.html [ Failure ] crbug.com/1399341 external/wpt/css/css-images/image-set/image-set-type-rendering-2.html [ Failure ] @@ -2985,6 +2977,7 @@ crbug.com/webrtc/10567 external/wpt/webrtc/simulcast/setParameters-encodings.https.html [ Failure Pass ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-backdrop-opacity.html [ Failure ] crbug.com/626703 external/wpt/css/css-backgrounds/background-clip/clip-text-multi-line-002.html [ Failure ] crbug.com/626703 virtual/threaded/external/wpt/css/css-backgrounds/background-clip/clip-text-multi-line-002.html [ Failure ] crbug.com/626703 external/wpt/css/css-pseudo/svg-text-selection-002.html [ Failure ] @@ -5997,9 +5990,6 @@ crbug.com/1273409 [ Linux ] fast/canvas/OffscreenCanvas-2d-drawImage.html [ Failure Pass ] crbug.com/1273409 [ Win10.20h2 ] fast/canvas/OffscreenCanvas-2d-drawImage.html [ Failure Pass ] -# Flaky on multiple platforms -crbug.com/1277696 fast/loader/reload-zero-byte-plugin.html [ Failure Pass ] - # Flaky on Windows crbug.com/1316343 [ Win ] external/wpt/web-bundle/subresource-loading/reuse-web-bundle-resource.https.tentative.html [ Failure ] @@ -6942,3 +6932,6 @@ # default. crbug.com/1239281 external/wpt/speculation-rules/prerender/main-frame-navigation.https.html [ Skip Timeout ] crbug.com/1239281 virtual/prerender/external/wpt/speculation-rules/prerender/main-frame-navigation.https.html [ Pass ] + +#Sheriff 2023-02-21 +crbug.com/1308826 fast/loader/reload-zero-byte-plugin.html [ Failure Pass Timeout ]
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 aca5588..9b54939 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
@@ -252683,6 +252683,19 @@ {} ] ], + "modal-dialog-backdrop-opacity.html": [ + "d8356c7837e5a5f8966128a806237b88f5305ac5", + [ + null, + [ + [ + "/html/semantics/interactive-elements/the-dialog-element/modal-dialog-backdrop-opacity-ref.html", + "==" + ] + ], + {} + ] + ], "modal-dialog-backdrop.html": [ "55d7132f8cefa6be3b2a3133e35e9c9c3cbef603", [ @@ -261185,7 +261198,7 @@ ] ], "transform-dynamic-change.html": [ - "57b5551061945931b39f35394e2974b2306e2762", + "0efefba0f54510925eb5a350e253212de303196b", [ null, [ @@ -264634,11 +264647,11 @@ "support": { ".cache": { "gitignore2.json": [ - "e9321bea7969ce4d25eee7850b650134065266d4", + "24658fcbb8b2f7366ccd91bb977cd3be4719da28", [] ], "mtime.json": [ - "3559b00cd4995e4d04d9a1e875c0507d83c92abc", + "9e6b268c357c24b113ae363db36beb76cb116c89", [] ] }, @@ -274875,6 +274888,10 @@ "2a4c9f94323b689d452b539f148cc9262aa6d215", [] ], + "adjoining-float-nested-forced-clearance-003.html.ini": [ + "dd1850d1ac7d1c6514dfad84480737a43a2f56d9", + [] + ], "clear-001-ref.xht": [ "e607591a9049fe56e71f29c548de3aa1e79e81d5", [] @@ -286615,17 +286632,13 @@ [] ], "linear-timing-functions-output.tentative-expected.txt": [ - "88f2248255788087684ab209d732a94f274ac53d", + "294d7dddbed7a5a46eb477418c6db0f9d301e094", [] ], "linear-timing-functions-output.tentative.html.ini": [ "ee2255dd0aefea4492b9012a26726f1e640f4352", [] ], - "linear-timing-functions-syntax.tentative-expected.txt": [ - "aaca64ccd2ef989fd88d74c2d9cd2499872bd8b4", - [] - ], "linear-timing-functions-syntax.tentative.html.ini": [ "9de4381f98f666da3fd7503201e4d898c2c2f62e", [] @@ -318316,6 +318329,12 @@ "f72f11dccae5e8b63de6148573723f86fbb4c708", [] ], + "animations": { + "transition-timing-function.html.ini": [ + "9b89222a1852c831fbbf38790aef8e9c31b7937c", + [] + ] + }, "changing-while-transition-004-expected.txt": [ "fb9a59feae5051b296630e58f0a2bc1491ccb096", [] @@ -318338,7 +318357,7 @@ ], "parsing": { "transition-timing-function-valid-expected.txt": [ - "0d8cfd02f6de0911b4d3437540aabb51aa41c606", + "d1984937cd701aa731d4aee1e60a3cad64e22aec", [] ], "transition-timing-function-valid.html.ini": [ @@ -319727,10 +319746,18 @@ [] ], "compute-kind-widget-generated": { + "kind-of-widget-fallback-color-input-border-bottom-style-001.html.ini": [ + "781e3a390720e3062919d91b8b872054bbd0548f", + [] + ], "kind-of-widget-fallback-color-input-border-right-width-001.html.ini": [ "3bc7206ff029796da08852980f2e65ceb93e446f", [] ], + "kind-of-widget-fallback-color-input-border-start-start-radius-001.html.ini": [ + "c74f36c94f4915534169818d014b67649dbaf35f", + [] + ], "kind-of-widget-fallback-input-reset-border-top-color-001.html.ini": [ "14b26723f548de962341d22594eefaf841cec560", [] @@ -319747,10 +319774,18 @@ "7c4c698d1b2ef49f01e00c3643d10ca2832d2d3b", [] ], + "kind-of-widget-fallback-input-submit-border-end-start-radius-001.html.ini": [ + "0a103751c35f49aefdaf0284d14ae70ecf9c3907", + [] + ], "kind-of-widget-fallback-input-submit-border-inline-end-style-001.html.ini": [ "f51d4a9c07c6dc242a4d336871bf2cd0303ebceb", [] ], + "kind-of-widget-fallback-input-submit-border-inline-end-width-001.html.ini": [ + "2a170629651d9defa1951ceceeab784ca50ea285", + [] + ], "kind-of-widget-fallback-input-submit-border-top-left-radius-001.html.ini": [ "3c0a4536d792ebcd543ab708a30b850998a25a60", [] @@ -319763,6 +319798,10 @@ "8cf94321dc1df346f82158550e4cd2ad2b5b6e3d", [] ], + "kind-of-widget-fallback-input-text-border-inline-end-width-001.html.ini": [ + "5c6ec5907d255fee47b26102195d0bf7d3b2136b", + [] + ], "kind-of-widget-fallback-meter-background-attachment-001.html.ini": [ "5c85d4c8e2f214d8e5287e8ac98f6b1d3a9a274c", [] @@ -334778,23 +334817,23 @@ }, "headers": { "header-setcookie.any-expected.txt": [ - "c6c298f94d1204591bf434b8fd704b81320040a3", + "74245ad0eba600ac2ae0933887fec588fa114fdc", [] ], "header-setcookie.any.js.ini": [ - "046eb56e918183fce70775b3660cf7cd37ac14b1", + "9f52c2a1f24a6c1f8374e275647a3be7e52b15df", [] ], "header-setcookie.any.serviceworker-expected.txt": [ - "c6c298f94d1204591bf434b8fd704b81320040a3", + "74245ad0eba600ac2ae0933887fec588fa114fdc", [] ], "header-setcookie.any.sharedworker-expected.txt": [ - "c6c298f94d1204591bf434b8fd704b81320040a3", + "74245ad0eba600ac2ae0933887fec588fa114fdc", [] ], "header-setcookie.any.worker-expected.txt": [ - "c6c298f94d1204591bf434b8fd704b81320040a3", + "74245ad0eba600ac2ae0933887fec588fa114fdc", [] ] }, @@ -344254,7 +344293,7 @@ [] ], "offscreencanvas.resize.html.ini": [ - "3e9fc974c9bebcc283c4b5274bb97969da62d850", + "91a366642c8b7be8a4345d2d63887bdd0846a50a", [] ], "offscreencanvas.transferrable-expected.txt": [ @@ -345349,7 +345388,7 @@ [] ], "javascript-url.https.html.ini": [ - "8661502d3ccb10e5215a5ad874ec06638ebe8ce6", + "d8bd3cb3a11dda94b9baf9340e83db21c6f01cae", [] ], "navigate-top-to-aboutblank.https.html.ini": [ @@ -351585,6 +351624,16 @@ [] ] }, + "scripting": { + "the-script-element": { + "resources": { + "script.js": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ] + } + } + }, "select": { "DIR_METADATA": [ "433bd59b7296e7f49313c3ae65683fc9d9c0259d", @@ -352171,6 +352220,10 @@ "c87776d55026edeb5095aacd8731fcbce9db7b44", [] ], + "resource-selection-remove-src.html.ini": [ + "84ac3cbe597a0281d1803f35c0536d8a11324cf3", + [] + ], "resource-selection-source-media-expected.txt": [ "1da5da8edaefb15bd8d0cca0d4358c3ed4f17cef", [] @@ -354420,6 +354473,14 @@ "1b757ecf62dbdbf1a6a710525dcd1cd5aa816fa7", [] ], + "modal-dialog-backdrop-opacity-ref.html": [ + "b50e6ae026124af0a27622cb995cd497e9761dda", + [] + ], + "modal-dialog-backdrop-opacity.html.ini": [ + "eef8f661e0020631ecc5887889778f5881d0e51c", + [] + ], "modal-dialog-backdrop-ref.html": [ "d703b7f28e01eef831c09a4fdac9403e603a6b9d", [] @@ -356561,6 +356622,14 @@ [] ] } + }, + "the-link-element": { + "resources": { + "stylesheet.css": [ + "9d9d772fb468756d1a90f72325f89cd372f812ef", + [] + ] + } } }, "syntax": { @@ -358868,7 +358937,7 @@ [] ], "idle-detection-allowed-by-permissions-policy.https.sub.html.ini": [ - "6f363c189c39ce8e2921eb7be18b2a9a306423f7", + "72ab7077d7a9e7e0aad9701c1e76f6b97b70ffa8", [] ], "idle-detection-default-permissions-policy.https.sub.html.ini": [ @@ -367426,6 +367495,10 @@ "6915b1949551ebcdd02fe2d44f1860be90407c7a", [] ], + "pointerevent_coordinates_when_locked.html.ini": [ + "9c178b8b0a58bd202df92e06a27ce9ca20079932", + [] + ], "pointerevent_pointerlock_supercedes_capture.html.ini": [ "759bd08a318d168760a19aa84b71d1bb3079f591", [] @@ -368354,26 +368427,6 @@ } } }, - "priority-hints": { - "META.yml": [ - "487b4013a02209cf35be8c9d5099c4d7842ba915", - [] - ], - "iframe-attr-fetchpriority.tentative.html.ini": [ - "393552e14ffb7cbf192212a7124036f20be1bce6", - [] - ], - "resources": { - "script.js": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "stylesheet.css": [ - "9d9d772fb468756d1a90f72325f89cd372f812ef", - [] - ] - } - }, "private-click-measurement": { "idlharness.window-expected.txt": [ "a4ac106d29355a4f88e88250a2dc108dc3758fd1", @@ -379040,7 +379093,7 @@ [] ], "transform-dynamic-change-ref.html": [ - "df8afcebc18e912d3c4a66be7e069f1a827e1e88", + "db88a073254200a69faee8fff1a0bda19cfeaa9b", [] ], "transform-dynamic-change-root-ref.html": [ @@ -386882,6 +386935,10 @@ "6eca04506e1168680a9787c2b7999fc28bf26c22", [] ], + "embedded_style_urls.html.ini": [ + "9bf35c49db387b457ab2c8f861cc1d71dba5bdb4", + [] + ], "enable_controls_reposition-ref.html": [ "f150531bbda8dc17dc9e6c1bc7211c60d773af47", [] @@ -430202,7 +430259,7 @@ ] ], "linear-timing-functions-syntax.tentative.html": [ - "73267f08604d0243d63712c34fd073d58715f0b2", + "99b680d0bde07bbaa1824d7fcd13e78e0dc172f0", [ null, {} @@ -448783,7 +448840,7 @@ ] ], "transition-timing-function.html": [ - "2200c73471774b6475fa7198f037daf79671c507", + "0184b29a796140f423f72097f57875a629598c6b", [ null, {} @@ -449065,7 +449122,7 @@ ] ], "transition-timing-function-valid.html": [ - "5402fdac195b2dc2d68553d593e1924f5c3be695", + "658ef76bbe84d47864570be49726d36e75b1b555", [ null, {} @@ -449167,7 +449224,7 @@ ] ], "transition-001.html": [ - "e0bf09ae37589b9a8ed2688dd4479e2b109ad076", + "492b4437470f5855e1390b3eafdf320528ed4c43", [ null, {} @@ -485015,7 +485072,7 @@ }, "headers": { "header-setcookie.any.js": [ - "b8a3348f5f5392757ff02c76418c73bd0cb55207", + "cafb780c2c75a9ae6a84fb842f0d0fa075aeffd8", [ "fetch/api/headers/header-setcookie.any.html", { @@ -527844,6 +527901,17 @@ ] } }, + "embedded-content": { + "the-img-element": { + "attr-img-fetchpriority.html": [ + "996aa4d1567d1548c805163f2c9ce30cd2008e47", + [ + null, + {} + ] + ] + } + }, "infrastructure": { "common-dom-interfaces": { "collections": { @@ -530954,6 +531022,17 @@ } } }, + "scripting": { + "the-script-element": { + "attr-script-fetchpriority.html": [ + "8639d04d86aaa8d5275fee19fadab0e23d1a8583", + [ + null, + {} + ] + ] + } + }, "select": { "options-length-too-large.html": [ "7ce33ffad49b839dc9fa383ef55cc04b9dfa6bb6", @@ -543891,6 +543970,15 @@ ] ] } + }, + "the-link-element": { + "attr-link-fetchpriority.html": [ + "32c318b7605c2bd92ef59fdd27137fe3dd48d0f5", + [ + null, + {} + ] + ] } }, "syntax": { @@ -567906,36 +567994,6 @@ ] } }, - "priority-hints": { - "iframe-attr-fetchpriority.tentative.html": [ - "386577690b2557cf5f54e586a4b95f638d237ecf", - [ - null, - {} - ] - ], - "img-attr-fetchpriority.tentative.html": [ - "996aa4d1567d1548c805163f2c9ce30cd2008e47", - [ - null, - {} - ] - ], - "link-attr-fetchpriority.tentative.html": [ - "32c318b7605c2bd92ef59fdd27137fe3dd48d0f5", - [ - null, - {} - ] - ], - "script-attr-fetchpriority.tentative.html": [ - "8639d04d86aaa8d5275fee19fadab0e23d1a8583", - [ - null, - {} - ] - ] - }, "private-click-measurement": { "idlharness.window.js": [ "1d0539a7bf56d071d247cded4ed2f4555b34bf6f", @@ -583600,7 +583658,7 @@ ] ], "hidden_document.html": [ - "349539628a3718920384ae6faca36844041ecdc8", + "6c39d6e6e5be3233017ef6fec577a58187bfe4e9", [ null, {
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats-clear/adjoining-float-nested-forced-clearance-003.html.ini b/third_party/blink/web_tests/external/wpt/css/CSS2/floats-clear/adjoining-float-nested-forced-clearance-003.html.ini new file mode 100644 index 0000000..dd1850d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats-clear/adjoining-float-nested-forced-clearance-003.html.ini
@@ -0,0 +1,2 @@ +[adjoining-float-nested-forced-clearance-003.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-computed.sub-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-computed.sub-expected.txt index 78e0027..dfc5f32b 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-computed.sub-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-computed.sub-expected.txt
@@ -11,15 +11,15 @@ PASS Property background-image value '-webkit-image-set(url(http://web-platform.test/example.png) 2400dpcm, 'http://web-platform.test/example.png' 2x)' PASS Property background-image value 'image-set('http://web-platform.test/example.jpeg' 240dpi, url(http://web-platform.test/example.png) 3.5x)' PASS Property background-image value '-webkit-image-set('http://web-platform.test/example.jpeg' 240dpi, url(http://web-platform.test/example.png) 3.5x)' -FAIL Property background-image value 'image-set(linear-gradient(black, white) 1x)' assert_true: 'image-set(linear-gradient(black, white) 1x)' is a supported value for background-image. expected true got false -FAIL Property background-image value '-webkit-image-set(linear-gradient(black, white) 1x)' assert_true: '-webkit-image-set(linear-gradient(black, white) 1x)' is a supported value for background-image. expected true got false +PASS Property background-image value 'image-set(linear-gradient(black, white) 1x)' +PASS Property background-image value '-webkit-image-set(linear-gradient(black, white) 1x)' FAIL Property background-image value 'image-set(url(http://web-platform.test/example.png) 1x type('image/png'))' assert_true: 'image-set(url(http://web-platform.test/example.png) 1x type('image/png'))' is a supported value for background-image. expected true got false FAIL Property background-image value '-webkit-image-set(url(http://web-platform.test/example.png) 1x type('image/png'))' assert_true: '-webkit-image-set(url(http://web-platform.test/example.png) 1x type('image/png'))' is a supported value for background-image. expected true got false FAIL Property background-image value 'image-set(url(http://web-platform.test/example.png) type('image/png'))' assert_true: 'image-set(url(http://web-platform.test/example.png) type('image/png'))' is a supported value for background-image. expected true got false FAIL Property background-image value '-webkit-image-set(url(http://web-platform.test/example.png) type('image/png'))' assert_true: '-webkit-image-set(url(http://web-platform.test/example.png) type('image/png'))' is a supported value for background-image. expected true got false FAIL Property background-image value 'image-set(url(http://web-platform.test/example.png) type('image/png') 1x)' assert_true: 'image-set(url(http://web-platform.test/example.png) type('image/png') 1x)' is a supported value for background-image. expected true got false FAIL Property background-image value '-webkit-image-set(url(http://web-platform.test/example.png) type('image/png') 1x)' assert_true: '-webkit-image-set(url(http://web-platform.test/example.png) type('image/png') 1x)' is a supported value for background-image. expected true got false -FAIL Property content value 'image-set(url('http://web-platform.test/example.png') 192dpi, linear-gradient(black, white) 1x)' assert_true: 'image-set(url('http://web-platform.test/example.png') 192dpi, linear-gradient(black, white) 1x)' is a supported value for content. expected true got false -FAIL Property content value '-webkit-image-set(url('http://web-platform.test/example.png') 192dpi, linear-gradient(black, white) 1x)' assert_true: '-webkit-image-set(url('http://web-platform.test/example.png') 192dpi, linear-gradient(black, white) 1x)' is a supported value for content. expected true got false +PASS Property content value 'image-set(url('http://web-platform.test/example.png') 192dpi, linear-gradient(black, white) 1x)' +PASS Property content value '-webkit-image-set(url('http://web-platform.test/example.png') 192dpi, linear-gradient(black, white) 1x)' Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-computed.sub.html.ini b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-computed.sub.html.ini deleted file mode 100644 index f98353b..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-computed.sub.html.ini +++ /dev/null
@@ -1,30 +0,0 @@ -[image-set-computed.sub.html] - [Property background-image value 'image-set(linear-gradient(black, white) 1x)'] - expected: FAIL - - [Property background-image value '-webkit-image-set(linear-gradient(black, white) 1x)'] - expected: FAIL - - [Property background-image value 'image-set(url(http://web-platform.test/example.png) 1x type('image/png'))'] - expected: FAIL - - [Property background-image value '-webkit-image-set(url(http://web-platform.test/example.png) 1x type('image/png'))'] - expected: FAIL - - [Property background-image value 'image-set(url(http://web-platform.test/example.png) type('image/png'))'] - expected: FAIL - - [Property background-image value '-webkit-image-set(url(http://web-platform.test/example.png) type('image/png'))'] - expected: FAIL - - [Property background-image value 'image-set(url(http://web-platform.test/example.png) type('image/png') 1x)'] - expected: FAIL - - [Property background-image value '-webkit-image-set(url(http://web-platform.test/example.png) type('image/png') 1x)'] - expected: FAIL - - [Property content value 'image-set(url('http://web-platform.test/example.png') 192dpi, linear-gradient(black, white) 1x)'] - expected: FAIL - - [Property content value '-webkit-image-set(url('http://web-platform.test/example.png') 192dpi, linear-gradient(black, white) 1x)'] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-conic-gradient-rendering.html.ini b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-conic-gradient-rendering.html.ini deleted file mode 100644 index 95d9cf7..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-conic-gradient-rendering.html.ini +++ /dev/null
@@ -1,2 +0,0 @@ -[image-set-conic-gradient-rendering.html] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-linear-gradient-rendering.html.ini b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-linear-gradient-rendering.html.ini deleted file mode 100644 index b58c2976..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-linear-gradient-rendering.html.ini +++ /dev/null
@@ -1,2 +0,0 @@ -[image-set-linear-gradient-rendering.html] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing-expected.txt index d2f52d3..52390b2 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 82 tests; 60 PASS, 22 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 82 tests; 76 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS e.style['background-image'] = "image-set(url(example.png) 1x)" should set the property value PASS e.style['background-image'] = "-webkit-image-set(url(example.png) 1x)" should set the property value PASS e.style['background-image'] = "image-set('example.jpg' 1x)" should set the property value @@ -62,22 +62,22 @@ PASS e.style['content'] = "-webkit-image-set(url(\"example.png\") 1dpi)" should set the property value PASS e.style['background-image'] = "image-set(url(\"example.png\") 1invalidResUnit)" should not set the property value PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 1invalidResUnit)" should not set the property value -FAIL e.style['background-image'] = "image-set(linear-gradient(black, white) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['background-image'] = "-webkit-image-set(linear-gradient(black, white) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['background-image'] = "image-set(repeating-linear-gradient(red, blue 25%) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['background-image'] = "-webkit-image-set(repeating-linear-gradient(red, blue 25%) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['background-image'] = "image-set(radial-gradient(black, white) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['background-image'] = "-webkit-image-set(radial-gradient(black, white) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['background-image'] = "image-set(repeating-radial-gradient(red, blue 25%) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['background-image'] = "-webkit-image-set(repeating-radial-gradient(red, blue 25%) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['background-image'] = "image-set(conic-gradient(black, white) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['background-image'] = "-webkit-image-set(conic-gradient(black, white) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['background-image'] = "image-set(repeating-conic-gradient(red, blue 25%) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['background-image'] = "-webkit-image-set(repeating-conic-gradient(red, blue 25%) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['content'] = "image-set(linear-gradient(black, white) 1x, url(\"example.png\") 4x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['content'] = "-webkit-image-set(linear-gradient(black, white) 1x, url(\"example.png\") 4x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['content'] = "image-set(url(\"example.png\") 192dpi, linear-gradient(black, white) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['content'] = "-webkit-image-set(url(\"example.png\") 192dpi, linear-gradient(black, white) 1x)" should set the property value assert_not_equals: property should be set got disallowed value "" +PASS e.style['background-image'] = "image-set(linear-gradient(black, white) 1x)" should set the property value +PASS e.style['background-image'] = "-webkit-image-set(linear-gradient(black, white) 1x)" should set the property value +PASS e.style['background-image'] = "image-set(repeating-linear-gradient(red, blue 25%) 1x)" should set the property value +PASS e.style['background-image'] = "-webkit-image-set(repeating-linear-gradient(red, blue 25%) 1x)" should set the property value +PASS e.style['background-image'] = "image-set(radial-gradient(black, white) 1x)" should set the property value +PASS e.style['background-image'] = "-webkit-image-set(radial-gradient(black, white) 1x)" should set the property value +PASS e.style['background-image'] = "image-set(repeating-radial-gradient(red, blue 25%) 1x)" should set the property value +PASS e.style['background-image'] = "-webkit-image-set(repeating-radial-gradient(red, blue 25%) 1x)" should set the property value +PASS e.style['background-image'] = "image-set(conic-gradient(black, white) 1x)" should set the property value +PASS e.style['background-image'] = "-webkit-image-set(conic-gradient(black, white) 1x)" should set the property value +PASS e.style['background-image'] = "image-set(repeating-conic-gradient(red, blue 25%) 1x)" should set the property value +PASS e.style['background-image'] = "-webkit-image-set(repeating-conic-gradient(red, blue 25%) 1x)" should set the property value +PASS e.style['content'] = "image-set(linear-gradient(black, white) 1x, url(\"example.png\") 4x)" should set the property value +PASS e.style['content'] = "-webkit-image-set(linear-gradient(black, white) 1x, url(\"example.png\") 4x)" should set the property value +PASS e.style['content'] = "image-set(url(\"example.png\") 192dpi, linear-gradient(black, white) 1x)" should set the property value +PASS e.style['content'] = "-webkit-image-set(url(\"example.png\") 192dpi, linear-gradient(black, white) 1x)" should set the property value PASS e.style['cursor'] = "image-set(linear-gradient(black, white) 1x)" should not set the property value PASS e.style['cursor'] = "-webkit-image-set(linear-gradient(black, white) 1x)" should not set the property value PASS e.style['background-image'] = "image-set(linear-gradient(red) 1x)" should not set the property value
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing.html.ini b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing.html.ini deleted file mode 100644 index 936aabcf..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing.html.ini +++ /dev/null
@@ -1,66 +0,0 @@ -[image-set-parsing.html] - [e.style['background-image'\] = "image-set(url(\\"example.png\\") 1x type(\\"image/png\\"))" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "-webkit-image-set(url(\\"example.png\\") 1x type(\\"image/png\\"))" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "image-set(url(example.png) type('image/png'))" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "-webkit-image-set(url(example.png) type('image/png'))" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "image-set(url(example.png) type('image/png') 1x)" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "-webkit-image-set(url(example.png) type('image/png') 1x)" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "image-set(linear-gradient(black, white) 1x)" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "-webkit-image-set(linear-gradient(black, white) 1x)" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "image-set(repeating-linear-gradient(red, blue 25%) 1x)" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "-webkit-image-set(repeating-linear-gradient(red, blue 25%) 1x)" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "image-set(radial-gradient(black, white) 1x)" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "-webkit-image-set(radial-gradient(black, white) 1x)" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "image-set(repeating-radial-gradient(red, blue 25%) 1x)" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "-webkit-image-set(repeating-radial-gradient(red, blue 25%) 1x)" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "image-set(conic-gradient(black, white) 1x)" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "-webkit-image-set(conic-gradient(black, white) 1x)" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "image-set(repeating-conic-gradient(red, blue 25%) 1x)" should set the property value] - expected: FAIL - - [e.style['background-image'\] = "-webkit-image-set(repeating-conic-gradient(red, blue 25%) 1x)" should set the property value] - expected: FAIL - - [e.style['content'\] = "image-set(linear-gradient(black, white) 1x, url(\\"example.png\\") 4x)" should set the property value] - expected: FAIL - - [e.style['content'\] = "-webkit-image-set(linear-gradient(black, white) 1x, url(\\"example.png\\") 4x)" should set the property value] - expected: FAIL - - [e.style['content'\] = "image-set(url(\\"example.png\\") 192dpi, linear-gradient(black, white) 1x)" should set the property value] - expected: FAIL - - [e.style['content'\] = "-webkit-image-set(url(\\"example.png\\") 192dpi, linear-gradient(black, white) 1x)" should set the property value] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-radial-gradient-rendering.html.ini b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-radial-gradient-rendering.html.ini deleted file mode 100644 index 3fcaf7f..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-radial-gradient-rendering.html.ini +++ /dev/null
@@ -1,2 +0,0 @@ -[image-set-radial-gradient-rendering.html] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-repeating-conic-gradient-rendering.html.ini b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-repeating-conic-gradient-rendering.html.ini deleted file mode 100644 index f18e1ef..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-repeating-conic-gradient-rendering.html.ini +++ /dev/null
@@ -1,2 +0,0 @@ -[image-set-repeating-conic-gradient-rendering.html] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-repeating-linear-gradient-rendering.html.ini b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-repeating-linear-gradient-rendering.html.ini deleted file mode 100644 index be70642..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-repeating-linear-gradient-rendering.html.ini +++ /dev/null
@@ -1,2 +0,0 @@ -[image-set-repeating-linear-gradient-rendering.html] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-repeating-radial-gradient-rendering.html.ini b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-repeating-radial-gradient-rendering.html.ini deleted file mode 100644 index cfb95cb..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-repeating-radial-gradient-rendering.html.ini +++ /dev/null
@@ -1,2 +0,0 @@ -[image-set-repeating-radial-gradient-rendering.html] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transitions/animations/transition-timing-function.html.ini b/third_party/blink/web_tests/external/wpt/css/css-transitions/animations/transition-timing-function.html.ini new file mode 100644 index 0000000..9b89222a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-transitions/animations/transition-timing-function.html.ini
@@ -0,0 +1,2 @@ +[transition-timing-function.html] + expected: ERROR
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-color-input-border-bottom-style-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-color-input-border-bottom-style-001.html.ini new file mode 100644 index 0000000..781e3a3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-color-input-border-bottom-style-001.html.ini
@@ -0,0 +1,2 @@ +[kind-of-widget-fallback-color-input-border-bottom-style-001.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-color-input-border-start-start-radius-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-color-input-border-start-start-radius-001.html.ini new file mode 100644 index 0000000..c74f36c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-color-input-border-start-start-radius-001.html.ini
@@ -0,0 +1,2 @@ +[kind-of-widget-fallback-color-input-border-start-start-radius-001.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-end-start-radius-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-end-start-radius-001.html.ini new file mode 100644 index 0000000..0a10375 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-end-start-radius-001.html.ini
@@ -0,0 +1,2 @@ +[kind-of-widget-fallback-input-submit-border-end-start-radius-001.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-inline-end-width-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-inline-end-width-001.html.ini new file mode 100644 index 0000000..2a170629 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-inline-end-width-001.html.ini
@@ -0,0 +1,2 @@ +[kind-of-widget-fallback-input-submit-border-inline-end-width-001.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-text-border-inline-end-width-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-text-border-inline-end-width-001.html.ini new file mode 100644 index 0000000..5c6ec590 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-text-border-inline-end-width-001.html.ini
@@ -0,0 +1,2 @@ +[kind-of-widget-fallback-input-text-border-inline-end-width-001.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt index c6c298f94..74245ad 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt +++ b/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt
@@ -7,6 +7,7 @@ FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +FAIL Headers iterator is correctly updated with set-cookie changes #2 assert_array_equals: expected property 1 to be "a" but got "a, b, c" (expected array ["set-cookie", "a"] got ["set-cookie", "a, b, c"]) PASS Headers.prototype.has works for set-cookie FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 PASS Headers.prototype.set works for set-cookie @@ -19,6 +20,8 @@ FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Adding Set-Cookie headers normalizes their value assert_equals: Array length is not equal expected 2 but got 1 +PASS Adding invalid Set-Cookie headers throws FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.js b/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.js index b8a3348..cafb780c 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.js +++ b/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.js
@@ -130,6 +130,23 @@ }, "Headers iterator is correctly updated with set-cookie changes"); test(function () { + const headers = new Headers([ + ["set-cookie", "a"], + ["set-cookie", "b"], + ["set-cookie", "c"] + ]); + const iterator = headers[Symbol.iterator](); + assert_array_equals(iterator.next().value, ["set-cookie", "a"]); + headers.delete("set-cookie"); + headers.append("set-cookie", "d"); + headers.append("set-cookie", "e"); + headers.append("set-cookie", "f"); + assert_array_equals(iterator.next().value, ["set-cookie", "e"]); + assert_array_equals(iterator.next().value, ["set-cookie", "f"]); + assert_true(iterator.next().done); +}, "Headers iterator is correctly updated with set-cookie changes #2"); + +test(function () { const headers = new Headers(headerList); assert_true(headers.has("sEt-cOoKiE")); }, "Headers.prototype.has works for set-cookie"); @@ -216,6 +233,31 @@ }, "Headers.prototype.getSetCookie preserves header ordering"); test(function () { + const headers = new Headers({"Set-Cookie": " a=b\n"}); + headers.append("set-cookie", "\n\rc=d "); + assert_nested_array_equals([...headers], [ + ["set-cookie", "a=b"], + ["set-cookie", "c=d"] + ]); + headers.set("set-cookie", "\te=f "); + assert_nested_array_equals([...headers], [["set-cookie", "e=f"]]); +}, "Adding Set-Cookie headers normalizes their value"); + +test(function () { + assert_throws_js(TypeError, () => { + new Headers({"set-cookie": "\0"}); + }); + + const headers = new Headers(); + assert_throws_js(TypeError, () => { + headers.append("Set-Cookie", "a\nb"); + }); + assert_throws_js(TypeError, () => { + headers.set("Set-Cookie", "a\rb"); + }); +}, "Adding invalid Set-Cookie headers throws"); + +test(function () { const response = new Response(); response.headers.append("Set-Cookie", "foo=bar"); assert_array_equals(response.headers.getSetCookie(), []);
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.js.ini b/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.js.ini index 046eb56..9f52c2a 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.js.ini +++ b/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.js.ini
@@ -47,6 +47,12 @@ [Set-Cookie is a forbidden response header] expected: FAIL + [Adding Set-Cookie headers normalizes their value] + expected: FAIL + + [Headers iterator is correctly updated with set-cookie changes #2] + expected: FAIL + [header-setcookie.any.serviceworker.html] [Headers iterator does not combine set-cookie headers] @@ -97,6 +103,12 @@ [Set-Cookie is a forbidden response header] expected: FAIL + [Adding Set-Cookie headers normalizes their value] + expected: FAIL + + [Headers iterator is correctly updated with set-cookie changes #2] + expected: FAIL + [header-setcookie.any.sharedworker.html] [Headers iterator does not combine set-cookie headers] @@ -147,6 +159,12 @@ [Set-Cookie is a forbidden response header] expected: FAIL + [Adding Set-Cookie headers normalizes their value] + expected: FAIL + + [Headers iterator is correctly updated with set-cookie changes #2] + expected: FAIL + [header-setcookie.any.worker.html] [Headers iterator does not combine set-cookie headers] @@ -196,3 +214,9 @@ [Set-Cookie is a forbidden response header] expected: FAIL + + [Adding Set-Cookie headers normalizes their value] + expected: FAIL + + [Headers iterator is correctly updated with set-cookie changes #2] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt index c6c298f94..74245ad 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt +++ b/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt
@@ -7,6 +7,7 @@ FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +FAIL Headers iterator is correctly updated with set-cookie changes #2 assert_array_equals: expected property 1 to be "a" but got "a, b, c" (expected array ["set-cookie", "a"] got ["set-cookie", "a, b, c"]) PASS Headers.prototype.has works for set-cookie FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 PASS Headers.prototype.set works for set-cookie @@ -19,6 +20,8 @@ FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Adding Set-Cookie headers normalizes their value assert_equals: Array length is not equal expected 2 but got 1 +PASS Adding invalid Set-Cookie headers throws FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt index c6c298f94..74245ad 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt +++ b/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt
@@ -7,6 +7,7 @@ FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +FAIL Headers iterator is correctly updated with set-cookie changes #2 assert_array_equals: expected property 1 to be "a" but got "a, b, c" (expected array ["set-cookie", "a"] got ["set-cookie", "a, b, c"]) PASS Headers.prototype.has works for set-cookie FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 PASS Headers.prototype.set works for set-cookie @@ -19,6 +20,8 @@ FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Adding Set-Cookie headers normalizes their value assert_equals: Array length is not equal expected 2 but got 1 +PASS Adding invalid Set-Cookie headers throws FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt index c6c298f94..74245ad 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt +++ b/third_party/blink/web_tests/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt
@@ -7,6 +7,7 @@ FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +FAIL Headers iterator is correctly updated with set-cookie changes #2 assert_array_equals: expected property 1 to be "a" but got "a, b, c" (expected array ["set-cookie", "a"] got ["set-cookie", "a, b, c"]) PASS Headers.prototype.has works for set-cookie FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 PASS Headers.prototype.set works for set-cookie @@ -19,6 +20,8 @@ FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Adding Set-Cookie headers normalizes their value assert_equals: Array length is not equal expected 2 but got 1 +PASS Adding invalid Set-Cookie headers throws FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.resize.html.ini b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.resize.html.ini index 3e9fc974..91a3666 100644 --- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.resize.html.ini +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.resize.html.ini
@@ -5,7 +5,7 @@ [Verify that resizing an OffscreenCanvas with a webgl context propagates the new size to its placeholder canvas asynchronously.] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): PASS + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] if (product == "content_shell") and (os == "linux") and (flag_specific == "highdpi"): PASS FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/javascript-url.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/javascript-url.https.html.ini index 8661502..d8bd3cb3 100644 --- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/javascript-url.https.html.ini +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/javascript-url.https.html.ini
@@ -21,3 +21,6 @@ [javascript-url.https.html?15-16] expected: [ERROR, CRASH] + +[javascript-url.https.html?13-14] + expected: [ERROR, OK]
diff --git a/third_party/blink/web_tests/external/wpt/priority-hints/img-attr-fetchpriority.tentative.html b/third_party/blink/web_tests/external/wpt/html/embedded-content/the-img-element/attr-img-fetchpriority.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/priority-hints/img-attr-fetchpriority.tentative.html rename to third_party/blink/web_tests/external/wpt/html/embedded-content/the-img-element/attr-img-fetchpriority.html
diff --git a/third_party/blink/web_tests/external/wpt/priority-hints/script-attr-fetchpriority.tentative.html b/third_party/blink/web_tests/external/wpt/html/scripting/the-script-element/attr-script-fetchpriority.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/priority-hints/script-attr-fetchpriority.tentative.html rename to third_party/blink/web_tests/external/wpt/html/scripting/the-script-element/attr-script-fetchpriority.html
diff --git a/third_party/blink/web_tests/external/wpt/priority-hints/resources/script.js b/third_party/blink/web_tests/external/wpt/html/scripting/the-script-element/resources/script.js similarity index 100% rename from third_party/blink/web_tests/external/wpt/priority-hints/resources/script.js rename to third_party/blink/web_tests/external/wpt/html/scripting/the-script-element/resources/script.js
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-remove-src.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-remove-src.html.ini new file mode 100644 index 0000000..84ac3cbe --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-remove-src.html.ini
@@ -0,0 +1,3 @@ +[resource-selection-remove-src.html] + [invoking resource selection by setting src; await stable state] + expected: [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-backdrop-opacity-ref.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-backdrop-opacity-ref.html new file mode 100644 index 0000000..b50e6ae --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-backdrop-opacity-ref.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html> +<meta charset="utf-8"> +<link rel="stylesheet" href="resources/dialog.css"> +<style> +.backdrop { + display: block; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + + background-color: green; + opacity: 0.5; +} +</style> +<body> +<div class="backdrop"></div> +<div class="pseudodialog">Test passes if you see a green backdrop at half opacity.</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-backdrop-opacity.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-backdrop-opacity.html new file mode 100644 index 0000000..d8356c7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-backdrop-opacity.html
@@ -0,0 +1,16 @@ +<!DOCTYPE html> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> +<link rel="match" href="modal-dialog-backdrop-opacity-ref.html"> +<link rel="help" href="https://fullscreen.spec.whatwg.org/#user-agent-level-style-sheet-defaults"> +<style> +dialog::backdrop { + background-color: rgb(0, 128, 0); + opacity: 0.5; +} +</style> +<body> +<dialog>Test passes if you see a green backdrop at half opacity.</dialog> +<script> +document.querySelector('dialog').showModal(); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-backdrop-opacity.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-backdrop-opacity.html.ini new file mode 100644 index 0000000..eef8f66 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-backdrop-opacity.html.ini
@@ -0,0 +1,2 @@ +[modal-dialog-backdrop-opacity.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/priority-hints/link-attr-fetchpriority.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/the-link-element/attr-link-fetchpriority.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/priority-hints/link-attr-fetchpriority.tentative.html rename to third_party/blink/web_tests/external/wpt/html/semantics/the-link-element/attr-link-fetchpriority.html
diff --git a/third_party/blink/web_tests/external/wpt/priority-hints/resources/stylesheet.css b/third_party/blink/web_tests/external/wpt/html/semantics/the-link-element/resources/stylesheet.css similarity index 100% rename from third_party/blink/web_tests/external/wpt/priority-hints/resources/stylesheet.css rename to third_party/blink/web_tests/external/wpt/html/semantics/the-link-element/resources/stylesheet.css
diff --git a/third_party/blink/web_tests/external/wpt/idle-detection/idle-detection-allowed-by-permissions-policy.https.sub.html.ini b/third_party/blink/web_tests/external/wpt/idle-detection/idle-detection-allowed-by-permissions-policy.https.sub.html.ini index 6f363c1..72ab707 100644 --- a/third_party/blink/web_tests/external/wpt/idle-detection/idle-detection-allowed-by-permissions-policy.https.sub.html.ini +++ b/third_party/blink/web_tests/external/wpt/idle-detection/idle-detection-allowed-by-permissions-policy.https.sub.html.ini
@@ -14,3 +14,6 @@ [Permissions-Policy idle-detection=* explicity set by top-level frame allows workers in cross-origin iframes.] expected: NOTRUN + + [Inherited header permissions policy allows dedicated workers.] + expected: [FAIL, TIMEOUT]
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_coordinates_when_locked.html.ini b/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_coordinates_when_locked.html.ini new file mode 100644 index 0000000..9c178b8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_coordinates_when_locked.html.ini
@@ -0,0 +1,3 @@ +[pointerevent_coordinates_when_locked.html] + [mouse Test pointerevent coordinates when pointer is locked] + expected: [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/priority-hints/META.yml b/third_party/blink/web_tests/external/wpt/priority-hints/META.yml deleted file mode 100644 index 487b401..0000000 --- a/third_party/blink/web_tests/external/wpt/priority-hints/META.yml +++ /dev/null
@@ -1,5 +0,0 @@ -spec: https://wicg.github.io/priority-hints/ -suggested_reviewers: - - addyosmani - - domfarolino - - yoavweiss
diff --git a/third_party/blink/web_tests/external/wpt/priority-hints/iframe-attr-fetchpriority.tentative.html b/third_party/blink/web_tests/external/wpt/priority-hints/iframe-attr-fetchpriority.tentative.html deleted file mode 100644 index 3865776..0000000 --- a/third_party/blink/web_tests/external/wpt/priority-hints/iframe-attr-fetchpriority.tentative.html +++ /dev/null
@@ -1,26 +0,0 @@ -<!DOCTYPE html> -<title>Priority Hints - iFrame element</title> -<meta name="author" title="Patrick Meenan" href="mailto:patmeenan@gmail.com"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<iframe id=iframe1 src="/common/blank.html" fetchpriority=high></iframe> -<iframe id=iframe2 src="/common/blank.html" fetchpriority=low></iframe> -<iframe id=iframe3 src="/common/blank.html" fetchpriority=auto></iframe> -<iframe id=iframe4 src="/common/blank.html" fetchpriority=xyz></iframe> -<iframe id=iframe5 src="/common/blank.html"></iframe> - -<script> - test(() => { - assert_equals(iframe1.fetchPriority, "high", "high fetchPriority is a valid IDL value on the script element"); - assert_equals(iframe2.fetchPriority, "low", "low fetchPriority is a valid IDL value on the script element"); - assert_equals(iframe3.fetchPriority, "auto", "auto fetchPriority is a valid IDL value on the script element"); - assert_equals(iframe4.fetchPriority, "auto", "invalid fetchPriority reflects as 'auto' IDL attribute on the script element"); - assert_equals(iframe5.fetchPriority, "auto", "missing fetchPriority reflects as 'auto' IDL attribute on the script element"); - }, "fetchpriority attribute on <iframe> elements should reflect valid IDL values"); - - test(() => { - const iframe = document.createElement("iframe"); - assert_equals(iframe.fetchPriority, "auto"); - }, "default fetchpriority attribute on <iframe> elements should be 'auto'"); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/priority-hints/iframe-attr-fetchpriority.tentative.html.ini b/third_party/blink/web_tests/external/wpt/priority-hints/iframe-attr-fetchpriority.tentative.html.ini deleted file mode 100644 index 393552e14..0000000 --- a/third_party/blink/web_tests/external/wpt/priority-hints/iframe-attr-fetchpriority.tentative.html.ini +++ /dev/null
@@ -1,6 +0,0 @@ -[iframe-attr-fetchpriority.tentative.html] - [fetchpriority attribute on <iframe> elements should reflect valid IDL values] - expected: FAIL - - [default fetchpriority attribute on <iframe> elements should be 'auto'] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/mock-direct-sockets.js b/third_party/blink/web_tests/external/wpt/resources/chromium/mock-direct-sockets.js index 0752850..e2e0245 100644 --- a/third_party/blink/web_tests/external/wpt/resources/chromium/mock-direct-sockets.js +++ b/third_party/blink/web_tests/external/wpt/resources/chromium/mock-direct-sockets.js
@@ -38,6 +38,15 @@ result: -11 }); } + + openTCPServerSocket( + options, + receiver) { + return Promise.resolve({ + // return result = net:Error::NOT_IMPLEMENTED (code -11) + result: -11 + }); + } } let testInternal = {
diff --git a/third_party/blink/web_tests/external/wpt/screen-orientation/hidden_document.html b/third_party/blink/web_tests/external/wpt/screen-orientation/hidden_document.html index 3495396..6c39d6e 100644 --- a/third_party/blink/web_tests/external/wpt/screen-orientation/hidden_document.html +++ b/third_party/blink/web_tests/external/wpt/screen-orientation/hidden_document.html
@@ -14,11 +14,13 @@ promise_test(async (t) => { const { minimize, restore } = window_state_context(t); + t.add_cleanup(makeCleanup()); await minimize(); assert_equals(document.visibilityState, "hidden", "Document must be hidden"); - await promise_rejects_dom(t, "SecurityError", screen.orientation.lock("landscape") ); + const opposite = getOppositeOrientation(); + await promise_rejects_dom(t, "SecurityError", screen.orientation.lock(opposite) ); }, "hidden documents must reject went trying to call lock or unlock"); promise_test(async (t) => { @@ -29,33 +31,4 @@ assert_equals(document.visibilityState, "hidden", "Document must be hidden"); assert_throws_dom("SecurityError", () => screen.orientation.unlock()); }, "hidden documents must reject went trying to call unlock"); - - promise_test(async (t) => { - const { minimize, restore } = window_state_context(t); - t.add_cleanup(makeCleanup()); - await screen.orientation.lock(getOppositeOrientation()); - - await minimize(); - - assert_equals(document.visibilityState, "hidden", "Document must be hidden"); - assert_throws_dom("SecurityError", () => screen.orientation.unlock()); - }, "hidden documents must not unlock the screen orientation"); - - promise_test(async (t) => { - const { minimize, restore } = window_state_context(t); - t.add_cleanup(makeCleanup()); - await screen.orientation.lock(getOppositeOrientation()); - - await minimize(); - - assert_equals(document.visibilityState, "hidden"); - await promise_rejects_dom(t, "SecurityError", screen.orientation.lock(getOppositeOrientation())); - - // Maximize, now everything should work as expected. - await restore(); - - assert_equals(document.visibilityState, "visible"); - await screen.orientation.lock(getOppositeOrientation()); - screen.orientation.unlock(); - }, "Once maximized, a minimized window can lock or unlock the screen orientation again"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_urls.html.ini b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_urls.html.ini new file mode 100644 index 0000000..9bf35c4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_urls.html.ini
@@ -0,0 +1,2 @@ +[embedded_style_urls.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/webnn/idlharness.https.any-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/webnn/idlharness.https.any-expected.txt index bed6deb..d76de0a1 100644 --- a/third_party/blink/web_tests/platform/linux/external/wpt/webnn/idlharness.https.any-expected.txt +++ b/third_party/blink/web_tests/platform/linux/external/wpt/webnn/idlharness.https.any-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 403 tests; 227 PASS, 176 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 403 tests; 230 PASS, 173 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL idl_test setup promise_test: Unhandled rejection with value: object "NotSupportedError: Not implemented" PASS idl_test validation PASS Partial interface MLContext: original interface defined @@ -155,13 +155,13 @@ PASS MLContext interface: existence and properties of interface prototype object's "constructor" property PASS MLContext interface: existence and properties of interface prototype object's @@unscopables property PASS MLContext interface: member computeSync -FAIL MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) assert_own_property: interface prototype object missing non-static operation expected property "compute" missing +PASS MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) FAIL MLContext interface: operation createCommandEncoder() assert_own_property: interface prototype object missing non-static operation expected property "createCommandEncoder" missing PASS MLContext must be primary interface of context PASS Stringification of context PASS MLContext interface: context must not have property "computeSync" -FAIL MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type assert_inherits: property "compute" not found in prototype chain -FAIL MLContext interface: calling compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError assert_inherits: property "compute" not found in prototype chain +PASS MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type +PASS MLContext interface: calling compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError FAIL MLContext interface: context must inherit property "createCommandEncoder()" with the proper type assert_inherits: property "createCommandEncoder" not found in prototype chain FAIL MLCommandEncoder interface: existence and properties of interface object assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing FAIL MLCommandEncoder interface object length assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/webnn/idlharness.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/webnn/idlharness.https.any.worker-expected.txt index 9f94851..a4c52718 100644 --- a/third_party/blink/web_tests/platform/linux/external/wpt/webnn/idlharness.https.any.worker-expected.txt +++ b/third_party/blink/web_tests/platform/linux/external/wpt/webnn/idlharness.https.any.worker-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 409 tests; 232 PASS, 177 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 409 tests; 235 PASS, 174 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL idl_test setup promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'buildSync' on 'MLGraphBuilder': Not implemented" PASS idl_test validation PASS Partial interface MLContext: original interface defined @@ -159,14 +159,14 @@ PASS MLContext interface: existence and properties of interface prototype object's "constructor" property PASS MLContext interface: existence and properties of interface prototype object's @@unscopables property PASS MLContext interface: operation computeSync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) -FAIL MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) assert_own_property: interface prototype object missing non-static operation expected property "compute" missing +PASS MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) FAIL MLContext interface: operation createCommandEncoder() assert_own_property: interface prototype object missing non-static operation expected property "createCommandEncoder" missing PASS MLContext must be primary interface of context PASS Stringification of context PASS MLContext interface: context must inherit property "computeSync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type PASS MLContext interface: calling computeSync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError -FAIL MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type assert_inherits: property "compute" not found in prototype chain -FAIL MLContext interface: calling compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError assert_inherits: property "compute" not found in prototype chain +PASS MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type +PASS MLContext interface: calling compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError FAIL MLContext interface: context must inherit property "createCommandEncoder()" with the proper type assert_inherits: property "createCommandEncoder" not found in prototype chain FAIL MLCommandEncoder interface: existence and properties of interface object assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing FAIL MLCommandEncoder interface object length assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
diff --git a/third_party/blink/web_tests/platform/linux/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt new file mode 100644 index 0000000..74245ad --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt
@@ -0,0 +1,27 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +FAIL Headers iterator is correctly updated with set-cookie changes #2 assert_array_equals: expected property 1 to be "a" but got "a, b, c" (expected array ["set-cookie", "a"] got ["set-cookie", "a, b, c"]) +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Adding Set-Cookie headers normalizes their value assert_equals: Array length is not equal expected 2 but got 1 +PASS Adding invalid Set-Cookie headers throws +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt new file mode 100644 index 0000000..74245ad --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt
@@ -0,0 +1,27 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +FAIL Headers iterator is correctly updated with set-cookie changes #2 assert_array_equals: expected property 1 to be "a" but got "a, b, c" (expected array ["set-cookie", "a"] got ["set-cookie", "a, b, c"]) +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Adding Set-Cookie headers normalizes their value assert_equals: Array length is not equal expected 2 but got 1 +PASS Adding invalid Set-Cookie headers throws +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt new file mode 100644 index 0000000..74245ad --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt
@@ -0,0 +1,27 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +FAIL Headers iterator is correctly updated with set-cookie changes #2 assert_array_equals: expected property 1 to be "a" but got "a, b, c" (expected array ["set-cookie", "a"] got ["set-cookie", "a, b, c"]) +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Adding Set-Cookie headers normalizes their value assert_equals: Array length is not equal expected 2 but got 1 +PASS Adding invalid Set-Cookie headers throws +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt new file mode 100644 index 0000000..74245ad --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt
@@ -0,0 +1,27 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +FAIL Headers iterator is correctly updated with set-cookie changes #2 assert_array_equals: expected property 1 to be "a" but got "a, b, c" (expected array ["set-cookie", "a"] got ["set-cookie", "a, b, c"]) +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Adding Set-Cookie headers normalizes their value assert_equals: Array length is not equal expected 2 but got 1 +PASS Adding invalid Set-Cookie headers throws +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt new file mode 100644 index 0000000..74245ad --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt
@@ -0,0 +1,27 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +FAIL Headers iterator is correctly updated with set-cookie changes #2 assert_array_equals: expected property 1 to be "a" but got "a, b, c" (expected array ["set-cookie", "a"] got ["set-cookie", "a, b, c"]) +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Adding Set-Cookie headers normalizes their value assert_equals: Array length is not equal expected 2 but got 1 +PASS Adding invalid Set-Cookie headers throws +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt new file mode 100644 index 0000000..74245ad --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt
@@ -0,0 +1,27 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +FAIL Headers iterator is correctly updated with set-cookie changes #2 assert_array_equals: expected property 1 to be "a" but got "a, b, c" (expected array ["set-cookie", "a"] got ["set-cookie", "a, b, c"]) +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Adding Set-Cookie headers normalizes their value assert_equals: Array length is not equal expected 2 but got 1 +PASS Adding invalid Set-Cookie headers throws +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt new file mode 100644 index 0000000..74245ad --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt
@@ -0,0 +1,27 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +FAIL Headers iterator is correctly updated with set-cookie changes #2 assert_array_equals: expected property 1 to be "a" but got "a, b, c" (expected array ["set-cookie", "a"] got ["set-cookie", "a, b, c"]) +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Adding Set-Cookie headers normalizes their value assert_equals: Array length is not equal expected 2 but got 1 +PASS Adding invalid Set-Cookie headers throws +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt new file mode 100644 index 0000000..74245ad --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt
@@ -0,0 +1,27 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +FAIL Headers iterator is correctly updated with set-cookie changes #2 assert_array_equals: expected property 1 to be "a" but got "a, b, c" (expected array ["set-cookie", "a"] got ["set-cookie", "a, b, c"]) +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Adding Set-Cookie headers normalizes their value assert_equals: Array length is not equal expected 2 but got 1 +PASS Adding invalid Set-Cookie headers throws +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/webnn/idlharness.https.any-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/webnn/idlharness.https.any-expected.txt index bed6deb..d76de0a1 100644 --- a/third_party/blink/web_tests/platform/mac/external/wpt/webnn/idlharness.https.any-expected.txt +++ b/third_party/blink/web_tests/platform/mac/external/wpt/webnn/idlharness.https.any-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 403 tests; 227 PASS, 176 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 403 tests; 230 PASS, 173 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL idl_test setup promise_test: Unhandled rejection with value: object "NotSupportedError: Not implemented" PASS idl_test validation PASS Partial interface MLContext: original interface defined @@ -155,13 +155,13 @@ PASS MLContext interface: existence and properties of interface prototype object's "constructor" property PASS MLContext interface: existence and properties of interface prototype object's @@unscopables property PASS MLContext interface: member computeSync -FAIL MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) assert_own_property: interface prototype object missing non-static operation expected property "compute" missing +PASS MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) FAIL MLContext interface: operation createCommandEncoder() assert_own_property: interface prototype object missing non-static operation expected property "createCommandEncoder" missing PASS MLContext must be primary interface of context PASS Stringification of context PASS MLContext interface: context must not have property "computeSync" -FAIL MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type assert_inherits: property "compute" not found in prototype chain -FAIL MLContext interface: calling compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError assert_inherits: property "compute" not found in prototype chain +PASS MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type +PASS MLContext interface: calling compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError FAIL MLContext interface: context must inherit property "createCommandEncoder()" with the proper type assert_inherits: property "createCommandEncoder" not found in prototype chain FAIL MLCommandEncoder interface: existence and properties of interface object assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing FAIL MLCommandEncoder interface object length assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/webnn/idlharness.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/webnn/idlharness.https.any.worker-expected.txt index 9f94851..a4c52718 100644 --- a/third_party/blink/web_tests/platform/mac/external/wpt/webnn/idlharness.https.any.worker-expected.txt +++ b/third_party/blink/web_tests/platform/mac/external/wpt/webnn/idlharness.https.any.worker-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 409 tests; 232 PASS, 177 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 409 tests; 235 PASS, 174 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL idl_test setup promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'buildSync' on 'MLGraphBuilder': Not implemented" PASS idl_test validation PASS Partial interface MLContext: original interface defined @@ -159,14 +159,14 @@ PASS MLContext interface: existence and properties of interface prototype object's "constructor" property PASS MLContext interface: existence and properties of interface prototype object's @@unscopables property PASS MLContext interface: operation computeSync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) -FAIL MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) assert_own_property: interface prototype object missing non-static operation expected property "compute" missing +PASS MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) FAIL MLContext interface: operation createCommandEncoder() assert_own_property: interface prototype object missing non-static operation expected property "createCommandEncoder" missing PASS MLContext must be primary interface of context PASS Stringification of context PASS MLContext interface: context must inherit property "computeSync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type PASS MLContext interface: calling computeSync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError -FAIL MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type assert_inherits: property "compute" not found in prototype chain -FAIL MLContext interface: calling compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError assert_inherits: property "compute" not found in prototype chain +PASS MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type +PASS MLContext interface: calling compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError FAIL MLContext interface: context must inherit property "createCommandEncoder()" with the proper type assert_inherits: property "createCommandEncoder" not found in prototype chain FAIL MLCommandEncoder interface: existence and properties of interface object assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing FAIL MLCommandEncoder interface object length assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/clamp.https.any-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/clamp.https.any-expected.txt deleted file mode 100644 index 585bea565..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/clamp.https.any-expected.txt +++ /dev/null
@@ -1,35 +0,0 @@ -This is a testharness.js-based test. -FAIL clamp float32 1D tensor default options / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 2D tensor default options / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor default options / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 4D tensor default options / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 5D tensor default options / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 4D tensor default options.maxValue and specified negative options.minValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor default options.maxValue and specified options.minValue=0.0 / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 2D tensor default options.maxValue and specified positive options.minValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 5D tensor default options.minValue and specified negative options.maxValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 1D tensor default options.minValue and specified options.maxValue=0.0 / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor default options.minValue and specified positive options.maxValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 5D tensor specified both negative options.minValue and options.maxValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 4D tensor specified negative options.minValue and options.maxValue=0.0 / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor specified negative options.minValue and positive options.maxValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 2D tensor specified options.minValue=0.0 and positive options.maxValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 1D tensor specified both positive options.minValue and options.maxValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 1D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 2D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 4D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 5D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 4D tensor default options.maxValue and specified negative options.minValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor default options.maxValue and specified options.minValue=0.0 / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 2D tensor default options.maxValue and specified positive options.minValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 5D tensor default options.minValue and specified negative options.maxValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 1D tensor default options.minValue and specified options.maxValue=0.0 / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor default options.minValue and specified positive options.maxValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 5D tensor specified both negative options.minValue and options.maxValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 4D tensor specified negative options.minValue and options.maxValue=0.0 / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor specified negative options.minValue and positive options.maxValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 2D tensor specified options.minValue=0.0 and positive options.maxValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 1D tensor specified both positive options.minValue and options.maxValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/clamp.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/clamp.https.any.worker-expected.txt deleted file mode 100644 index a47cc834..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/clamp.https.any.worker-expected.txt +++ /dev/null
@@ -1,68 +0,0 @@ -This is a testharness.js-based test. -Found 64 tests; 32 PASS, 32 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS clamp float32 1D tensor default options / cpu / sync -PASS clamp float32 2D tensor default options / cpu / sync -PASS clamp float32 3D tensor default options / cpu / sync -PASS clamp float32 4D tensor default options / cpu / sync -PASS clamp float32 5D tensor default options / cpu / sync -PASS clamp float32 4D tensor default options.maxValue and specified negative options.minValue / cpu / sync -PASS clamp float32 3D tensor default options.maxValue and specified options.minValue=0.0 / cpu / sync -PASS clamp float32 2D tensor default options.maxValue and specified positive options.minValue / cpu / sync -PASS clamp float32 5D tensor default options.minValue and specified negative options.maxValue / cpu / sync -PASS clamp float32 1D tensor default options.minValue and specified options.maxValue=0.0 / cpu / sync -PASS clamp float32 3D tensor default options.minValue and specified positive options.maxValue / cpu / sync -PASS clamp float32 5D tensor specified both negative options.minValue and options.maxValue / cpu / sync -PASS clamp float32 4D tensor specified negative options.minValue and options.maxValue=0.0 / cpu / sync -PASS clamp float32 3D tensor specified negative options.minValue and positive options.maxValue / cpu / sync -PASS clamp float32 2D tensor specified options.minValue=0.0 and positive options.maxValue / cpu / sync -PASS clamp float32 1D tensor specified both positive options.minValue and options.maxValue / cpu / sync -PASS clamp float32 1D tensor default options / gpu / sync -PASS clamp float32 2D tensor default options / gpu / sync -PASS clamp float32 3D tensor default options / gpu / sync -PASS clamp float32 4D tensor default options / gpu / sync -PASS clamp float32 5D tensor default options / gpu / sync -PASS clamp float32 4D tensor default options.maxValue and specified negative options.minValue / gpu / sync -PASS clamp float32 3D tensor default options.maxValue and specified options.minValue=0.0 / gpu / sync -PASS clamp float32 2D tensor default options.maxValue and specified positive options.minValue / gpu / sync -PASS clamp float32 5D tensor default options.minValue and specified negative options.maxValue / gpu / sync -PASS clamp float32 1D tensor default options.minValue and specified options.maxValue=0.0 / gpu / sync -PASS clamp float32 3D tensor default options.minValue and specified positive options.maxValue / gpu / sync -PASS clamp float32 5D tensor specified both negative options.minValue and options.maxValue / gpu / sync -PASS clamp float32 4D tensor specified negative options.minValue and options.maxValue=0.0 / gpu / sync -PASS clamp float32 3D tensor specified negative options.minValue and positive options.maxValue / gpu / sync -PASS clamp float32 2D tensor specified options.minValue=0.0 and positive options.maxValue / gpu / sync -PASS clamp float32 1D tensor specified both positive options.minValue and options.maxValue / gpu / sync -FAIL clamp float32 1D tensor default options / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 2D tensor default options / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor default options / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 4D tensor default options / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 5D tensor default options / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 4D tensor default options.maxValue and specified negative options.minValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor default options.maxValue and specified options.minValue=0.0 / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 2D tensor default options.maxValue and specified positive options.minValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 5D tensor default options.minValue and specified negative options.maxValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 1D tensor default options.minValue and specified options.maxValue=0.0 / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor default options.minValue and specified positive options.maxValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 5D tensor specified both negative options.minValue and options.maxValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 4D tensor specified negative options.minValue and options.maxValue=0.0 / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor specified negative options.minValue and positive options.maxValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 2D tensor specified options.minValue=0.0 and positive options.maxValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 1D tensor specified both positive options.minValue and options.maxValue / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 1D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 2D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 4D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 5D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 4D tensor default options.maxValue and specified negative options.minValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor default options.maxValue and specified options.minValue=0.0 / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 2D tensor default options.maxValue and specified positive options.minValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 5D tensor default options.minValue and specified negative options.maxValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 1D tensor default options.minValue and specified options.maxValue=0.0 / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor default options.minValue and specified positive options.maxValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 5D tensor specified both negative options.minValue and options.maxValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 4D tensor specified negative options.minValue and options.maxValue=0.0 / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 3D tensor specified negative options.minValue and positive options.maxValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 2D tensor specified options.minValue=0.0 and positive options.maxValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL clamp float32 1D tensor specified both positive options.minValue and options.maxValue / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/conv2d.https.any-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/conv2d.https.any-expected.txt index 2a1c1a0..e885ad4 100644 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/conv2d.https.any-expected.txt +++ b/third_party/blink/web_tests/platform/win/external/wpt/webnn/conv2d.https.any-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 52 tests; 0 PASS, 52 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 52 tests; 2 PASS, 50 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL conv2d float32 4D input and filter(non-constant) tensors default options / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." FAIL conv2d float32 4D input and filter tensors default options / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." FAIL conv2d float32 4D input and filter tensors options.padding / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." @@ -19,7 +19,7 @@ FAIL conv2d float32 4D input and filter tensors options.filterLayout='ihwo' / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='oihw' / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The filter layout oihw is not supported." FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='hwio' / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The filter layout hwio is not supported." -FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='ohwi' / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='ohwi' / cpu / async FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='ihwo' / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The filter layout ihwo is not supported." FAIL conv2d float32 4D input and filter tensors 1D options.bias / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." FAIL conv2d float32 4D input and filter tensors options.activation=relu / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." @@ -45,7 +45,7 @@ FAIL conv2d float32 4D input and filter tensors options.filterLayout='ihwo' / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='oihw' / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The filter layout oihw is not supported." FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='hwio' / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The filter layout hwio is not supported." -FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='ohwi' / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='ohwi' / gpu / async FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='ihwo' / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The filter layout ihwo is not supported." FAIL conv2d float32 4D input and filter tensors 1D options.bias / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." FAIL conv2d float32 4D input and filter tensors options.activation=relu / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported."
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/conv2d.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/conv2d.https.any.worker-expected.txt index 8004bbb..918c78dd 100644 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/conv2d.https.any.worker-expected.txt +++ b/third_party/blink/web_tests/platform/win/external/wpt/webnn/conv2d.https.any.worker-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 104 tests; 2 PASS, 102 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 104 tests; 4 PASS, 100 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL conv2d float32 4D input and filter(non-constant) tensors default options / cpu / sync Failed to execute 'buildSync' on 'MLGraphBuilder': The input layout nchw is not supported. FAIL conv2d float32 4D input and filter tensors default options / cpu / sync Failed to execute 'buildSync' on 'MLGraphBuilder': The input layout nchw is not supported. FAIL conv2d float32 4D input and filter tensors options.padding / cpu / sync Failed to execute 'buildSync' on 'MLGraphBuilder': The input layout nchw is not supported. @@ -71,7 +71,7 @@ FAIL conv2d float32 4D input and filter tensors options.filterLayout='ihwo' / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='oihw' / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The filter layout oihw is not supported." FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='hwio' / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The filter layout hwio is not supported." -FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='ohwi' / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='ohwi' / cpu / async FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='ihwo' / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The filter layout ihwo is not supported." FAIL conv2d float32 4D input and filter tensors 1D options.bias / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." FAIL conv2d float32 4D input and filter tensors options.activation=relu / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." @@ -97,7 +97,7 @@ FAIL conv2d float32 4D input and filter tensors options.filterLayout='ihwo' / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='oihw' / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The filter layout oihw is not supported." FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='hwio' / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The filter layout hwio is not supported." -FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='ohwi' / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='ohwi' / gpu / async FAIL conv2d float32 4D input and filter tensors options.inputLayout='nhwc' and options.filterLayout='ihwo' / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The filter layout ihwo is not supported." FAIL conv2d float32 4D input and filter tensors 1D options.bias / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." FAIL conv2d float32 4D input and filter tensors options.activation=relu / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported."
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/elementwise_binary.https.any-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/elementwise_binary.https.any-expected.txt index 359eb554..30b9bbb 100644 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/elementwise_binary.https.any-expected.txt +++ b/third_party/blink/web_tests/platform/win/external/wpt/webnn/elementwise_binary.https.any-expected.txt
@@ -1,113 +1,113 @@ This is a testharness.js-based test. -Found 132 tests; 0 PASS, 132 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL add float32 1D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 2D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 3D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 4D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 5D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 1D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 2D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 3D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 4D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 1D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 2D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 3D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 4D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 5D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 1D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 2D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 3D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 4D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 1D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 2D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 3D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 4D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 5D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 1D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 2D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 3D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 4D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 1D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 2D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 3D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 4D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 5D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 1D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 2D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 3D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 4D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 1D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 2D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 3D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 4D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 5D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 1D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 2D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 3D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 4D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 1D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 2D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 3D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 4D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 5D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 1D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 2D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 3D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 4D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 1D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 2D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 3D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 4D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 5D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 1D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 2D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 3D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 4D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 1D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 2D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 3D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 4D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 5D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 1D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 2D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 3D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 4D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 1D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 2D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 3D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 4D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 5D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 1D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 2D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 3D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 4D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 1D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 2D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 3D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 4D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 5D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 1D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 2D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 3D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 4D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 1D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 2D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 3D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 4D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 5D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 1D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 2D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 3D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 4D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 1D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 2D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 3D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 4D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 5D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 1D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 2D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 3D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 4D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +Found 132 tests; 108 PASS, 24 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS add float32 1D tensors / cpu / async +PASS add float32 2D tensors / cpu / async +PASS add float32 3D tensors / cpu / async +PASS add float32 4D tensors / cpu / async +PASS add float32 5D tensors / cpu / async +PASS add float32 broadcast 1D to 4D / cpu / async +PASS add float32 broadcast 2D to 4D / cpu / async +PASS add float32 broadcast 3D to 4D / cpu / async +PASS add float32 broadcast 4D to 4D / cpu / async +PASS add float32 1D tensors / gpu / async +PASS add float32 2D tensors / gpu / async +PASS add float32 3D tensors / gpu / async +PASS add float32 4D tensors / gpu / async +PASS add float32 5D tensors / gpu / async +PASS add float32 broadcast 1D to 4D / gpu / async +PASS add float32 broadcast 2D to 4D / gpu / async +PASS add float32 broadcast 3D to 4D / gpu / async +PASS add float32 broadcast 4D to 4D / gpu / async +PASS sub float32 1D tensors / cpu / async +PASS sub float32 2D tensors / cpu / async +PASS sub float32 3D tensors / cpu / async +PASS sub float32 4D tensors / cpu / async +PASS sub float32 5D tensors / cpu / async +PASS sub float32 broadcast 1D to 4D / cpu / async +PASS sub float32 broadcast 2D to 4D / cpu / async +PASS sub float32 broadcast 3D to 4D / cpu / async +PASS sub float32 broadcast 4D to 4D / cpu / async +PASS sub float32 1D tensors / gpu / async +PASS sub float32 2D tensors / gpu / async +PASS sub float32 3D tensors / gpu / async +PASS sub float32 4D tensors / gpu / async +PASS sub float32 5D tensors / gpu / async +PASS sub float32 broadcast 1D to 4D / gpu / async +PASS sub float32 broadcast 2D to 4D / gpu / async +PASS sub float32 broadcast 3D to 4D / gpu / async +PASS sub float32 broadcast 4D to 4D / gpu / async +PASS mul float32 1D tensors / cpu / async +PASS mul float32 2D tensors / cpu / async +PASS mul float32 3D tensors / cpu / async +PASS mul float32 4D tensors / cpu / async +PASS mul float32 5D tensors / cpu / async +PASS mul float32 broadcast 1D to 4D / cpu / async +PASS mul float32 broadcast 2D to 4D / cpu / async +PASS mul float32 broadcast 3D to 4D / cpu / async +PASS mul float32 broadcast 4D to 4D / cpu / async +PASS mul float32 1D tensors / gpu / async +PASS mul float32 2D tensors / gpu / async +PASS mul float32 3D tensors / gpu / async +PASS mul float32 4D tensors / gpu / async +PASS mul float32 5D tensors / gpu / async +PASS mul float32 broadcast 1D to 4D / gpu / async +PASS mul float32 broadcast 2D to 4D / gpu / async +PASS mul float32 broadcast 3D to 4D / gpu / async +PASS mul float32 broadcast 4D to 4D / gpu / async +PASS div float32 1D tensors / cpu / async +PASS div float32 2D tensors / cpu / async +PASS div float32 3D tensors / cpu / async +PASS div float32 4D tensors / cpu / async +PASS div float32 5D tensors / cpu / async +PASS div float32 broadcast 1D to 4D / cpu / async +PASS div float32 broadcast 2D to 4D / cpu / async +PASS div float32 broadcast 3D to 4D / cpu / async +PASS div float32 broadcast 4D to 4D / cpu / async +PASS div float32 1D tensors / gpu / async +PASS div float32 2D tensors / gpu / async +PASS div float32 3D tensors / gpu / async +PASS div float32 4D tensors / gpu / async +PASS div float32 5D tensors / gpu / async +PASS div float32 broadcast 1D to 4D / gpu / async +PASS div float32 broadcast 2D to 4D / gpu / async +PASS div float32 broadcast 3D to 4D / gpu / async +PASS div float32 broadcast 4D to 4D / gpu / async +PASS max float32 1D tensors / cpu / async +PASS max float32 2D tensors / cpu / async +PASS max float32 3D tensors / cpu / async +PASS max float32 4D tensors / cpu / async +PASS max float32 5D tensors / cpu / async +PASS max float32 broadcast 1D to 4D / cpu / async +PASS max float32 broadcast 2D to 4D / cpu / async +PASS max float32 broadcast 3D to 4D / cpu / async +PASS max float32 broadcast 4D to 4D / cpu / async +PASS max float32 1D tensors / gpu / async +PASS max float32 2D tensors / gpu / async +PASS max float32 3D tensors / gpu / async +PASS max float32 4D tensors / gpu / async +PASS max float32 5D tensors / gpu / async +PASS max float32 broadcast 1D to 4D / gpu / async +PASS max float32 broadcast 2D to 4D / gpu / async +PASS max float32 broadcast 3D to 4D / gpu / async +PASS max float32 broadcast 4D to 4D / gpu / async +PASS min float32 1D tensors / cpu / async +PASS min float32 2D tensors / cpu / async +PASS min float32 3D tensors / cpu / async +PASS min float32 4D tensors / cpu / async +PASS min float32 5D tensors / cpu / async +PASS min float32 broadcast 1D to 4D / cpu / async +PASS min float32 broadcast 2D to 4D / cpu / async +PASS min float32 broadcast 3D to 4D / cpu / async +PASS min float32 broadcast 4D to 4D / cpu / async +PASS min float32 1D tensors / gpu / async +PASS min float32 2D tensors / gpu / async +PASS min float32 3D tensors / gpu / async +PASS min float32 4D tensors / gpu / async +PASS min float32 5D tensors / gpu / async +PASS min float32 broadcast 1D to 4D / gpu / async +PASS min float32 broadcast 2D to 4D / gpu / async +PASS min float32 broadcast 3D to 4D / gpu / async +PASS min float32 broadcast 4D to 4D / gpu / async FAIL pow float32 1D base tensor and 1D integer exponent tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: builder[operationName] is not a function" FAIL pow float32 2D base tensor and 2D integer exponent tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: builder[operationName] is not a function" FAIL pow float32 3D base tensor and 3D integer exponent tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: builder[operationName] is not a function"
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/elementwise_binary.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/elementwise_binary.https.any.worker-expected.txt index 9b5b2f7..ef89f0a 100644 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/elementwise_binary.https.any.worker-expected.txt +++ b/third_party/blink/web_tests/platform/win/external/wpt/webnn/elementwise_binary.https.any.worker-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 264 tests; 108 PASS, 156 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 264 tests; 216 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS add float32 1D tensors / cpu / sync PASS add float32 2D tensors / cpu / sync PASS add float32 3D tensors / cpu / sync @@ -132,114 +132,114 @@ FAIL pow float32 4D base tensor and broadcastable 2D integer exponent tensor / gpu / sync builder[operationName] is not a function FAIL pow float32 4D base tensor and broadcastable 3D integer exponent tensor / gpu / sync builder[operationName] is not a function FAIL pow float32 4D exponent tensor and broadcastable 4D positive base tensor / gpu / sync builder[operationName] is not a function -FAIL add float32 1D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 2D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 3D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 4D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 5D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 1D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 2D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 3D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 4D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 1D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 2D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 3D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 4D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 5D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 1D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 2D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 3D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL add float32 broadcast 4D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 1D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 2D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 3D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 4D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 5D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 1D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 2D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 3D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 4D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 1D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 2D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 3D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 4D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 5D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 1D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 2D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 3D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL sub float32 broadcast 4D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 1D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 2D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 3D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 4D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 5D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 1D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 2D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 3D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 4D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 1D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 2D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 3D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 4D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 5D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 1D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 2D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 3D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL mul float32 broadcast 4D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 1D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 2D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 3D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 4D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 5D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 1D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 2D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 3D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 4D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 1D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 2D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 3D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 4D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 5D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 1D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 2D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 3D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL div float32 broadcast 4D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 1D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 2D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 3D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 4D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 5D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 1D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 2D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 3D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 4D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 1D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 2D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 3D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 4D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 5D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 1D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 2D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 3D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL max float32 broadcast 4D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 1D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 2D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 3D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 4D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 5D tensors / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 1D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 2D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 3D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 4D to 4D / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 1D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 2D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 3D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 4D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 5D tensors / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 1D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 2D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 3D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL min float32 broadcast 4D to 4D / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS add float32 1D tensors / cpu / async +PASS add float32 2D tensors / cpu / async +PASS add float32 3D tensors / cpu / async +PASS add float32 4D tensors / cpu / async +PASS add float32 5D tensors / cpu / async +PASS add float32 broadcast 1D to 4D / cpu / async +PASS add float32 broadcast 2D to 4D / cpu / async +PASS add float32 broadcast 3D to 4D / cpu / async +PASS add float32 broadcast 4D to 4D / cpu / async +PASS add float32 1D tensors / gpu / async +PASS add float32 2D tensors / gpu / async +PASS add float32 3D tensors / gpu / async +PASS add float32 4D tensors / gpu / async +PASS add float32 5D tensors / gpu / async +PASS add float32 broadcast 1D to 4D / gpu / async +PASS add float32 broadcast 2D to 4D / gpu / async +PASS add float32 broadcast 3D to 4D / gpu / async +PASS add float32 broadcast 4D to 4D / gpu / async +PASS sub float32 1D tensors / cpu / async +PASS sub float32 2D tensors / cpu / async +PASS sub float32 3D tensors / cpu / async +PASS sub float32 4D tensors / cpu / async +PASS sub float32 5D tensors / cpu / async +PASS sub float32 broadcast 1D to 4D / cpu / async +PASS sub float32 broadcast 2D to 4D / cpu / async +PASS sub float32 broadcast 3D to 4D / cpu / async +PASS sub float32 broadcast 4D to 4D / cpu / async +PASS sub float32 1D tensors / gpu / async +PASS sub float32 2D tensors / gpu / async +PASS sub float32 3D tensors / gpu / async +PASS sub float32 4D tensors / gpu / async +PASS sub float32 5D tensors / gpu / async +PASS sub float32 broadcast 1D to 4D / gpu / async +PASS sub float32 broadcast 2D to 4D / gpu / async +PASS sub float32 broadcast 3D to 4D / gpu / async +PASS sub float32 broadcast 4D to 4D / gpu / async +PASS mul float32 1D tensors / cpu / async +PASS mul float32 2D tensors / cpu / async +PASS mul float32 3D tensors / cpu / async +PASS mul float32 4D tensors / cpu / async +PASS mul float32 5D tensors / cpu / async +PASS mul float32 broadcast 1D to 4D / cpu / async +PASS mul float32 broadcast 2D to 4D / cpu / async +PASS mul float32 broadcast 3D to 4D / cpu / async +PASS mul float32 broadcast 4D to 4D / cpu / async +PASS mul float32 1D tensors / gpu / async +PASS mul float32 2D tensors / gpu / async +PASS mul float32 3D tensors / gpu / async +PASS mul float32 4D tensors / gpu / async +PASS mul float32 5D tensors / gpu / async +PASS mul float32 broadcast 1D to 4D / gpu / async +PASS mul float32 broadcast 2D to 4D / gpu / async +PASS mul float32 broadcast 3D to 4D / gpu / async +PASS mul float32 broadcast 4D to 4D / gpu / async +PASS div float32 1D tensors / cpu / async +PASS div float32 2D tensors / cpu / async +PASS div float32 3D tensors / cpu / async +PASS div float32 4D tensors / cpu / async +PASS div float32 5D tensors / cpu / async +PASS div float32 broadcast 1D to 4D / cpu / async +PASS div float32 broadcast 2D to 4D / cpu / async +PASS div float32 broadcast 3D to 4D / cpu / async +PASS div float32 broadcast 4D to 4D / cpu / async +PASS div float32 1D tensors / gpu / async +PASS div float32 2D tensors / gpu / async +PASS div float32 3D tensors / gpu / async +PASS div float32 4D tensors / gpu / async +PASS div float32 5D tensors / gpu / async +PASS div float32 broadcast 1D to 4D / gpu / async +PASS div float32 broadcast 2D to 4D / gpu / async +PASS div float32 broadcast 3D to 4D / gpu / async +PASS div float32 broadcast 4D to 4D / gpu / async +PASS max float32 1D tensors / cpu / async +PASS max float32 2D tensors / cpu / async +PASS max float32 3D tensors / cpu / async +PASS max float32 4D tensors / cpu / async +PASS max float32 5D tensors / cpu / async +PASS max float32 broadcast 1D to 4D / cpu / async +PASS max float32 broadcast 2D to 4D / cpu / async +PASS max float32 broadcast 3D to 4D / cpu / async +PASS max float32 broadcast 4D to 4D / cpu / async +PASS max float32 1D tensors / gpu / async +PASS max float32 2D tensors / gpu / async +PASS max float32 3D tensors / gpu / async +PASS max float32 4D tensors / gpu / async +PASS max float32 5D tensors / gpu / async +PASS max float32 broadcast 1D to 4D / gpu / async +PASS max float32 broadcast 2D to 4D / gpu / async +PASS max float32 broadcast 3D to 4D / gpu / async +PASS max float32 broadcast 4D to 4D / gpu / async +PASS min float32 1D tensors / cpu / async +PASS min float32 2D tensors / cpu / async +PASS min float32 3D tensors / cpu / async +PASS min float32 4D tensors / cpu / async +PASS min float32 5D tensors / cpu / async +PASS min float32 broadcast 1D to 4D / cpu / async +PASS min float32 broadcast 2D to 4D / cpu / async +PASS min float32 broadcast 3D to 4D / cpu / async +PASS min float32 broadcast 4D to 4D / cpu / async +PASS min float32 1D tensors / gpu / async +PASS min float32 2D tensors / gpu / async +PASS min float32 3D tensors / gpu / async +PASS min float32 4D tensors / gpu / async +PASS min float32 5D tensors / gpu / async +PASS min float32 broadcast 1D to 4D / gpu / async +PASS min float32 broadcast 2D to 4D / gpu / async +PASS min float32 broadcast 3D to 4D / gpu / async +PASS min float32 broadcast 4D to 4D / gpu / async FAIL pow float32 1D base tensor and 1D integer exponent tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: builder[operationName] is not a function" FAIL pow float32 2D base tensor and 2D integer exponent tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: builder[operationName] is not a function" FAIL pow float32 3D base tensor and 3D integer exponent tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: builder[operationName] is not a function"
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/gemm.https.any-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/gemm.https.any-expected.txt index 60c1627..5f07f8e1 100644 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/gemm.https.any-expected.txt +++ b/third_party/blink/web_tests/platform/win/external/wpt/webnn/gemm.https.any-expected.txt
@@ -1,6 +1,6 @@ This is a testharness.js-based test. FAIL gemm two float32 2D tensors (b is non-constant) default options / cpu / async promise_test: Unhandled rejection with value: object "DataError: Failed to call xnn_define_fully_connected(subgraph, output_min, output_max, input_id, filter_id, bias_id, output_id, flags): xnn_status_invalid_parameter." -FAIL gemm two float32 2D tensors default options / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +FAIL gemm two float32 2D tensors default options / cpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false FAIL gemm two float32 2D tensors options.c / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors broadcast options.c [1, 5] => [3, 5] / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors broadcast options.c [3, 1] => [3, 5] / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." @@ -11,12 +11,12 @@ FAIL gemm two float32 2D tensors options.beta / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: gemm doesn't support beta option." FAIL gemm two float32 2D tensors options.c and options.beta / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors options.aTranspose being true / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: gemm doesn't support aTranspose option." -FAIL gemm two float32 2D tensors options.aTranspose being explicit false / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL gemm two float32 2D tensors options.bTranspose being true / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL gemm two float32 2D tensors options.bTranspose being explicit false / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +FAIL gemm two float32 2D tensors options.aTranspose being explicit false / cpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false +FAIL gemm two float32 2D tensors options.bTranspose being true / cpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false +FAIL gemm two float32 2D tensors options.bTranspose being explicit false / cpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false FAIL gemm two float32 2D tensors all options / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors (b is non-constant) default options / gpu / async promise_test: Unhandled rejection with value: object "DataError: Failed to call xnn_define_fully_connected(subgraph, output_min, output_max, input_id, filter_id, bias_id, output_id, flags): xnn_status_invalid_parameter." -FAIL gemm two float32 2D tensors default options / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +FAIL gemm two float32 2D tensors default options / gpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false FAIL gemm two float32 2D tensors options.c / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors broadcast options.c [1, 5] => [3, 5] / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors broadcast options.c [3, 1] => [3, 5] / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." @@ -27,9 +27,9 @@ FAIL gemm two float32 2D tensors options.beta / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: gemm doesn't support beta option." FAIL gemm two float32 2D tensors options.c and options.beta / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors options.aTranspose being true / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: gemm doesn't support aTranspose option." -FAIL gemm two float32 2D tensors options.aTranspose being explicit false / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL gemm two float32 2D tensors options.bTranspose being true / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL gemm two float32 2D tensors options.bTranspose being explicit false / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +FAIL gemm two float32 2D tensors options.aTranspose being explicit false / gpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false +FAIL gemm two float32 2D tensors options.bTranspose being true / gpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false +FAIL gemm two float32 2D tensors options.bTranspose being explicit false / gpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false FAIL gemm two float32 2D tensors all options / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/gemm.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/gemm.https.any.worker-expected.txt index c78ce1c..0d66e6f 100644 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/gemm.https.any.worker-expected.txt +++ b/third_party/blink/web_tests/platform/win/external/wpt/webnn/gemm.https.any.worker-expected.txt
@@ -33,7 +33,7 @@ FAIL gemm two float32 2D tensors options.bTranspose being explicit false / gpu / sync assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false FAIL gemm two float32 2D tensors all options / gpu / sync Failed to execute 'buildSync' on 'MLGraphBuilder': The dimensions of bias must be [5]. FAIL gemm two float32 2D tensors (b is non-constant) default options / cpu / async promise_test: Unhandled rejection with value: object "DataError: Failed to call xnn_define_fully_connected(subgraph, output_min, output_max, input_id, filter_id, bias_id, output_id, flags): xnn_status_invalid_parameter." -FAIL gemm two float32 2D tensors default options / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +FAIL gemm two float32 2D tensors default options / cpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false FAIL gemm two float32 2D tensors options.c / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors broadcast options.c [1, 5] => [3, 5] / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors broadcast options.c [3, 1] => [3, 5] / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." @@ -44,12 +44,12 @@ FAIL gemm two float32 2D tensors options.beta / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: gemm doesn't support beta option." FAIL gemm two float32 2D tensors options.c and options.beta / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors options.aTranspose being true / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: gemm doesn't support aTranspose option." -FAIL gemm two float32 2D tensors options.aTranspose being explicit false / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL gemm two float32 2D tensors options.bTranspose being true / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL gemm two float32 2D tensors options.bTranspose being explicit false / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +FAIL gemm two float32 2D tensors options.aTranspose being explicit false / cpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false +FAIL gemm two float32 2D tensors options.bTranspose being true / cpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false +FAIL gemm two float32 2D tensors options.bTranspose being explicit false / cpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false FAIL gemm two float32 2D tensors all options / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors (b is non-constant) default options / gpu / async promise_test: Unhandled rejection with value: object "DataError: Failed to call xnn_define_fully_connected(subgraph, output_min, output_max, input_id, filter_id, bias_id, output_id, flags): xnn_status_invalid_parameter." -FAIL gemm two float32 2D tensors default options / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +FAIL gemm two float32 2D tensors default options / gpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false FAIL gemm two float32 2D tensors options.c / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors broadcast options.c [1, 5] => [3, 5] / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors broadcast options.c [3, 1] => [3, 5] / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." @@ -60,9 +60,9 @@ FAIL gemm two float32 2D tensors options.beta / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: gemm doesn't support beta option." FAIL gemm two float32 2D tensors options.c and options.beta / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." FAIL gemm two float32 2D tensors options.aTranspose being true / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: gemm doesn't support aTranspose option." -FAIL gemm two float32 2D tensors options.aTranspose being explicit false / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL gemm two float32 2D tensors options.bTranspose being true / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL gemm two float32 2D tensors options.bTranspose being explicit false / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +FAIL gemm two float32 2D tensors options.aTranspose being explicit false / gpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false +FAIL gemm two float32 2D tensors options.bTranspose being true / gpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false +FAIL gemm two float32 2D tensors options.bTranspose being explicit false / gpu / async assert_true: assert_array_approx_equals_ulp: test gemm float32 actual 96.12967681884766 should be close enough to expected 96.12957763671875 by the acceptable 8 ULP distance, but they have 13 ULP distance expected true got false FAIL gemm two float32 2D tensors all options / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The dimensions of bias must be [5]." Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/idlharness.https.any-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/idlharness.https.any-expected.txt index d4b4c80..76f1c5d 100644 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/idlharness.https.any-expected.txt +++ b/third_party/blink/web_tests/platform/win/external/wpt/webnn/idlharness.https.any-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 403 tests; 227 PASS, 176 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 403 tests; 230 PASS, 173 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL idl_test setup promise_test: Unhandled rejection with value: object "NotSupportedError: The input layout nchw is not supported." PASS idl_test validation PASS Partial interface MLContext: original interface defined @@ -155,13 +155,13 @@ PASS MLContext interface: existence and properties of interface prototype object's "constructor" property PASS MLContext interface: existence and properties of interface prototype object's @@unscopables property PASS MLContext interface: member computeSync -FAIL MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) assert_own_property: interface prototype object missing non-static operation expected property "compute" missing +PASS MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) FAIL MLContext interface: operation createCommandEncoder() assert_own_property: interface prototype object missing non-static operation expected property "createCommandEncoder" missing PASS MLContext must be primary interface of context PASS Stringification of context PASS MLContext interface: context must not have property "computeSync" -FAIL MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type assert_inherits: property "compute" not found in prototype chain -FAIL MLContext interface: calling compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError assert_inherits: property "compute" not found in prototype chain +PASS MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type +PASS MLContext interface: calling compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError FAIL MLContext interface: context must inherit property "createCommandEncoder()" with the proper type assert_inherits: property "createCommandEncoder" not found in prototype chain FAIL MLCommandEncoder interface: existence and properties of interface object assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing FAIL MLCommandEncoder interface object length assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/idlharness.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/idlharness.https.any.worker-expected.txt index d9d0eb9..0b620c7 100644 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/idlharness.https.any.worker-expected.txt +++ b/third_party/blink/web_tests/platform/win/external/wpt/webnn/idlharness.https.any.worker-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 409 tests; 232 PASS, 177 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 409 tests; 235 PASS, 174 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL idl_test setup promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'buildSync' on 'MLGraphBuilder': The input layout nchw is not supported." PASS idl_test validation PASS Partial interface MLContext: original interface defined @@ -159,14 +159,14 @@ PASS MLContext interface: existence and properties of interface prototype object's "constructor" property PASS MLContext interface: existence and properties of interface prototype object's @@unscopables property PASS MLContext interface: operation computeSync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) -FAIL MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) assert_own_property: interface prototype object missing non-static operation expected property "compute" missing +PASS MLContext interface: operation compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) FAIL MLContext interface: operation createCommandEncoder() assert_own_property: interface prototype object missing non-static operation expected property "createCommandEncoder" missing PASS MLContext must be primary interface of context PASS Stringification of context PASS MLContext interface: context must inherit property "computeSync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type PASS MLContext interface: calling computeSync(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError -FAIL MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type assert_inherits: property "compute" not found in prototype chain -FAIL MLContext interface: calling compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError assert_inherits: property "compute" not found in prototype chain +PASS MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews)" with the proper type +PASS MLContext interface: calling compute(MLGraph, MLNamedArrayBufferViews, MLNamedArrayBufferViews) on context with too few arguments must throw TypeError FAIL MLContext interface: context must inherit property "createCommandEncoder()" with the proper type assert_inherits: property "createCommandEncoder" not found in prototype chain FAIL MLCommandEncoder interface: existence and properties of interface object assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing FAIL MLCommandEncoder interface object length assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/pooling.https.any-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/pooling.https.any-expected.txt index 684b357..08befcc 100644 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/pooling.https.any-expected.txt +++ b/third_party/blink/web_tests/platform/win/external/wpt/webnn/pooling.https.any-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 68 tests; 0 PASS, 68 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 68 tests; 6 PASS, 62 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL averagePool2d float32 4D tensor default options / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.windowDimensions / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.padding / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." @@ -11,12 +11,12 @@ FAIL averagePool2d float32 4D tensor options.autoPad=same-upper ignores options.padding / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.autoPad=same-lower ignores options.padding / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.layout=nchw / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL averagePool2d float32 4D tensor options.layout=nhwc / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS averagePool2d float32 4D tensor options.layout=nhwc / cpu / async FAIL averagePool2d float32 4D tensor options.roundingType=floor / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.roundingType=ceil / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.outputSizes ignores options.roundingType=floor / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.outputSizes ignores options.roundingType=ceil / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL averagePool2d float32 4D tensor options.dilations with options.strides / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +FAIL averagePool2d float32 4D tensor options.dilations with options.strides / cpu / async assert_true: assert_array_approx_equals_ulp: test averagePool2d float32 actual -0.2304840087890625 should be close enough to expected -0.23048464953899384 by the acceptable 11 ULP distance, but they have 43 ULP distance expected true got false FAIL averagePool2d float32 4D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.windowDimensions / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.padding / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." @@ -28,12 +28,12 @@ FAIL averagePool2d float32 4D tensor options.autoPad=same-upper ignores options.padding / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.autoPad=same-lower ignores options.padding / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.layout=nchw / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL averagePool2d float32 4D tensor options.layout=nhwc / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS averagePool2d float32 4D tensor options.layout=nhwc / gpu / async FAIL averagePool2d float32 4D tensor options.roundingType=floor / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.roundingType=ceil / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.outputSizes ignores options.roundingType=floor / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.outputSizes ignores options.roundingType=ceil / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL averagePool2d float32 4D tensor options.dilations with options.strides / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +FAIL averagePool2d float32 4D tensor options.dilations with options.strides / gpu / async assert_true: assert_array_approx_equals_ulp: test averagePool2d float32 actual -0.2304840087890625 should be close enough to expected -0.23048464953899384 by the acceptable 11 ULP distance, but they have 43 ULP distance expected true got false FAIL maxPool2d float32 4D tensor default options / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.windowDimensions / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.padding / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." @@ -45,12 +45,12 @@ FAIL maxPool2d float32 4D tensor options.autoPad=same-upper ignores options.padding / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.autoPad=same-lower ignores options.padding / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.layout=nchw / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL maxPool2d float32 4D tensor options.layout=nhwc / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS maxPool2d float32 4D tensor options.layout=nhwc / cpu / async FAIL maxPool2d float32 4D tensor options.roundingType=floor / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.roundingType=ceil / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.outputSizes ignores options.roundingType=floor / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.outputSizes ignores options.roundingType=ceil / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL maxPool2d float32 4D tensor options.dilations with options.strides / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS maxPool2d float32 4D tensor options.dilations with options.strides / cpu / async FAIL maxPool2d float32 4D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.windowDimensions / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.padding / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." @@ -62,11 +62,11 @@ FAIL maxPool2d float32 4D tensor options.autoPad=same-upper ignores options.padding / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.autoPad=same-lower ignores options.padding / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.layout=nchw / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL maxPool2d float32 4D tensor options.layout=nhwc / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS maxPool2d float32 4D tensor options.layout=nhwc / gpu / async FAIL maxPool2d float32 4D tensor options.roundingType=floor / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.roundingType=ceil / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.outputSizes ignores options.roundingType=floor / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.outputSizes ignores options.roundingType=ceil / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL maxPool2d float32 4D tensor options.dilations with options.strides / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS maxPool2d float32 4D tensor options.dilations with options.strides / gpu / async Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/pooling.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/pooling.https.any.worker-expected.txt index 2c6126b..0b24523b2 100644 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/pooling.https.any.worker-expected.txt +++ b/third_party/blink/web_tests/platform/win/external/wpt/webnn/pooling.https.any.worker-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 136 tests; 6 PASS, 130 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 136 tests; 12 PASS, 124 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL averagePool2d float32 4D tensor default options / cpu / sync Failed to execute 'buildSync' on 'MLGraphBuilder': The nchw input layout is not supported. FAIL averagePool2d float32 4D tensor options.windowDimensions / cpu / sync Failed to execute 'buildSync' on 'MLGraphBuilder': The nchw input layout is not supported. FAIL averagePool2d float32 4D tensor options.padding / cpu / sync Failed to execute 'buildSync' on 'MLGraphBuilder': The nchw input layout is not supported. @@ -79,12 +79,12 @@ FAIL averagePool2d float32 4D tensor options.autoPad=same-upper ignores options.padding / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.autoPad=same-lower ignores options.padding / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.layout=nchw / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL averagePool2d float32 4D tensor options.layout=nhwc / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS averagePool2d float32 4D tensor options.layout=nhwc / cpu / async FAIL averagePool2d float32 4D tensor options.roundingType=floor / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.roundingType=ceil / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.outputSizes ignores options.roundingType=floor / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.outputSizes ignores options.roundingType=ceil / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL averagePool2d float32 4D tensor options.dilations with options.strides / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +FAIL averagePool2d float32 4D tensor options.dilations with options.strides / cpu / async assert_true: assert_array_approx_equals_ulp: test averagePool2d float32 actual -0.2304840087890625 should be close enough to expected -0.23048464953899384 by the acceptable 11 ULP distance, but they have 43 ULP distance expected true got false FAIL averagePool2d float32 4D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.windowDimensions / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.padding / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." @@ -96,12 +96,12 @@ FAIL averagePool2d float32 4D tensor options.autoPad=same-upper ignores options.padding / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.autoPad=same-lower ignores options.padding / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.layout=nchw / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL averagePool2d float32 4D tensor options.layout=nhwc / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS averagePool2d float32 4D tensor options.layout=nhwc / gpu / async FAIL averagePool2d float32 4D tensor options.roundingType=floor / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.roundingType=ceil / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.outputSizes ignores options.roundingType=floor / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL averagePool2d float32 4D tensor options.outputSizes ignores options.roundingType=ceil / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL averagePool2d float32 4D tensor options.dilations with options.strides / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +FAIL averagePool2d float32 4D tensor options.dilations with options.strides / gpu / async assert_true: assert_array_approx_equals_ulp: test averagePool2d float32 actual -0.2304840087890625 should be close enough to expected -0.23048464953899384 by the acceptable 11 ULP distance, but they have 43 ULP distance expected true got false FAIL maxPool2d float32 4D tensor default options / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.windowDimensions / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.padding / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." @@ -113,12 +113,12 @@ FAIL maxPool2d float32 4D tensor options.autoPad=same-upper ignores options.padding / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.autoPad=same-lower ignores options.padding / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.layout=nchw / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL maxPool2d float32 4D tensor options.layout=nhwc / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS maxPool2d float32 4D tensor options.layout=nhwc / cpu / async FAIL maxPool2d float32 4D tensor options.roundingType=floor / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.roundingType=ceil / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.outputSizes ignores options.roundingType=floor / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.outputSizes ignores options.roundingType=ceil / cpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL maxPool2d float32 4D tensor options.dilations with options.strides / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS maxPool2d float32 4D tensor options.dilations with options.strides / cpu / async FAIL maxPool2d float32 4D tensor default options / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.windowDimensions / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.padding / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." @@ -130,11 +130,11 @@ FAIL maxPool2d float32 4D tensor options.autoPad=same-upper ignores options.padding / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.autoPad=same-lower ignores options.padding / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.layout=nchw / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL maxPool2d float32 4D tensor options.layout=nhwc / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS maxPool2d float32 4D tensor options.layout=nhwc / gpu / async FAIL maxPool2d float32 4D tensor options.roundingType=floor / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.roundingType=ceil / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.outputSizes ignores options.roundingType=floor / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." FAIL maxPool2d float32 4D tensor options.outputSizes ignores options.roundingType=ceil / gpu / async promise_test: Unhandled rejection with value: object "NotSupportedError: The nchw input layout is not supported." -FAIL maxPool2d float32 4D tensor options.dilations with options.strides / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" +PASS maxPool2d float32 4D tensor options.dilations with options.strides / gpu / async Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/relu.https.any-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/relu.https.any-expected.txt deleted file mode 100644 index 18e06a3..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/relu.https.any-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This is a testharness.js-based test. -FAIL relu float32 1D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 2D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 3D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 4D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 5D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 1D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 2D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 3D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 4D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 5D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/relu.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/relu.https.any.worker-expected.txt deleted file mode 100644 index bd5a797..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/relu.https.any.worker-expected.txt +++ /dev/null
@@ -1,23 +0,0 @@ -This is a testharness.js-based test. -PASS relu float32 1D tensor / cpu / sync -PASS relu float32 2D tensor / cpu / sync -PASS relu float32 3D tensor / cpu / sync -PASS relu float32 4D tensor / cpu / sync -PASS relu float32 5D tensor / cpu / sync -PASS relu float32 1D tensor / gpu / sync -PASS relu float32 2D tensor / gpu / sync -PASS relu float32 3D tensor / gpu / sync -PASS relu float32 4D tensor / gpu / sync -PASS relu float32 5D tensor / gpu / sync -FAIL relu float32 1D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 2D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 3D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 4D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 5D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 1D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 2D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 3D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 4D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL relu float32 5D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/reshape.https.any-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/reshape.https.any-expected.txt deleted file mode 100644 index 8e93e62..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/reshape.https.any-expected.txt +++ /dev/null
@@ -1,15 +0,0 @@ -This is a testharness.js-based test. -FAIL reshape float32 tensor to a new shape (reorder all dimensions) / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (reduce dimensions) / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (extend dimensions) / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (one dimension being the special value of null) / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to 1D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to 1D tensor newShape=[null] / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (reorder all dimensions) / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (reduce dimensions) / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (extend dimensions) / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (one dimension being the special value of null) / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to 1D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to 1D tensor newShape=[null] / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/reshape.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/reshape.https.any.worker-expected.txt deleted file mode 100644 index f369294..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/reshape.https.any.worker-expected.txt +++ /dev/null
@@ -1,27 +0,0 @@ -This is a testharness.js-based test. -PASS reshape float32 tensor to a new shape (reorder all dimensions) / cpu / sync -PASS reshape float32 tensor to a new shape (reduce dimensions) / cpu / sync -PASS reshape float32 tensor to a new shape (extend dimensions) / cpu / sync -PASS reshape float32 tensor to a new shape (one dimension being the special value of null) / cpu / sync -PASS reshape float32 tensor to 1D tensor / cpu / sync -PASS reshape float32 tensor to 1D tensor newShape=[null] / cpu / sync -PASS reshape float32 tensor to a new shape (reorder all dimensions) / gpu / sync -PASS reshape float32 tensor to a new shape (reduce dimensions) / gpu / sync -PASS reshape float32 tensor to a new shape (extend dimensions) / gpu / sync -PASS reshape float32 tensor to a new shape (one dimension being the special value of null) / gpu / sync -PASS reshape float32 tensor to 1D tensor / gpu / sync -PASS reshape float32 tensor to 1D tensor newShape=[null] / gpu / sync -FAIL reshape float32 tensor to a new shape (reorder all dimensions) / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (reduce dimensions) / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (extend dimensions) / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (one dimension being the special value of null) / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to 1D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to 1D tensor newShape=[null] / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (reorder all dimensions) / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (reduce dimensions) / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (extend dimensions) / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to a new shape (one dimension being the special value of null) / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to 1D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL reshape float32 tensor to 1D tensor newShape=[null] / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/softmax.https.any-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/softmax.https.any-expected.txt deleted file mode 100644 index 59bd94871..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/softmax.https.any-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL softmax float32 2D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL softmax float32 2D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webnn/softmax.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webnn/softmax.https.any.worker-expected.txt deleted file mode 100644 index 8eb519c2..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/webnn/softmax.https.any.worker-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -PASS softmax float32 2D tensor / cpu / sync -PASS softmax float32 2D tensor / gpu / sync -FAIL softmax float32 2D tensor / cpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -FAIL softmax float32 2D tensor / gpu / async promise_test: Unhandled rejection with value: object "TypeError: context.compute is not a function" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt b/third_party/blink/web_tests/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt new file mode 100644 index 0000000..c6c298f94 --- /dev/null +++ b/third_party/blink/web_tests/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt
@@ -0,0 +1,24 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt b/third_party/blink/web_tests/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt new file mode 100644 index 0000000..c6c298f94 --- /dev/null +++ b/third_party/blink/web_tests/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt
@@ -0,0 +1,24 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt b/third_party/blink/web_tests/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt new file mode 100644 index 0000000..c6c298f94 --- /dev/null +++ b/third_party/blink/web_tests/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt
@@ -0,0 +1,24 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt b/third_party/blink/web_tests/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt new file mode 100644 index 0000000..c6c298f94 --- /dev/null +++ b/third_party/blink/web_tests/virtual/orb-v01/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt
@@ -0,0 +1,24 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt b/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt new file mode 100644 index 0000000..c6c298f94 --- /dev/null +++ b/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any-expected.txt
@@ -0,0 +1,24 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt b/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt new file mode 100644 index 0000000..c6c298f94 --- /dev/null +++ b/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.serviceworker-expected.txt
@@ -0,0 +1,24 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt b/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt new file mode 100644 index 0000000..c6c298f94 --- /dev/null +++ b/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.sharedworker-expected.txt
@@ -0,0 +1,24 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt b/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt new file mode 100644 index 0000000..c6c298f94 --- /dev/null +++ b/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/fetch/api/headers/header-setcookie.any.worker-expected.txt
@@ -0,0 +1,24 @@ +This is a testharness.js-based test. +PASS Headers.prototype.get combines set-cookie headers in order +FAIL Headers iterator does not combine set-cookie headers assert_equals: Array length is not equal expected 2 but got 1 +PASS Headers iterator does not special case set-cookie2 headers +FAIL Headers iterator does not combine set-cookie & set-cookie2 headers assert_equals: Array length is not equal expected 3 but got 2 +FAIL Headers iterator preserves set-cookie ordering assert_equals: Array length is not equal expected 3 but got 1 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering) assert_equals: Array length is not equal expected 5 but got 4 +FAIL Headers iterator is correctly updated with set-cookie changes assert_array_equals: value is undefined, expected array +PASS Headers.prototype.has works for set-cookie +FAIL Headers.prototype.append works for set-cookie assert_equals: Array length is not equal expected 3 but got 2 +PASS Headers.prototype.set works for set-cookie +PASS Headers.prototype.delete works for set-cookie +FAIL Headers.prototype.getSetCookie with no headers present headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with one header created from an object headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with multiple headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with an empty header headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie with two equal headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie ignores set-cookie2 headers headers.getSetCookie is not a function +FAIL Headers.prototype.getSetCookie preserves header ordering headers.getSetCookie is not a function +FAIL Set-Cookie is a forbidden response header response.headers.getSetCookie is not a function +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/view-transition-wide-gamut/inspector-protocol/css/css-get-styles-for-view-transition-expected.txt b/third_party/blink/web_tests/virtual/view-transition-wide-gamut/inspector-protocol/css/css-get-styles-for-view-transition-expected.txt index e7f1d4a2c..5c63737 100644 --- a/third_party/blink/web_tests/virtual/view-transition-wide-gamut/inspector-protocol/css/css-get-styles-for-view-transition-expected.txt +++ b/third_party/blink/web_tests/virtual/view-transition-wide-gamut/inspector-protocol/css/css-get-styles-for-view-transition-expected.txt
@@ -116,6 +116,11 @@ name : pointer-events value : none } + [6] : { + important : true + name : top-layer + value : browser !important + } ] shorthandEntries : [ [0] : { @@ -1713,6 +1718,11 @@ name : pointer-events value : none } + [6] : { + important : true + name : top-layer + value : browser !important + } ] shorthandEntries : [ [0] : {
diff --git a/third_party/blink/web_tests/virtual/view-transition/inspector-protocol/css/css-get-styles-for-view-transition-expected.txt b/third_party/blink/web_tests/virtual/view-transition/inspector-protocol/css/css-get-styles-for-view-transition-expected.txt index e7f1d4a2c..5c63737 100644 --- a/third_party/blink/web_tests/virtual/view-transition/inspector-protocol/css/css-get-styles-for-view-transition-expected.txt +++ b/third_party/blink/web_tests/virtual/view-transition/inspector-protocol/css/css-get-styles-for-view-transition-expected.txt
@@ -116,6 +116,11 @@ name : pointer-events value : none } + [6] : { + important : true + name : top-layer + value : browser !important + } ] shorthandEntries : [ [0] : { @@ -1713,6 +1718,11 @@ name : pointer-events value : none } + [6] : { + important : true + name : top-layer + value : browser !important + } ] shorthandEntries : [ [0] : {
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt index 9167035..3b9c87a9 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -833,6 +833,7 @@ [Worker] method createContextSync [Worker] interface MLContext [Worker] attribute @@toStringTag +[Worker] method compute [Worker] method computeSync [Worker] method constructor [Worker] interface MLGraph
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 48eeefc2..784dfab 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
@@ -5174,6 +5174,7 @@ method createContext interface MLContext attribute @@toStringTag + method compute method constructor interface MLGraph attribute @@toStringTag
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/fence-urn-iframes.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/fence-urn-iframes.https.html new file mode 100644 index 0000000..cdde073 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/fence-urn-iframes.https.html
@@ -0,0 +1,52 @@ +<!DOCTYPE html> +<title>Test window.fence availability in iframes.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.js"></script> + +<body> +<script> + +promise_test(async(t) => { + const frame = await attachIFrameContext(); + await frame.execute(() => { + assert_equals(window.fence, null); + }); +}, 'window.fence is unavailable in normal (non-urn) iframes'); + +promise_test(async(t) => { + // window.fence works in urn iframes. + var frame = await attachIFrameContext({generator_api: 'fledge'}); + await frame.execute(() => { + assert_not_equals(window.fence, null); + }); + // window.fence works after navigating to a new urn. + frame = await replaceFrameContext(frame, {generator_api: 'fledge'}); + await frame.execute(() => { + assert_not_equals(window.fence, null); + }); + // window.fence still works after embedder-initiated navigations to non-urns, + // because the concept of "embedder-initiated" navigations is nebulous in + // iframes. + frame = await replaceFrameContext(frame); + await frame.execute(() => { + assert_not_equals(window.fence, null); + }); +}, 'window.fence is available in urn iframes'); + +promise_test(async(t) => { + // window.fence works in urn iframes. + const frame = await attachIFrameContext({generator_api: 'fledge'}); + await frame.execute(async () => { + assert_not_equals(window.fence, null); + const nested_frame = await attachIFrameContext(); + await nested_frame.execute(() => { + assert_not_equals(window.fence, null); + }); + }); +}, 'window.fence is available in same-origin subframes of urn iframes'); + +</script> +</body>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/fence-urn-iframes.https.html.ini b/third_party/blink/web_tests/wpt_internal/fenced_frame/fence-urn-iframes.https.html.ini new file mode 100644 index 0000000..4704101 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/fence-urn-iframes.https.html.ini
@@ -0,0 +1,9 @@ +[fence-urn-iframes.https.html] + [window.fence is unavailable in normal (non-urn) iframes] + expected: FAIL + + [window.fence is available in urn iframes] + expected: FAIL + + [window.fence is available in same-origin subframes of urn iframes] + expected: FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/get-nested-configs.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/get-nested-configs.https.html index a21fd85..c78a6685 100644 --- a/third_party/blink/web_tests/wpt_internal/fenced_frame/get-nested-configs.https.html +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/get-nested-configs.https.html
@@ -58,8 +58,8 @@ const response = await nextValueFromServer(key); const [length, first_url] = response.split(","); - assert_equals(length, '0', 'There should be 0 nested configurations.'); -}, 'getNestedConfigs() in a nested iframe should be empty'); + assert_equals(length, '20', 'There should be 20 nested configurations.'); +}, 'getNestedConfigs() should work in a same-origin nested iframe'); promise_test(async (t) => { const key = token();
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/get-nested-configs.https.html.ini b/third_party/blink/web_tests/wpt_internal/fenced_frame/get-nested-configs.https.html.ini index 8b98488..3827f52 100644 --- a/third_party/blink/web_tests/wpt_internal/fenced_frame/get-nested-configs.https.html.ini +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/get-nested-configs.https.html.ini
@@ -19,3 +19,6 @@ [Navigating an invalid config should be handled gracefully] expected: FAIL + + [getNestedConfigs() should work in a same-origin nested iframe] + expected: FAIL
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index 1ae3b49..80b14f1 100644 --- a/third_party/freetype/README.chromium +++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@ Name: FreeType URL: http://www.freetype.org/ -Version: VER-2-13-0-6-gbbfcd79ea -Revision: bbfcd79eacb4985d4b68783565f4b494aa64516b +Version: VER-2-13-0-7-g713580f41 +Revision: 713580f41dcc2054d7fa56265f03eeb9c67e0937 CPEPrefix: cpe:/a:freetype:freetype:2.12.1 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses"
diff --git a/third_party/ipcz/.gclient-default b/third_party/ipcz/.gclient-default new file mode 100644 index 0000000..3d05f8d6 --- /dev/null +++ b/third_party/ipcz/.gclient-default
@@ -0,0 +1,8 @@ +solutions = [ + { + "name" : '.', + "url" : 'https://chromium.googlesource.com/chromium/src/third_party/ipcz', + "deps_file" : 'DEPS', + "managed" : False, + }, +]
diff --git a/third_party/ipcz/.gitignore b/third_party/ipcz/.gitignore new file mode 100644 index 0000000..4d59250 --- /dev/null +++ b/third_party/ipcz/.gitignore
@@ -0,0 +1,16 @@ +.cipd +.gclient +.gclient_entries +.gclient_previous_sync_commits +*.swp +/build +/buildtools +/out* +/testing +/third_party/abseil-cpp +/third_party/catapult +/third_party/llvm-build +/third_party/depot_tools +/third_party/googletest +/third_party/ninja +/tools
diff --git a/third_party/ipcz/.gn b/third_party/ipcz/.gn new file mode 100644 index 0000000..a231c16 --- /dev/null +++ b/third_party/ipcz/.gn
@@ -0,0 +1,14 @@ +import("//build/dotfile_settings.gni") + +# The location of the build configuration file. +buildconfig = "//build/config/BUILDCONFIG.gn" + +# The python interpreter to use by default. On Windows, this will look +# for python3.exe and python3.bat. +script_executable = "python3" + +exec_script_whitelist = build_dotfile_settings.exec_script_whitelist + +default_args = { + clang_use_chrome_plugins = false +}
diff --git a/third_party/ipcz/.vpython3 b/third_party/ipcz/.vpython3 new file mode 100644 index 0000000..ba611ca --- /dev/null +++ b/third_party/ipcz/.vpython3
@@ -0,0 +1,83 @@ +# This is a vpython "spec" file. +# +# It describes patterns for python wheel dependencies of the python scripts in +# the chromium repo, particularly for dependencies that have compiled components +# (since pure-python dependencies can be easily vendored into third_party). +# +# When vpython is invoked, it finds this file and builds a python VirtualEnv, +# containing all of the dependencies described in this file, fetching them from +# CIPD (the "Chrome Infrastructure Package Deployer" service). Unlike `pip`, +# this never requires the end-user machine to have a working python extension +# compilation environment. All of these packages are built using: +# https://chromium.googlesource.com/infra/infra/+/main/infra/tools/dockerbuild/ +# +# All python scripts in the repo share this same spec, to avoid dependency +# fragmentation. +# +# If you have depot_tools installed in your $PATH, you can invoke python scripts +# in this repo by running them as you normally would run them, except +# substituting `vpython` instead of `python` on the command line, e.g.: +# vpython path/to/script.py some --arguments +# +# Read more about `vpython` and how to modify this file here: +# https://chromium.googlesource.com/infra/infra/+/main/doc/users/vpython.md + +python_version: "3.8" + +# The default set of platforms vpython checks does not yet include mac-arm64. +# Setting `verify_pep425_tag` to the list of platforms we explicitly must support +# allows us to ensure that vpython specs stay mac-arm64-friendly +verify_pep425_tag: [ + {python: "cp38", abi: "cp38", platform: "manylinux1_x86_64"}, + {python: "cp38", abi: "cp38", platform: "linux_arm64"}, + + {python: "cp38", abi: "cp38", platform: "macosx_10_10_intel"}, + {python: "cp38", abi: "cp38", platform: "macosx_11_0_arm64"}, + + {python: "cp38", abi: "cp38", platform: "win32"}, + {python: "cp38", abi: "cp38", platform: "win_amd64"} +] + +# TODO(https://crbug.com/898348): Add in necessary wheels as Python3 versions +# become available. +wheel: < + name: "infra/python/wheels/six-py2_py3" + version: "version:1.15.0" +> + +# Common utilities. +# Use the same versions specified by //third_party/catapult/.vpython3 so that +# Chromium tests using Telemetry function properly. +wheel: < + name: "infra/python/wheels/numpy/${vpython_platform}" + version: "version:1.2x.supported.1" +> +wheel: < + name: "infra/python/wheels/pexpect/${vpython_platform}" + version: "version:4.8.0.chromium.1" +> +wheel: < + name: "infra/python/wheels/psutil/${vpython_platform}" + version: "version:5.8.0.chromium.3" +> +wheel: < + name: "infra/python/wheels/requests-py2_py3" + version: "version:2.26.0" +> +wheel: < + name: "infra/python/wheels/pillow/${vpython_platform}" + version: "version:8.3.1" + # There is currently no Linux arm/arm64 version in CIPD. + not_match_tag < + platform: "linux_aarch64" + > +> +wheel: < + name: "infra/python/wheels/opencv_python/${vpython_platform}" + version: "version:4.5.3.56.chromium.4" + # There is currently no Linux arm/arm64 version in CIPD. + not_match_tag < + platform: "linux_aarch64" + > +> +
diff --git a/third_party/ipcz/DEPS b/third_party/ipcz/DEPS index 1f020d1..17747c9 100644 --- a/third_party/ipcz/DEPS +++ b/third_party/ipcz/DEPS
@@ -1,3 +1,5 @@ +use_relative_paths = True + gclient_gn_args_file = 'build/config/gclient_args.gni' gclient_gn_args = [ 'build_with_chromium', @@ -14,19 +16,20 @@ 'chromium_git': 'https://chromium.googlesource.com', - 'abseil_revision': 'cfdfe8d1453ed2762d8e68d06b2e0a9fbf0f57bb', - 'build_revision': '9d31c5f0204d7e806723266ed38b8485214a996b', - 'buildtools_revision': 'f78b4b9f33bd8ef9944d5ce643daff1c31880189', - 'catapult_revision': 'd90eeee99383928afa92d6960ad9d3b5f51f8b76', - 'chromium_testing_revision': '1b963e718e4b6945c8c86b558abcd67e34491ea2', - 'clang_format_revision': 'e435ad79c17b1888b34df88d6a30a094936e3836', - 'clang_revision': '946a41a51f44207941b3729a0733dfc1e236644e', - 'depot_tools_revision': 'd05a2e03953bf7e58696a0401ba41360b627401c', - 'gn_version': 'git_revision:0725d7827575b239594fbc8fd5192873a1d62f44', - 'chromium_googletest_revision': '2617f568c87dc512e52d686d9e2e61479e330991', - 'googletest_revision': 'f45d5865ed0b2b8912244627cdf508a24cc6ccb4', - 'libcxx_revision': '79a2e924d96e2fc1e4b937c42efd08898fa472d7', - 'libcxxabi_revision': 'df43e1b0396fbd3a0e511b804eeec54f3b62e3f0', + 'abseil_revision': 'c1aaebb624a60dacbc75547ff8771d8cae57293f', + 'build_revision': '6be968106c392e4d179622e443ba586b73a958a6', + 'buildtools_revision': '2ff42d2008f09f65de12e70c6ff0ad58ddb090ad', + 'catapult_revision': 'bdf25f32dca0cdcc633b6d19d886c0aeeba23527', + 'chromium_googletest_revision': '39342c077fc0eaa3ba17d5f51a774b843a20df48', + 'chromium_testing_revision': 'e0a8fc7153fbd4f2d19f58cb60c981c5dcb528d0', + 'clang_format_revision': 'f97059df7f8b205064625cdb5f97b56668a125ef', + 'clang_revision': 'effd9257d456f2d42e9e22fa4f37a24d8cf0b5b5', + 'depot_tools_revision': '62c7a8bad074fdb4339e544b0053206a4f820e15', + 'gn_version': 'git_revision:edf6ef4b06b42c58292faea78498aff76bdf68ed', + 'googletest_revision': 'af29db7ec28d6df1c7f0f745186884091e602e07', + 'libcxx_revision': '6f4617b9efc36525e030ec9855114f3c93550ec1', + 'libcxxabi_revision': 'f7460fc60ab56553f0b3b0853f1ea60aa51b9478', + 'ninja_version': 'version:2@1.11.1.chromium.6', } deps = { @@ -83,6 +86,16 @@ 'third_party/googletest/src': '{chromium_git}/external/github.com/google/googletest@{googletest_revision}', + 'third_party/ninja': { + 'packages': [ + { + 'package': 'infra/3pp/tools/ninja/${{platform}}', + 'version': Var('ninja_version'), + } + ], + 'dep_type': 'cipd', + }, + 'tools/clang': { 'url': '{chromium_git}/chromium/src/tools/clang.git@{clang_revision}', 'condition': 'not build_with_chromium', @@ -132,7 +145,7 @@ '--arch=x64'], }, -{ + { # Case-insensitivity for the Win SDK. Must run before win_toolchain below. 'name': 'ciopfs_linux', 'pattern': '.',
diff --git a/third_party/ipcz/src/BUILD.gn b/third_party/ipcz/src/BUILD.gn index f77c735e..6ca7706e 100644 --- a/third_party/ipcz/src/BUILD.gn +++ b/third_party/ipcz/src/BUILD.gn
@@ -323,7 +323,10 @@ } config("ipcz_include_src_dir") { - include_dirs = [ "${ipcz_src_root}" ] + include_dirs = [ + "${ipcz_src_root}", + get_path_info("${ipcz_src_root}/", "gen_dir"), + ] } ipcz_source_set("ipcz_test_support") {
diff --git a/third_party/ipcz/src/ipcz/router.cc b/third_party/ipcz/src/ipcz/router.cc index cdeb509..ae68187 100644 --- a/third_party/ipcz/src/ipcz/router.cc +++ b/third_party/ipcz/src/ipcz/router.cc
@@ -306,10 +306,13 @@ if (!inward_edge_ && !bridge_) { is_peer_closed_ = true; if (inbound_parcels_.IsSequenceFullyConsumed()) { - status_.flags |= IPCZ_PORTAL_STATUS_DEAD; + status_.flags |= + IPCZ_PORTAL_STATUS_PEER_CLOSED | IPCZ_PORTAL_STATUS_DEAD; } status_.num_remote_bytes = 0; status_.num_remote_parcels = 0; + traps_.UpdatePortalStatus( + context, status_, TrapSet::UpdateReason::kPeerClosed, dispatcher); } } else if (link_type.is_peripheral_inward()) { if (!outbound_parcels_.SetFinalSequenceLength(sequence_length)) { @@ -360,10 +363,13 @@ // Terminal routers may have trap events to fire. is_peer_closed_ = true; if (inbound_parcels_.IsSequenceFullyConsumed()) { - status_.flags |= IPCZ_PORTAL_STATUS_DEAD; + status_.flags |= + IPCZ_PORTAL_STATUS_PEER_CLOSED | IPCZ_PORTAL_STATUS_DEAD; } status_.num_remote_parcels = 0; status_.num_remote_bytes = 0; + traps_.UpdatePortalStatus(context, status_, + TrapSet::UpdateReason::kPeerClosed, dispatcher); } } @@ -447,7 +453,7 @@ status_.num_local_parcels = inbound_parcels_.GetNumAvailableElements(); status_.num_local_bytes = inbound_parcels_.GetTotalAvailableElementSize(); if (inbound_parcels_.IsSequenceFullyConsumed()) { - status_.flags |= IPCZ_PORTAL_STATUS_DEAD; + status_.flags |= IPCZ_PORTAL_STATUS_PEER_CLOSED | IPCZ_PORTAL_STATUS_DEAD; } traps_.UpdatePortalStatus(context, status_, TrapSet::UpdateReason::kLocalParcelConsumed, @@ -518,7 +524,7 @@ status_.num_local_parcels = inbound_parcels_.GetNumAvailableElements(); status_.num_local_bytes = inbound_parcels_.GetTotalAvailableElementSize(); if (inbound_parcels_.IsSequenceFullyConsumed()) { - status_.flags |= IPCZ_PORTAL_STATUS_DEAD; + status_.flags |= IPCZ_PORTAL_STATUS_PEER_CLOSED | IPCZ_PORTAL_STATUS_DEAD; } traps_.UpdatePortalStatus(context, status_, TrapSet::UpdateReason::kLocalParcelConsumed, @@ -600,7 +606,8 @@ return nullptr; } if (router->inbound_parcels_.IsSequenceFullyConsumed()) { - router->status_.flags |= IPCZ_PORTAL_STATUS_DEAD; + router->status_.flags |= + IPCZ_PORTAL_STATUS_PEER_CLOSED | IPCZ_PORTAL_STATUS_DEAD; } }
diff --git a/third_party/ipcz/src/test/multinode_test.cc b/third_party/ipcz/src/test/multinode_test.cc index fdbde41..3c157b48 100644 --- a/third_party/ipcz/src/test/multinode_test.cc +++ b/third_party/ipcz/src/test/multinode_test.cc
@@ -12,6 +12,7 @@ #include "ipcz/ipcz.h" #include "reference_drivers/async_reference_driver.h" #include "reference_drivers/sync_reference_driver.h" +#include "test_buildflags.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/multiprocess_func_list.h" #include "third_party/abseil-cpp/absl/base/macros.h" @@ -19,7 +20,6 @@ #include "third_party/abseil-cpp/absl/strings/str_split.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/abseil-cpp/absl/types/variant.h" -#include "third_party/ipcz/src/test_buildflags.h" #if BUILDFLAG(ENABLE_IPCZ_MULTIPROCESS_TESTS) #include "reference_drivers/file_descriptor.h"
diff --git a/third_party/ipcz/src/test/multinode_test.h b/third_party/ipcz/src/test/multinode_test.h index 34f700e..eb0fae3 100644 --- a/third_party/ipcz/src/test/multinode_test.h +++ b/third_party/ipcz/src/test/multinode_test.h
@@ -14,11 +14,11 @@ #include "ipcz/ipcz.h" #include "test/test_base.h" +#include "test_buildflags.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/base/macros.h" #include "third_party/abseil-cpp/absl/types/span.h" #include "third_party/abseil-cpp/absl/types/variant.h" -#include "third_party/ipcz/src/test_buildflags.h" #include "util/ref_counted.h" namespace ipcz::test {
diff --git a/third_party/ipcz/src/test/run_all_tests.cc b/third_party/ipcz/src/test/run_all_tests.cc index a776e75..2239a0a2 100644 --- a/third_party/ipcz/src/test/run_all_tests.cc +++ b/third_party/ipcz/src/test/run_all_tests.cc
@@ -4,13 +4,13 @@ #include "standalone/base/logging.h" #include "standalone/base/stack_trace.h" +#include "test/multinode_test.h" +#include "test_buildflags.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/multiprocess_func_list.h" -#include "third_party/ipcz/src/test/multinode_test.h" -#include "third_party/ipcz/src/test_buildflags.h" #if BUILDFLAG(ENABLE_IPCZ_MULTIPROCESS_TESTS) -#include "third_party/ipcz/src/test/test_child_launcher.h" +#include "test/test_child_launcher.h" #endif int main(int argc, char** argv) {
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium index 1b44bba62..e90c961 100644 --- a/third_party/nearby/README.chromium +++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@ Name: Nearby Connections Library Short Name: Nearby URL: https://github.com/google/nearby -Version: f655636db7282a694ed7764bd07fb985e960c2aa +Version: a977a6bd7c85b417919111bf98c139be782ce6cc License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/tools/clang/scripts/package.py b/tools/clang/scripts/package.py index 8e768ca..eda9ddc1 100755 --- a/tools/clang/scripts/package.py +++ b/tools/clang/scripts/package.py
@@ -19,8 +19,6 @@ import tarfile import time -from update import PACKAGE_VERSION, RELEASE_VERSION, STAMP_FILE - # Path constants. THIS_DIR = os.path.dirname(__file__) CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..')) @@ -181,6 +179,8 @@ help='Upload the target archive to Google Cloud Storage.') parser.add_argument('--build-mac-arm', action='store_true', help='Build arm binaries. Only valid on macOS.') + parser.add_argument('--revision', + help='LLVM revision to use. Default: based on update.py') args = parser.parse_args() if args.build_mac_arm and sys.platform != 'darwin': @@ -190,6 +190,19 @@ print('--build-mac-arm only valid on intel to cross-build arm') return 1 + if args.revision: + # Use upload_revision.py to set the revision first. + cmd = [ + sys.executable, + os.path.join(THIS_DIR, 'upload_revision.py'), + '--no-git', # Just run locally, don't upload anything. + '--clang-git-hash=' + args.revision + ] + subprocess.call(cmd) + + # This needs to happen after upload_revision.py modifies update.py. + from update import PACKAGE_VERSION, RELEASE_VERSION, STAMP_FILE + expected_stamp = PACKAGE_VERSION pdir = 'clang-' + expected_stamp print(pdir)
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 1c1ab13d..81a21ab 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -5841,6 +5841,16 @@ </description> </action> +<action name="ChromeOS.Settings.InputMethod.Autocorrect.Open"> + <owner>zacpartridge@chromium.org</owner> + <owner>essential-inputs-team@google.com</owner> + <description> + Recorded when a user clicks the link to open the Auto-correction section in + Chrome OS Inputs methods setting page. This can happen when a user clicks on + the Learn More button from the Autocorrection undo window. + </description> +</action> + <action name="ChromeOS.Settings.Languages"> <owner>myy@chromium.org</owner> <owner>essential-inputs-team@google.com</owner> @@ -5958,8 +5968,9 @@ </action> <action name="ClearBrowsingData_Everything" not_user_triggered="true"> - <owner>Please list the metric's owners. Add more owner tags as needed.</owner> - <description>Please enter the description of this user action.</description> + <owner>dullweber@chromium.org</owner> + <owner>msramek@chromium.org</owner> + <description>Browsing data has been cleared for all time.</description> </action> <action name="ClearBrowsingData_History" not_user_triggered="true"> @@ -5967,24 +5978,36 @@ <description>Please enter the description of this user action.</description> </action> +<action name="ClearBrowsingData_Last15Minutes" not_user_triggered="true"> + <owner>dullweber@chromium.org</owner> + <owner>msramek@chromium.org</owner> + <description> + Browsing data has been cleared for the last 15 minutes. + </description> +</action> + <action name="ClearBrowsingData_LastDay" not_user_triggered="true"> - <owner>Please list the metric's owners. Add more owner tags as needed.</owner> - <description>Please enter the description of this user action.</description> + <owner>dullweber@chromium.org</owner> + <owner>msramek@chromium.org</owner> + <description>Browsing data has been cleared for the last day.</description> </action> <action name="ClearBrowsingData_LastHour" not_user_triggered="true"> - <owner>Please list the metric's owners. Add more owner tags as needed.</owner> - <description>Please enter the description of this user action.</description> + <owner>dullweber@chromium.org</owner> + <owner>msramek@chromium.org</owner> + <description>Browsing data has been cleared for the last hour.</description> </action> <action name="ClearBrowsingData_LastMonth" not_user_triggered="true"> - <owner>Please list the metric's owners. Add more owner tags as needed.</owner> - <description>Please enter the description of this user action.</description> + <owner>dullweber@chromium.org</owner> + <owner>msramek@chromium.org</owner> + <description>Browsing data has been cleared for the last month.</description> </action> <action name="ClearBrowsingData_LastWeek" not_user_triggered="true"> - <owner>Please list the metric's owners. Add more owner tags as needed.</owner> - <description>Please enter the description of this user action.</description> + <owner>dullweber@chromium.org</owner> + <owner>msramek@chromium.org</owner> + <description>Browsing data has been cleared for the last week.</description> </action> <action name="ClearBrowsingData_LSOData"> @@ -6101,6 +6124,12 @@ <description>Time period in CBD was changed.</description> </action> +<action name="ClearBrowsingData_TimePeriodChanged_Last15Minutes"> + <owner>dullweber@chromium.org</owner> + <owner>msramek@chromium.org</owner> + <description>Time period in CBD was changed.</description> +</action> + <action name="ClearBrowsingData_TimePeriodChanged_LastDay"> <owner>dullweber@chromium.org</owner> <owner>msramek@chromium.org</owner>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index ccbb290..1b0e34b7 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -2641,7 +2641,7 @@ <int value="1" label="Default"> The SamplingHeapProfiler uses the default unwind tables. </int> - <int value="2" label="CFIBackTrace"> + <int value="2" label="CFIBackTrace (obsolete)"> The SamplingHeapProfiler uses the trace_event::CFIBacktraceAndroid class. </int> <int value="3" label="Unavailable"> @@ -13643,6 +13643,27 @@ <int value="5" label="App provided items"/> </enum> +<enum name="BrowserDataBackMigratorFinalStatus"> + <int value="0" label="Succeeded"/> + <int value="1" label="PreMigrationCleanUpDeleteTmpDirFailed"/> + <int value="2" label="MergeSplitItemsCreateTmpDirFailed"/> + <int value="3" label="MergeSplitItemsCopyExtensionsFailed"/> + <int value="4" label="MergeSplitItemsCopyExtensionStorageFailed"/> + <int value="5" label="MergeSplitItemsCreateDirFailed"/> + <int value="6" label="MergeSplitItemsMergeIndexedDBFailed"/> + <int value="7" label="MergeSplitItemsMergePrefsFailed"/> + <int value="8" label="MergeSplitItemsMergeLocalStorageLevelDBFailed"/> + <int value="9" label="MergeSplitItemsMergeStateStoreLevelDBFailed"/> + <int value="10" label="MergeSplitItemsMergeSyncDataFailed"/> + <int value="11" label="DeleteAshItemsDeleteExtensionsFailed"/> + <int value="12" label="DeleteAshItemsDeleteLacrosItemFailed"/> + <int value="13" label="DeleteTmpDirDeleteFailed"/> + <int value="14" label="DeleteLacrosDirDeleteFailed"/> + <int value="15" label="MoveLacrosItemsToAshDirFailed"/> + <int value="16" label="MoveMergedItemsBackToAshMoveFileFailed"/> + <int value="17" label="MoveMergedItemsBackToAshCopyDirectoryFailed"/> +</enum> + <enum name="BrowserDataMigratorFinalStatus"> <int value="0" label="Skipped"/> <int value="1" label="Success"/> @@ -42202,7 +42223,7 @@ <int value="4412" label="ServiceWorkerSkippedForEmptyFetchHandler"/> <int value="4413" label="ImageSet"/> <int value="4414" label="WindowCloseHistoryLengthOne"/> - <int value="4415" label="CreateNSResolverWithNonElements"/> + <int value="4415" label="OBSOLETE_CreateNSResolverWithNonElements"/> <int value="4416" label="CSSValueAppearanceNonStandard"/> <int value="4417" label="CSSGetComputedAnimationDelayZero"/> <int value="4418" label="GetEffectTimingDelayZero"/> @@ -42268,6 +42289,7 @@ <int value="4472" label="CSSColorColorSpecifiedSpace"/> <int value="4473" label="CSSColorLabOklab"/> <int value="4474" label="CSSColorLchOklch"/> + <int value="4475" label="CreateNSResolverWithNonElements2"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -59620,6 +59642,7 @@ <int value="-1206524306" label="EnableAuraTooltipsOnWindows:disabled"/> <int value="-1206337150" label="OmniboxUIExperimentHideSuggestionUrlScheme:disabled"/> + <int value="-1205293795" label="NotificationImageDrag:disabled"/> <int value="-1205076560" label="EnableSearchBoxSelection:disabled"/> <int value="-1203955801" label="enable-password-change-support:disabled"/> <int value="-1203742042" label="enable-gesture-selection"/> @@ -61317,6 +61340,7 @@ <int value="-242441279" label="SafetyCheckUnusedSitePermissions:enabled"/> <int value="-242431978" label="StartSurfaceRefactor:enabled"/> <int value="-241353344" label="MidiManagerWinrt:disabled"/> + <int value="-241061180" label="NotificationImageDrag:enabled"/> <int value="-240531943" label="ContextualSearchRankerQuery:disabled"/> <int value="-239616243" label="HighDynamicRange:enabled"/> <int value="-239176328" label="BluetoothAggressiveAppearanceFilter:enabled"/> @@ -94658,7 +94682,7 @@ <int value="8" label="Abort: account info not compatible"/> <int value="9" label="Abort: profile creation disallowed"/> <int value="10" label="Abort: shut down"/> - <int value="11" label="Abort: no browser window"/> + <int value="11" label="Abort: no supported browser window"/> <int value="12" label="Abort: password update"/> <int value="13" label="Abort: password update pending"/> <int value="14" label="Abort: user declined new profile for this account"/> @@ -102977,6 +103001,17 @@ <int value="2" label="Degraded"/> </enum> +<enum name="TrustedVaultDeviceRegistrationOutcome"> + <int value="0" label="Success"/> + <int value="1" label="Already registered"/> + <int value="2" label="Local data obsolete"/> + <int value="3" label="Transient access token fetching error"/> + <int value="4" label="Persistent access token fetching error"/> + <int value="5" label="Primary account changed access token fetching error"/> + <int value="6" label="Network error"/> + <int value="7" label="Other error"/> +</enum> + <enum name="TrustedVaultDeviceRegistrationState"> <int value="0" label="Already registered V0"/> <int value="1" label="Local keys are stale"/>
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml index 0bb7716..cd9ec22 100644 --- a/tools/metrics/histograms/metadata/accessibility/histograms.xml +++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -1815,7 +1815,7 @@ </histogram> <histogram name="Accessibility.WebSpeech.Duration" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>evliu@google.com</owner> <owner>chrome-media-ux@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml index 4761adbe..4cd3742b 100644 --- a/tools/metrics/histograms/metadata/android/histograms.xml +++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -170,7 +170,7 @@ </histogram> <histogram name="Android.ActivityStop.PercentageOfTabsUsed" units="%" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>gauravjj@google.com</owner> <owner>skavuluru@google.com</owner> <owner>clank-large-form-factors@google.com</owner> @@ -589,7 +589,7 @@ </histogram> <histogram name="Android.BindingManger.ConnectionsDroppedDueToMaxSize" - units="connections" expires_after="2023-06-18"> + units="connections" expires_after="2023-08-20"> <owner>ckitagawa@chromium.org</owner> <owner>yfriedman@chromium.org</owner> <summary> @@ -625,7 +625,7 @@ </histogram> <histogram name="Android.ChildMismatch.AppInfoError2" enum="ChildAppInfoError" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>torne@chromium.org</owner> <owner>boliu@chromium.org</owner> <summary> @@ -652,7 +652,7 @@ </histogram> <histogram name="Android.ChildMismatch.BrowserVersionChanged2" - enum="BooleanChanged" expires_after="2023-06-18"> + enum="BooleanChanged" expires_after="2023-08-20"> <owner>torne@chromium.org</owner> <owner>boliu@chromium.org</owner> <summary> @@ -690,7 +690,7 @@ </histogram> <histogram name="Android.ChildProcessBinding.TotalConnections" - units="connections" expires_after="2023-06-18"> + units="connections" expires_after="2023-08-20"> <owner>ckitagawa@chromium.org</owner> <owner>yfriedman@chromium.org</owner> <summary> @@ -1847,7 +1847,7 @@ </histogram> <histogram name="Android.Jank.AsyncTaskGetOnUiThreadStatus" - enum="AsyncTaskStatus" expires_after="2023-06-18"> + enum="AsyncTaskStatus" expires_after="2023-08-20"> <owner>smaier@chromium.org</owner> <owner>agrieve@chromium.org</owner> <summary> @@ -2134,7 +2134,7 @@ </histogram> <histogram name="Android.Messages.Stacking" enum="StackingAnimationType" - expires_after="2023-08-08"> + expires_after="2023-08-20"> <owner>lazzzis@chromium.org</owner> <owner>src/components/messages/OWNERS</owner> <summary> @@ -2145,7 +2145,7 @@ </histogram> <histogram name="Android.Messages.Stacking.ThreeStacked" - enum="StackingAnimationThreeStackedType" expires_after="M115"> + enum="StackingAnimationThreeStackedType" expires_after="2023-08-20"> <owner>lazzzis@chromium.org</owner> <owner>src/components/messages/OWNERS</owner> <summary> @@ -2356,7 +2356,7 @@ </histogram> <histogram name="Android.NativeBackgroundTask.TaskStarted.FullBrowser" - enum="BackgroundTaskId" expires_after="2023-06-15"> + enum="BackgroundTaskId" expires_after="2023-08-20"> <owner>mheikal@chromium.org</owner> <owner>hanxi@chromium.org</owner> <owner>hnakashima@chromium.org</owner> @@ -2367,7 +2367,7 @@ </histogram> <histogram name="Android.NativeBackgroundTask.TaskStarted.ReducedMode" - enum="BackgroundTaskId" expires_after="2023-06-15"> + enum="BackgroundTaskId" expires_after="2023-08-20"> <owner>mheikal@chromium.org</owner> <owner>hanxi@chromium.org</owner> <owner>hnakashima@chromium.org</owner> @@ -2417,7 +2417,7 @@ </histogram> <histogram name="Android.Omnibox.InputToNavigationControllerStart" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>spelchat@chromium.org</owner> <owner>chrome-brapp-loading@google.com</owner> <summary> @@ -3666,7 +3666,7 @@ </histogram> <histogram name="Android.TabStrip.TimeToSwitchTab" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>gauravjj@google.com</owner> <owner>twellington@chromium.org</owner> <owner>clank-large-form-factors@google.com</owner> @@ -4489,7 +4489,7 @@ </histogram> <histogram name="Android.WebView.NonEmbeddedMetrics.HistogramRecordAge" - units="minutes" expires_after="2023-06-18"> + units="minutes" expires_after="2023-08-20"> <owner>hazems@chromium.org</owner> <owner>ntfschr@chromium.org</owner> <owner>src/android_webview/OWNERS</owner> @@ -4503,7 +4503,7 @@ </histogram> <histogram name="Android.WebView.NonEmbeddedMetrics.NumHistograms" - units="histograms" expires_after="2023-06-18"> + units="histograms" expires_after="2023-08-20"> <owner>ntfschr@chromium.org</owner> <owner>hazems@chromium.org</owner> <owner>src/android_webview/OWNERS</owner> @@ -4516,7 +4516,7 @@ <histogram name="Android.WebView.NonEmbeddedMetrics.ParsingLogResult" enum="AndroidWebViewNonEmbeddedMetricsParsingLogResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>hazems@chromium.org</owner> <owner>ntfschr@chromium.org</owner> <owner>src/android_webview/OWNERS</owner> @@ -4855,7 +4855,7 @@ </histogram> <histogram name="Android.WebView.SafeMode.SafeModeEnabled" - enum="BooleanEnabled" expires_after="2023-06-18"> + enum="BooleanEnabled" expires_after="2023-08-20"> <owner>ntfschr@chromium.org</owner> <owner>src/android_webview/OWNERS</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/apps/histograms.xml b/tools/metrics/histograms/metadata/apps/histograms.xml index 9beb6c5..90f7a5d 100644 --- a/tools/metrics/histograms/metadata/apps/histograms.xml +++ b/tools/metrics/histograms/metadata/apps/histograms.xml
@@ -269,7 +269,7 @@ </histogram> <histogram name="Apps.AppLaunchPerAppType" enum="AppType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nancylingwang@chromium.org</owner> <owner>chromeos-apps-foundation-team@google.com</owner> <summary> @@ -279,7 +279,7 @@ </histogram> <histogram name="Apps.AppLaunchPerAppTypeV2" enum="AppTypeV2" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nancylingwang@chromium.org</owner> <owner>chromeos-apps-foundation-team@google.com</owner> <summary> @@ -289,7 +289,7 @@ </histogram> <histogram name="Apps.AppLaunchSource" enum="LaunchSource" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nancylingwang@chromium.org</owner> <owner>chromeos-apps-foundation-team@google.com</owner> <summary>Records an app launch grouped by launch source.</summary> @@ -410,7 +410,7 @@ </histogram> <histogram name="Apps.AppList.ContinueIsDriveEnabled" enum="BooleanEnabled" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>tby@chromium.org</owner> <owner>gzadina@chromium.org</owner> <summary> @@ -923,7 +923,7 @@ </histogram> <histogram name="Apps.AppList.Search.DriveContinueResultsShown" - enum="BooleanShown" expires_after="2023-06-18"> + enum="BooleanShown" expires_after="2023-08-20"> <owner>amandadeacon@chromium.org</owner> <owner>tby@chromium.org</owner> <owner>thanhdng@chromium.org</owner> @@ -1466,7 +1466,7 @@ </histogram> <histogram name="Apps.AppListAppMovingType" enum="AppListAppMovingType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>tbarzic@chromium.org</owner> <owner>mmourgos@chromium.org</owner> <owner>newcomer@chromium.org</owner> @@ -1753,7 +1753,7 @@ </histogram> <histogram name="Apps.AppListSearchAutocomplete" enum="SearchBoxTextMatch" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yulunwu@chromium.org</owner> <owner>tbarzic@chromium.org</owner> <summary> @@ -1975,7 +1975,7 @@ </histogram> <histogram name="Apps.ArcGhostWindowLaunch" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nancylingwang@chromium.org</owner> <owner>sstan@chromium.org</owner> <summary> @@ -2235,7 +2235,7 @@ </histogram> <histogram name="Apps.IconLoadingMethod" enum="IconLoadingMethod" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nancylingwang@chromium.org</owner> <owner>chromeos-apps-foundation-team@google.com</owner> <summary>Records the app icon loading method when loading app icons.</summary> @@ -2754,7 +2754,7 @@ </histogram> <histogram name="Apps.RestoreArcWindowCount" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nancylingwang@chromium.org</owner> <owner>sstan@chromium.org</owner> <summary> @@ -2775,7 +2775,7 @@ </histogram> <histogram name="Apps.RestoredAppLaunch" enum="AppType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nancylingwang@chromium.org</owner> <owner>sammiequon@chromium.org</owner> <summary> @@ -2785,7 +2785,7 @@ </histogram> <histogram name="Apps.RestoreForCrashNotification" enum="RestoreAction" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nancylingwang@chromium.org</owner> <owner>sammiequon@chromium.org</owner> <summary> @@ -2795,7 +2795,7 @@ </histogram> <histogram name="Apps.RestoreInitSetting" enum="RestoreSetting" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nancylingwang@chromium.org</owner> <owner>sammiequon@chromium.org</owner> <summary> @@ -2814,7 +2814,7 @@ </histogram> <histogram name="Apps.RestoreNotification" enum="RestoreAction" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nancylingwang@chromium.org</owner> <owner>sammiequon@chromium.org</owner> <summary> @@ -2824,7 +2824,7 @@ </histogram> <histogram name="Apps.RestoreSetting" enum="RestoreSetting" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nancylingwang@chromium.org</owner> <owner>sammiequon@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/arc/histograms.xml b/tools/metrics/histograms/metadata/arc/histograms.xml index 31cf192..b8679e8 100644 --- a/tools/metrics/histograms/metadata/arc/histograms.xml +++ b/tools/metrics/histograms/metadata/arc/histograms.xml
@@ -434,7 +434,7 @@ </histogram> <histogram name="Arc.AppCount.HasInstalledOrUnknownApp" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>khmel@google.com</owner> <owner>arcvm-eng@google.com</owner> <summary> @@ -675,7 +675,7 @@ </histogram> <histogram name="Arc.Auth.MainAccountHashMigration.Status" - enum="ArcMainAccountHashMigrationStatus" expires_after="2023-06-18"> + enum="ArcMainAccountHashMigrationStatus" expires_after="2023-08-20"> <owner>vsomani@google.com</owner> <owner>arc-core@google.com</owner> <summary> @@ -936,7 +936,7 @@ </histogram> <histogram name="Arc.CompatMode.InitialResizeLockState" - enum="ArcResizeLockState" expires_after="2023-06-18"> + enum="ArcResizeLockState" expires_after="2023-08-20"> <owner>toshikikikuchi@google.com</owner> <owner>takise@google.com</owner> <summary> @@ -946,7 +946,7 @@ </histogram> <histogram name="Arc.CompatMode.RightClickConversion" - enum="ArcRightClickConversionResult" expires_after="2023-06-18"> + enum="ArcRightClickConversionResult" expires_after="2023-08-20"> <owner>yhanada@google.com</owner> <owner>arc-framework@google.com</owner> <summary> @@ -1623,7 +1623,7 @@ </histogram> <histogram name="Arc.Notifications.ActionEnabled" enum="BooleanEnabled" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yaoqq@google.com</owner> <owner>arc-framework@google.com</owner> <summary> @@ -1633,7 +1633,7 @@ </histogram> <histogram name="Arc.Notifications.ExpandState" - enum="ArcNotificationExpandState" expires_after="2023-06-18"> + enum="ArcNotificationExpandState" expires_after="2023-08-20"> <owner>yaoqq@google.com</owner> <owner>arc-framework@google.com</owner> <summary> @@ -1647,7 +1647,7 @@ </histogram> <histogram name="Arc.Notifications.InlineReplyEnabled" enum="BooleanEnabled" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yaoqq@google.com</owner> <owner>arc-framework@google.com</owner> <summary> @@ -1657,7 +1657,7 @@ </histogram> <histogram name="Arc.Notifications.IsCustomNotification" - enum="BooleanIsCustomNotification" expires_after="2023-06-18"> + enum="BooleanIsCustomNotification" expires_after="2023-08-20"> <owner>shuminghao@google.com</owner> <owner>arc-framework@google.com</owner> <summary> @@ -1666,14 +1666,14 @@ </histogram> <histogram name="Arc.Notifications.Style" enum="ArcNotificationStyle" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yaoqq@google.com</owner> <owner>arc-framework@google.com</owner> <summary>Records the style of an Arc notification when it's created.</summary> </histogram> <histogram name="Arc.OptInAction" enum="ArcOptInAction" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>mhasank@google.com</owner> <owner>arc-core@google.com</owner> <summary> @@ -1790,7 +1790,7 @@ </histogram> <histogram name="Arc.PlayStoreLaunchWithinAWeek" enum="BooleanUsage" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>rsorokin@chromium.org</owner> <owner>cros-oac@google.com</owner> <summary> @@ -2121,7 +2121,7 @@ </histogram> <histogram name="Arc.Session.HasWebViewUsage" enum="Boolean" - expires_after="2023-04-15"> + expires_after="2023-08-20"> <owner>hungmn@google.com</owner> <owner>khmel@google.com</owner> <owner>arc-performance@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml index b6552cd..18936ca 100644 --- a/tools/metrics/histograms/metadata/ash/histograms.xml +++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -396,7 +396,7 @@ </histogram> <histogram name="Ash.BackGesture.EndScenarioType" - enum="BackGestureEndScenarioType" expires_after="2023-06-18"> + enum="BackGestureEndScenarioType" expires_after="2023-08-20"> <owner>minch@chromium.org</owner> <owner>tclaiborne@chromium.org</owner> <summary> @@ -406,7 +406,7 @@ </histogram> <histogram name="Ash.BackGesture.StartScenarioType" - enum="BackGestureStartScenarioType" expires_after="2023-06-18"> + enum="BackGestureStartScenarioType" expires_after="2023-08-20"> <owner>minch@chromium.org</owner> <owner>tclaiborne@chromium.org</owner> <summary> @@ -416,7 +416,7 @@ </histogram> <histogram name="Ash.BackGesture.UnderneathWindowType" - enum="BackGestureUnderneathWindowType" expires_after="2023-06-18"> + enum="BackGestureUnderneathWindowType" expires_after="2023-08-20"> <owner>minch@chromium.org</owner> <owner>tclaiborne@chromium.org</owner> <summary> @@ -447,6 +447,47 @@ </summary> </histogram> +<histogram name="Ash.BrowserDataBackMigrator.FinalStatus" + enum="BrowserDataBackMigratorFinalStatus" expires_after="2023-12-01"> + <owner>janagrill@google.com</owner> + <owner>artyomchen@google.com</owner> + <summary> + The final status of browser data backward migration. Recorded once at the + end of the migration process. It is collected to monitor whether backward + migration is working, and if it is not to determine which step is failing. + </summary> +</histogram> + +<histogram name="Ash.BrowserDataBackMigrator.PosixErrno.{TaskStatus}" + enum="PopularOSErrno" expires_after="2023-12-01"> + <owner>janagrill@google.com</owner> + <owner>artyomchen@google.com</owner> + <summary> + Recorded when browser data backward migration fails. Records the errno set + by the operation that caused the migration to fail. `TaskStatus` is used to + determine the step in which the error occurred. + </summary> + <token key="TaskStatus"> + <variant name="DeleteAshItemsDeleteExtensionsFailed"/> + <variant name="DeleteAshItemsDeleteLacrosItemFailed"/> + <variant name="DeleteLacrosDirDeleteFailed"/> + <variant name="DeleteTmpDirDeleteFailed"/> + <variant name="MergeSplitItemsCopyExtensionsFailed"/> + <variant name="MergeSplitItemsCopyExtensionStorageFailed"/> + <variant name="MergeSplitItemsCreateDirFailed"/> + <variant name="MergeSplitItemsCreateTmpDirFailed"/> + <variant name="MergeSplitItemsMergeIndexedDBFailed"/> + <variant name="MergeSplitItemsMergeLocalStorageLevelDBFailed"/> + <variant name="MergeSplitItemsMergePrefsFailed"/> + <variant name="MergeSplitItemsMergeStateStoreLevelDBFailed"/> + <variant name="MergeSplitItemsMergeSyncDataFailed"/> + <variant name="MoveLacrosItemsToAshDirFailed"/> + <variant name="MoveMergedItemsBackToAshCopyDirectoryFailed"/> + <variant name="MoveMergedItemsBackToAshMoveFileFailed"/> + <variant name="PreMigrationCleanUpDeleteTmpDirFailed"/> + </token> +</histogram> + <histogram name="Ash.BrowserDataMigrator.AshDataSizeMB" units="MB" expires_after="M121"> <owner>ythjkt@chromium.org</owner> @@ -1432,7 +1473,7 @@ </histogram> <histogram name="Ash.CaptureModeController.ScreenshotsPerWeek" units="int" - expires_after="2023-06-11"> + expires_after="2023-08-20"> <owner>afakhry@chromium.org</owner> <owner>gzadina@google.com</owner> <summary> @@ -1722,7 +1763,7 @@ </histogram> <histogram name="Ash.Desks.DesksCount3" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>afakhry@chromium.org</owner> <owner>tclaiborne@chromium.org</owner> <summary> @@ -1744,7 +1785,7 @@ </histogram> <histogram name="Ash.Desks.MoveWindowFromActiveDesk" - enum="DesksMoveWindowFromActiveDeskSource" expires_after="2023-06-18"> + enum="DesksMoveWindowFromActiveDeskSource" expires_after="2023-08-20"> <owner>afakhry@chromium.org</owner> <owner>tclaiborne@chromium.org</owner> <summary> @@ -1761,7 +1802,7 @@ </histogram> <histogram name="Ash.Desks.NewDesk2" enum="DesksCreationRemovalSource" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>afakhry@chromium.org</owner> <owner>tclaiborne@chromium.org</owner> <summary> @@ -2069,7 +2110,7 @@ </histogram> <histogram name="Ash.Desks.WeeklyActiveDesks" units="active desks" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>afakhry@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2978,7 +3019,7 @@ </histogram> <histogram name="Ash.Lacros.Launch.ModeAndSource" - enum="LacrosLaunchModeAndSource" expires_after="2023-06-18"> + enum="LacrosLaunchModeAndSource" expires_after="2023-08-20"> <owner>skuhne@chromium.org</owner> <owner>lacros-team@google.com</owner> <summary> @@ -3005,7 +3046,7 @@ </histogram> <histogram name="Ash.Login.Lock.AuthMethod.Switched" - enum="AuthMethodSwitchType" expires_after="2023-06-18"> + enum="AuthMethodSwitchType" expires_after="2023-08-20"> <owner>emaamari@google.com</owner> <owner>cros-lurs@google.com</owner> <summary> @@ -3014,7 +3055,7 @@ </histogram> <histogram name="Ash.Login.Lock.AuthMethod.Used.ClamShellMode" - enum="AuthMethod" expires_after="2023-06-18"> + enum="AuthMethod" expires_after="2023-08-20"> <owner>emaamari@google.com</owner> <owner>cros-lurs@google.com</owner> <summary> @@ -3025,7 +3066,7 @@ </histogram> <histogram name="Ash.Login.Lock.AuthMethod.Used.TabletMode" enum="AuthMethod" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>emaamari@google.com</owner> <owner>cros-lurs@google.com</owner> <summary> @@ -3064,7 +3105,7 @@ </histogram> <histogram name="Ash.Login.Lock.UserClicks" enum="LockScreenUserClickTarget" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>emaamari@google.com</owner> <owner>cros-lurs@google.com</owner> <summary> @@ -3083,7 +3124,7 @@ </histogram> <histogram name="Ash.Login.Login.AuthMethod.Used.ClamShellMode" - enum="AuthMethod" expires_after="2023-06-18"> + enum="AuthMethod" expires_after="2023-08-20"> <owner>emaamari@google.com</owner> <owner>cros-lurs@google.com</owner> <summary> @@ -3114,7 +3155,7 @@ </histogram> <histogram name="Ash.Login.Login.UserClicks" enum="LoginScreenUserClickTarget" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>emaamari@google.com</owner> <owner>cros-lurs@google.com</owner> <summary> @@ -3124,7 +3165,7 @@ </histogram> <histogram name="Ash.Login.OOBE.UserClicks" enum="OobeUserClickTarget" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>emaamari@google.com</owner> <owner>raleksandrov@google.com</owner> <owner>cros-lurs@google.com</owner> @@ -3873,7 +3914,7 @@ </summary> </histogram> -<histogram name="Ash.Overview.Items" units="units" expires_after="2023-06-18"> +<histogram name="Ash.Overview.Items" units="units" expires_after="2023-08-20"> <owner>nupurjain@chromium.org</owner> <owner>sammiequon@chromium.org</owner> <summary> @@ -3959,7 +4000,7 @@ </histogram> <histogram name="Ash.Overview.TimeBetweenUse" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nupurjain@chromium.org</owner> <owner>sammiequon@chromium.org</owner> <summary> @@ -4074,7 +4115,7 @@ </histogram> <histogram name="Ash.Personalization.AmbientMode.AnimationTheme" - enum="AmbientModeAnimationTheme" expires_after="2023-06-18"> + enum="AmbientModeAnimationTheme" expires_after="2023-08-20"> <owner>jasontt@chromium.org</owner> <owner>assistive-eng@google.com</owner> <summary> @@ -4103,7 +4144,7 @@ </histogram> <histogram name="Ash.Personalization.KeyboardBacklight.Color" - enum="PersonalizationKeyboardBacklightColor" expires_after="2023-06-15"> + enum="PersonalizationKeyboardBacklightColor" expires_after="2023-08-20"> <owner>jasontt@chromium.org</owner> <owner>assistive-eng@google.com</owner> <summary> @@ -4113,7 +4154,7 @@ </histogram> <histogram name="Ash.Personalization.KeyboardBacklight.Color.Settled" - enum="PersonalizationKeyboardBacklightColor" expires_after="2023-06-15"> + enum="PersonalizationKeyboardBacklightColor" expires_after="2023-08-20"> <owner>jasontt@chromium.org</owner> <owner>assistive-eng@google.com</owner> <summary> @@ -4123,7 +4164,7 @@ </histogram> <histogram name="Ash.Personalization.KeyboardBacklight.WallpaperColor.Valid" - enum="BooleanValid" expires_after="2023-06-15"> + enum="BooleanValid" expires_after="2023-08-20"> <owner>jasontt@chromium.org</owner> <owner>assistive-eng@google.com</owner> <summary> @@ -4133,7 +4174,7 @@ </histogram> <histogram name="Ash.Personalization.Path" enum="PersonalizationPath" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jasontt@chromium.org</owner> <owner>assistive-eng@google.com</owner> <summary> @@ -4142,7 +4183,7 @@ </histogram> <histogram name="Ash.Personalization.Theme.ColorMode" - enum="PersonalizationThemeColorMode" expires_after="2023-06-18"> + enum="PersonalizationThemeColorMode" expires_after="2023-08-20"> <owner>jasontt@chromium.org</owner> <owner>assistive-eng@google.com</owner> <summary> @@ -5045,7 +5086,7 @@ </histogram> <histogram name="Ash.SplitView.EntryPoint.DeviceOrientation" - enum="DeviceOrientation" expires_after="2023-06-18"> + enum="DeviceOrientation" expires_after="2023-08-20"> <owner>xdai@chromium.org</owner> <owner>zxdan@chromium.org</owner> <owner>nupurjain@chromium.org</owner> @@ -5449,7 +5490,7 @@ </histogram> <histogram name="Ash.TouchView.LidAngle" units="degrees" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>oshima@chromium.org</owner> <summary> Chrome OS only. The computed angle between the lid and the keyboard panel. @@ -5816,7 +5857,7 @@ </histogram> <histogram name="Ash.Wallpaper.Image" enum="WallpaperImage" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jasontt@chromium.org</owner> <owner>assistive-eng@google.com</owner> <summary> @@ -5836,7 +5877,7 @@ </histogram> <histogram name="Ash.Wallpaper.Source2" enum="WallpaperType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>thuongphan@chromium.org</owner> <owner>assistive-eng@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/assistant/histograms.xml b/tools/metrics/histograms/metadata/assistant/histograms.xml index 9852e87..5dd93eb 100644 --- a/tools/metrics/histograms/metadata/assistant/histograms.xml +++ b/tools/metrics/histograms/metadata/assistant/histograms.xml
@@ -75,7 +75,7 @@ </histogram> <histogram name="Assistant.EntryPoint" enum="AssistantEntryPoint" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xiaohuic@chromium.org</owner> <owner>croissant-eng@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml index 01a169c..0bfcc70 100644 --- a/tools/metrics/histograms/metadata/autofill/histograms.xml +++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -287,7 +287,7 @@ </histogram> <histogram name="Autocomplete.Events" enum="AutocompleteEvents" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>chrome-autofill-team@google.com</owner> <summary> @@ -355,7 +355,7 @@ </histogram> <histogram name="Autofill.Address.IsEnabled.Startup" enum="BooleanEnabled" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jsaul@google.com</owner> <owner>chrome-autofill-alerts@google.com</owner> <summary> @@ -389,7 +389,7 @@ <histogram name="Autofill.AddressProfileImportCountrySpecificFieldRequirements" enum="AutofillAddressProfileImportCountrySpecificFieldRequirement" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>koerber@google.com</owner> <owner>battre@chromium.org</owner> <summary> @@ -400,7 +400,7 @@ </histogram> <histogram name="Autofill.AddressProfileImportRequirements" - enum="AutofillAddressProfileImportRequirement" expires_after="2023-06-18"> + enum="AutofillAddressProfileImportRequirement" expires_after="2023-08-20"> <owner>koerber@google.com</owner> <owner>battre@chromium.org</owner> <summary> @@ -410,7 +410,7 @@ </histogram> <histogram name="Autofill.AddressProfileImportStatus" - enum="AutofillAddressProfileImportStatus" expires_after="2023-06-18"> + enum="AutofillAddressProfileImportStatus" expires_after="2023-08-20"> <owner>koerber@google.com</owner> <owner>battre@chromium.org</owner> <summary> @@ -419,7 +419,7 @@ </histogram> <histogram name="Autofill.AddressSuggestionsCount" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>chrome-autofill-alerts@google.com</owner> <summary> @@ -938,7 +938,7 @@ <histogram name="Autofill.CardUnmaskAuthenticationSelectionDialog.Result" enum="AutofillCardUnmaskAuthenticationSelectionDialogResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>siyua@chromium.org</owner> <owner>jsaul@google.com</owner> <owner>siashah@chromium.org</owner> @@ -1004,7 +1004,7 @@ </histogram> <histogram name="Autofill.CreditCard.IsEnabled.PageLoad" enum="BooleanEnabled" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jsaul@google.com</owner> <owner>chrome-autofill-alerts@google.com</owner> <summary> @@ -1354,7 +1354,7 @@ </histogram> <histogram name="Autofill.DaysSinceLastUse.StoredCreditCard" units="days" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>chrome-autofill-alerts@google.com</owner> <!-- Name completed by histogram_suffixes name="AutofillCreditCardType" --> @@ -1420,7 +1420,7 @@ </histogram> <histogram name="Autofill.EditedAutofilledFieldAtSubmission.Aggregate" - enum="AutofilledFieldUserEditingStatus" expires_after="2023-06-18"> + enum="AutofilledFieldUserEditingStatus" expires_after="2023-08-20"> <owner>koerber@google.com</owner> <owner>battre@google.com</owner> <summary> @@ -1431,7 +1431,7 @@ <histogram name="Autofill.EditedAutofilledFieldAtSubmission.ByFieldType" enum="AutofilledFieldUserEditingStatusByFieldType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>koerber@google.com</owner> <owner>battre@google.com</owner> <summary> @@ -1601,7 +1601,7 @@ </histogram> <histogram name="Autofill.FieldCount" units="form fields" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>kolos@chromium.org</owner> <owner>battre@chromium.org</owner> <owner>chrome-autofill-alerts@google.com</owner> @@ -1992,7 +1992,7 @@ </histogram> <histogram name="Autofill.FormSubmittedState" enum="AutofillFormSubmittedState" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>chrome-autofill-alerts@google.com</owner> <summary>The autofill state related to a submitted form.</summary> @@ -2228,7 +2228,7 @@ </histogram> <histogram name="Autofill.IsEnabled.Startup" enum="BooleanEnabled" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jsaul@google.com</owner> <owner>battre@chromium.org</owner> <owner>chrome-autofill-alerts@google.com</owner> @@ -2279,7 +2279,7 @@ <histogram name="Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue2" - enum="Boolean" expires_after="2023-06-18"> + enum="Boolean" expires_after="2023-08-20"> <owner>vidhanj@google.com</owner> <owner>koerber@google.com</owner> <owner>chrome-autofill-alerts@google.com</owner> @@ -2388,7 +2388,7 @@ </histogram> <histogram name="Autofill.LabelInference.AssignedLabelSource" - enum="AssignedLabelSource" expires_after="2023-06-18"> + enum="AssignedLabelSource" expires_after="2023-08-20"> <owner>fleimgruber@google.com</owner> <owner>chrome-autofill-team@google.com</owner> <summary> @@ -2399,7 +2399,7 @@ </histogram> <histogram name="Autofill.LabelInference.InferredLabelSource" - enum="InferredLabelSource" expires_after="2023-06-18"> + enum="InferredLabelSource" expires_after="2023-08-20"> <owner>fleimgruber@google.com</owner> <owner>chrome-autofill-team@google.com</owner> <summary> @@ -2634,7 +2634,7 @@ </histogram> <histogram name="Autofill.NumberOfEditedAutofilledFieldsAtSubmission" - units="fields" expires_after="2023-06-18"> + units="fields" expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>chrome-autofill-alerts@google.com</owner> <summary> @@ -2644,7 +2644,7 @@ </histogram> <histogram name="Autofill.NumberOfProfilesConsideredForDedupe" units="profiles" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>chrome-autofill-alerts@google.com</owner> <summary> @@ -2662,7 +2662,7 @@ </histogram> <histogram name="Autofill.NumElementsMatchesNumFields" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>chrome-autofill-alerts@google.com</owner> <summary> @@ -3120,7 +3120,7 @@ </histogram> <histogram name="Autofill.ProfileActionOnFormSubmitted" - enum="AutofillProfileAction" expires_after="2023-06-18"> + enum="AutofillProfileAction" expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>chrome-autofill-alerts@google.com</owner> <summary> @@ -3160,7 +3160,7 @@ </histogram> <histogram name="Autofill.ProfileImport.NewProfileEditedType" - enum="AutofillSettingsVisibleTypes" expires_after="2023-06-04"> + enum="AutofillSettingsVisibleTypes" expires_after="2023-08-20"> <owner>koerber@google.com</owner> <owner>src/components/autofill/OWNERS</owner> <summary> @@ -3173,7 +3173,7 @@ <histogram name="Autofill.ProfileImport.NewProfileNumberOfAutocompleteUnrecognizedFields" - units="fields" expires_after="2023-04-30"> + units="fields" expires_after="2023-08-20"> <owner>fleimgruber@google.com</owner> <owner>chrome-autofill-team@google.com</owner> <summary> @@ -3185,7 +3185,7 @@ </histogram> <histogram name="Autofill.ProfileImport.NewProfileNumberOfEditedFields" - units="fields" expires_after="2023-06-04"> + units="fields" expires_after="2023-08-20"> <owner>koerber@google.com</owner> <owner>src/components/autofill/OWNERS</owner> <summary> @@ -3209,7 +3209,7 @@ </histogram> <histogram name="Autofill.ProfileImport.PhoneNumberParsed" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>fleimgruber@google.com</owner> <owner>chrome-autofill-team@google.com</owner> <summary> @@ -3296,7 +3296,7 @@ </histogram> <histogram name="Autofill.ProfileImport.UpdateProfileEditedType" - enum="AutofillSettingsVisibleTypes" expires_after="2023-06-11"> + enum="AutofillSettingsVisibleTypes" expires_after="2023-08-20"> <owner>koerber@google.com</owner> <owner>src/components/autofill/OWNERS</owner> <summary> @@ -3351,7 +3351,7 @@ <histogram name="Autofill.ProfileImport.UpdateProfileNumberOfAutocompleteUnrecognizedFields" - units="fields" expires_after="2023-04-30"> + units="fields" expires_after="2023-08-20"> <owner>fleimgruber@google.com</owner> <owner>chrome-autofill-team@google.com</owner> <summary> @@ -3617,7 +3617,7 @@ </histogram> <histogram name="Autofill.ScanCreditCard.Completed" enum="BooleanCompleted" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>chrome-autofill-alerts@google.com</owner> <summary>Whether a credit card scan was completed or cancelled.</summary> @@ -3638,7 +3638,7 @@ </histogram> <histogram name="Autofill.ScanCreditCardPrompt" - enum="AutofillScanCreditCardPrompt" expires_after="2023-06-18"> + enum="AutofillScanCreditCardPrompt" expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>jsaul@chromium.org</owner> <owner>chrome-autofill-alerts@google.com</owner> @@ -3785,7 +3785,7 @@ </histogram> <histogram name="Autofill.StoredCreditCardCount" units="cards" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>chrome-autofill-alerts@google.com</owner> <!-- Name completed by histogram_suffixes name="AutofillCreditCardType" --> @@ -4171,7 +4171,7 @@ </histogram> <histogram name="Autofill.SubmittedValuePatterns" enum="AutofillValuePatterns" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>jsaul@google.com</owner> <owner>koerber@google.com</owner> @@ -4194,7 +4194,7 @@ </histogram> <histogram name="Autofill.SuggestionAcceptedIndex.Autocomplete" - units="position" expires_after="2023-06-18"> + units="position" expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>chrome-autofill-alerts@google.com</owner> <summary> @@ -4615,7 +4615,7 @@ </histogram> <histogram name="Autofill.UsedCachedVirtualCard" units="uses" - expires_after="2023-06-01"> + expires_after="2023-08-20"> <owner>siyua@chromium.org</owner> <owner>jsaul@google.com</owner> <owner>payments-autofill-team@google.com</owner> @@ -4871,7 +4871,7 @@ <histogram name="Autofill.VirtualCardManualFallbackBubble.FieldClicked" enum="AutofillVirtualCardManualFallbackBubbleFieldClicked" - expires_after="2023-06-04"> + expires_after="2023-08-20"> <owner>siyua@chromium.org</owner> <owner>jsaul@google.com</owner> <owner>payments-autofill-team@google.com</owner> @@ -4956,7 +4956,7 @@ </histogram> <histogram name="Autofill.WebOTP.OneTimeCode.FromAutocomplete" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yigu@chromium.org</owner> <owner>battre@chromium.org</owner> <owner>web-identity@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml index 0532b35..12808ad8 100644 --- a/tools/metrics/histograms/metadata/blink/histograms.xml +++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -650,7 +650,7 @@ </histogram> <histogram base="true" name="Blink.ContentDocumentUpdate.UpdateTime" - units="microseconds" expires_after="2023-06-18"> + units="microseconds" expires_after="2023-08-20"> <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" --> <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" --> @@ -769,7 +769,7 @@ </histogram> <histogram name="Blink.CullRect.UpdateTime" units="microseconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>pdr@chromium.org</owner> <owner>wangxianzhu@chromium.org</owner> <owner>paint-dev@chromium.org</owner> @@ -794,7 +794,7 @@ </histogram> <histogram name="Blink.DecodedImage.JpegDensity.KiBWeighted" - units="0.01 bits per pixel" expires_after="2023-06-18"> + units="0.01 bits per pixel" expires_after="2023-08-20"> <owner>jyrki@google.com</owner> <owner>compression-dev@google.com</owner> <summary> @@ -1134,7 +1134,7 @@ </histogram> <histogram name="Blink.FedCm.Timing.CancelOnDialog" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yigu@chromium.org</owner> <owner>web-identity-eng@google.com</owner> <summary> @@ -1422,7 +1422,7 @@ </histogram> <histogram base="true" name="Blink.HandleInputEvents.UpdateTime" - units="microseconds" expires_after="2023-06-18"> + units="microseconds" expires_after="2023-08-20"> <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" --> <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" --> @@ -2508,7 +2508,7 @@ </histogram> <histogram name="Blink.PreloadRequestWaitTime" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>cduvall@chromium.org</owner> <owner>swarm-team@google.com</owner> <summary> @@ -2956,7 +2956,7 @@ </histogram> <histogram base="true" name="Blink.Style.UpdateTime" units="microseconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" --> <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" --> @@ -2980,7 +2980,7 @@ </histogram> <histogram name="Blink.SVGImage.DataChanged" units="microseconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>pdr@chromium.org</owner> <owner>paint-dev@chromium.org</owner> <summary> @@ -3168,7 +3168,7 @@ </histogram> <histogram name="Blink.UseCounter.FeaturePolicy.Header" - enum="FeaturePolicyFeature" expires_after="2023-06-18"> + enum="FeaturePolicyFeature" expires_after="2023-08-20"> <owner>iclelland@chromium.org</owner> <owner>feature-control@chromium.org</owner> <summary> @@ -3384,7 +3384,7 @@ </histogram> <histogram name="Blink.UseCounter.PermissionsPolicy.Allow2" - enum="FeaturePolicyFeature" expires_after="2023-06-18"> + enum="FeaturePolicyFeature" expires_after="2023-08-20"> <owner>iclelland@chromium.org</owner> <owner>feature-control@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/bluetooth/histograms.xml b/tools/metrics/histograms/metadata/bluetooth/histograms.xml index f1beab974..a3dd3b5 100644 --- a/tools/metrics/histograms/metadata/bluetooth/histograms.xml +++ b/tools/metrics/histograms/metadata/bluetooth/histograms.xml
@@ -889,7 +889,7 @@ </histogram> <histogram name="Bluetooth.ChromeOS.FastPair.KeyBasedPairing.Write.PairFailure" - enum="FastPairPairFailure" expires_after="2023-06-04"> + enum="FastPairPairFailure" expires_after="2023-08-20"> <owner>jackshira@google.com</owner> <owner>dclasson@google.com</owner> <owner>brandosocarras@google.com</owner> @@ -1013,7 +1013,7 @@ </histogram> <histogram name="Bluetooth.ChromeOS.FastPair.PairDevice.ErrorReason" - enum="BluetoothDeviceConnectErrorCode" expires_after="2023-04-30"> + enum="BluetoothDeviceConnectErrorCode" expires_after="2023-08-20"> <owner>jackshira@google.com</owner> <owner>dclasson@google.com</owner> <owner>brandosocarras@google.com</owner> @@ -1028,7 +1028,7 @@ </histogram> <histogram name="Bluetooth.ChromeOS.FastPair.PairDevice.Result" - enum="BooleanSuccess" expires_after="2023-06-04"> + enum="BooleanSuccess" expires_after="2023-08-20"> <owner>jackshira@google.com</owner> <owner>dclasson@google.com</owner> <owner>brandosocarras@google.com</owner> @@ -1211,7 +1211,7 @@ </histogram> <histogram name="Bluetooth.ChromeOS.FastPair.RetroactiveEngagementFunnel.Steps" - enum="FastPairRetroactiveEngagementFlowEvent" expires_after="2023-06-11"> + enum="FastPairRetroactiveEngagementFlowEvent" expires_after="2023-08-20"> <owner>jackshira@google.com</owner> <owner>dclasson@google.com</owner> <owner>brandosocarras@google.com</owner> @@ -1564,7 +1564,7 @@ </histogram> <histogram name="Bluetooth.ChromeOS.Forget.Result" enum="ForgetResult" - expires_after="2023-06-21"> + expires_after="2023-08-20"> <owner>khorimoto@chromium.org</owner> <owner>cros-connectivity@google.com</owner> <summary>Emitted each time a device forget attempt completes.</summary> @@ -1650,7 +1650,7 @@ </histogram> <histogram name="Bluetooth.ChromeOS.PoweredState" enum="BooleanEnabled" - expires_after="2023-06-21"> + expires_after="2023-08-20"> <owner>khorimoto@chromium.org</owner> <owner>cros-connectivity@google.com</owner> <summary> @@ -1673,14 +1673,14 @@ </histogram> <histogram name="Bluetooth.ChromeOS.SetNickname.Result" - enum="SetNicknameResult" expires_after="2023-06-21"> + enum="SetNicknameResult" expires_after="2023-08-20"> <owner>khorimoto@chromium.org</owner> <owner>cros-connectivity@google.com</owner> <summary>Emitted each time a nickname change attempt completes.</summary> </histogram> <histogram name="Bluetooth.ChromeOS.UiSurfaceDisplayed" - enum="BluetoothUiSurface" expires_after="2023-06-21"> + enum="BluetoothUiSurface" expires_after="2023-08-20"> <owner>khorimoto@chromium.org</owner> <owner>cros-connectivity@google.com</owner> <summary>Metric emmitted each time a UI surface is shown.</summary>
diff --git a/tools/metrics/histograms/metadata/bookmarks/histograms.xml b/tools/metrics/histograms/metadata/bookmarks/histograms.xml index 4ae329b..2c2174af 100644 --- a/tools/metrics/histograms/metadata/bookmarks/histograms.xml +++ b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
@@ -355,14 +355,14 @@ </histogram> <histogram name="Bookmarks.EntryPoint" enum="BookmarksEntryPoint" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ianwen@chromium.org</owner> <component>UI>Browser>Bookmarks</component> <summary>How users add a new bookmark.</summary> </histogram> <histogram name="Bookmarks.GetResultsMatching.AnyTermApproach.Used" - enum="Boolean" expires_after="2023-06-18"> + enum="Boolean" expires_after="2023-08-20"> <owner>manukh@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> <component>UI>Browser>Bookmarks</component> @@ -405,7 +405,7 @@ </histogram> <histogram name="Bookmarks.GetResultsMatching.Terms.TermLength" - units="characters" expires_after="2023-06-18"> + units="characters" expires_after="2023-08-20"> <owner>manukh@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> <component>UI>Browser>Bookmarks</component>
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml index 0421c297..4918ae8 100644 --- a/tools/metrics/histograms/metadata/browser/histograms.xml +++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -931,7 +931,7 @@ </histogram> <histogram name="BrowserSwitcher.AlternativeBrowser" enum="BrowserType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nicolaso@chromium.org</owner> <owner>pastarmovj@chromium.org</owner> <summary> @@ -1009,7 +1009,7 @@ </histogram> <histogram name="BrowserSwitcher.ExternalSitelistSize" units="rules" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nicolaso@chromium.org</owner> <owner>pastarmovj@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/chrome/histograms.xml b/tools/metrics/histograms/metadata/chrome/histograms.xml index 5eeeb5b..e03b30d 100644 --- a/tools/metrics/histograms/metadata/chrome/histograms.xml +++ b/tools/metrics/histograms/metadata/chrome/histograms.xml
@@ -296,7 +296,7 @@ </histogram> <histogram name="ChromeColors.ColorOnLoad" enum="ChromeColorsInfo" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>gayane@chromium.org</owner> <owner>yyushkina@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml index 90ce92e1..c7a791f 100644 --- a/tools/metrics/histograms/metadata/chromeos/histograms.xml +++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -244,7 +244,7 @@ </histogram> <histogram name="ChromeOS.Attestation.AttestationFlowStatus" - enum="AttestationFlowStatus" expires_after="2023-06-18"> + enum="AttestationFlowStatus" expires_after="2023-08-20"> <owner>cylai@chromium.org</owner> <owner>cros-hwsec+umas@chromium.org</owner> <summary> @@ -299,7 +299,7 @@ </histogram> <histogram name="ChromeOS.Camera.AutoFraming.EnabledTime" units="%" - expires_after="2023-06-04"> + expires_after="2023-08-20"> <owner>kamesan@chromium.org</owner> <owner>chromeos-camera-eng@google.com</owner> <summary> @@ -320,7 +320,7 @@ </histogram> <histogram name="ChromeOS.Camera.AutoFraming.MedianZoomRatio" units="tenths" - expires_after="2023-06-04"> + expires_after="2023-08-20"> <owner>kamesan@chromium.org</owner> <owner>chromeos-camera-eng@google.com</owner> <summary> @@ -799,7 +799,7 @@ </histogram> <histogram name="ChromeOS.CWP.ParsePSIMemory" enum="ChromeOSParsePSIMemStatus" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>raging@google.com</owner> <owner>chromeos-memory@google.com</owner> <summary> @@ -980,7 +980,7 @@ </histogram> <histogram name="ChromeOS.DiagnosticsUi.OpenDuration" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ashleydp@google.com</owner> <owner>gavinwill@chromium.org</owner> <owner>zentaro@chromium.org</owner> @@ -992,7 +992,7 @@ </histogram> <histogram name="ChromeOS.DiagnosticsUi.RoutineCount" units="routines" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ashleydp@google.com</owner> <owner>gavinwill@chromium.org</owner> <owner>zentaro@chromium.org</owner> @@ -1425,7 +1425,7 @@ </histogram> <histogram name="ChromeOS.Intents.IntentPickerAction" - enum="IntentPickerDialogAction" expires_after="2023-08-13"> + enum="IntentPickerDialogAction" expires_after="2023-08-20"> <owner>tsergeant@chromium.org</owner> <owner>chromeos-apps-foundation-team@google.com</owner> <summary> @@ -1453,7 +1453,7 @@ </histogram> <histogram name="ChromeOS.Intents.IntentPickerIconEvent" - enum="IntentPickerIconEvent" expires_after="2023-06-18"> + enum="IntentPickerIconEvent" expires_after="2023-08-20"> <owner>tsergeant@chromium.org</owner> <owner>chromeos-apps-foundation-team@google.com</owner> <summary> @@ -1756,7 +1756,7 @@ </histogram> <histogram name="ChromeOS.Liveness.PingResponseTime" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>rtinkoff@google.com</owner> <owner>xiyuan@google.com</owner> <summary> @@ -2151,7 +2151,7 @@ </histogram> <histogram name="ChromeOS.SecurityAnomaly" enum="SecurityAnomaly" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jorgelo@chromium.org</owner> <owner>chromeos-security-core@google.com</owner> <summary> @@ -2313,7 +2313,7 @@ </histogram> <histogram base="true" name="ChromeOS.SystemTray.AnimationSmoothness" units="%" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <!-- Name completed by histogram suffixes name="SystemTrayTransitionType" --> @@ -2379,7 +2379,7 @@ </histogram> <histogram name="ChromeOS.SystemTray.Network.RowClickedAction" - enum="NetworkRowClickedAction" expires_after="2023-06-20"> + enum="NetworkRowClickedAction" expires_after="2023-08-20"> <owner>khorimoto@chromium.org</owner> <owner>tjohnsonkanu@chromium.org</owner> <owner>chadduffin@chromium.org</owner> @@ -2392,7 +2392,7 @@ </histogram> <histogram name="ChromeOS.SystemTray.Network.SectionShown" - enum="DetailedViewSection" expires_after="2023-06-20"> + enum="DetailedViewSection" expires_after="2023-08-20"> <owner>khorimoto@chromium.org</owner> <owner>tjohnsonkanu@chromium.org</owner> <owner>chadduffin@chromium.org</owner> @@ -2549,7 +2549,7 @@ </histogram> <histogram name="ChromeOS.UrlXattrsCount" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jorgelo@chromium.org</owner> <owner>tnagel@chromium.org</owner> <summary> @@ -2673,7 +2673,7 @@ </histogram> <histogram name="ChromeOS.WXMountCount" units="count" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jorgelo@chromium.org</owner> <owner>chromeos-security-core@google.com</owner> <summary> @@ -2685,7 +2685,7 @@ </histogram> <histogram name="ChromeOS.Zram.PSISomeOrigDataSizeMB" units="MB" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>erikchen@chromium.org</owner> <owner>bgeffon@chromium.org</owner> <owner>chromeos-memory@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml index 8872d2e..35893e4 100644 --- a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml +++ b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
@@ -210,7 +210,7 @@ </histogram> <histogram name="ChromeOS.Settings.Languages.Interaction" - enum="SettingsLanguagesPageInteraction" expires_after="2023-06-18"> + enum="SettingsLanguagesPageInteraction" expires_after="2023-08-20"> <owner>myy@chromium.org</owner> <owner>essential-inputs-team@google.com</owner> <summary> @@ -239,7 +239,7 @@ </histogram> <histogram base="true" name="ChromeOS.Settings.Languages.Toggle" - enum="BooleanToggled" expires_after="2023-06-18"> + enum="BooleanToggled" expires_after="2023-08-20"> <!-- Name completed by histogram_suffixes name="SettingsLanguagesPageToggle" --> <owner>myy@chromium.org</owner> @@ -319,7 +319,7 @@ </histogram> <histogram name="ChromeOS.Settings.NumSearchResultsFetched" units="results" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xiaohuic@chromium.org</owner> <owner>cros-settings@google.com</owner> <summary> @@ -343,7 +343,7 @@ </histogram> <histogram name="ChromeOS.Settings.PathVisited" - enum="WebUIOSSettingsPathHashes" expires_after="2023-06-18"> + enum="WebUIOSSettingsPathHashes" expires_after="2023-08-20"> <owner>xiaohuic@chromium.org</owner> <owner>cros-settings@google.com</owner> <summary> @@ -386,7 +386,7 @@ </histogram> <histogram name="ChromeOS.Settings.SearchRequests" - enum="OsSettingSearchRequestTypes" expires_after="2023-06-18"> + enum="OsSettingSearchRequestTypes" expires_after="2023-08-20"> <owner>xiaohuic@chromium.org</owner> <owner>cros-settings@google.com</owner> <summary> @@ -419,7 +419,7 @@ </histogram> <histogram name="ChromeOS.Settings.SearchResultSectionSelected" - enum="OsSettingsSection" expires_after="2023-06-18"> + enum="OsSettingsSection" expires_after="2023-08-20"> <owner>xiaohuic@chromium.org</owner> <owner>cros-settings@google.com</owner> <summary> @@ -437,7 +437,7 @@ </histogram> <histogram name="ChromeOS.Settings.SearchResultSubpageSelected" - enum="OsSettingsSubpage" expires_after="2023-06-18"> + enum="OsSettingsSubpage" expires_after="2023-08-20"> <owner>xiaohuic@chromium.org</owner> <owner>cros-settings@google.com</owner> <summary> @@ -446,7 +446,7 @@ </histogram> <histogram name="ChromeOS.Settings.SearchResultTypeSelected" - enum="OsSettingsSearchResultType" expires_after="2023-06-18"> + enum="OsSettingsSearchResultType" expires_after="2023-08-20"> <owner>xiaohuic@chromium.org</owner> <owner>cros-settings@google.com</owner> <summary> @@ -479,7 +479,7 @@ </histogram> <histogram name="ChromeOS.Settings.UserActionOnSearchResultsShown" - enum="OsSettingSearchBoxUserAction" expires_after="2023-06-18"> + enum="OsSettingSearchBoxUserAction" expires_after="2023-08-20"> <owner>xiaohuic@chromium.org</owner> <owner>cros-settings@google.com</owner> <summary> @@ -488,7 +488,7 @@ </histogram> <histogram name="ChromeOS.Settings.Wifi.AddNetwork" - enum="NetworkDiscoveryState" expires_after="2023-06-18"> + enum="NetworkDiscoveryState" expires_after="2023-08-20"> <owner>jonmann@chromium.org</owner> <owner>khorimoto@chromium.org</owner> <owner>tnagel@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/commerce/histograms.xml b/tools/metrics/histograms/metadata/commerce/histograms.xml index add4a552..8add4ee 100644 --- a/tools/metrics/histograms/metadata/commerce/histograms.xml +++ b/tools/metrics/histograms/metadata/commerce/histograms.xml
@@ -163,7 +163,7 @@ </histogram> <histogram name="Commerce.Heuristics.MerchantNameSource" - enum="CommerceHeuristicsDataSource" expires_after="2023-06-18"> + enum="CommerceHeuristicsDataSource" expires_after="2023-08-20"> <owner>yuezhanggg@chromium.org</owner> <owner>wychen@chromium.org</owner> <owner>chrome-shopping@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/compositing/histograms.xml b/tools/metrics/histograms/metadata/compositing/histograms.xml index bf80a9b..194adb8 100644 --- a/tools/metrics/histograms/metadata/compositing/histograms.xml +++ b/tools/metrics/histograms/metadata/compositing/histograms.xml
@@ -269,7 +269,7 @@ </histogram> <histogram name="Compositing.Display.DrmOverlayManager.FirstTestPageFlipPassed" - enum="Boolean" expires_after="2023-06-18"> + enum="Boolean" expires_after="2023-08-20"> <owner>khaslett@chromium.org</owner> <owner>kylechar@chromium.org</owner> <summary> @@ -279,7 +279,7 @@ </histogram> <histogram name="Compositing.Display.DrmOverlayManager.TestPageFlipCount" - units="units" expires_after="2023-06-18"> + units="units" expires_after="2023-08-20"> <owner>khaslett@chromium.org</owner> <owner>kylechar@chromium.org</owner> <summary> @@ -289,7 +289,7 @@ </histogram> <histogram name="Compositing.Display.DrmOverlayManager.TestPageFlipUs" - units="microseconds" expires_after="2023-06-18"> + units="microseconds" expires_after="2023-08-20"> <owner>khaslett@chromium.org</owner> <owner>kylechar@chromium.org</owner> <summary> @@ -360,7 +360,7 @@ </histogram> <histogram name="Compositing.Display.OverlayProcessorOzone.MaxPlanesSupported" - units="units" expires_after="2023-06-18"> + units="units" expires_after="2023-08-20"> <owner>khaslett@chromium.org</owner> <owner>kylechar@chromium.org</owner> <summary> @@ -372,7 +372,7 @@ <histogram name="Compositing.Display.OverlayProcessorUsingStrategy.CandidateCombinationPreviouslySucceeded" - enum="Boolean" expires_after="2023-06-18"> + enum="Boolean" expires_after="2023-08-20"> <owner>khaslett@chromium.org</owner> <owner>kylechar@chromium.org</owner> <summary> @@ -435,7 +435,7 @@ <histogram name="Compositing.Display.OverlayProcessorUsingStrategy.ShouldAttemptMultipleOverlays" - enum="AttemptingMultipleOverlays" expires_after="2023-06-18"> + enum="AttemptingMultipleOverlays" expires_after="2023-08-20"> <owner>khaslett@chromium.org</owner> <owner>kylechar@chromium.org</owner> <summary> @@ -622,7 +622,7 @@ </histogram> <histogram name="Compositing.Renderer.LCDTextDisallowedReasonKPixels" - enum="LCDTextDisallowedReason" expires_after="2023-06-18"> + enum="LCDTextDisallowedReason" expires_after="2023-08-20"> <owner>wangxianzhu@chromium.org</owner> <owner>paint-dev@chromium.org</owner> <summary> @@ -748,7 +748,7 @@ </histogram> <histogram name="Compositing.SurfaceAggregator.DeclareResourcesUs" - units="microseconds" expires_after="2023-06-18"> + units="microseconds" expires_after="2023-08-20"> <owner>kylechar@chromium.org</owner> <owner>jonross@chromium.org</owner> <summary> @@ -762,7 +762,7 @@ </histogram> <histogram name="Compositing.SurfaceAggregator.PrewalkedSurfaceCount" - units="surfaces" expires_after="2023-06-18"> + units="surfaces" expires_after="2023-08-20"> <owner>kylechar@chromium.org</owner> <owner>jonross@chromium.org</owner> <summary> @@ -772,7 +772,7 @@ </histogram> <histogram name="Compositing.SurfaceAggregator.PrewalkUs" units="microseconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>kylechar@chromium.org</owner> <owner>jonross@chromium.org</owner> <summary> @@ -999,7 +999,7 @@ </histogram> <histogram name="Graphics.Smoothness.Checkerboarding" units="%" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jonross@chromium.org</owner> <owner>graphics-dev@chromium.org</owner> <summary> @@ -1040,7 +1040,7 @@ </summary> </histogram> -<histogram name="Graphics.Smoothness.Jank" units="%" expires_after="2023-08-13"> +<histogram name="Graphics.Smoothness.Jank" units="%" expires_after="2023-08-20"> <owner>jonross@chromium.org</owner> <owner>mjzhang@chromium.org</owner> <owner>graphics-dev@chromium.org</owner> @@ -1276,7 +1276,7 @@ </histogram> <histogram name="Graphics.Smoothness.PercentMissedDeadlineFrames.AllSequences" - units="%" expires_after="2023-06-18"> + units="%" expires_after="2023-08-20"> <owner>jonross@chromium.org</owner> <owner>graphics-dev@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml index ec9a55b..f66c817 100644 --- a/tools/metrics/histograms/metadata/content/histograms.xml +++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -331,7 +331,7 @@ </histogram> <histogram name="ContentSettings.RegularProfile.DefaultBackgroundSyncSetting" - enum="ContentSetting" expires_after="2023-06-18"> + enum="ContentSetting" expires_after="2023-08-20"> <owner>tungnh@chromium.org</owner> <owner>src/components/permissions/PERMISSIONS_OWNERS</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/content_creation/histograms.xml b/tools/metrics/histograms/metadata/content_creation/histograms.xml index c7e3b20f..ac41444 100644 --- a/tools/metrics/histograms/metadata/content_creation/histograms.xml +++ b/tools/metrics/histograms/metadata/content_creation/histograms.xml
@@ -186,7 +186,7 @@ </histogram> <histogram name="SharedHighlights.LinkGenerated.Error" - enum="LinkGenerationError" expires_after="2023-06-18"> + enum="LinkGenerationError" expires_after="2023-08-20"> <owner>jeffreycohen@chromium.org</owner> <owner>chrome-shared-highlighting@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/cookie/histograms.xml b/tools/metrics/histograms/metadata/cookie/histograms.xml index 5ce11d0..680443ca 100644 --- a/tools/metrics/histograms/metadata/cookie/histograms.xml +++ b/tools/metrics/histograms/metadata/cookie/histograms.xml
@@ -608,7 +608,7 @@ </histogram> <histogram name="Cookie.PartitionCount" units="partitions" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>dylancutler@google.com</owner> <owner>src/net/cookies/OWNERS</owner> <summary> @@ -620,7 +620,7 @@ </histogram> <histogram name="Cookie.PartitionedCookieCount" units="cookies" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>dylancutler@google.com</owner> <owner>src/net/cookies/OWNERS</owner> <summary> @@ -631,7 +631,7 @@ </histogram> <histogram name="Cookie.PartitionedCookiesInRequest" units="cookies" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>dylancutler@google.com</owner> <owner>src/net/cookies/OWNERS</owner> <summary> @@ -810,7 +810,7 @@ </histogram> <histogram name="Cookie.TimeDatabaseMigrationToV18" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>arichiv@chromium.org</owner> <owner>bingler@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/cras/histograms.xml b/tools/metrics/histograms/metadata/cras/histograms.xml index 96f4c2c..b587de4 100644 --- a/tools/metrics/histograms/metadata/cras/histograms.xml +++ b/tools/metrics/histograms/metadata/cras/histograms.xml
@@ -720,7 +720,7 @@ </histogram> <histogram name="Cras.UnderrunsPerDevice" units="count" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yuhsuan@chromium.org</owner> <owner>chromeos-audio@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/cros_ml/histograms.xml b/tools/metrics/histograms/metadata/cros_ml/histograms.xml index d633df53..867a9cf 100644 --- a/tools/metrics/histograms/metadata/cros_ml/histograms.xml +++ b/tools/metrics/histograms/metadata/cros_ml/histograms.xml
@@ -234,7 +234,7 @@ </histogram> <histogram name="MachineLearningService.ProcessError" - enum="MachineLearningServiceProcessError" expires_after="2023-06-18"> + enum="MachineLearningServiceProcessError" expires_after="2023-08-20"> <owner>amoylan@chromium.org</owner> <owner>alanlxl@chromium.org</owner> <owner>honglinyu@chromium.org</owner> @@ -372,7 +372,7 @@ </histogram> <histogram name="MachineLearningService.WorkerProcessCleanUpTime" - units="microseconds" expires_after="2023-06-18"> + units="microseconds" expires_after="2023-08-20"> <owner>alanlxl@chromium.org</owner> <owner>amoylan@chromium.org</owner> <owner>honglinyu@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/crostini/histograms.xml b/tools/metrics/histograms/metadata/crostini/histograms.xml index c0cc1bf..6c2a597 100644 --- a/tools/metrics/histograms/metadata/crostini/histograms.xml +++ b/tools/metrics/histograms/metadata/crostini/histograms.xml
@@ -509,7 +509,7 @@ </histogram> <histogram name="Crostini.TerminalSettingsChanged" - enum="CrostiniTerminalSetting" expires_after="2023-06-18"> + enum="CrostiniTerminalSetting" expires_after="2023-08-20"> <owner>joelhockey@chromium.org</owner> <owner>lxj@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/cryptohome/histograms.xml b/tools/metrics/histograms/metadata/cryptohome/histograms.xml index 4474ef5e..ac4fbda 100644 --- a/tools/metrics/histograms/metadata/cryptohome/histograms.xml +++ b/tools/metrics/histograms/metadata/cryptohome/histograms.xml
@@ -874,7 +874,7 @@ </histogram> <histogram name="Cryptohome.TimeToUSSLoadPersisted" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>thomascedeno@google.com</owner> <owner>cros-hwsec+uma@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/custom_tabs/histograms.xml b/tools/metrics/histograms/metadata/custom_tabs/histograms.xml index 6a5b3bf1..97b80c5 100644 --- a/tools/metrics/histograms/metadata/custom_tabs/histograms.xml +++ b/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
@@ -36,7 +36,7 @@ </histogram> <histogram name="CustomTabs.AutoclosedSessionDuration" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jinsukkim@chromium.org</owner> <owner>twellington@chromium.org</owner> <owner>cct-team@google.com</owner> @@ -53,7 +53,7 @@ </histogram> <histogram name="CustomTabs.Branding.BrandingCheckCanceled" - enum="BooleanCanceled" expires_after="2023-06-18"> + enum="BooleanCanceled" expires_after="2023-08-20"> <owner>wenyufu@chromium.org</owner> <owner>chrome-connective-tissue@google.com</owner> <summary> @@ -65,7 +65,7 @@ </histogram> <histogram name="CustomTabs.Branding.BrandingCheckDuration" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>wenyufu@chromium.org</owner> <owner>chrome-connective-tissue@google.com</owner> <summary> @@ -77,7 +77,7 @@ </histogram> <histogram name="CustomTabs.Branding.BrandingDecision" - enum="CustomTabsBrandingDecision" expires_after="2023-06-18"> + enum="CustomTabsBrandingDecision" expires_after="2023-08-20"> <owner>wenyufu@chromium.org</owner> <owner>chrome-connective-tissue@google.com</owner> <summary> @@ -94,7 +94,7 @@ </histogram> <histogram name="CustomTabs.Branding.IsPackageNameValid" enum="BooleanValid" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>wenyufu@chromium.org</owner> <owner>chrome-connective-tissue@google.com</owner> <summary> @@ -110,7 +110,7 @@ </histogram> <histogram name="CustomTabs.Branding.NumberOfClients" units="count" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>wenyufu@chromium.org</owner> <owner>chrome-connective-tissue@google.com</owner> <summary> @@ -172,7 +172,7 @@ </histogram> <histogram name="CustomTabs.CloseCause" enum="CustomTabsCloseCause" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jinsukkim@chromium.org</owner> <owner>twellington@chromium.org</owner> <owner>cct-team@google.com</owner> @@ -273,7 +273,7 @@ </histogram> <histogram name="CustomTabs.HadInteractionOnClose.Form" enum="Boolean" - expires_after="2023-06-19"> + expires_after="2023-08-20"> <owner>katzz@google.com</owner> <owner>chrome-connective-tissue@google.com</owner> <summary> @@ -297,7 +297,7 @@ </histogram> <histogram name="CustomTabs.HadInteractionOnClose.Navigation" enum="Boolean" - expires_after="2023-06-19"> + expires_after="2023-08-20"> <owner>katzz@google.com</owner> <owner>chrome-connective-tissue@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/dev/histograms.xml b/tools/metrics/histograms/metadata/dev/histograms.xml index 692e54d..8b7578d 100644 --- a/tools/metrics/histograms/metadata/dev/histograms.xml +++ b/tools/metrics/histograms/metadata/dev/histograms.xml
@@ -23,7 +23,7 @@ <histograms> <histogram name="DevTools.ActionTaken" enum="DevToolsAction" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>alph@chromium.org</owner> <owner>yangguo@chromium.org</owner> <owner>bmeurer@chromium.org</owner> @@ -81,7 +81,7 @@ </histogram> <histogram name="DevTools.DeveloperResourceLoaded" - enum="DevToolsDeveloperResourceLoaded" expires_after="2023-06-18"> + enum="DevToolsDeveloperResourceLoaded" expires_after="2023-08-20"> <owner>yangguo@chromium.org</owner> <owner>bmeurer@chromium.org</owner> <summary> @@ -116,7 +116,7 @@ </histogram> <histogram name="DevTools.DeveloperResourceScheme" - enum="DevToolsDeveloperResourceScheme" expires_after="2023-06-18"> + enum="DevToolsDeveloperResourceScheme" expires_after="2023-08-20"> <owner>yangguo@chromium.org</owner> <owner>bmeurer@chromium.org</owner> <summary> @@ -134,7 +134,7 @@ </histogram> <histogram name="DevTools.ExperimentDisabled" enum="DevtoolsExperiments" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yangguo@chromium.org</owner> <owner>changhao@chromium.org</owner> <summary> @@ -143,7 +143,7 @@ </histogram> <histogram name="DevTools.ExperimentEnabled" enum="DevtoolsExperiments" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yangguo@chromium.org</owner> <owner>changhao@chromium.org</owner> <summary> @@ -152,7 +152,7 @@ </histogram> <histogram name="DevTools.ExperimentEnabledAtLaunch" enum="DevtoolsExperiments" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yangguo@chromium.org</owner> <owner>changhao@chromium.org</owner> <summary> @@ -179,7 +179,7 @@ </histogram> <histogram name="DevTools.IssuesPanelIssueExpanded" - enum="DevToolsIssuesPanelIssueExpanded" expires_after="2023-06-18"> + enum="DevToolsIssuesPanelIssueExpanded" expires_after="2023-08-20"> <owner>yangguo@chromium.org</owner> <owner>dsv@chromium.org</owner> <summary> @@ -197,7 +197,7 @@ </histogram> <histogram name="DevTools.IssuesPanelResourceOpened" - enum="DevToolsIssuesPanelResourceOpened" expires_after="2023-03-05"> + enum="DevToolsIssuesPanelResourceOpened" expires_after="2024-03-05"> <owner>yangguo@chromium.org</owner> <owner>dsv@chromium.org</owner> <summary> @@ -218,7 +218,7 @@ </histogram> <histogram name="DevTools.KeyboardShortcutFired" - enum="DevToolsKeyboardShortcutAction" expires_after="2023-06-18"> + enum="DevToolsKeyboardShortcutAction" expires_after="2023-08-20"> <owner>yangguo@chromium.org</owner> <owner>jalyn@microsoft.com</owner> <owner>leo.lee@microsoft.com</owner> @@ -372,7 +372,7 @@ </histogram> <histogram name="DevTools.RecordingReplayFinished" - enum="DevToolsRecordingReplayFinished" expires_after="2023-06-18"> + enum="DevToolsRecordingReplayFinished" expires_after="2023-08-20"> <owner>alexrudenko@chromium.org</owner> <owner>mathias@chromium.org</owner> <owner>yangguo@chromium.org</owner> @@ -392,7 +392,7 @@ </histogram> <histogram name="DevTools.RecordingReplayStarted" - enum="DevToolsRecordingReplayStarted" expires_after="2023-06-18"> + enum="DevToolsRecordingReplayStarted" expires_after="2023-08-20"> <owner>alexrudenko@chromium.org</owner> <owner>mathias@chromium.org</owner> <owner>yangguo@chromium.org</owner> @@ -400,7 +400,7 @@ </histogram> <histogram name="DevTools.RecordingToggled" enum="DevToolsRecordingToggled" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>alexrudenko@chromium.org</owner> <owner>mathias@chromium.org</owner> <owner>yangguo@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/download/histograms.xml b/tools/metrics/histograms/metadata/download/histograms.xml index 9e8ac49..ebd86d1 100644 --- a/tools/metrics/histograms/metadata/download/histograms.xml +++ b/tools/metrics/histograms/metadata/download/histograms.xml
@@ -111,7 +111,7 @@ </histogram> <histogram name="Download.Bubble.LoadAndSetIconLatency" units="ms" - expires_after="2023-06-21"> + expires_after="2023-08-20"> <owner>chlily@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -172,7 +172,7 @@ </histogram> <histogram name="Download.Bubble.SubpageAction" - enum="DownloadBubbleSubpageAction" expires_after="2023-06-18"> + enum="DownloadBubbleSubpageAction" expires_after="2023-08-20"> <owner>drubery@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -277,7 +277,7 @@ </histogram> <histogram base="true" name="Download.Counts" enum="DownloadCountType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <!-- Name completed by histogram_suffixes name="DownloadSource" --> <owner>shaktisahu@chromium.org</owner> @@ -828,7 +828,7 @@ </histogram> <histogram name="Download.OpenDownloads.PerProfileType" - enum="BrowserProfileType" expires_after="2023-06-18"> + enum="BrowserProfileType" expires_after="2023-08-20"> <owner>sideyilmaz@chromium.org</owner> <owner>chrome-incognito@google.com</owner> <summary> @@ -839,7 +839,7 @@ </histogram> <histogram name="Download.OpenDownloadsFromMenu.PerProfileType" - enum="BrowserProfileType" expires_after="2023-06-18"> + enum="BrowserProfileType" expires_after="2023-08-20"> <owner>sideyilmaz@chromium.org</owner> <owner>chrome-incognito@google.com</owner> <summary> @@ -1349,7 +1349,7 @@ </histogram> <histogram name="Download.Shelf.DragInfo" enum="Download.DragInfo" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>thefrog@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1359,7 +1359,7 @@ </histogram> <histogram name="Download.Shelf.VisibleTime" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1370,7 +1370,7 @@ </histogram> <histogram name="Download.ShelfContextMenuAction" - enum="DownloadShelfContextMenuAction" expires_after="2023-06-18"> + enum="DownloadShelfContextMenuAction" expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1431,7 +1431,7 @@ </histogram> <histogram name="Download.Start.ContentType.NormalProfile" - enum="DownloadContentType" expires_after="2023-06-18"> + enum="DownloadContentType" expires_after="2023-08-20"> <owner>shaktisahu@chromium.org</owner> <owner>clank-downloads@google.com</owner> <summary> @@ -1443,7 +1443,7 @@ </histogram> <histogram name="Download.Start.PerProfileType" enum="BrowserProfileType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>sideyilmaz@chromium.org</owner> <owner>chrome-incognito@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/event/histograms.xml b/tools/metrics/histograms/metadata/event/histograms.xml index 35b9910..eee928b 100644 --- a/tools/metrics/histograms/metadata/event/histograms.xml +++ b/tools/metrics/histograms/metadata/event/histograms.xml
@@ -95,7 +95,7 @@ <histogram name="Event.DownEventCount.PerInputFormFactorDestinationCombination2" enum="DownEventInputFormFactorDestinationCombination2" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>tbuckley@chromium.org</owner> <summary> The number of down events received per destination, input and form factor @@ -249,7 +249,7 @@ </histogram> <histogram name="Event.Jank.ScrollUpdate.TotalJankyAndNonJankyDuration2" - enum="JankyBoolean" expires_after="2023-06-18"> + enum="JankyBoolean" expires_after="2023-08-20"> <owner>nuskos@google.com</owner> <owner>woa-performance@google.com</owner> <summary> @@ -263,7 +263,7 @@ </histogram> <histogram name="Event.Latency.EndToEnd.KeyPress" units="microseconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>flackr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -302,7 +302,7 @@ </histogram> <histogram name="Event.Latency.EndToEnd.TouchpadPinch2" units="microseconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>nzolghadr@chromium.org</owner> <owner>input-dev@chromium.org</owner> <summary> @@ -315,7 +315,7 @@ </histogram> <histogram name="Event.Latency.HitTest" units="microseconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>pdr@chromium.org</owner> <owner>paint-dev@chromium.org</owner> <summary> @@ -334,7 +334,7 @@ </histogram> <histogram name="Event.Latency.HitTestRecursive" units="microseconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>pdr@chromium.org</owner> <owner>paint-dev@chromium.org</owner> <summary> @@ -407,7 +407,7 @@ </histogram> <histogram name="Event.Latency.ScrollBegin.TimeToScrollUpdateSwapBegin2" - units="microseconds" expires_after="2023-06-18"> + units="microseconds" expires_after="2023-08-20"> <owner>nzolghadr@chromium.org</owner> <summary> NOTE: This metric is deprecated in favor of @@ -543,7 +543,7 @@ </histogram> <histogram name="Event.Latency.ScrollJank" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ddrone@google.com</owner> <owner>chrometto-team@google.com</owner> <summary> @@ -575,7 +575,7 @@ </histogram> <histogram name="Event.Latency.ScrollUpdate.JankyEvents" units="counts" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ddrone@google.com</owner> <owner>chrometto-team@google.com</owner> <summary> @@ -630,7 +630,7 @@ </histogram> <histogram name="Event.Latency.ScrollUpdate.TotalDuration" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ddrone@google.com</owner> <owner>chrometto-team@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml index a06b6c8e..d00aa756 100644 --- a/tools/metrics/histograms/metadata/extensions/histograms.xml +++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -741,7 +741,7 @@ </histogram> <histogram name="Extensions.DeclarativeNetRequest.ManifestEnabledRulesCount2" - units="rules" expires_after="2023-06-18"> + units="rules" expires_after="2023-08-20"> <owner>kelvinjiang@chromium.org</owner> <owner>src/extensions/OWNERS</owner> <summary> @@ -3988,7 +3988,7 @@ </histogram> <histogram name="Extensions.ServiceWorkerBackground.StartWorkerStatus" - enum="Boolean" expires_after="2023-06-18"> + enum="Boolean" expires_after="2023-08-20"> <owner>lazyboy@chromium.org</owner> <owner>dbertoni@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/file/histograms.xml b/tools/metrics/histograms/metadata/file/histograms.xml index b2f6b60..95cef43f6 100644 --- a/tools/metrics/histograms/metadata/file/histograms.xml +++ b/tools/metrics/histograms/metadata/file/histograms.xml
@@ -241,7 +241,7 @@ </histogram> <histogram name="FileBrowser.DirectoryScan" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>simmonsjosh@google.com</owner> <owner>src/ui/file_manager/OWNERS</owner> <summary> @@ -283,7 +283,7 @@ </histogram> <histogram name="FileBrowser.Downloads.DirectoryPercentageOfDiskUsage" - units="%" expires_after="2023-06-18"> + units="%" expires_after="2023-08-20"> <owner>simmonsjosh@google.com</owner> <owner>src/ui/file_manager/OWNERS</owner> <summary> @@ -294,7 +294,7 @@ </histogram> <histogram name="FileBrowser.Downloads.DirectorySizeMiB" units="MiB" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>simmonsjosh@google.com</owner> <owner>src/ui/file_manager/OWNERS</owner> <summary> @@ -544,7 +544,7 @@ </histogram> <histogram name="FileBrowser.Location.OnEntrySelected.TopLevel" - enum="FileManagerRootType" expires_after="2023-06-18"> + enum="FileManagerRootType" expires_after="2023-08-20"> <owner>simmonsjosh@google.com</owner> <owner>src/ui/file_manager/OWNERS</owner> <summary> @@ -703,7 +703,7 @@ </histogram> <histogram name="FileBrowser.OfficeFiles.UseOutsideDrive" - enum="OfficeFilesUseOutsideDriveHook" expires_after="2023-06-18"> + enum="OfficeFilesUseOutsideDriveHook" expires_after="2023-08-20"> <owner>cassycc@google.com</owner> <owner>src/ui/file_manager/OWNERS</owner> <summary> @@ -714,7 +714,7 @@ </histogram> <histogram name="FileBrowser.OpenFiles.RootType" enum="FileManagerRootType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>simmonsjosh@google.com</owner> <owner>src/ui/file_manager/OWNERS</owner> <summary> @@ -761,7 +761,7 @@ </histogram> <histogram name="FileBrowser.Recent.FilterByType" - enum="FileManagerRecentFilterType" expires_after="2023-06-18"> + enum="FileManagerRecentFilterType" expires_after="2023-08-20"> <owner>simmonsjosh@google.com</owner> <owner>src/ui/file_manager/OWNERS</owner> <summary> @@ -1020,7 +1020,7 @@ </histogram> <histogram name="FileBrowser.VolumeType" enum="FileManagerVolumeType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>simmonsjosh@google.com</owner> <owner>src/ui/file_manager/OWNERS</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/fingerprint/histograms.xml b/tools/metrics/histograms/metadata/fingerprint/histograms.xml index 7a7e964..7f5dbccb 100644 --- a/tools/metrics/histograms/metadata/fingerprint/histograms.xml +++ b/tools/metrics/histograms/metadata/fingerprint/histograms.xml
@@ -36,7 +36,7 @@ </histogram> <histogram name="Fingerprint.Auth.ScanResult" enum="FingerprintScanResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>emaamari@google.com</owner> <owner>tomhughes@chromium.org</owner> <owner>cros-lurs@google.com</owner> @@ -90,7 +90,7 @@ </histogram> <histogram name="Fingerprint.FingerprintPowerButtonRace" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>emaamari@google.com</owner> <owner>chromeos-commercial-identity@google.com</owner> <owner>chromeos-fingerprint@google.com</owner> @@ -319,7 +319,7 @@ </histogram> <histogram name="Fingerprint.Unlock.Result" enum="FingerprintUnlockResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>emaamari@google.com</owner> <owner>tomhughes@chromium.org</owner> <owner>cros-lurs@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/geolocation/histograms.xml b/tools/metrics/histograms/metadata/geolocation/histograms.xml index f90a4c0..b05ef57 100644 --- a/tools/metrics/histograms/metadata/geolocation/histograms.xml +++ b/tools/metrics/histograms/metadata/geolocation/histograms.xml
@@ -98,7 +98,7 @@ </histogram> <histogram name="Geolocation.NetworkLocationRequest.Event" - enum="NetworkLocationRequestEvent" expires_after="2023-06-18"> + enum="NetworkLocationRequestEvent" expires_after="2023-08-20"> <owner>mattreynolds@chromium.org</owner> <owner>device-dev@chromium.org</owner> <summary> @@ -117,7 +117,7 @@ </histogram> <histogram name="Geolocation.NetworkLocationRequest.ResponseCode" - enum="HttpResponseCode" expires_after="2023-06-18"> + enum="HttpResponseCode" expires_after="2023-08-20"> <owner>mattreynolds@chromium.org</owner> <owner>device-dev@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/gpu/histograms.xml b/tools/metrics/histograms/metadata/gpu/histograms.xml index 2a0a97a..04e78ab 100644 --- a/tools/metrics/histograms/metadata/gpu/histograms.xml +++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -425,7 +425,7 @@ </histogram> <histogram name="GPU.D3D11FeatureLevel" enum="D3D11FeatureLevel" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>zmo@chromium.org</owner> <owner>graphics-dev@chromium.org</owner> <summary> @@ -435,7 +435,7 @@ </histogram> <histogram name="GPU.D3D12FeatureLevel" enum="D3D12FeatureLevel" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>magchen@chromium.org</owner> <owner>zmo@chromium.org</owner> <summary> @@ -445,7 +445,7 @@ </histogram> <histogram name="GPU.D3D12HighestShaderModel2" enum="D3DShaderModel" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>magchen@chromium.org</owner> <owner>zmo@chromium.org</owner> <owner>amaiorano@google.com</owner> @@ -526,7 +526,7 @@ </histogram> <histogram name="GPU.DirectComposition.DCLayerResult.Texture" - enum="DCLayerResult" expires_after="2023-06-15"> + enum="DCLayerResult" expires_after="2023-08-20"> <owner>sunnyps@chromium.org</owner> <owner>zmo@chromium.org</owner> <summary> @@ -569,7 +569,7 @@ </histogram> <histogram name="GPU.DirectComposition.IsUnderlay" enum="BooleanUnderlay" - expires_after="2023-06-15"> + expires_after="2023-08-20"> <owner>magchen@chromium.org</owner> <owner>zmo@chromium.org</owner> <summary> @@ -638,7 +638,7 @@ </histogram> <histogram name="GPU.DirectComposition.VideoPresentationMode" - enum="DirectCompositionVideoPresentationMode" expires_after="2023-06-15"> + enum="DirectCompositionVideoPresentationMode" expires_after="2023-08-20"> <owner>sunnyps@chromium.org</owner> <owner>zmo@chromium.org</owner> <owner>magchen@chromium.org</owner> @@ -768,7 +768,7 @@ </summary> </histogram> -<histogram name="GPU.GpuCount" units="gpus" expires_after="2023-06-18"> +<histogram name="GPU.GpuCount" units="gpus" expires_after="2023-08-20"> <owner>zmo@chromium.org</owner> <owner>graphics-dev@chromium.org</owner> <summary> @@ -915,7 +915,7 @@ </histogram> <histogram name="GPU.IOSurface.CATransactionTimeUs" units="microseconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>magchen@chromium.org</owner> <owner>ccameron@chromium.org</owner> <summary> @@ -950,7 +950,7 @@ </histogram> <histogram name="Gpu.Mac.BackpressureUs" units="microseconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>magchen@chromium.org</owner> <owner>ccameron@chromium.org</owner> <summary> @@ -970,7 +970,7 @@ </histogram> <histogram name="Gpu.Metal.ReadWriteTextureSupport" - enum="MetalReadWriteTextureSupportTier" expires_after="2023-06-18"> + enum="MetalReadWriteTextureSupportTier" expires_after="2023-08-20"> <owner>cwallez@chromium.org</owner> <owner>graphics-dev@chromium.org</owner> <summary> @@ -1084,7 +1084,7 @@ </histogram> <histogram name="Gpu.OutputSurface.ScheduleOverlaysUs" units="microseconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>magchen@chromium.org</owner> <owner>ccameron@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/history/histograms.xml b/tools/metrics/histograms/metadata/history/histograms.xml index 42e54fac..1a25208 100644 --- a/tools/metrics/histograms/metadata/history/histograms.xml +++ b/tools/metrics/histograms/metadata/history/histograms.xml
@@ -1139,7 +1139,7 @@ </histogram> <histogram name="History.Clusters.Backend.QueryAnnotatedVisits.ThreadTime" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>sophiechang@chromium.org</owner> <owner>chrome-journeys@google.com</owner> <component>UI>Browser>Journeys</component> @@ -1440,7 +1440,7 @@ </histogram> <histogram name="History.Clusters.JourneysEligibleAndEnabledAtSessionStart" - units="BooleanEnabled" expires_after="2023-06-18"> + units="BooleanEnabled" expires_after="2023-08-20"> <owner>sophiechang@chromium.org</owner> <owner>chrome-journeys@google.com</owner> <component>UI>Browser>Journeys</component> @@ -1477,7 +1477,7 @@ </histogram> <histogram name="History.Clusters.KeywordCache.ThreadTime" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>tommycli@chromium.org</owner> <owner>chrome-journeys@google.com</owner> <component>UI>Browser>Journeys</component> @@ -1490,7 +1490,7 @@ </histogram> <histogram name="History.Clusters.ProcessClustersDuration" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>olivierli@chromium.org</owner> <owner>tommycli@chromium.org</owner> <component>UI>Browser>Journeys</component> @@ -1689,7 +1689,7 @@ </histogram> <histogram name="History.Clusters.WebUISessionDuration" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>tommycli@chromium.org</owner> <owner>chrome-journeys@google.com</owner> <component>UI>Browser>Journeys</component> @@ -2154,7 +2154,7 @@ </histogram> <histogram name="History.InMemoryURLIndexingTime.RoundTripTime" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>tommycli@chromium.org</owner> <owner>mpearson@chromium.org</owner> <component>UI>Browser>History</component> @@ -2461,7 +2461,7 @@ </histogram> <histogram name="History.VisitTableCount" units="visits" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>mpearson@chromium.org</owner> <owner>sky@chromium.org</owner> <component>UI>Browser>History</component>
diff --git a/tools/metrics/histograms/metadata/input/histograms.xml b/tools/metrics/histograms/metadata/input/histograms.xml index 4c30af2f..a99a614 100644 --- a/tools/metrics/histograms/metadata/input/histograms.xml +++ b/tools/metrics/histograms/metadata/input/histograms.xml
@@ -38,7 +38,7 @@ </histogram> <histogram name="InputMethod.Assistive.Autocorrect.Actions" - enum="IMEAutocorrectActions" expires_after="2023-06-18"> + enum="IMEAutocorrectActions" expires_after="2023-08-20"> <owner>jopalmer@google.com</owner> <owner>essential-inputs-team@google.com</owner> <summary> @@ -58,7 +58,7 @@ </histogram> <histogram name="InputMethod.Assistive.Autocorrect.Count" - enum="IMETextInputClient" expires_after="2023-06-18"> + enum="IMETextInputClient" expires_after="2023-08-20"> <owner>myy@google.com</owner> <owner>essential-inputs-team@google.com</owner> <summary> @@ -491,7 +491,7 @@ </histogram> <histogram name="InputMethod.Assistive.Disabled" enum="IMEAssistiveAction" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jiwan@google.com</owner> <owner>essential-inputs-team@google.com</owner> <summary> @@ -562,7 +562,7 @@ </histogram> <histogram name="InputMethod.Assistive.Grammar.Actions" - enum="IMEGrammarActions" expires_after="2023-06-18"> + enum="IMEGrammarActions" expires_after="2023-08-20"> <owner>jiwan@google.com</owner> <owner>essential-inputs-team@google.com</owner> <summary> @@ -586,7 +586,7 @@ </histogram> <histogram name="InputMethod.Assistive.Grammar.Count" enum="IMETextInputClient" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>curtismcmullan@google.com</owner> <owner>essential-inputs-team@google.com</owner> <summary> @@ -659,7 +659,7 @@ </histogram> <histogram name="InputMethod.Assistive.MultiWord.InputState" - enum="IMEAssistiveTextInputState" expires_after="2023-06-18"> + enum="IMEAssistiveTextInputState" expires_after="2023-08-20"> <owner>curtismcmullan@google.com</owner> <owner>essential-inputs-team@google.com</owner> <summary> @@ -729,7 +729,7 @@ </histogram> <histogram name="InputMethod.Assistive.Success" enum="IMEAssistiveAction" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jiwan@google.com</owner> <owner>essential-inputs-team@google.com</owner> <summary> @@ -1005,7 +1005,7 @@ </histogram> <histogram name="InputMethod.Handwriting.LanguageModelLoadTime" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>curtismcmullan@chromium.org</owner> <owner>essential-inputs-team@google.com</owner> <summary> @@ -1016,7 +1016,7 @@ </histogram> <histogram name="InputMethod.Handwriting.LanguagePackState" - enum="LanguagePackState" expires_after="2023-06-18"> + enum="LanguagePackState" expires_after="2023-08-20"> <owner>curtismcmullan@chromium.org</owner> <owner>essential-inputs-team@google.com</owner> <summary> @@ -1262,7 +1262,7 @@ </histogram> <histogram name="InputMethod.SessionDuration" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>keithlee@chromium.org</owner> <owner>essential-inputs-team@google.com</owner> <summary> @@ -1336,7 +1336,7 @@ </histogram> <histogram name="InputMethod.VirtualKeyboard.BackspaceCount" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>shend@chromium.org</owner> <owner>essential-inputs-team@google.com</owner> <summary> @@ -1576,7 +1576,7 @@ </histogram> <histogram name="InputMethod.VirtualKeyboard.Layout" enum="IMEVKLayout" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>shend@chromium.org</owner> <owner>essential-inputs-team@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/installer/histograms.xml b/tools/metrics/histograms/metadata/installer/histograms.xml index eda588e9..2241bd0 100644 --- a/tools/metrics/histograms/metadata/installer/histograms.xml +++ b/tools/metrics/histograms/metadata/installer/histograms.xml
@@ -161,7 +161,7 @@ </histogram> <histogram name="Installer.PowerwashDays" units="powerwashdays" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>qianwan@google.com</owner> <owner>chromeos-data@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/kiosk/histograms.xml b/tools/metrics/histograms/metadata/kiosk/histograms.xml index 3343a022..1a77c1f 100644 --- a/tools/metrics/histograms/metadata/kiosk/histograms.xml +++ b/tools/metrics/histograms/metadata/kiosk/histograms.xml
@@ -173,14 +173,14 @@ </histogram> <histogram name="Kiosk.Launch.CryptohomeFailure" enum="LoginFailureReason" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xiyuan@chromium.org</owner> <owner>apotapchuk@chromium.org</owner> <summary>Tracks cryptohome failure during kiosk launch.</summary> </histogram> <histogram name="Kiosk.Launch.Error" enum="KioskLaunchError" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xiyuan@chromium.org</owner> <owner>apotapchuk@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/language/histograms.xml b/tools/metrics/histograms/metadata/language/histograms.xml index 93b190a8..5f6dc0a 100644 --- a/tools/metrics/histograms/metadata/language/histograms.xml +++ b/tools/metrics/histograms/metadata/language/histograms.xml
@@ -107,7 +107,7 @@ </histogram> <histogram name="LanguageSettings.AppLanguagePrompt.IsOnline" - enum="BooleanYesNo" expires_after="2023-06-18"> + enum="BooleanYesNo" expires_after="2023-08-20"> <owner>perrier@chromium.org</owner> <owner>chrome-language@google.com</owner> <summary> @@ -364,7 +364,7 @@ <histogram name="LanguageUsage.UI.Android.IsLocaleUpdated" enum="LanguageUsage.UI.Android.LocaleUpdateStatus" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>perrier@chromium.org</owner> <owner>chrome-language@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/login/histograms.xml b/tools/metrics/histograms/metadata/login/histograms.xml index 411e3dbd..bdf4e0f6 100644 --- a/tools/metrics/histograms/metadata/login/histograms.xml +++ b/tools/metrics/histograms/metadata/login/histograms.xml
@@ -51,7 +51,7 @@ </histogram> <histogram name="Login.ArcContinueBootImpulseStatus" - enum="ArcContinueBootImpulseStatus" expires_after="2023-06-18"> + enum="ArcContinueBootImpulseStatus" expires_after="2023-08-20"> <owner>vsomani@google.com</owner> <owner>arc-core@google.com</owner> <summary> @@ -191,7 +191,7 @@ </histogram> <histogram name="Login.NumberOfUsersOnLoginScreen" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>mslus@chromium.org</owner> <owner>chromeos-commercial-identity@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml index 5b36d16..3016fb9 100644 --- a/tools/metrics/histograms/metadata/media/histograms.xml +++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -154,7 +154,7 @@ </histogram> <histogram name="Media.AImageReaderGLOwner.HasFence" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>vasilyt@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -692,7 +692,7 @@ </histogram> <histogram name="Media.Audio.OutputDeviceMixer.MixedPlaybackStatus" - enum="AudioOutputDeviceMixerMixedPlaybackStatus" expires_after="2023-06-18"> + enum="AudioOutputDeviceMixerMixedPlaybackStatus" expires_after="2023-08-20"> <owner>olka@chromium.org</owner> <owner>tguilbert@chromium.org</owner> <owner>webrtc-audio-uma@google.com</owner> @@ -738,7 +738,7 @@ </histogram> <histogram name="Media.Audio.OutputDeviceMixer.OvertimeCount" units="count" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>olka@chromium.org</owner> <owner>saza@chromium.org</owner> <owner>tguilbert@chromium.org</owner> @@ -800,7 +800,7 @@ </histogram> <histogram name="Media.Audio.Processing.CaptureDelayMs" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>saza@google.com</owner> <owner>olka@chromium.org</owner> <owner>webrtc-audio-uma@google.com</owner> @@ -824,7 +824,7 @@ </histogram> <histogram name="Media.Audio.Processing.RenderDelayMs" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>saza@chromium.org</owner> <owner>olka@chromium.org</owner> <owner>webrtc-audio-uma@google.com</owner> @@ -859,7 +859,7 @@ </histogram> <histogram name="Media.Audio.Processing.TotalDelayVarianceMs" - units="ms squared" expires_after="2023-06-18"> + units="ms squared" expires_after="2023-08-20"> <owner>saza@chromium.org</owner> <owner>olka@chromium.org</owner> <owner>webrtc-audio-uma@google.com</owner> @@ -953,7 +953,7 @@ </histogram> <histogram name="Media.Audio.Render.OutputDeviceAuthorizationTimedOut" - enum="BooleanTimedOut" expires_after="2023-06-18"> + enum="BooleanTimedOut" expires_after="2023-08-20"> <owner>guidou@chromium.org</owner> <owner>olka@chromium.org</owner> <owner>webrtc-audio-uma@google.com</owner> @@ -964,7 +964,7 @@ </histogram> <histogram name="Media.Audio.Render.OutputDeviceStartTime2" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>dalecurtis@chromium.org</owner> <owner>olka@chromium.org</owner> <owner>tguilbert@chromium.org</owner> @@ -1314,7 +1314,7 @@ </histogram> <histogram name="Media.AudioOutputController.CallbackError" enum="BooleanError" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>olka@chromium.org</owner> <owner>guidou@chromium.org</owner> <owner>webrtc-audio-uma@google.com</owner> @@ -1340,7 +1340,7 @@ </histogram> <histogram name="Media.AudioOutputController.ProxyStreamCreationResult" - enum="AudioOutputStreamCreationResult" expires_after="2023-06-18"> + enum="AudioOutputStreamCreationResult" expires_after="2023-08-20"> <owner>guidou@chromium.org</owner> <owner>olka@chromium.org</owner> <owner>webrtc-audio-uma@google.com</owner> @@ -1355,7 +1355,7 @@ <histogram name="Media.AudioOutputController.ProxyStreamCreationResultForDeviceChange" - enum="AudioOutputStreamCreationResult" expires_after="2023-06-18"> + enum="AudioOutputStreamCreationResult" expires_after="2023-08-20"> <owner>guidou@chromium.org</owner> <owner>olka@chromium.org</owner> <owner>webrtc-audio-uma@google.com</owner> @@ -1461,7 +1461,7 @@ <histogram name="Media.AudioOutputResampler.OpenLowLatencyStream" enum="AudioOutputResamplerLowLatencyOpenStreamResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>olka@chromium.org</owner> <owner>armax@chromium.org</owner> <owner>guidou@chromium.org</owner> @@ -1663,7 +1663,7 @@ </histogram> <histogram name="Media.BreakoutBox.Usage" enum="BreakoutBoxUsage" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>guidou@chromium.org</owner> <owner>hta@chromium.org</owner> <owner>tguilbert@chromium.org</owner> @@ -1806,7 +1806,7 @@ </histogram> <histogram name="Media.Controls.Show.Audio" enum="MediaControlsShowReason" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>steimel@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -2389,7 +2389,7 @@ <histogram name="Media.EME.MediaFoundationService.Widevine.HardwareSecure.IsTypeSupported" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>xhwang@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -2511,7 +2511,7 @@ </histogram> <histogram name="Media.EME.Widevine.HardwareSecure.Support" - enum="BooleanSupported" expires_after="2023-08-13"> + enum="BooleanSupported" expires_after="2023-08-20"> <owner>xhwang@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -2793,7 +2793,7 @@ </histogram> <histogram name="Media.GlobalMediaControls.DeviceSelectorOpened" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>steimel@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -2816,7 +2816,7 @@ </histogram> <histogram name="Media.GlobalMediaControls.EntryPoint" - enum="GlobalMediaControlsEntryPoint" expires_after="2023-06-18"> + enum="GlobalMediaControlsEntryPoint" expires_after="2023-08-20"> <owner>takumif@chromium.org</owner> <owner>openscreen-eng@google.com</owner> <owner>media-dev@chromium.org</owner> @@ -3077,7 +3077,7 @@ </histogram> <histogram name="Media.InputStreamDurationWithoutCallback" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>olka@chromium.org</owner> <owner>henrika@chromium.org</owner> <owner>webrtc-audio-uma@google.com</owner> @@ -4313,7 +4313,7 @@ </histogram> <histogram name="Media.RtcLowLatencyVideoRenderer.AverageQueueLengthX10" - units="frames" expires_after="2023-06-18"> + units="frames" expires_after="2023-08-20"> <owner>kron@chromium.org</owner> <owner>webrtc-video@google.com</owner> <summary> @@ -4324,7 +4324,7 @@ </histogram> <histogram name="Media.RtcLowLatencyVideoRenderer.DrainedFramesPermille" - units="permille" expires_after="2023-06-18"> + units="permille" expires_after="2023-08-20"> <owner>kron@chromium.org</owner> <owner>webrtc-video@google.com</owner> <summary> @@ -4335,7 +4335,7 @@ </histogram> <histogram name="Media.RtcLowLatencyVideoRenderer.DroppedFramesPermille" - units="permille" expires_after="2023-06-18"> + units="permille" expires_after="2023-08-20"> <owner>kron@chromium.org</owner> <owner>webrtc-video@google.com</owner> <summary> @@ -4346,7 +4346,7 @@ </histogram> <histogram name="Media.RtcLowLatencyVideoRenderer.EnterDrainModeCount" - units="count" expires_after="2023-06-18"> + units="count" expires_after="2023-08-20"> <owner>kron@chromium.org</owner> <owner>webrtc-video@google.com</owner> <summary> @@ -4378,7 +4378,7 @@ </histogram> <histogram name="Media.RtcLowLatencyVideoRenderer.NoNewFrameToRenderPermille" - units="permille" expires_after="2023-06-18"> + units="permille" expires_after="2023-08-20"> <owner>kron@chromium.org</owner> <owner>webrtc-video@google.com</owner> <summary> @@ -4389,7 +4389,7 @@ </histogram> <histogram name="Media.RtcLowLatencyVideoRenderer.ReduceSteadyStateCount" - units="count" expires_after="2023-06-18"> + units="count" expires_after="2023-08-20"> <owner>kron@chromium.org</owner> <owner>webrtc-video@google.com</owner> <summary> @@ -4400,7 +4400,7 @@ </histogram> <histogram name="Media.RtcLowLatencyVideoRenderer.TotalFrames" units="frames" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>kron@chromium.org</owner> <owner>webrtc-video@google.com</owner> <summary> @@ -4600,7 +4600,7 @@ </histogram> <histogram name="Media.Session.Play" enum="MediaSessionActionSource" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>steimel@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -6260,7 +6260,7 @@ <histogram name="MediaRouter.CastStreaming.Start.Success.AccessCodeRememberedDevice" - enum="MirrorType" expires_after="2023-05-14"> + enum="MirrorType" expires_after="2023-08-20"> <owner>bzielinski@google.com</owner> <owner>cros-edu-eng@google.com</owner> <summary> @@ -6282,7 +6282,7 @@ </histogram> <histogram name="MediaRouter.Dial.CreateRoute" - enum="MediaRouterDialCreateRouteResult" expires_after="2023-06-18"> + enum="MediaRouterDialCreateRouteResult" expires_after="2023-08-20"> <owner>takumif@chromium.org</owner> <owner>mfoltz@chromium.org</owner> <owner>openscreen-eng@google.com</owner> @@ -6293,7 +6293,7 @@ </histogram> <histogram name="MediaRouter.Dial.FetchAppInfo" - enum="MediaRouterDialFetchAppInfoResult" expires_after="2023-06-18"> + enum="MediaRouterDialFetchAppInfoResult" expires_after="2023-08-20"> <owner>takumif@chromium.org</owner> <owner>mfoltz@chromium.org</owner> <owner>openscreen-eng@google.com</owner> @@ -6377,7 +6377,7 @@ </histogram> <histogram name="MediaRouter.Provider.CreateRoute.Result" - enum="MediaRouteProviderResult" expires_after="2023-06-18"> + enum="MediaRouteProviderResult" expires_after="2023-08-20"> <!-- Name completed by histogram_suffixes name="MediaRouteProvider" --> <owner>takumif@chromium.org</owner> @@ -6442,7 +6442,7 @@ </histogram> <histogram name="MediaRouter.RemotePlayback.SinkCapability.SupportedAudioCodec" - enum="AudioCodec" expires_after="2023-06-15"> + enum="AudioCodec" expires_after="2023-08-20"> <owner>muyaoxu@google.com</owner> <owner>openscreen-eng@google.com</owner> <summary> @@ -6454,7 +6454,7 @@ </histogram> <histogram name="MediaRouter.RemotePlayback.SinkCapability.SupportedVideoCodec" - enum="VideoCodec" expires_after="2023-06-15"> + enum="VideoCodec" expires_after="2023-08-20"> <owner>muyaoxu@google.com</owner> <owner>openscreen-eng@google.com</owner> <summary> @@ -6492,7 +6492,7 @@ </histogram> <histogram name="MediaRouter.RemotePlayback.SinkModelCompatibility" - enum="Boolean" expires_after="2023-06-15"> + enum="Boolean" expires_after="2023-08-20"> <owner>muyaoxu@google.com</owner> <owner>openscreen-eng@google.com</owner> <summary> @@ -6503,7 +6503,7 @@ </histogram> <histogram name="MediaRouter.Sink.SelectedType" enum="MediaSinkType" - expires_after="2023-08-13"> + expires_after="2023-08-20"> <owner>takumif@chromium.org</owner> <owner>openscreen-eng@google.com</owner> <summary> @@ -6597,7 +6597,7 @@ </histogram> <histogram name="MediaRouter.Ui.Device.Count" units="units" - expires_after="2023-08-13"> + expires_after="2023-08-20"> <owner>takumif@chromium.org</owner> <owner>openscreen-eng@google.com</owner> <summary> @@ -6671,7 +6671,7 @@ </histogram> <histogram name="MediaRouter.WiredDisplay.AvailableDevicesCount" units="units" - expires_after="2023-06-04"> + expires_after="2023-08-20"> <owner>takumif@chromium.org</owner> <owner>openscreen-eng@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/memory/histograms.xml b/tools/metrics/histograms/metadata/memory/histograms.xml index be66a9b9..6241e10b 100644 --- a/tools/metrics/histograms/metadata/memory/histograms.xml +++ b/tools/metrics/histograms/metadata/memory/histograms.xml
@@ -168,7 +168,7 @@ </histogram> <histogram name="HeapProfiling.SamplingIntervalKB" units="KB" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>joenotcharles@chromium.org</owner> <owner>chrome-memory@google.com</owner> <summary> @@ -1000,7 +1000,7 @@ </histogram> <histogram name="Memory.Experimental.Renderer.HighestPrivateMemoryFootprint" - units="MB" expires_after="2023-06-18"> + units="MB" expires_after="2023-08-20"> <owner>tasak@google.com</owner> <owner>bartekn@google.com</owner> <summary> @@ -1144,6 +1144,66 @@ </summary> </histogram> +<histogram + name="Memory.Experimental.UserLevelMemoryPressureSignal.TotalPrivateMemoryFootprintAfter" + units="MB" expires_after="2023-08-01"> + <owner>tasak@google.com</owner> + <owner>chrome-memory-tok@google.com</owner> + <summary> + The total private memory footprint 10 seconds after a user-level memory + pressure signal is generated. Recorded on Android. + </summary> +</histogram> + +<histogram + name="Memory.Experimental.UserLevelMemoryPressureSignal.TotalPrivateMemoryFootprintBefore" + units="MB" expires_after="2023-08-01"> + <owner>tasak@google.com</owner> + <owner>chrome-memory-tok@google.com</owner> + <summary> + The total private memory footprint right before a user-level memory pressure + signal is generated. Recorded on Android. + + This memory footprint metric cannot be compared across platforms because + each platform relies on platform-level APIs for accounting. As such, though + this attempts to measure private memory footprint as best as possible, it + does not measure the same thing on each platform. We have not found a good + way to compare any system level memory metric across platforms due to the + different nature of memory management on each platform. + </summary> +</histogram> + +<histogram + name="Memory.Experimental.UserLevelMemoryPressureSignal.TotalPrivateMemoryFootprintVisibleOrHigherPriorityRenderersAfter" + units="MB" expires_after="2023-08-01"> + <owner>tasak@google.com</owner> + <owner>chrome-memory-tok@google.com</owner> + <summary> + The total private memory footprint excluding lower priority renderers' 10 + seconds after a user-level memory pressure signal is generated. Recorded on + Android. + </summary> +</histogram> + +<histogram + name="Memory.Experimental.UserLevelMemoryPressureSignal.TotalPrivateMemoryFootprintVisibleOrHigherPriorityRenderersBefore" + units="MB" expires_after="2023-08-01"> + <owner>tasak@google.com</owner> + <owner>chrome-memory-tok@google.com</owner> + <summary> + The total private memory footprint excluding lower priority renderers' right + before a user-level memory pressure signal is generated. Recorded on + Android. + + This memory footprint metric cannot be compared across platforms because + each platform relies on platform-level APIs for accounting. As such, though + this attempts to measure private memory footprint as best as possible, it + does not measure the same thing on each platform. We have not found a good + way to compare any system level memory metric across platforms due to the + different nature of memory management on each platform. + </summary> +</histogram> + <histogram base="true" name="Memory.Experimental.Utility2" units="MB" expires_after="2024-01-10"> <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" --> @@ -1493,7 +1553,7 @@ </histogram> <histogram name="Memory.NetworkService.PrivateMemoryFootprint" units="MiB" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>mmenke@chromium.org</owner> <owner>morlovich@chromium.org</owner> <owner>erikchen@chromium.org</owner> @@ -1664,7 +1724,7 @@ </histogram> <histogram name="Memory.OOMKills.Count" units="kills" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>vovoy@google.com</owner> <owner>wvk@google.com</owner> <summary>Cumulative count of OOM kills in one user session.</summary> @@ -2186,7 +2246,7 @@ </histogram> <histogram name="Memory.PartitionAlloc.MemoryReclaim" units="microseconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>lizeb@chromium.org</owner> <owner>bartekn@chromium.org</owner> <summary> @@ -2377,7 +2437,7 @@ </histogram> <histogram name="Memory.RendererProcessCount" units="processes" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>creis@chromium.org</owner> <owner>nasko@chromium.org</owner> <summary> @@ -2466,7 +2526,7 @@ </histogram> <histogram name="Memory.RenderProcessHost.Percent.OriginAgentClusterOverhead" - units="%" expires_after="2023-06-18"> + units="%" expires_after="2023-08-20"> <owner>wjmaclean@chromium.org</owner> <owner>alexmos@chromium.org</owner> <owner>creis@chromium.org</owner> @@ -2638,7 +2698,7 @@ </histogram> <histogram name="Memory.Total.RendererPrivateMemoryFootprint" units="MB" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>tommckee@chromium.org</owner> <summary> A rough estimate of the private memory footprint of all renderer processes. @@ -2734,7 +2794,7 @@ </summary> </histogram> -<histogram name="Memory.Total.TileMemory" units="MB" expires_after="2023-06-18"> +<histogram name="Memory.Total.TileMemory" units="MB" expires_after="2023-08-20"> <owner>lizeb@chromium.org</owner> <owner>chrome-gpu-memory@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/mobile/histograms.xml b/tools/metrics/histograms/metadata/mobile/histograms.xml index 5e0c7576..3f332dff 100644 --- a/tools/metrics/histograms/metadata/mobile/histograms.xml +++ b/tools/metrics/histograms/metadata/mobile/histograms.xml
@@ -73,7 +73,7 @@ </histogram> <histogram name="Mobile.CanonicalURLResult" enum="CanonicalURLResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>pkl@chromium.org</owner> <owner>sebsg@chromium.org</owner> <owner>tedchoc@chromium.org</owner> @@ -1070,7 +1070,7 @@ </histogram> <histogram name="MobileOmnibox.PressedClipboardSuggestionAge" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jdonnelly@chromium.org</owner> <owner>mpearson@chromium.org</owner> <summary> @@ -1257,7 +1257,7 @@ </histogram> <histogram name="MobileStartup.LaunchType" enum="LaunchType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>tedchoc@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/navigation/histograms.xml b/tools/metrics/histograms/metadata/navigation/histograms.xml index 6024161e..c07b35d 100644 --- a/tools/metrics/histograms/metadata/navigation/histograms.xml +++ b/tools/metrics/histograms/metadata/navigation/histograms.xml
@@ -875,7 +875,7 @@ </histogram> <histogram name="Navigation.MainFrame.SiteEngagementLevel" - enum="SiteEngagementLevel" expires_after="2023-05-07"> + enum="SiteEngagementLevel" expires_after="2023-08-20"> <owner>meacer@chromium.org</owner> <owner>security-enamel@chromium.org</owner> <summary> @@ -885,7 +885,7 @@ </histogram> <histogram name="Navigation.MainFrame.ThirdPartyCookieBlockingEnabled" - enum="ThirdPartyCookieBlockState" expires_after="2023-06-18"> + enum="ThirdPartyCookieBlockState" expires_after="2023-08-20"> <owner>dullweber@chromium.org</owner> <owner>feuunk@chromium.org</owner> <summary> @@ -1301,7 +1301,7 @@ </histogram> <histogram name="Navigation.RequiresDedicatedProcess" - enum="NavigationRequiresDedicatedProcess" expires_after="2023-06-18"> + enum="NavigationRequiresDedicatedProcess" expires_after="2023-08-20"> <owner>alexmos@chromium.org</owner> <owner>lukasza@chromium.org</owner> <summary> @@ -1476,7 +1476,7 @@ <histogram name="NavigationSuggestion.GetDomainInfoDelayBeforeAllowingNavigation" - units="ms" expires_after="2023-06-15"> + units="ms" expires_after="2023-08-20"> <owner>meacer@chromium.org</owner> <owner>blundell@chromium.org</owner> <owner>security-enamel@chromium.org</owner> @@ -1492,7 +1492,7 @@ <histogram name="NavigationSuggestion.IsLookalikeUrlDelayBeforeAllowingNavigation" - units="ms" expires_after="2023-06-15"> + units="ms" expires_after="2023-08-20"> <owner>meacer@chromium.org</owner> <owner>blundell@chromium.org</owner> <owner>security-enamel@chromium.org</owner> @@ -1508,7 +1508,7 @@ <histogram name="NavigationSuggestion.PerformChecksDelayBeforeAllowingNavigation" - units="ms" expires_after="2023-06-15"> + units="ms" expires_after="2023-08-20"> <owner>meacer@chromium.org</owner> <owner>blundell@chromium.org</owner> <owner>security-enamel@chromium.org</owner> @@ -1637,7 +1637,7 @@ </histogram> <histogram name="Prerender.Experimental.PredictionStatus.DefaultSearchEngine" - enum="PrerenderPredictionStatus" expires_after="2023-06-18"> + enum="PrerenderPredictionStatus" expires_after="2023-08-20"> <owner>asamidoi@chromium.org</owner> <owner>chrome-prerendering@google.com</owner> <summary> @@ -1649,7 +1649,7 @@ </histogram> <histogram name="Prerender.Experimental.PredictionStatus.DirectUrlInput" - enum="PrerenderPredictionStatus" expires_after="2023-06-18"> + enum="PrerenderPredictionStatus" expires_after="2023-08-20"> <owner>asamidoi@chromium.org</owner> <owner>chrome-prerendering@google.com</owner> <summary> @@ -1739,7 +1739,7 @@ <histogram name="Prerender.Experimental.Search.FirstCorrectPrerenderHintReceivedToRealSearchNavigationStartedDuration" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>lingqi@chromium.org</owner> <owner>chrome-prerendering@google.com</owner> <summary> @@ -1785,7 +1785,7 @@ </histogram> <histogram name="Prerender.FinalStatus" enum="PrerenderFinalStatus" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ryansturm@chromium.org</owner> <owner>tbansal@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/nearby/histograms.xml b/tools/metrics/histograms/metadata/nearby/histograms.xml index 1cc0cc26..ce7639e 100644 --- a/tools/metrics/histograms/metadata/nearby/histograms.xml +++ b/tools/metrics/histograms/metadata/nearby/histograms.xml
@@ -500,7 +500,7 @@ </histogram> <histogram name="Nearby.Share.Certificates.Storage.InitializeSuccessDuration" - units="ms" expires_after="2023-06-04"> + units="ms" expires_after="2023-08-20"> <owner>crisrael@google.com</owner> <owner>nearby-share-chromeos-eng@google.com</owner> <summary> @@ -959,7 +959,7 @@ </histogram> <histogram name="Nearby.Share.Payload.Medium" enum="NearbyShareUpgradedMedium" - expires_after="2023-08-13"> + expires_after="2023-08-20"> <owner>pushi@google.com</owner> <owner>nearby-share-chromeos-eng@google.com</owner> <summary> @@ -1174,7 +1174,7 @@ </histogram> <histogram name="Nearby.Share.Transfer.Success" enum="BooleanSuccess" - expires_after="2023-08-13"> + expires_after="2023-08-20"> <owner>pushi@google.com</owner> <owner>nearby-share-chromeos-eng@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml index ce76c1c66..40e6c01 100644 --- a/tools/metrics/histograms/metadata/net/histograms.xml +++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -90,7 +90,7 @@ </histogram> <histogram name="HttpCache.CreateDiskEntry" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yhirano@chromium.org</owner> <owner>net-dev@chromium.org</owner> <summary> @@ -124,7 +124,7 @@ </summary> </histogram> -<histogram name="HttpCache.OpenDiskEntry" units="ms" expires_after="2023-06-18"> +<histogram name="HttpCache.OpenDiskEntry" units="ms" expires_after="2023-08-20"> <owner>yhirano@chromium.org</owner> <owner>net-dev@chromium.org</owner> <summary> @@ -543,7 +543,7 @@ </histogram> <histogram name="Net.ConnectionInfo.MainFrame" enum="ConnectionInfo" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>dschinazi@chromium.org</owner> <owner>src/net/OWNERS</owner> <summary> @@ -694,7 +694,7 @@ </histogram> <histogram name="Net.DNS.DnsConfig.Nsswitch.Compatible" enum="BooleanValid" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ericorth@chromium.org</owner> <owner>src/net/OWNERS</owner> <summary> @@ -2058,7 +2058,7 @@ </histogram> <histogram name="Net.OnTransferSizeUpdated.Experimental.OverridenBy" - enum="OnTransferSizeUpdatedFrom" expires_after="2023-06-18"> + enum="OnTransferSizeUpdatedFrom" expires_after="2023-08-20"> <owner>amanvr@chromium.org</owner> <owner>carlscab@chromium.org</owner> <owner>woa-performance@google.com</owner> @@ -2423,7 +2423,7 @@ </histogram> <histogram name="Net.QuicMultiPort.AltPortFailureWhenPathDegradingVsGeneral" - units="%" expires_after="2023-05-11"> + units="%" expires_after="2023-08-20"> <owner>renjietang@chromium.org</owner> <owner>src/net/quic/OWNERS</owner> <summary> @@ -2433,7 +2433,7 @@ </histogram> <histogram name="Net.QuicMultiPort.AltPortRttWhenPathDegradingVsGeneral" - units="%" expires_after="2023-05-11"> + units="%" expires_after="2023-08-20"> <owner>renjietang@chromium.org</owner> <owner>src/net/quic/OWNERS</owner> <summary> @@ -2443,7 +2443,7 @@ </histogram> <histogram name="Net.QuicMultiPort.NumDefaultPathDegrading" units="times" - expires_after="2023-05-11"> + expires_after="2023-08-20"> <owner>renjietang@chromium.org</owner> <owner>src/net/quic/OWNERS</owner> <summary> @@ -4476,7 +4476,7 @@ </histogram> <histogram name="Net.RestrictedCookieManager.PartitionedCookiesInScript" - units="cookies" expires_after="2023-06-18"> + units="cookies" expires_after="2023-08-20"> <owner>dylancutler@google.com</owner> <owner>src/net/cookies/OWNERS</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml index ee4f8faa..611c332 100644 --- a/tools/metrics/histograms/metadata/network/histograms.xml +++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -1505,7 +1505,7 @@ </histogram> <histogram name="Network.NetworkPortalSigninMode" - enum="NetworkPortalSigninMode" expires_after="2023-06-18"> + enum="NetworkPortalSigninMode" expires_after="2023-08-20"> <owner>stevenjb@chromium.org</owner> <owner>cros-network-health@google.com</owner> <summary> @@ -1969,7 +1969,7 @@ </histogram> <histogram name="Network.Shill.Ethernet.ExpiredLeaseLengthSeconds2" - units="seconds" expires_after="2023-06-11"> + units="seconds" expires_after="2023-08-20"> <owner>hugobenichi@google.com</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2287,7 +2287,7 @@ </histogram> <histogram name="Network.Shill.SuspendActionTimeTaken" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>matthewmwang@chromium.org</owner> <owner>stevenjb@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> @@ -2320,7 +2320,7 @@ </histogram> <histogram name="Network.Shill.Vpn.Ikev2.AuthenticationType" - enum="VPNIPsecAuthenticationType" expires_after="2023-06-04"> + enum="VPNIPsecAuthenticationType" expires_after="2023-08-20"> <owner>jiejiang@chromium.org</owner> <owner>cros-connectivity@google.com</owner> <owner>cros-network-metrics@google.com</owner> @@ -2331,7 +2331,7 @@ </histogram> <histogram name="Network.Shill.Vpn.Ikev2.EndReason" enum="NetworkServiceError" - expires_after="2023-06-11"> + expires_after="2023-08-20"> <owner>jiejiang@chromium.org</owner> <owner>cros-connectivity@google.com</owner> <owner>cros-network-metrics@google.com</owner> @@ -2542,7 +2542,7 @@ </histogram> <histogram name="Network.Shill.WiFi.AdapterAllowlisted" - enum="WiFiAdapterInAllowlist" expires_after="2023-06-18"> + enum="WiFiAdapterInAllowlist" expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2616,7 +2616,7 @@ </histogram> <histogram name="Network.Shill.WiFi.ApChannelSwitch" enum="WiFiApChannelSwitch" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>matthewmwang@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2626,7 +2626,7 @@ </histogram> <histogram name="Network.Shill.WiFi.ApDisconnectReason" enum="WiFiReasonCode" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2636,7 +2636,7 @@ </histogram> <histogram name="Network.Shill.WiFi.ApDisconnectType" enum="WiFiStatusType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2656,7 +2656,7 @@ </histogram> <histogram name="Network.Shill.WiFi.AssocFailureType" enum="WiFiStatusCode" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2723,7 +2723,7 @@ </histogram> <histogram name="Network.Shill.Wifi.Channel" enum="NetworkChannelType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2744,7 +2744,7 @@ </histogram> <histogram name="Network.Shill.WiFi.ClientDisconnectReason" - enum="WiFiReasonCode" expires_after="2023-06-18"> + enum="WiFiReasonCode" expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2754,7 +2754,7 @@ </histogram> <histogram name="Network.Shill.WiFi.ClientDisconnectType" enum="WiFiStatusType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2764,7 +2764,7 @@ </histogram> <histogram name="Network.Shill.WiFi.CQMNotification" - enum="WiFiCQMNotificationType" expires_after="2023-06-18"> + enum="WiFiCQMNotificationType" expires_after="2023-08-20"> <owner>kuabhs@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2776,7 +2776,7 @@ </histogram> <histogram name="Network.Shill.Wifi.DevicePresenceStatus" enum="BooleanPresent" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2786,7 +2786,7 @@ </histogram> <histogram name="Network.Shill.Wifi.Disconnect" enum="NetworkDisconnectType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2939,7 +2939,7 @@ </histogram> <histogram name="Network.Shill.Wifi.NetworkConnectionIPType" - enum="NetworkConnectionIPType" expires_after="2023-06-18"> + enum="NetworkConnectionIPType" expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2986,7 +2986,7 @@ </histogram> <histogram name="Network.Shill.Wifi.PortalResult" enum="NetworkPortalResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>matthewmwang@chromium.org</owner> <owner>stevenjb@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> @@ -3008,7 +3008,7 @@ </histogram> <histogram name="Network.Shill.WiFi.RememberedNetworkCount" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>matthewmwang@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3047,7 +3047,7 @@ </histogram> <histogram base="true" name="Network.Shill.WiFi.RoamComplete" - enum="WiFiRoamComplete" expires_after="2023-06-18"> + enum="WiFiRoamComplete" expires_after="2023-08-20"> <!-- Name completed by histogram_suffixes name="RoamSecurityType" --> <owner>matthewmwang@chromium.org</owner> @@ -3073,7 +3073,7 @@ </histogram> <histogram name="Network.Shill.WiFi.ScanResult" enum="WiFiScanResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3093,7 +3093,7 @@ </histogram> <histogram name="Network.Shill.Wifi.Security" enum="NetworkSecurityType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3116,7 +3116,7 @@ </histogram> <histogram name="Network.Shill.Wifi.ServiceErrors" enum="NetworkServiceError" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>kuabhs@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3156,7 +3156,7 @@ </histogram> <histogram name="Network.Shill.Wifi.SignalAtDisconnect" units="negative dBm" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>kuabhs@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3166,7 +3166,7 @@ </histogram> <histogram name="Network.Shill.Wifi.SignalStrength" units="negative dBm" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>kuabhs@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3205,7 +3205,7 @@ </histogram> <histogram name="Network.Shill.Wifi.TimeOnline" units="seconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3237,7 +3237,7 @@ </histogram> <histogram name="Network.Shill.Wifi.TimeToConnect" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3268,7 +3268,7 @@ </histogram> <histogram name="Network.Shill.Wifi.TimeToOnline" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3302,7 +3302,7 @@ </histogram> <histogram name="Network.Shill.Wifi.TimeToScan" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3312,7 +3312,7 @@ </histogram> <histogram name="Network.Shill.Wifi.TimeToScanAndConnect" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3324,7 +3324,7 @@ </histogram> <histogram name="Network.Shill.WiFi.TransmitBitrateMbps" units="Mbps" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3335,7 +3335,7 @@ </histogram> <histogram name="Network.Shill.Wifi.UnreliableLinkSignalStrength" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3358,7 +3358,7 @@ </histogram> <histogram name="Network.Shill.WiFi.UserInitiatedConnectionResult" - enum="ConnectionResult" expires_after="2023-06-18"> + enum="ConnectionResult" expires_after="2023-08-20"> <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3407,7 +3407,7 @@ </histogram> <histogram name="Network.Wifi.Synced.Connection.FailureReason" - enum="ConnectionFailureReason" expires_after="2023-06-18"> + enum="ConnectionFailureReason" expires_after="2023-08-20"> <owner>jonmann@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -3417,7 +3417,7 @@ </histogram> <histogram name="Network.Wifi.Synced.Connection.Result" enum="BooleanSuccess" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jonmann@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -3427,7 +3427,7 @@ </histogram> <histogram name="Network.Wifi.Synced.Hidden.Fixed" units="networks" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jonmann@chromium.org</owner> <owner>tnagel@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> @@ -3460,7 +3460,7 @@ </histogram> <histogram name="Network.Wifi.Synced.TotalCount" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jonmann@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml index c852fd6..8a9563ec 100644 --- a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml +++ b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
@@ -23,7 +23,7 @@ <histograms> <histogram name="NewTabPage.ActionAndroid2" enum="NewTabPageActionAndroid2" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>twellington@chromium.org</owner> <owner>finkm@chromium.org</owner> <summary> @@ -306,7 +306,7 @@ </histogram> <histogram name="NewTabPage.ConcretePage" enum="NewTabPageConcretePage" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>danpeng@google.com</owner> <owner>tiborg@chromium.org</owner> <owner>chrome-desktop-ntp@google.com</owner> @@ -317,7 +317,7 @@ </histogram> <histogram name="NewTabPage.ContentSuggestions.ArticlesListVisible" - enum="BooleanVisible" expires_after="2023-06-18"> + enum="BooleanVisible" expires_after="2023-08-20"> <owner>freedjm@chromium.org</owner> <owner>feed@chromium.org</owner> <summary> @@ -848,7 +848,7 @@ </histogram> <histogram name="NewTabPage.Customized" enum="NTPCustomizedFeatures" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>tiborg@chromium.org</owner> <owner>yyushkina@chromium.org</owner> <owner>chrome-desktop-ntp@google.com</owner> @@ -859,7 +859,7 @@ </histogram> <histogram name="NewTabPage.CustomizedShortcuts" - enum="NTPCustomizedShortcutSettings" expires_after="2023-06-18"> + enum="NTPCustomizedShortcutSettings" expires_after="2023-08-20"> <owner>tiborg@chromium.org</owner> <owner>yyushkina@chromium.org</owner> <owner>chrome-desktop-ntp@google.com</owner> @@ -883,7 +883,7 @@ </histogram> <histogram name="NewTabPage.CustomizeShortcutAction" - enum="NTPCustomizeShortcutAction" expires_after="2023-06-18"> + enum="NTPCustomizeShortcutAction" expires_after="2023-08-20"> <owner>tiborg@chromium.org</owner> <owner>yyushkina@chromium.org</owner> <owner>chrome-desktop-ntp@google.com</owner> @@ -1237,7 +1237,7 @@ </histogram> <histogram name="NewTabPage.Modules.FreOptOut" units="count" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>danpeng@google.com</owner> <owner>pauladedeji@chromium.org</owner> <owner>chrome-desktop-ntp@google.com</owner> @@ -1440,7 +1440,7 @@ </histogram> <histogram name="NewTabPage.MostVisitedMigratedDefaultAppType" - enum="TypeOfDeletedMostVisitedApp" expires_after="2023-06-18"> + enum="TypeOfDeletedMostVisitedApp" expires_after="2023-08-20"> <owner>dibyapal@chromium.org</owner> <owner>desktop-pwas-team@google.com</owner> <summary> @@ -2019,7 +2019,7 @@ </summary> </histogram> -<histogram name="NewTabPage.TimeSpent" units="ms" expires_after="2023-06-18"> +<histogram name="NewTabPage.TimeSpent" units="ms" expires_after="2023-08-20"> <owner>freedjm@chromium.org</owner> <owner>feed@chromium.org</owner> <owner>olivierrobin@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/notifications/histograms.xml b/tools/metrics/histograms/metadata/notifications/histograms.xml index 0a3ccb2..4e4ae5b8 100644 --- a/tools/metrics/histograms/metadata/notifications/histograms.xml +++ b/tools/metrics/histograms/metadata/notifications/histograms.xml
@@ -392,7 +392,7 @@ </histogram> <histogram name="Notifications.Database.ExpiredNotificationCount" - units="notifications" expires_after="2023-06-18"> + units="notifications" expires_after="2023-08-20"> <owner>knollr@chromium.org</owner> <owner>peter@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml index b21916697..8148b53 100644 --- a/tools/metrics/histograms/metadata/omnibox/histograms.xml +++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -140,7 +140,7 @@ </histogram> <histogram name="Omnibox.AnswerParseType" enum="SuggestionAnswerType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jdonnelly@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> <summary> @@ -480,7 +480,7 @@ </histogram> <histogram name="Omnibox.ClipboardSuggestionShownAge" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>gangwu@chromium.org</owner> <owner>jdonnelly@chromium.org</owner> <summary> @@ -498,7 +498,7 @@ </histogram> <histogram name="Omnibox.ClipboardSuggestionShownNumTimes" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>gangwu@chromium.org</owner> <owner>jdonnelly@chromium.org</owner> <summary> @@ -691,7 +691,7 @@ </histogram> <histogram name="Omnibox.EnteredKeywordMode2" enum="OmniboxEnteredKeywordMode2" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jdonnelly@chromium.org</owner> <owner>mpearson@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> @@ -1219,7 +1219,7 @@ </histogram> <histogram name="Omnibox.NumTypedTerms" units="terms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jdonnelly@chromium.org</owner> <owner>mpearson@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> @@ -1275,7 +1275,7 @@ </histogram> <histogram name="Omnibox.PedalShown" enum="SuggestionPedalType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jdonnelly@chromium.org</owner> <owner>orinj@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> @@ -1352,7 +1352,7 @@ </histogram> <histogram name="Omnibox.ResumeJourneyShown.ClusterKeywordType" - enum="HistoryClusterKeywordType" expires_after="2023-06-18"> + enum="HistoryClusterKeywordType" expires_after="2023-08-20"> <owner>junzou@chromium.org</owner> <owner>chrome-intelligence-core@google.com</owner> <summary> @@ -1369,7 +1369,7 @@ </histogram> <histogram name="Omnibox.ResumeJourneyShown.PageEntityCollection" - enum="OptimizationGuidePageEntityCollection" expires_after="2023-06-18"> + enum="OptimizationGuidePageEntityCollection" expires_after="2023-08-20"> <owner>junzou@chromium.org</owner> <owner>chrome-intelligence-core@google.com</owner> <summary> @@ -1416,7 +1416,7 @@ </histogram> <histogram name="Omnibox.RichAutocompletion.Triggered.Any" units="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>manukh@chromium.org</owner> <owner>jdonnelly@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> @@ -1466,7 +1466,7 @@ </histogram> <histogram name="Omnibox.SearchEngineType" enum="OmniboxSearchEngineType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jdonnelly@chromium.org</owner> <owner>mpearson@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> @@ -1508,7 +1508,7 @@ </histogram> <histogram name="Omnibox.SelectedPosition" units="position" - expires_after="2023-08-13"> + expires_after="2023-08-20"> <owner>jdonnelly@chromium.org</owner> <owner>mpearson@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> @@ -1528,7 +1528,7 @@ </histogram> <histogram name="Omnibox.Start.WantAsyncMatches" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>tommycli@chromium.org</owner> <owner>jdonnelly@chromium.org</owner> <summary> @@ -1580,7 +1580,7 @@ </histogram> <histogram name="Omnibox.SuggestionUsed.OfferedTabMatch" enum="BooleanOffered" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>gangwu@chromium.org</owner> <owner>mpearson@chromium.org</owner> <owner>jdonnelly@chromium.org</owner> @@ -1603,7 +1603,7 @@ </histogram> <histogram name="Omnibox.SuggestionUsed.Pedal" enum="SuggestionPedalType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jdonnelly@chromium.org</owner> <owner>orinj@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> @@ -1642,7 +1642,7 @@ </histogram> <histogram name="Omnibox.SuggestionUsed.ResumeJourney.ClusterKeywordScore" - units="count" expires_after="2023-06-18"> + units="count" expires_after="2023-08-20"> <owner>junzou@chromium.org</owner> <owner>chrome-intelligence-core@google.com</owner> <summary> @@ -1837,7 +1837,7 @@ </histogram> <histogram name="Omnibox.SuggestionUsed.ResumeJourneyCTR" - enum="BooleanSelected" expires_after="2023-06-18"> + enum="BooleanSelected" expires_after="2023-08-20"> <owner>tommycli@chromium.org</owner> <owner>chrome-journeys@google.com</owner> <summary> @@ -1858,7 +1858,7 @@ </histogram> <histogram name="Omnibox.SuggestionUsed.RichAutocompletion" - enum="OmniboxRichAutocompletionType" expires_after="2023-06-18"> + enum="OmniboxRichAutocompletionType" expires_after="2023-08-20"> <owner>manukh@chromium.org</owner> <owner>jdonnelly@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> @@ -1881,7 +1881,7 @@ <histogram name="Omnibox.SuggestionUsed.Search.Experimental.NavigationToFirstMeaningfulPaint" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>jdonnelly@chromium.org</owner> <owner>mpearson@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> @@ -1892,7 +1892,7 @@ </histogram> <histogram name="Omnibox.SuggestionUsed.Search.InputToNavigationStart" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>spelchat@chromium.org</owner> <owner>chrome-brapp-loading@google.com</owner> <owner>chrome-omnibox-team@google.com</owner> @@ -1946,7 +1946,7 @@ </histogram> <histogram name="Omnibox.SuggestionUsed.SelectedTabMatch" - enum="BooleanSelected" expires_after="2023-06-18"> + enum="BooleanSelected" expires_after="2023-08-20"> <owner>gangwu@chromium.org</owner> <owner>mpearson@chromium.org</owner> <owner>jdonnelly@chromium.org</owner> @@ -1987,7 +1987,7 @@ </histogram> <histogram name="Omnibox.SuggestionUsed.URL.InputToNavigationStart" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>spelchat@chromium.org</owner> <owner>chrome-brapp-loading@google.com</owner> <owner>chrome-omnibox-team@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/oobe/histograms.xml b/tools/metrics/histograms/metadata/oobe/histograms.xml index 49620447..e72ad88a 100644 --- a/tools/metrics/histograms/metadata/oobe/histograms.xml +++ b/tools/metrics/histograms/metadata/oobe/histograms.xml
@@ -307,7 +307,7 @@ </summary> </histogram> -<histogram name="OOBE.GaiaLoginTime" units="ms" expires_after="2023-06-18"> +<histogram name="OOBE.GaiaLoginTime" units="ms" expires_after="2023-08-20"> <owner>dkuzmin@google.com</owner> <owner>cros-oac@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml index 61a085c..5303d1d 100644 --- a/tools/metrics/histograms/metadata/optimization/histograms.xml +++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -230,7 +230,7 @@ <histogram name="OptimizationGuide.HintCacheLevelDBStore.Status" enum="OptimizationGuideHintCacheLevelDBStoreStatus" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>mcrouse@chromium.org</owner> <owner>sophiechang@chromium.org</owner> <summary> @@ -1441,7 +1441,7 @@ </histogram> <histogram name="OptimizationGuide.RemoteFetchingEnabled" enum="BooleanEnabled" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>sophiechang@chromium.org</owner> <owner>mcrouse@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index 8f83539..db5f980 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -224,7 +224,7 @@ </histogram> <histogram name="AccessCodeCast.Discovery.DeviceDurationOnRoute" - units="seconds" expires_after="2023-06-18"> + units="seconds" expires_after="2023-08-20"> <owner>bzielinski@google.com</owner> <owner>cros-edu-eng@google.com</owner> <summary> @@ -1294,7 +1294,7 @@ <histogram name="AutocompleteActionPredictor.NoStatePrefetchStatus" enum="AutocompleteActionPredictorPredictionStatus" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>spelchat@chromium.org</owner> <owner>chrome-brapp-loading@google.com</owner> <summary> @@ -1881,7 +1881,7 @@ </histogram> <histogram name="BrotliFilter.CompressionPercent" units="%" - expires_after="M115"> + expires_after="2023-08-20"> <owner>eustas@chromium.org</owner> <summary>Compressed/Decompressed size ratio.</summary> </histogram> @@ -1900,7 +1900,7 @@ </histogram> <histogram name="BrotliFilter.Status" enum="BrotliFilterDecodingStatus" - expires_after="M115"> + expires_after="2023-08-20"> <owner>eustas@chromium.org</owner> <summary> The final state of the BrotliFilter. Recorded during the decoding process as @@ -1910,7 +1910,8 @@ </summary> </histogram> -<histogram name="BrotliFilter.UsedMemoryKB" units="KiB" expires_after="M115"> +<histogram name="BrotliFilter.UsedMemoryKB" units="KiB" + expires_after="2023-08-20"> <owner>eustas@chromium.org</owner> <summary> Maximum amount of memory allocated to decode a Brotli-compressed response @@ -2897,7 +2898,7 @@ </histogram> <histogram name="ClientHints.AcceptCHFrame" enum="AcceptCHFrameRestart" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>aarontag@chromium.org</owner> <owner>miketaylr@chromium.org</owner> <summary> @@ -2909,7 +2910,7 @@ </histogram> <histogram name="ClientHints.CriticalCHRestart" enum="CriticalCHRestart" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>aarontag@chromium.org</owner> <owner>miketaylr@chromium.org</owner> <summary> @@ -3344,7 +3345,7 @@ </histogram> <histogram base="true" name="ContextMenu.SelectedOptionDesktop" - enum="ContextMenuOptionDesktop" expires_after="2023-06-18"> + enum="ContextMenuOptionDesktop" expires_after="2023-08-20"> <owner>avi@chromium.org</owner> <owner>mpearson@chromium.org</owner> <summary> @@ -3448,7 +3449,7 @@ </histogram> <histogram name="ContextMenu.URLClicked" enum="BooleanClicked" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>twellington@chromium.org</owner> <owner>clank-app-team@google.com</owner> <summary>Logged when the URL is clicked. Android only.</summary> @@ -4467,7 +4468,7 @@ </histogram> <histogram name="Crypto.TPMSupport2" enum="TPMSupport" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>agl@chromium.org</owner> <owner>davidben@chromium.org</owner> <owner>wfh@chromium.org</owner> @@ -4861,7 +4862,7 @@ </histogram> <histogram name="DisplayManager.InternalDisplayZoomPercentage" units="%" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>zentaro@chromium.org</owner> <owner>cros-peripherals@google.com</owner> <summary> @@ -4884,7 +4885,7 @@ </histogram> <histogram name="DisplayManager.MirroringImplementation" - enum="DisplayMirroringImplementation" expires_after="2023-06-18"> + enum="DisplayMirroringImplementation" expires_after="2023-08-20"> <owner>jshargo@chromium.org</owner> <owner>oshima@chromium.org</owner> <owner>chromeos-gfx-compositor@google.com</owner> @@ -4909,7 +4910,7 @@ </histogram> <histogram name="DisplayManager.MultiDisplayMode" enum="MultiDisplayModes" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>zentaro@chromium.org</owner> <owner>cros-peripherals@google.com</owner> <summary> @@ -5526,7 +5527,7 @@ </histogram> <histogram name="Eche.StreamEvent.ConnectionFail" enum="ConnectionFailReason" - expires_after="2023-06-11"> + expires_after="2023-08-20"> <owner>paulzchen@google.com</owner> <owner>andychou@google.com</owner> <owner>exo-core-eng@google.com</owner> @@ -6255,7 +6256,7 @@ </histogram> <histogram name="Feedback.RequestSource" enum="FeedbackSource" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>afakhry@chromium.org</owner> <owner>cros-telemetry@google.com</owner> <summary>Records the source that requested showing the feedback app.</summary> @@ -7730,7 +7731,7 @@ </histogram> <histogram name="Lens.Omnibox.LensSupportStatus" enum="LensSupportStatus" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yusuyoutube@google.com</owner> <owner>benwgold@google.com</owner> <owner>fgorski@chromium.org</owner> @@ -8476,7 +8477,7 @@ </histogram> <histogram name="Mouse.PointerSensitivity.Changed" enum="PointerSensitivity" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>zentaro@chromium.org</owner> <owner>cros-peripherals@google.com</owner> <summary> @@ -8969,7 +8970,7 @@ </histogram> <histogram name="OAuth2Login.SessionRestore" enum="GaiaSessionRestoreOutcome" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>anastasiian@chromium.org</owner> <owner>sinhak@chromium.org</owner> <summary>Outcome of Chrome OS GAIA cookie session restore process.</summary> @@ -10125,7 +10126,7 @@ </histogram> <histogram name="PrefetchedSignedExchangeCache.Count" units="count" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ksakamoto@chromium.org</owner> <owner>webpackage-dev@chromium.org</owner> <summary> @@ -10578,7 +10579,7 @@ </histogram> <histogram name="PushMessaging.UnregistrationReason" - enum="PushUnregistrationReason" expires_after="2023-06-18"> + enum="PushUnregistrationReason" expires_after="2023-08-20"> <owner>peter@chromium.org</owner> <owner>knollr@chromium.org</owner> <summary> @@ -11048,7 +11049,7 @@ </histogram> <histogram name="RenderTextHarfBuzz.GetFallbackFontsTime" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ccameron@chromium.org</owner> <owner>etienneb@chromium.org</owner> <summary> @@ -11462,7 +11463,7 @@ </histogram> <histogram name="SB2.DownloadUrlCheckDuration" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -12059,7 +12060,7 @@ </histogram> <histogram name="Servicification.Startup3" enum="ServicificationStartupMode" - expires_after="2023-05-07"> + expires_after="2023-08-20"> <owner>hanxi@chromium.org</owner> <owner>yfriedman@chromium.org</owner> <owner>hnakashima@chromium.org</owner> @@ -12553,7 +12554,7 @@ </histogram> <histogram name="SiteIsolatedCodeCache.JS.FetchCodeCache" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yhirano@chromium.org</owner> <owner>loading-dev@google.com</owner> <summary> @@ -13169,7 +13170,7 @@ </histogram> <histogram name="SubresourceWebBundles.ContentLength" units="bytes" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>horo@chromium.org</owner> <owner>webpackage-dev@chromium.org</owner> <summary> @@ -13190,14 +13191,14 @@ </histogram> <histogram name="SubresourceWebBundles.LoadResult" - enum="SubresourceWebBundleLoadResult" expires_after="2023-06-18"> + enum="SubresourceWebBundleLoadResult" expires_after="2023-08-20"> <owner>horo@chromium.org</owner> <owner>webpackage-dev@chromium.org</owner> <summary>The result of loading subresource web bundles.</summary> </histogram> <histogram name="SubresourceWebBundles.MaxMemoryUsagePerProcess" units="bytes" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>horo@chromium.org</owner> <owner>webpackage-dev@chromium.org</owner> <summary> @@ -13219,7 +13220,7 @@ </histogram> <histogram name="SubresourceWebBundles.ReceivedSize" units="bytes" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>horo@chromium.org</owner> <owner>webpackage-dev@chromium.org</owner> <summary> @@ -13229,7 +13230,7 @@ </histogram> <histogram name="SubresourceWebBundles.ResourceCount" units="resources" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ksakamoto@chromium.org</owner> <owner>webpackage-dev@chromium.org</owner> <summary> @@ -13754,7 +13755,7 @@ </histogram> <histogram name="Touchpad.HapticClickSensitivity.Changed" - enum="HapticClickSensitivity" expires_after="2023-06-18"> + enum="HapticClickSensitivity" expires_after="2023-08-20"> <owner>gavinwill@chromium.org</owner> <owner>cros-peripherals@chromium.org</owner> <summary> @@ -13964,7 +13965,7 @@ </histogram> <histogram name="Tracing.Background.FinalizationDisallowedReason" - enum="TracingFinalizationDisallowedReason" expires_after="2023-06-18"> + enum="TracingFinalizationDisallowedReason" expires_after="2023-08-20"> <owner>ssid@chromium.org</owner> <summary> Reason why background tracing finalization was not allowed. Also see @@ -13987,7 +13988,7 @@ </histogram> <histogram name="Tracing.Background.ScenarioState" - enum="BackgroundTracingState" expires_after="2023-06-18"> + enum="BackgroundTracingState" expires_after="2023-08-20"> <owner>oysteine@chromium.org</owner> <summary> Records state of the Background Tracing system, from when scenarios are @@ -14025,7 +14026,7 @@ </summary> </histogram> -<histogram name="UI.DeviceScale" units="%" expires_after="2023-06-18"> +<histogram name="UI.DeviceScale" units="%" expires_after="2023-08-20"> <owner>bsep@chromium.org</owner> <summary> The device scales available on the system at startup. A system may report @@ -14643,7 +14644,7 @@ </histogram> <histogram name="VoiceInteraction.FailureEventSource" - enum="VoiceInteractionEventSource" expires_after="2023-06-04"> + enum="VoiceInteractionEventSource" expires_after="2023-08-20"> <owner>basiaz@google.com</owner> <owner>chrome-language@google.com</owner> <summary> @@ -14655,7 +14656,7 @@ </histogram> <histogram name="VoiceInteraction.FailureEventTarget" enum="VoiceIntentTarget" - expires_after="2023-06-04"> + expires_after="2023-08-20"> <owner>basiaz@google.com</owner> <owner>chrome-language@google.com</owner> <summary> @@ -14938,7 +14939,7 @@ </histogram> <histogram name="WebFont.CacheHit" enum="WebFontCacheHit" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>hajimehoshi@chromium.org</owner> <owner>kenjibaheux@chromium.org</owner> <owner>kouhei@chromium.org</owner> @@ -14950,6 +14951,18 @@ </summary> </histogram> +<histogram name="WebFont.Clients.RenderBlockingFonts.ExpiredFonts" + units="fonts" expires_after="2023-05-31"> + <owner>xiaochengh@chromium.org</owner> + <owner>chrome-rendering-core@google.com</owner> + <summary> + Recorded when render-blocking web font preloads have reached the maximum + blocking time, and therefore, turned into non-render-blocking. Records the + number of web font preloads that are still pending. This is a diagnostic + metric for feature RenderBlockingFonts. + </summary> +</histogram> + <histogram name="WebFont.DownloadTime.0.Under10KB" units="ms" expires_after="2022-11-13"> <owner>kenjibaheux@chromium.org</owner> @@ -15402,7 +15415,7 @@ </histogram> <histogram name="WhatsNew.LoadEvent" enum="WhatsNewLoadEvent" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>rbpotter@chromium.org</owner> <owner>mahmadi@chromium.org</owner> <summary> @@ -15428,7 +15441,7 @@ </histogram> <histogram name="WhatsNew.StartupType" enum="WhatsNewStartupType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>rbpotter@chromium.org</owner> <owner>mahmadi@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml index 4cf4c597..0201fc5 100644 --- a/tools/metrics/histograms/metadata/page/histograms.xml +++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -421,7 +421,7 @@ </histogram> <histogram name="PageLoad.Clients.Ads.Resources.Bytes.Ads2" units="KB" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>johnidel@chromium.org</owner> <owner>jkarlin@chromium.org</owner> <summary> @@ -626,7 +626,7 @@ <histogram name="PageLoad.Clients.AMP.PaintTiming.InputToFirstContentfulPaint.Subframe" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>bmcquade@chromium.org</owner> <owner>sullivan@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> @@ -642,7 +642,7 @@ <histogram name="PageLoad.Clients.AMP.PaintTiming.InputToFirstContentfulPaint.Subframe.FullNavigation" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>bmcquade@chromium.org</owner> <owner>sullivan@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> @@ -657,7 +657,7 @@ <histogram name="PageLoad.Clients.AMP.PaintTiming.InputToLargestContentfulPaint.Subframe" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>bmcquade@chromium.org</owner> <owner>sullivan@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> @@ -1456,7 +1456,7 @@ </histogram> <histogram name="PageLoad.Cpu.TotalUsageForegrounded" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>alexmt@chromium.org</owner> <owner>johnidel@chromium.org</owner> <summary> @@ -1653,7 +1653,7 @@ </histogram> <histogram name="PageLoad.Experimental.InputTiming.InputToNavigationStart" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>spelchat@chromium.org</owner> <owner>chrome-brapp-loading@google.com</owner> <summary> @@ -1664,7 +1664,7 @@ <histogram name="PageLoad.Experimental.InputTiming.InputToNavigationStart.Background" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>spelchat@chromium.org</owner> <owner>chrome-brapp-loading@google.com</owner> <summary> @@ -2060,7 +2060,7 @@ </histogram> <histogram name="PageLoad.Experimental.TotalForegroundDuration" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>npm@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> <summary> @@ -2898,7 +2898,7 @@ </histogram> <histogram name="PageLoad.PaintTiming.NavigationToLargestContentfulPaint2" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>npm@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> <summary> @@ -2933,7 +2933,7 @@ <histogram name="PageLoad.PaintTiming.NavigationToLargestContentfulPaint2.MainFrame" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>npm@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> <summary> @@ -2969,7 +2969,7 @@ </histogram> <histogram name="PageLoad.PaintTiming.ParseStartToFirstContentfulPaint" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>bmcquade@chromium.org</owner> <owner>csharrison@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> @@ -3018,7 +3018,7 @@ </histogram> <histogram name="PageLoad.ParseTiming.ParseBlockedOnScriptLoad" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>bmcquade@chromium.org</owner> <owner>csharrison@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml index 1511204c..020f74e 100644 --- a/tools/metrics/histograms/metadata/password/histograms.xml +++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -158,7 +158,7 @@ </histogram> <histogram name="KeyboardAccessory.AccessorySheetSuggestionsSelected" - enum="AccessorySuggestionType" expires_after="2023-06-18"> + enum="AccessorySuggestionType" expires_after="2023-08-20"> <owner>fhorschig@chromium.org</owner> <owner>ioanap@chromium.org</owner> <summary> @@ -351,7 +351,7 @@ </histogram> <histogram name="PasswordGeneration.SubmissionEvent" - enum="PasswordSubmissionEvent" expires_after="2023-06-18"> + enum="PasswordSubmissionEvent" expires_after="2023-08-20"> <owner>kazinova@google.com</owner> <owner>kolos@chromium.org</owner> <summary> @@ -469,7 +469,7 @@ </histogram> <histogram name="PasswordManager.AccountStorage.MoveToAccountStoreFlowAccepted" - enum="PasswordManager.MoveToAccountStoreTrigger" expires_after="2023-06-18"> + enum="PasswordManager.MoveToAccountStoreTrigger" expires_after="2023-08-20"> <owner>treib@chromium.org</owner> <owner>victorvianna@google.com</owner> <owner>mamir@chromium.org</owner> @@ -482,7 +482,7 @@ </histogram> <histogram name="PasswordManager.AccountStorage.MoveToAccountStoreFlowOffered" - enum="PasswordManager.MoveToAccountStoreTrigger" expires_after="2023-06-18"> + enum="PasswordManager.MoveToAccountStoreTrigger" expires_after="2023-08-20"> <owner>treib@chromium.org</owner> <owner>victorvianna@google.com</owner> <owner>mamir@chromium.org</owner> @@ -494,7 +494,7 @@ </histogram> <histogram name="PasswordManager.AccountStorage.NumOptedInAccountsAfterOptIn" - units="accounts" expires_after="2023-06-18"> + units="accounts" expires_after="2023-08-20"> <owner>mamir@chromium.org</owner> <owner>treib@chromium.org</owner> <summary> @@ -505,7 +505,7 @@ </histogram> <histogram name="PasswordManager.AccountStorage.NumOptedInAccountsAfterOptOut" - units="accounts" expires_after="2023-06-18"> + units="accounts" expires_after="2023-08-20"> <owner>mamir@chromium.org</owner> <owner>treib@chromium.org</owner> <summary> @@ -565,7 +565,7 @@ </histogram> <histogram name="PasswordManager.AccountStoreBlocklistedEntriesAfterOptIn" - units="credentials" expires_after="2023-06-18"> + units="credentials" expires_after="2023-08-20"> <owner>treib@chromium.org</owner> <owner>mamir@chromium.org</owner> <summary> @@ -575,7 +575,7 @@ </histogram> <histogram name="PasswordManager.AccountStoreCredentialsAfterOptIn" - units="credentials" expires_after="2023-06-18"> + units="credentials" expires_after="2023-08-20"> <owner>treib@chromium.org</owner> <owner>mamir@chromium.org</owner> <summary> @@ -905,7 +905,7 @@ </histogram> <histogram name="PasswordManager.BiometricAuthBeforeFillingEnabled2" - enum="BooleanEnabled" expires_after="M115"> + enum="BooleanEnabled" expires_after="2023-08-20"> <owner>kazinova@google.com</owner> <owner>vsemeniuk@google.com</owner> <summary> @@ -1126,7 +1126,7 @@ </histogram> <histogram name="PasswordManager.CertificateErrorsWhileSeeingForms" - enum="PasswordCertificateError" expires_after="2023-06-18"> + enum="PasswordCertificateError" expires_after="2023-08-20"> <owner>battre@chromium.org</owner> <owner>kazinova@google.com</owner> <owner>chrome-password-manager-metrics-alerts@google.com</owner> @@ -1510,7 +1510,7 @@ </histogram> <histogram name="PasswordManager.FillingSource" - enum="PasswordManagerFillingSource" expires_after="2023-06-18"> + enum="PasswordManagerFillingSource" expires_after="2023-08-20"> <owner>mamir@chromium.org</owner> <owner>treib@chromium.org</owner> <summary> @@ -1936,7 +1936,7 @@ </histogram> <histogram name="PasswordManager.LeakDetection.IsPasswordReused" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>vasilii@chromium.org</owner> <owner>vsemeniuk@google.com</owner> <summary> @@ -2026,7 +2026,7 @@ </histogram> <histogram name="PasswordManager.LoginDatabaseInit2" - enum="LoginDatabaseInitError" expires_after="2023-04-30"> + enum="LoginDatabaseInitError" expires_after="2023-08-20"> <owner>vasilii@chromium.org</owner> <owner>mamir@chromium.org</owner> <summary> @@ -2176,7 +2176,7 @@ </histogram> <histogram name="PasswordManager.NonSyncPasswordHashChange" - enum="GaiaPasswordHashChange" expires_after="2023-06-18"> + enum="GaiaPasswordHashChange" expires_after="2023-08-20"> <owner>drubery@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -2368,7 +2368,7 @@ </histogram> <histogram name="PasswordManager.PasswordReuse.NumberOfMatches" - units="credentials" expires_after="2023-06-18"> + units="credentials" expires_after="2023-08-20"> <owner>vakh@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -2384,7 +2384,7 @@ </histogram> <histogram name="PasswordManager.PasswordReuse.PasswordFieldDetected" - enum="PasswordReusePasswordFieldDetected" expires_after="2023-06-18"> + enum="PasswordReusePasswordFieldDetected" expires_after="2023-08-20"> <owner>vakh@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -3197,7 +3197,7 @@ <histogram name="PasswordManager.SaveUIOnClearedPasswordChangeFormDismissalReason" - enum="PasswordManagerUIDismissalReason" expires_after="2023-06-18"> + enum="PasswordManagerUIDismissalReason" expires_after="2023-08-20"> <owner>kazinova@google.com</owner> <owner>khamutov@google.com</owner> <summary> @@ -3297,7 +3297,7 @@ </histogram> <histogram name="PasswordManager.StoresUsedForFillingInLast28Days" - enum="PasswordManagerFillingSource" expires_after="2023-06-18"> + enum="PasswordManagerFillingSource" expires_after="2023-08-20"> <owner>mamir@chromium.org</owner> <owner>treib@chromium.org</owner> <summary> @@ -3309,7 +3309,7 @@ </histogram> <histogram name="PasswordManager.StoresUsedForFillingInLast7Days" - enum="PasswordManagerFillingSource" expires_after="2023-06-18"> + enum="PasswordManagerFillingSource" expires_after="2023-08-20"> <owner>mamir@chromium.org</owner> <owner>treib@chromium.org</owner> <summary> @@ -3455,7 +3455,7 @@ </histogram> <histogram name="PasswordManager.SyncPasswordHashChange" - enum="GaiaPasswordHashChange" expires_after="2023-06-18"> + enum="GaiaPasswordHashChange" expires_after="2023-08-20"> <owner>drubery@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -3693,7 +3693,7 @@ </histogram> <histogram name="PasswordManager.UPMUpdateSignInCredentialsSucces" - enum="Boolean" expires_after="2023-06-18"> + enum="Boolean" expires_after="2023-08-20"> <owner>izuzic@google.com</owner> <owner>ioanap@chromium.org</owner> <summary> @@ -4109,7 +4109,7 @@ </histogram> <histogram name="PasswordProtection.PageInfoAction" - enum="PasswordProtectionWarningAction" expires_after="2023-06-18"> + enum="PasswordProtectionWarningAction" expires_after="2023-08-20"> <owner>drubery@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -4146,7 +4146,7 @@ </histogram> <histogram name="PasswordProtection.PasswordReuseSyncAccountType" - enum="PasswordProtectionSyncAccountType" expires_after="2023-06-18"> + enum="PasswordProtectionSyncAccountType" expires_after="2023-08-20"> <owner>nwokedi@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/payment/histograms.xml b/tools/metrics/histograms/metadata/payment/histograms.xml index aab8975..cc68d4d 100644 --- a/tools/metrics/histograms/metadata/payment/histograms.xml +++ b/tools/metrics/histograms/metadata/payment/histograms.xml
@@ -207,7 +207,7 @@ <histogram name="PaymentRequest.SecurePaymentConfirmation.Funnel.AuthenticationDialogResult" enum="SecurePaymentConfirmationAuthenticationDialogResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>rouslan@chromium.org</owner> <owner>web-payments-team@google.com</owner> <summary> @@ -222,7 +222,7 @@ <histogram name="PaymentRequest.SecurePaymentConfirmation.Funnel.EnrollSystemPromptResult" enum="SecurePaymentConfirmationEnrollSystemPromptResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>rouslan@chromium.org</owner> <owner>web-payments-team@google.com</owner> <summary> @@ -237,7 +237,7 @@ <histogram name="PaymentRequest.SecurePaymentConfirmation.Funnel.SystemPromptResult" enum="SecurePaymentConfirmationSystemPromptResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>rouslan@chromium.org</owner> <owner>web-payments-team@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/pdf/histograms.xml b/tools/metrics/histograms/metadata/pdf/histograms.xml index 4e326898..7adbc7d 100644 --- a/tools/metrics/histograms/metadata/pdf/histograms.xml +++ b/tools/metrics/histograms/metadata/pdf/histograms.xml
@@ -114,7 +114,7 @@ </summary> </histogram> -<histogram name="PDF.Version" enum="PDFVersion" expires_after="2023-06-18"> +<histogram name="PDF.Version" enum="PDFVersion" expires_after="2023-08-20"> <owner>dhoss@chromium.org</owner> <owner>thestig@chromium.org</owner> <summary>Tracks versions of documents opened in the PDF viewer.</summary>
diff --git a/tools/metrics/histograms/metadata/permissions/histograms.xml b/tools/metrics/histograms/metadata/permissions/histograms.xml index 85fe14e..4540550 100644 --- a/tools/metrics/histograms/metadata/permissions/histograms.xml +++ b/tools/metrics/histograms/metadata/permissions/histograms.xml
@@ -178,7 +178,7 @@ </histogram> <histogram name="Permissions.AutoBlocker.EmbargoStatus" - enum="PermissionEmbargoStatus" expires_after="2023-06-18"> + enum="PermissionEmbargoStatus" expires_after="2023-08-20"> <owner>engedy@chromium.org</owner> <owner>src/components/permissions/PERMISSIONS_OWNERS</owner> <summary> @@ -689,7 +689,7 @@ </histogram> <histogram name="Permissions.Prompt.Accepted.PriorDismissCount2" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>engedy@chromium.org</owner> <owner>src/components/permissions/PERMISSIONS_OWNERS</owner> <summary> @@ -1247,7 +1247,7 @@ </histogram> <histogram name="SiteEngagementService.OriginsEngaged" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>calamity@chromium.org</owner> <owner>dominickn@chromium.org</owner> <summary> @@ -1298,7 +1298,7 @@ </histogram> <histogram name="WebsiteSettings.Action" enum="WebsiteSettingsAction" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>estark@chromium.org</owner> <owner>dullweber@chromium.org</owner> <summary> @@ -1378,7 +1378,7 @@ </histogram> <histogram name="WebsiteSettings.GetAllSitesLoadTime" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>olesiamarukhno@google.com</owner> <owner>sauski@google.com</owner> <owner>chrome-friendly-settings@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/platform/histograms.xml b/tools/metrics/histograms/metadata/platform/histograms.xml index 17277753..2781c349 100644 --- a/tools/metrics/histograms/metadata/platform/histograms.xml +++ b/tools/metrics/histograms/metadata/platform/histograms.xml
@@ -309,7 +309,7 @@ </histogram> <histogram name="Platform.DetachableBase.ActivePercent" units="%" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>fshao@chromium.org</owner> <owner>phoenixshen@chromium.org</owner> <owner>chromeos-kukui@google.com</owner> @@ -321,7 +321,7 @@ </histogram> <histogram name="Platform.DetachableBase.AttachedOnBoot" enum="BooleanAttached" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>fshao@chromium.org</owner> <owner>phoenixshen@chromium.org</owner> <owner>chromeos-kukui@google.com</owner> @@ -427,7 +427,7 @@ </histogram> <histogram name="Platform.DiskUsage.NumUserHomeDirectories" - units="home directories" expires_after="2023-06-18"> + units="home directories" expires_after="2023-08-20"> <owner>achuith@chromium.org</owner> <owner>tls@chromium.org</owner> <summary> @@ -776,7 +776,7 @@ </histogram> <histogram name="Platform.IntelMaxMicroArchitecture" - enum="IntelMaxMicroArchitecture" expires_after="2023-06-18"> + enum="IntelMaxMicroArchitecture" expires_after="2023-08-20"> <owner>fbarchard@chromium.org</owner> <owner>pwnall@chromium.org</owner> <summary> @@ -1154,7 +1154,7 @@ </summary> </histogram> -<histogram name="Platform.Memory.VMs" units="MiB" expires_after="2023-06-04"> +<histogram name="Platform.Memory.VMs" units="MiB" expires_after="2023-08-20"> <!-- Name completed by histogram_suffixes name="ProcessMemoryType" --> <owner>bgeffon@chromium.org</owner> @@ -1375,7 +1375,7 @@ </histogram> <histogram name="Platform.Modemfwd.DlcInstallResult" - enum="ModemfwdDlcInstallResult" expires_after="2023-06-18"> + enum="ModemfwdDlcInstallResult" expires_after="2023-08-20"> <owner>andrewlassalle@google.com</owner> <owner>cros-connectivity@google.com</owner> <summary> @@ -1396,7 +1396,7 @@ </histogram> <histogram name="Platform.Modemfwd.FWInstallResult" - enum="ModemfwdFWInstallResult" expires_after="2023-06-18"> + enum="ModemfwdFWInstallResult" expires_after="2023-08-20"> <owner>andrewlassalle@google.com</owner> <owner>cros-connectivity@google.com</owner> <summary>The result of each modem FW install attempt.</summary> @@ -1414,7 +1414,7 @@ </histogram> <histogram name="Platform.Modemfwd.FWUpdateLocation" - enum="ModemfwdFWUpdateLocation" expires_after="2023-06-18"> + enum="ModemfwdFWUpdateLocation" expires_after="2023-08-20"> <owner>andrewlassalle@google.com</owner> <owner>cros-connectivity@google.com</owner> <summary> @@ -1857,7 +1857,7 @@ </histogram> <histogram name="Platform.TPM.HardwareAlerts" enum="PlatformTPMHardwareAlerts" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>anatol@google.com</owner> <owner>cros-hwsec+uma@chromium.org</owner> <summary> @@ -1887,7 +1887,7 @@ </histogram> <histogram name="Platform.TPM.TimeToTakeOwnership" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yich@google.com</owner> <owner>cylai@google.com</owner> <owner>cros-hwsec+uma@chromium.org</owner> @@ -1898,7 +1898,7 @@ </histogram> <histogram name="Platform.TPM.TpmManagerSecretStatus" - enum="TpmManagerSecretStatus" expires_after="2023-06-18"> + enum="TpmManagerSecretStatus" expires_after="2023-08-20"> <owner>cylai@chromium.org</owner> <owner>cros-hwsec+uma@chromium.org</owner> <summary> @@ -2038,7 +2038,7 @@ </histogram> <histogram name="Platform.UnaggregatedUsageTime" units="seconds" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <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 70b3c9f..9c9660b6 100644 --- a/tools/metrics/histograms/metadata/power/histograms.xml +++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -537,7 +537,7 @@ <histogram name="PerformanceMonitor.UsageScenario.LongInterval" enum="PerformanceMonitor.UsageScenario.LongInterval" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>olivierli@chromium.org</owner> <owner>catan-team@chromium.org</owner> <summary> @@ -552,7 +552,7 @@ <histogram name="PerformanceMonitor.UsageScenario.ShortInterval" enum="PerformanceMonitor.UsageScenario.ShortInterval" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>olivierli@chromium.org</owner> <owner>catan-team@chromium.org</owner> <summary> @@ -2065,7 +2065,7 @@ </histogram> <histogram name="Power.Mac.IsOnBattery2" enum="BooleanOnBattery" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>avi@chromium.org</owner> <owner>lgrey@chromium.org</owner> <summary> @@ -2184,7 +2184,7 @@ </histogram> <histogram name="Power.PowerButtonPressed" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>emaamari@google.com</owner> <owner>chromeos-commercial-identity@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/printing/histograms.xml b/tools/metrics/histograms/metadata/printing/histograms.xml index 1bcc3230..b70c3cb 100644 --- a/tools/metrics/histograms/metadata/printing/histograms.xml +++ b/tools/metrics/histograms/metadata/printing/histograms.xml
@@ -105,7 +105,7 @@ </histogram> <histogram name="Printing.CUPS.IppAttributesSuccess" enum="BooleanSuccess" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>bmgordon@chromium.org</owner> <owner>cros-printing-dev@chromium.org</owner> <summary> @@ -162,7 +162,7 @@ </histogram> <histogram name="Printing.CUPS.MigratedMakeAndModel" enum="BooleanMigrated" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>luum@chromium.org</owner> <owner>cros-printing-dev@chromium.org</owner> <summary> @@ -286,7 +286,7 @@ </histogram> <histogram name="Printing.CUPS.PrinterStatusReasons" - enum="PrinterStatusReasons" expires_after="2023-06-18"> + enum="PrinterStatusReasons" expires_after="2023-08-20"> <owner>gavinwill@chromium.org</owner> <owner>cros-peripherals@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/privacy/histograms.xml b/tools/metrics/histograms/metadata/privacy/histograms.xml index f7fc0fa..0cbcbf2 100644 --- a/tools/metrics/histograms/metadata/privacy/histograms.xml +++ b/tools/metrics/histograms/metadata/privacy/histograms.xml
@@ -357,7 +357,7 @@ </histogram> <histogram name="Privacy.DIPS.TimeFromNavigationCommitToClientBounce" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>bcl@chromium.org</owner> <owner>jdh@chromium.org</owner> <owner>rtarpine@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/profile/histograms.xml b/tools/metrics/histograms/metadata/profile/histograms.xml index eddbab9..317260e 100644 --- a/tools/metrics/histograms/metadata/profile/histograms.xml +++ b/tools/metrics/histograms/metadata/profile/histograms.xml
@@ -23,13 +23,13 @@ <histograms> <histogram name="Profile.AddNewUser" enum="ProfileAddNewUser" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>rogerta@chromium.org</owner> <summary>The frequency of ways that new user profiles are added.</summary> </histogram> <histogram name="Profile.AddSignInFlowOutcome" - enum="ProfileSignedInFlowOutcome" expires_after="2023-06-18"> + enum="ProfileSignedInFlowOutcome" expires_after="2023-08-20"> <owner>jkrcal@chromium.org</owner> <owner>droger@chromium.org</owner> <summary> @@ -217,7 +217,7 @@ </histogram> <histogram name="Profile.Guest.TypeCreated" enum="GuestProfileCreatedType" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>dgn@chromium.org</owner> <owner>chrome-signin-team@google.com</owner> <summary> @@ -234,7 +234,7 @@ </histogram> <histogram name="Profile.Incognito.Lifetime" units="minutes" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>rhalavati@chromium.org</owner> <owner>chrome-incognito@google.com</owner> <summary> @@ -430,7 +430,7 @@ </histogram> <histogram name="Profile.NumberOfActiveProfiles" units="profiles" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>droger@chromium.org</owner> <owner>feuunk@chromium.org</owner> <summary> @@ -458,7 +458,7 @@ </histogram> <histogram name="Profile.NumberOfProfiles" units="profiles" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>droger@chromium.org</owner> <owner>jkrcal@chromium.org</owner> <summary> @@ -495,7 +495,7 @@ </histogram> <histogram name="Profile.NumberOfUnusedProfiles" units="profiles" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>msarda@chromium.org</owner> <owner>droger@chromium.org</owner> <summary> @@ -724,7 +724,7 @@ </histogram> <histogram name="ProfilePicker.AskOnStartup" enum="BooleanEnabled" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>msalama@chromium.org</owner> <owner>chrome-signin-team@google.com</owner> <summary> @@ -760,7 +760,7 @@ </histogram> <histogram name="ProfilePicker.FirstProfileTime.FirstWebContentsNonEmptyPaint" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>dgn@chromium.org</owner> <owner>chrome-signin-team@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/quick_answers/histograms.xml b/tools/metrics/histograms/metadata/quick_answers/histograms.xml index c8c312c3..1f0c79fc 100644 --- a/tools/metrics/histograms/metadata/quick_answers/histograms.xml +++ b/tools/metrics/histograms/metadata/quick_answers/histograms.xml
@@ -266,7 +266,7 @@ </histogram> <histogram name="QuickAnswers.TextToSpeech.EngineEvent" - enum="QuickAnswersTextToSpeechEngineEvent" expires_after="2023-06-04"> + enum="QuickAnswersTextToSpeechEngineEvent" expires_after="2023-08-20"> <owner>updowndota@chromium.org</owner> <owner>angelaxiao@chromium.org</owner> <owner>croissant-eng@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/quota/histograms.xml b/tools/metrics/histograms/metadata/quota/histograms.xml index 02e831b..7ab06cd 100644 --- a/tools/metrics/histograms/metadata/quota/histograms.xml +++ b/tools/metrics/histograms/metadata/quota/histograms.xml
@@ -88,7 +88,7 @@ </histogram> <histogram name="Quota.EvictedBucketAccessCount" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ayui@chromium.org</owner> <owner>chrome-owp-storage@google.com</owner> <summary> @@ -110,7 +110,7 @@ </histogram> <histogram name="Quota.EvictedBucketsPerHour" units="buckets" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ayui@chromium.org</owner> <owner>chrome-owp-storage@google.com</owner> <summary> @@ -307,7 +307,7 @@ </summary> </histogram> -<histogram name="Quota.TotalDiskSpace" units="MB" expires_after="2023-06-18"> +<histogram name="Quota.TotalDiskSpace" units="MB" expires_after="2023-08-20"> <owner>ayui@chromium.org</owner> <owner>chrome-owp-storage@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/renderer/histograms.xml b/tools/metrics/histograms/metadata/renderer/histograms.xml index 5e18e12..6c0bba29 100644 --- a/tools/metrics/histograms/metadata/renderer/histograms.xml +++ b/tools/metrics/histograms/metadata/renderer/histograms.xml
@@ -327,7 +327,7 @@ </histogram> <histogram name="Renderer.Font.PrimaryFont.FCP" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>kojii@chromium.org</owner> <owner>tkent@chromium.org</owner> <owner>yosin@chromium.org</owner> @@ -433,7 +433,7 @@ </histogram> <histogram name="Renderer.RenderThreadImpl.Init" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jam@chromium.org</owner> <owner>sky@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/renderer4/histograms.xml b/tools/metrics/histograms/metadata/renderer4/histograms.xml index b4fd116..51fae0bf 100644 --- a/tools/metrics/histograms/metadata/renderer4/histograms.xml +++ b/tools/metrics/histograms/metadata/renderer4/histograms.xml
@@ -191,7 +191,7 @@ </histogram> <histogram name="Renderer4.MainThreadGestureScrollReason2" - enum="MainThreadScrollingReason2" expires_after="2023-06-18"> + enum="MainThreadScrollingReason2" expires_after="2023-08-20"> <owner>flackr@chromium.org</owner> <owner>pdr@chromium.org</owner> <owner>input-dev@chromium.org</owner> @@ -210,7 +210,7 @@ </histogram> <histogram name="Renderer4.MainThreadWheelScrollReason2" - enum="MainThreadScrollingReason2" expires_after="2023-06-18"> + enum="MainThreadScrollingReason2" expires_after="2023-08-20"> <owner>flackr@chromium.org</owner> <owner>pdr@chromium.org</owner> <owner>input-dev@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml index 762dc00..1398a72 100644 --- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml +++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -464,7 +464,7 @@ </histogram> <histogram name="SafeBrowsing.ClientSafeBrowsingReport.RequestHasToken" - enum="BooleanSent" expires_after="2023-06-18"> + enum="BooleanSent" expires_after="2023-08-20"> <owner>thefrog@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -799,7 +799,7 @@ </histogram> <histogram name="SafeBrowsing.ExtensionTelemetry.FilePersistedAtWriteInterval" - enum="Boolean" expires_after="2023-06-18"> + enum="Boolean" expires_after="2023-08-20"> <owner>psarouthakis@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -812,7 +812,7 @@ <histogram name="SafeBrowsing.ExtensionTelemetry.NetworkRequestResponseCodeOrError" - enum="CombinedHttpResponseAndNetErrorCode" expires_after="2023-06-18"> + enum="CombinedHttpResponseAndNetErrorCode" expires_after="2023-08-20"> <owner>anunoy@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -866,7 +866,7 @@ </histogram> <histogram name="SafeBrowsing.ExtensionTelemetry.UploadSize" units="bytes" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>anunoy@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -877,7 +877,7 @@ </histogram> <histogram name="SafeBrowsing.ExtensionTelemetry.UploadSuccess" - enum="BooleanSuccess" expires_after="2023-06-18"> + enum="BooleanSuccess" expires_after="2023-08-20"> <owner>anunoy@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1347,7 +1347,7 @@ </histogram> <histogram name="SafeBrowsing.MetricsCollector.IsPrefValid" enum="BooleanValid" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1390,7 +1390,7 @@ <histogram name="SafeBrowsing.NavigationObserver.NavigationEventsRecordedLength" - units="count" expires_after="2023-06-18"> + units="count" expires_after="2023-08-20"> <owner>drubery@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1410,7 +1410,7 @@ </histogram> <histogram name="SafeBrowsing.PageLoadToken.Duration" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1432,7 +1432,7 @@ </histogram> <histogram name="SafeBrowsing.PageLoadToken.PasswordProtectionHasToken" - enum="BooleanExists" expires_after="2023-06-18"> + enum="BooleanExists" expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1442,7 +1442,7 @@ </histogram> <histogram name="SafeBrowsing.PageLoadToken.RealTimeCheckHasToken" - enum="BooleanExists" expires_after="2023-06-18"> + enum="BooleanExists" expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1452,7 +1452,7 @@ </histogram> <histogram name="SafeBrowsing.PageLoadToken.TokenCount" units="entries" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1548,7 +1548,7 @@ </histogram> <histogram name="SafeBrowsing.Pref.MainProfile.SafeBrowsingState" - enum="SafeBrowsingState" expires_after="2023-06-18"> + enum="SafeBrowsingState" expires_after="2023-08-20"> <owner>jeffcyr@google.com</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1581,7 +1581,7 @@ <histogram name="SafeBrowsing.RendererThrottle.IsCheckCompletedOnProcessResponse" - enum="BooleanCompleted" expires_after="2023-06-18"> + enum="BooleanCompleted" expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1594,7 +1594,7 @@ </histogram> <histogram name="SafeBrowsing.RendererThrottle.TotalDelay" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1631,7 +1631,7 @@ </histogram> <histogram name="SafeBrowsing.RT.AllStoresAvailable" enum="BooleanAvailable" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1653,7 +1653,7 @@ </histogram> <histogram name="SafeBrowsing.RT.CacheManager.CleanUpTime" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1673,7 +1673,7 @@ </histogram> <histogram name="SafeBrowsing.RT.CanCheckDatabase" enum="BooleanEnabled" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1707,7 +1707,7 @@ </histogram> <histogram name="SafeBrowsing.RT.GetCache.FallbackThreatType" - enum="SBThreatType" expires_after="2023-06-18"> + enum="SBThreatType" expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1858,7 +1858,7 @@ </histogram> <histogram name="SafeBrowsing.RT.Network.Result" - enum="CombinedHttpResponseAndNetErrorCode" expires_after="2023-08-13"> + enum="CombinedHttpResponseAndNetErrorCode" expires_after="2023-08-20"> <owner>vakh@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1939,7 +1939,7 @@ </histogram> <histogram name="SafeBrowsing.RT.RequestDestinations.Requested" - enum="RequestDestination" expires_after="2023-06-18"> + enum="RequestDestination" expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -1989,7 +1989,7 @@ </histogram> <histogram name="SafeBrowsing.RT.ThreatInfoSize" units="verdicts" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -2000,7 +2000,7 @@ </histogram> <histogram base="true" name="SafeBrowsing.Settings.UserAction" - enum="SafeBrowsingSettingsUserAction" expires_after="2023-06-18"> + enum="SafeBrowsingSettingsUserAction" expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -2024,7 +2024,7 @@ <histogram name="SafeBrowsing.TailoredSecurity.ConsentedDesktopDialogEnabledOutcome" - enum="SafeBrowsingTailoredSecurityOutcome" expires_after="2023-06-18"> + enum="SafeBrowsingTailoredSecurityOutcome" expires_after="2023-08-20"> <owner>jacastro@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -2057,7 +2057,7 @@ <histogram name="SafeBrowsing.TailoredSecurity.SyncPromptEnabledNotificationResult2" enum="SafeBrowsingTailoredSecurityNotificationResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jacastro@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -2191,7 +2191,7 @@ </histogram> <histogram name="SafeBrowsing.Triggers.SuspiciousSite.Event" - enum="SuspiciousSiteTriggerEvent" expires_after="2023-06-18"> + enum="SuspiciousSiteTriggerEvent" expires_after="2023-08-20"> <owner>vakh@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -2279,7 +2279,7 @@ </histogram> <histogram name="SafeBrowsing.V4GetHash.CountOfPrefixes" units="prefixes" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>vakh@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -2370,7 +2370,7 @@ <histogram name="SafeBrowsing.V4LocalDatabaseManager.TimeSinceLastUpdateResponse" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>ajuma@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -2556,7 +2556,7 @@ </histogram> <histogram name="SafeBrowsing.V4Store.IsStoreValid" enum="BooleanValid" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -2620,7 +2620,7 @@ </histogram> <histogram name="SafeBrowsing.V4StoreRead.Result" - enum="SafeBrowsingV4StoreReadResult" expires_after="2023-06-18"> + enum="SafeBrowsingV4StoreReadResult" expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -2645,7 +2645,7 @@ </histogram> <histogram name="SafeBrowsing.V4Update.Network.Result" - enum="CombinedHttpResponseAndNetErrorCode" expires_after="2023-06-18"> + enum="CombinedHttpResponseAndNetErrorCode" expires_after="2023-08-20"> <owner>vakh@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary> @@ -2670,7 +2670,7 @@ </histogram> <histogram name="SafeBrowsing.V4Update.ResponseSizeKB" units="KB" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>vakh@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml index 0ee3213..d123b3c 100644 --- a/tools/metrics/histograms/metadata/sb_client/histograms.xml +++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -478,7 +478,7 @@ <histogram name="SBClientDownload.UserGestureFileType.Attributes" enum="SBClientDownloadUserGestureFileTypeAttributes" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/search/histograms.xml b/tools/metrics/histograms/metadata/search/histograms.xml index 2680869..20cffb1 100644 --- a/tools/metrics/histograms/metadata/search/histograms.xml +++ b/tools/metrics/histograms/metadata/search/histograms.xml
@@ -57,7 +57,7 @@ </histogram> <histogram name="Search.ContextualSearch.All.Searches" - enum="BooleanBottomSearchKind" expires_after="2023-06-18"> + enum="BooleanBottomSearchKind" expires_after="2023-08-20"> <!-- TODO(donnd): change expires_after to "never" once established and approved. --> @@ -325,7 +325,7 @@ </histogram> <histogram name="Search.ContextualSearch.SelectionExpanded" - enum="ContextualSearchGestureIsTap" expires_after="2023-06-18"> + enum="ContextualSearchGestureIsTap" expires_after="2023-08-20"> <owner>donnd@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary> @@ -888,7 +888,7 @@ </histogram> <histogram name="Search.ContextualSearchQuickActions.Category" - enum="ContextualSearchQuickActionCategory" expires_after="2023-06-18"> + enum="ContextualSearchQuickActionCategory" expires_after="2023-08-20"> <owner>donnd@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary> @@ -1512,7 +1512,7 @@ <histogram name="Search.QueryTiles.ShowQueryTilesSegmentationResultComparison" enum="ShowQueryTilesSegmentationResultComparison" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>haileywang@chromium.org</owner> <owner>ssid@chromium.org</owner> <summary> @@ -1636,7 +1636,7 @@ </histogram> <histogram name="Search.RelatedSearches.CarouselLastVisibleItemPosition" - units="position" expires_after="2023-06-18"> + units="position" expires_after="2023-08-20"> <owner>donnd@chromium.org</owner> <owner>gangwu@chromium.org</owner> <owner>related-searches-vteam@google.com</owner> @@ -1689,7 +1689,7 @@ </histogram> <histogram name="Search.RelatedSearches.NumberOfSuggestionsClicked2" - units="selected" expires_after="2023-06-18"> + units="selected" expires_after="2023-08-20"> <owner>donnd@chromium.org</owner> <owner>related-searches-vteam@google.com</owner> <summary> @@ -1700,7 +1700,7 @@ </histogram> <histogram name="Search.RelatedSearches.QualifiedUsers" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>donnd@chromium.org</owner> <owner>related-searches-vteam@google.com</owner> <summary> @@ -1715,7 +1715,7 @@ </histogram> <histogram name="Search.RelatedSearches.SelectedCarouselIndex" units="position" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>donnd@chromium.org</owner> <owner>related-searches-vteam@google.com</owner> <summary> @@ -1726,7 +1726,7 @@ </histogram> <histogram name="Search.RelatedSearches.SelectedSuggestionIndex" - units="position" expires_after="2023-06-18"> + units="position" expires_after="2023-08-20"> <owner>donnd@chromium.org</owner> <owner>related-searches-vteam@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/security/histograms.xml b/tools/metrics/histograms/metadata/security/histograms.xml index af54da4..9d2456e 100644 --- a/tools/metrics/histograms/metadata/security/histograms.xml +++ b/tools/metrics/histograms/metadata/security/histograms.xml
@@ -210,7 +210,7 @@ </histogram> <histogram name="Security.PageInfo.AboutThisSiteLanguageSupported" - enum="Boolean" expires_after="2023-06-18"> + enum="Boolean" expires_after="2023-08-20"> <owner>dullweber@chromium.org</owner> <owner>olesiamarukhno@chromium.org</owner> <summary> @@ -292,7 +292,7 @@ </histogram> <histogram name="Security.PrivateNetworkAccess.CheckResult" - enum="PrivateNetworkAccessCheckResult" expires_after="2023-06-18"> + enum="PrivateNetworkAccessCheckResult" expires_after="2023-08-20"> <owner>titouan@chromium.org</owner> <owner>clamy@chromium.org</owner> <owner>mkwst@chromium.org</owner> @@ -928,7 +928,7 @@ </histogram> <histogram name="SiteIsolation.SavedOAuthSites.Size" units="origins" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>alexmos@chromium.org</owner> <owner>creis@chromium.org</owner> <owner>lukasza@chromium.org</owner> @@ -940,7 +940,7 @@ </histogram> <histogram name="SiteIsolation.SavedUserTriggeredIsolatedOrigins.Size" - units="origins" expires_after="2023-06-18"> + units="origins" expires_after="2023-08-20"> <owner>alexmos@chromium.org</owner> <owner>creis@chromium.org</owner> <owner>lukasza@chromium.org</owner> @@ -953,7 +953,7 @@ </histogram> <histogram name="SiteIsolation.SavedWebTriggeredIsolatedOrigins.Size" - units="origins" expires_after="2023-06-18"> + units="origins" expires_after="2023-08-20"> <owner>alexmos@chromium.org</owner> <owner>creis@chromium.org</owner> <owner>lukasza@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/service/histograms.xml b/tools/metrics/histograms/metadata/service/histograms.xml index ac403e2..41f4855 100644 --- a/tools/metrics/histograms/metadata/service/histograms.xml +++ b/tools/metrics/histograms/metadata/service/histograms.xml
@@ -341,7 +341,7 @@ </histogram> <histogram name="ServiceWorker.FetchEvent.Fallback.Time" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>wanderview@chromium.org</owner> <owner>asamidoi@chromium.org</owner> <owner>chrome-worker@google.com</owner> @@ -354,7 +354,7 @@ </histogram> <histogram name="ServiceWorker.FetchEvent.HasResponse.Time" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>wanderview@chromium.org</owner> <owner>asamidoi@chromium.org</owner> <owner>chrome-worker@google.com</owner> @@ -509,7 +509,7 @@ <histogram name="ServiceWorker.LoadTiming.MainFrame.MainResource.FetchHandlerEndToFallbackNetwork" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>bashi@chromium.org</owner> <owner>chrome-worker@google.com</owner> <summary> @@ -610,7 +610,7 @@ <histogram name="ServiceWorker.LoadTiming.MainFrame.MainResource.StartToForwardServiceWorker" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>bashi@chromium.org</owner> <owner>chrome-worker@google.com</owner> <summary> @@ -642,7 +642,7 @@ <histogram name="ServiceWorker.LoadTiming.Subresource.FetchHandlerEndToFallbackNetwork" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>bashi@chromium.org</owner> <owner>chrome-worker@google.com</owner> <summary> @@ -659,7 +659,7 @@ <histogram name="ServiceWorker.LoadTiming.Subresource.FetchHandlerEndToResponseReceived" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>bashi@chromium.org</owner> <owner>chrome-worker@google.com</owner> <summary> @@ -706,7 +706,7 @@ <histogram name="ServiceWorker.LoadTiming.Subresource.WorkerReadyToFetchHandlerEnd" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>bashi@chromium.org</owner> <owner>chrome-worker@google.com</owner> <summary> @@ -784,7 +784,7 @@ <histogram name="ServiceWorker.OnBrowserStartup.FirstFindRegistrationForClientUrl.Time" - units="ms" expires_after="2023-06-18"> + units="ms" expires_after="2023-08-20"> <owner>chikamune@chromium.org</owner> <owner>chrome-worker@google.com</owner> <summary> @@ -904,7 +904,7 @@ </histogram> <histogram name="ServiceWorker.StartNewWorker.Time" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>wanderview@chromium.org</owner> <owner>asamidoi@chromium.org</owner> <owner>chrome-worker@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/settings/histograms.xml b/tools/metrics/histograms/metadata/settings/histograms.xml index d8920937..a63c6ab 100644 --- a/tools/metrics/histograms/metadata/settings/histograms.xml +++ b/tools/metrics/histograms/metadata/settings/histograms.xml
@@ -75,7 +75,7 @@ </histogram> <histogram name="Settings.AutocompleteSearches.OnStartup2" - enum="BooleanEnabled" expires_after="2023-06-18"> + enum="BooleanEnabled" expires_after="2023-08-20"> <owner>harrisonsean@chromium.org</owner> <owner>chrome-friendly-settings@google.com</owner> <summary> @@ -123,7 +123,7 @@ </histogram> <histogram name="Settings.FirstPartySets.State" enum="FirstPartySetsState" - expires_after="2023-04-04"> + expires_after="M120"> <owner>alimariam@google.com</owner> <owner>olesiamarukhno@google.com</owner> <owner>sauski@google.com</owner> @@ -217,7 +217,7 @@ </histogram> <histogram name="Settings.PinUnlockSetup" enum="LockScreenProgress" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>anastasiian@chromium.org</owner> <owner>teresachow@google.com</owner> <owner>cros-lurs@google.com</owner> @@ -261,7 +261,7 @@ </histogram> <histogram name="Settings.PreloadStatus.OnStartup3" enum="PreloadPagesState" - expires_after="2023-04-30"> + expires_after="2023-08-20"> <owner>rainhard@chromium.org</owner> <owner>msramek@chromium.org</owner> <owner>chrome-friendly-settings@google.com</owner> @@ -365,7 +365,7 @@ <histogram name="Settings.PrivacySandbox.DialogDisplayHost" enum="SettingsPrivacySandboxDialogDisplayHostHash" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>sauski@google.com</owner> <owner>chrome-friendly-settings@google.com</owner> <summary> @@ -378,7 +378,7 @@ </histogram> <histogram name="Settings.PrivacySandbox.DialogLoadTime" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>olesiamarukhno@google.com</owner> <owner>sauski@google.com</owner> <owner>chrome-friendly-settings@google.com</owner> @@ -389,7 +389,7 @@ </histogram> <histogram name="Settings.PrivacySandbox.DialogWindowTooSmall" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>olesiamarukhno@google.com</owner> <owner>sauski@google.com</owner> <owner>kartoffel-core-eng@google.com</owner> @@ -453,7 +453,7 @@ </histogram> <histogram name="Settings.PrivacySandbox.PromptStartupState" - enum="SettingsPrivacySandboxStartupStates" expires_after="M115"> + enum="SettingsPrivacySandboxStartupStates" expires_after="2023-08-20"> <owner>sauski@google.com</owner> <owner>olesiamarukhno@chromium.org</owner> <owner>msramek@chromium.org</owner> @@ -465,7 +465,7 @@ </histogram> <histogram name="Settings.PrivacySandbox.StartupState" - enum="SettingsPrivacySandboxStartupStates" expires_after="2023-06-18"> + enum="SettingsPrivacySandboxStartupStates" expires_after="2023-08-20"> <owner>sauski@google.com</owner> <owner>harrisonsean@chromium.org</owner> <owner>msramek@chromium.org</owner> @@ -476,7 +476,7 @@ </histogram> <histogram name="Settings.PrivacySandbox.Topics.Enabled" enum="BooleanEnabled" - expires_after="M115"> + expires_after="2023-08-20"> <owner>sauski@google.com</owner> <owner>olesiamarukhno@chromium.org</owner> <owner>msramek@chromium.org</owner> @@ -562,7 +562,7 @@ </histogram> <histogram name="Settings.SafetyCheck.SafeBrowsingResult" - enum="SafetyCheckSafeBrowsingStatus" expires_after="2023-06-18"> + enum="SafetyCheckSafeBrowsingStatus" expires_after="2023-08-20"> <owner>andzaytsev@google.com</owner> <owner>msramek@chromium.org</owner> <summary>Resulting state of the safety check Safe Browsing check.</summary>
diff --git a/tools/metrics/histograms/metadata/sharing/histograms.xml b/tools/metrics/histograms/metadata/sharing/histograms.xml index ab6bedfbc..331e0bf 100644 --- a/tools/metrics/histograms/metadata/sharing/histograms.xml +++ b/tools/metrics/histograms/metadata/sharing/histograms.xml
@@ -395,7 +395,7 @@ </histogram> <histogram name="Sharing.SendMessageResult" enum="SharingSendMessageResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <!-- Name completed by histogram_suffixes SharingChannelType, SharingDevicePlatform, SharingMessage, and SharingPulseInterval. -->
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml index d89c11da..1a9ba59 100644 --- a/tools/metrics/histograms/metadata/signin/histograms.xml +++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -22,7 +22,7 @@ <histograms> -<histogram name="Signin" enum="SigninHelperFlow" expires_after="2023-08-13"> +<histogram name="Signin" enum="SigninHelperFlow" expires_after="2023-08-20"> <owner>mlerman@chromium.org</owner> <summary> Tracks user interactions as they sign in through a flow. The suffix of the @@ -95,7 +95,7 @@ </histogram> <histogram name="Signin.AccountConsistencyPromoAction" - enum="AccountConsistencyPromoAction" expires_after="2023-06-18"> + enum="AccountConsistencyPromoAction" expires_after="2023-08-20"> <owner>bsazonov@chromium.org</owner> <owner>aliceywang@chromium.org</owner> <summary> @@ -135,7 +135,7 @@ </histogram> <histogram name="Signin.AccountReconcilorState.OnGaiaResponse" - enum="SigninAccountReconcilorState" expires_after="2023-06-18"> + enum="SigninAccountReconcilorState" expires_after="2023-08-20"> <owner>jlebel@chromium.org</owner> <owner>chrome-signin-team@google.com</owner> <summary> @@ -161,7 +161,7 @@ </histogram> <histogram name="Signin.AccountTracker.GaiaIdMigrationState" - enum="OAuth2LoginAccountRevokedMigrationState" expires_after="2023-06-18"> + enum="OAuth2LoginAccountRevokedMigrationState" expires_after="2023-08-20"> <owner>msarda@chromium.org</owner> <owner>sdefresne@chromium.org</owner> <summary> @@ -499,7 +499,7 @@ </histogram> <histogram name="Signin.GetAccessTokenFinished" enum="GoogleServiceAuthError" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>droger@chromium.org</owner> <owner>msarda@chromium.org</owner> <summary> @@ -1269,7 +1269,7 @@ </histogram> <histogram name="Signin.SyncFirstSetupCompleteSource" - enum="SyncFirstSetupCompleteSource" expires_after="2023-06-18"> + enum="SyncFirstSetupCompleteSource" expires_after="2023-08-20"> <owner>triploblastic@chromium.org</owner> <owner>bsazonov@chromium.org</owner> <summary>Tracks where FirstSetupComplete bit is set from.</summary> @@ -1374,7 +1374,7 @@ </histogram> <histogram name="Signin.TransactionalReauthResult" enum="SigninReauthResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <!-- Name completed by histogram_suffixes name="TransactionalReauthEntryPoint" -->
diff --git a/tools/metrics/histograms/metadata/stability/histograms.xml b/tools/metrics/histograms/metadata/stability/histograms.xml index 53e42bd1..33f604e 100644 --- a/tools/metrics/histograms/metadata/stability/histograms.xml +++ b/tools/metrics/histograms/metadata/stability/histograms.xml
@@ -33,7 +33,7 @@ </variants> <histogram name="Stability.Android.MinidumpUploadingTime" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>shaktisahu@chromium.org</owner> <owner>src/components/minidump_uploader/OWNERS</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/startup/histograms.xml b/tools/metrics/histograms/metadata/startup/histograms.xml index 21e3c6d9..c5a671a 100644 --- a/tools/metrics/histograms/metadata/startup/histograms.xml +++ b/tools/metrics/histograms/metadata/startup/histograms.xml
@@ -192,7 +192,7 @@ </histogram> <histogram name="Startup.Android.Cold.TimeToVisibleContent" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ckitagawa@chromium.org</owner> <summary> Android: The time from the activity creation point to the moment the content @@ -374,7 +374,7 @@ </histogram> <histogram name="Startup.Android.StartSurfaceShownAtStartup" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>hanxi@chromium.org</owner> <owner>wychen@chromium.org</owner> <summary> @@ -395,7 +395,7 @@ </histogram> <histogram name="Startup.BringToForegroundReason" - enum="BooleanBringToForegroundReason" expires_after="2023-06-18"> + enum="BooleanBringToForegroundReason" expires_after="2023-08-20"> <owner>peter@chromium.org</owner> <summary> Records the cause, each time Chrome is brought to the foreground. Currently
diff --git a/tools/metrics/histograms/metadata/storage/histograms.xml b/tools/metrics/histograms/metadata/storage/histograms.xml index a934af6..aca666f 100644 --- a/tools/metrics/histograms/metadata/storage/histograms.xml +++ b/tools/metrics/histograms/metadata/storage/histograms.xml
@@ -80,7 +80,7 @@ </histogram> <histogram name="API.StorageAccess.RequestStorageAccess" - enum="RequestStorageResult" expires_after="2023-06-18"> + enum="RequestStorageResult" expires_after="2023-08-20"> <owner>mkwst@chromium.org</owner> <owner>brandm@microsoft.com</owner> <summary> @@ -150,7 +150,7 @@ </histogram> <histogram name="Clipboard.Read" enum="ClipboardFormatRead" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>huangdarwin@chromium.org</owner> <owner>src/ui/base/clipboard/OWNERS</owner> <summary> @@ -191,7 +191,7 @@ </histogram> <histogram name="Clipboard.Write" enum="ClipboardFormatWrite" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>huangdarwin@chromium.org</owner> <owner>src/ui/base/clipboard/OWNERS</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/subresource/histograms.xml b/tools/metrics/histograms/metadata/subresource/histograms.xml index ec049a1a..3f1a31a 100644 --- a/tools/metrics/histograms/metadata/subresource/histograms.xml +++ b/tools/metrics/histograms/metadata/subresource/histograms.xml
@@ -480,7 +480,7 @@ </histogram> <histogram name="SubresourceFilter.PageLoad.NumSubresourceLoads.MatchedRules" - units="resource loads" expires_after="2023-06-18"> + units="resource loads" expires_after="2023-08-20"> <owner>jkarlin@chromium.org</owner> <owner>chrome-ads-histograms@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml index aeb11dc..7b4d7e6 100644 --- a/tools/metrics/histograms/metadata/sync/histograms.xml +++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -134,7 +134,7 @@ </histogram> <histogram name="Sync.BookmarkGUIDSource2" enum="BookmarkGUIDSource" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>rushans@google.com</owner> <owner>mastiz@chromium.org</owner> <component>Services>Sync</component> @@ -517,7 +517,7 @@ </histogram> <histogram name="Sync.FCMInstanceIdTokenRetrievalStatus" - enum="InstanceIDResult" expires_after="2023-06-18"> + enum="InstanceIDResult" expires_after="2023-08-20"> <owner>rushans@google.com</owner> <owner>treib@chromium.org</owner> <component>Services>Sync</component> @@ -1283,7 +1283,7 @@ </histogram> <histogram name="Sync.StopSource" enum="SyncStopSource" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>treib@chromium.org</owner> <owner>mastiz@chromium.org</owner> <component>Services>Sync</component> @@ -1326,7 +1326,7 @@ </histogram> <histogram name="Sync.SyncEverything2" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>treib@chromium.org</owner> <owner>mastiz@chromium.org</owner> <component>Services>Sync</component> @@ -1353,7 +1353,7 @@ </histogram> <histogram name="Sync.SyncStoppedReported" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>rushans@google.com</owner> <owner>treib@chromium.org</owner> <component>Services>Sync</component> @@ -1430,7 +1430,7 @@ </histogram> <histogram name="Sync.TrustedVaultAddKeysAttemptIsSuccessful" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>mmoskvitin@google.com</owner> <owner>mastiz@chromium.org</owner> <component>Services>Sync</component> @@ -1454,7 +1454,7 @@ </histogram> <histogram name="Sync.TrustedVaultDeviceRegistered" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>mmoskvitin@google.com</owner> <owner>mastiz@chromium.org</owner> <component>Services>Sync</component> @@ -1466,6 +1466,17 @@ </summary> </histogram> +<histogram name="Sync.TrustedVaultDeviceRegistrationOutcome" + enum="TrustedVaultDeviceRegistrationOutcome" expires_after="2023-08-08"> + <owner>mmoskvitin@google.com</owner> + <owner>mastiz@chromium.org</owner> + <component>Services>Sync</component> + <summary> + Records the outcome of device registration attempt upon request completion + or failure. + </summary> +</histogram> + <histogram name="Sync.TrustedVaultDeviceRegistrationState" enum="TrustedVaultDeviceRegistrationState" expires_after="2023-08-08"> <owner>mmoskvitin@google.com</owner> @@ -1567,7 +1578,7 @@ </histogram> <histogram name="Sync.TrustedVaultJavascriptAddRecoveryMethodIsIncognito" - enum="BooleanIncognito" expires_after="2023-06-18"> + enum="BooleanIncognito" expires_after="2023-08-20"> <owner>mmoskvitin@google.com</owner> <owner>mastiz@chromium.org</owner> <component>Services>Sync</component> @@ -1579,7 +1590,7 @@ </histogram> <histogram name="Sync.TrustedVaultJavascriptAddRecoveryMethodSucceeded" - enum="BooleanSuccess" expires_after="2023-06-18"> + enum="BooleanSuccess" expires_after="2023-08-20"> <owner>mmoskvitin@google.com</owner> <owner>mastiz@chromium.org</owner> <component>Services>Sync</component> @@ -1591,7 +1602,7 @@ </histogram> <histogram name="Sync.TrustedVaultJavascriptAddRecoveryMethodUserKnown" - enum="BooleanKnown" expires_after="2023-06-18"> + enum="BooleanKnown" expires_after="2023-08-20"> <owner>mmoskvitin@google.com</owner> <owner>mastiz@chromium.org</owner> <component>Services>Sync</component> @@ -1603,7 +1614,7 @@ </histogram> <histogram name="Sync.TrustedVaultJavascriptAddRecoveryMethodValidArgs" - enum="BooleanValid" expires_after="2023-06-18"> + enum="BooleanValid" expires_after="2023-08-20"> <owner>mmoskvitin@google.com</owner> <owner>mastiz@chromium.org</owner> <component>Services>Sync</component> @@ -1669,7 +1680,7 @@ </histogram> <histogram name="Sync.TrustedVaultRecoverabilityStatusOnRequestCompletion" - enum="TrustedVaultRecoverabilityStatus" expires_after="2023-06-18"> + enum="TrustedVaultRecoverabilityStatus" expires_after="2023-08-20"> <owner>mmrashad@google.com</owner> <owner>mmoskvitin@google.com</owner> <component>Services>Sync</component> @@ -1728,7 +1739,7 @@ </histogram> <histogram name="Sync.TypedURLDatabaseError" enum="SyncTypedUrlDatabaseError" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>mastiz@chromium.org</owner> <component>Services>Sync</component> <summary>
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml index e854b85..9b9d2de 100644 --- a/tools/metrics/histograms/metadata/tab/histograms.xml +++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -390,7 +390,7 @@ </summary> </histogram> -<histogram name="Tab.NewTab" enum="NewTabType" expires_after="2023-06-18"> +<histogram name="Tab.NewTab" enum="NewTabType" expires_after="2023-08-20"> <owner>tbergquist@chromium.org</owner> <owner>bsep@chromium.org</owner> <summary> @@ -489,7 +489,7 @@ </histogram> <histogram name="Tab.Preview.TimeToStoreAfterTabSwitch" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>dfried@chromium.org</owner> <owner>collinbaker@chromium.org</owner> <summary> @@ -709,7 +709,7 @@ </histogram> <histogram name="TabGroups.CollapsedGroupCountPerLoad" units="groups" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>dpenning@chromium.org</owner> <owner>chrome-desktop-ui-sea@google.com</owner> <summary> @@ -739,7 +739,7 @@ </histogram> <histogram name="TabGroups.SessionsPerGroup" units="sessions" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>yusufo@chromium.org</owner> <owner>wychen@chromium.org</owner> <summary> @@ -791,7 +791,7 @@ </histogram> <histogram name="TabGroups.UserGroupCountPerLoad" units="groups" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>dpenning@chromium.org</owner> <owner>chrome-desktop-ui-sea@google.com</owner> <summary> @@ -1634,7 +1634,7 @@ <histogram name="Tabs.PersistedTabData.Storage.Save.File.FirstStorageRequestType" - enum="FileStorageRequestType" expires_after="2023-06-18"> + enum="FileStorageRequestType" expires_after="2023-08-20"> <owner>yusufo@chromium.org</owner> <owner>nyquist@chromium.org</owner> <owner>dtrainor@chromium.org</owner> @@ -1814,7 +1814,7 @@ </summary> </histogram> -<histogram name="Tabs.ScrubDuration" units="ms" expires_after="2023-06-18"> +<histogram name="Tabs.ScrubDuration" units="ms" expires_after="2023-08-20"> <owner>afakhry@chromium.org</owner> <owner>tclaiborne@chromium.org</owner> <summary> @@ -2859,7 +2859,7 @@ </summary> </histogram> -<histogram name="TabStrip.TimeToSwitch" units="ms" expires_after="2023-06-18"> +<histogram name="TabStrip.TimeToSwitch" units="ms" expires_after="2023-08-20"> <owner>dpenning@chromium.org</owner> <owner>chrome-desktop-ui-sea@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/translate/histograms.xml b/tools/metrics/histograms/metadata/translate/histograms.xml index 5d6775da..e20f4c44 100644 --- a/tools/metrics/histograms/metadata/translate/histograms.xml +++ b/tools/metrics/histograms/metadata/translate/histograms.xml
@@ -116,7 +116,7 @@ </histogram> <histogram name="Translate.CLD3.LanguageDetected" enum="LocaleCodeISO639" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>megjablon@google.com</owner> <owner>chrome-language@google.com</owner> <summary> @@ -423,7 +423,7 @@ </histogram> <histogram name="Translate.NeverTranslateSite" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>megjablon@google.com</owner> <owner>chrome-language@google.com</owner> <summary> @@ -433,7 +433,7 @@ </histogram> <histogram name="Translate.PageLoad.FinalSourceLanguage" - enum="LocaleCodeISO639" expires_after="2023-06-18"> + enum="LocaleCodeISO639" expires_after="2023-08-20"> <owner>megjablon@google.com</owner> <owner>chrome-language@google.com</owner> <summary> @@ -1041,7 +1041,7 @@ </histogram> <histogram name="Translate.UserActionDuration" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>megjablon@google.com</owner> <owner>chrome-language@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/uma/histograms.xml b/tools/metrics/histograms/metadata/uma/histograms.xml index 9aab932..df92aa26 100644 --- a/tools/metrics/histograms/metadata/uma/histograms.xml +++ b/tools/metrics/histograms/metadata/uma/histograms.xml
@@ -80,7 +80,7 @@ </histogram> <histogram name="UMA.ActualLogUploadInterval" units="minutes" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>asvitkine@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -123,7 +123,7 @@ </histogram> <histogram name="UMA.ClientIdBackupRecoveredWithAge" units="hours" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>asvitkine@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -134,7 +134,7 @@ </summary> </histogram> -<histogram name="UMA.ClientIdCleared" enum="Boolean" expires_after="2023-06-04"> +<histogram name="UMA.ClientIdCleared" enum="Boolean" expires_after="2023-08-20"> <owner>pdyson@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -144,7 +144,7 @@ </histogram> <histogram name="UMA.ClientIdSource" enum="ClientIdSource" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>pdyson@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary>The source of the client id when its creation is forced.</summary> @@ -732,7 +732,7 @@ </histogram> <histogram name="UMA.SamplingRatePerMille" units="samples per mille" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>jwd@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -760,7 +760,7 @@ </histogram> <histogram name="UMA.Startup.LocalStateFileExistence" enum="BooleanExists" - expires_after="2023-04-16"> + expires_after="2023-08-20"> <owner>caitlinfischer@google.com</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -770,7 +770,7 @@ </histogram> <histogram name="UMA.StartupVisibility" enum="StartupVisibility" - expires_after="2023-05-07"> + expires_after="2023-08-20"> <owner>caitlinfischer@google.com</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -879,7 +879,7 @@ </histogram> <histogram name="UMA.TruncatedEvents.UserAction" units="events" - expires_after="2023-08-13"> + expires_after="2023-08-20"> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/v8/histograms.xml b/tools/metrics/histograms/metadata/v8/histograms.xml index 4b4a336..8343a6a 100644 --- a/tools/metrics/histograms/metadata/v8/histograms.xml +++ b/tools/metrics/histograms/metadata/v8/histograms.xml
@@ -381,7 +381,7 @@ </histogram> <histogram name="V8.ExternalPointerTableCompactionOutcome" - enum="V8ExternalPointerTableCompactionOutcome" expires_after="2023-06-18"> + enum="V8ExternalPointerTableCompactionOutcome" expires_after="2023-08-20"> <owner>saelo@chromium.org</owner> <owner>ishell@chromium.org</owner> <summary> @@ -1357,7 +1357,7 @@ </summary> </histogram> -<histogram name="V8.ProduceCodeCache" units="ms" expires_after="2023-06-20"> +<histogram name="V8.ProduceCodeCache" units="ms" expires_after="2023-08-20"> <owner>chikamune@chromium.org</owner> <owner>chrome-worker@google.com</owner> <summary> @@ -1377,7 +1377,7 @@ </histogram> <histogram name="V8.SandboxedExternalPointersCount" units="count" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>saelo@chromium.org</owner> <owner>ishell@chromium.org</owner> <summary> @@ -1392,7 +1392,7 @@ </histogram> <histogram name="V8.SandboxMode" enum="V8SandboxMode" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>saelo@chromium.org</owner> <owner>ishell@chromium.org</owner> <summary> @@ -1413,7 +1413,7 @@ </histogram> <histogram name="V8.SandboxReservationSizeGB" units="GB" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>saelo@chromium.org</owner> <owner>ishell@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/variations/histograms.xml b/tools/metrics/histograms/metadata/variations/histograms.xml index 9b6bc415..a14fe737 100644 --- a/tools/metrics/histograms/metadata/variations/histograms.xml +++ b/tools/metrics/histograms/metadata/variations/histograms.xml
@@ -126,7 +126,7 @@ </histogram> <histogram name="Variations.FirstRun.SeedConnectTime" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -152,7 +152,7 @@ </histogram> <histogram name="Variations.FirstRun.SeedFetchTime" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -163,7 +163,7 @@ </histogram> <histogram name="Variations.FirstRunResult" enum="VariationsFirstRunResult" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -497,7 +497,7 @@ </histogram> <histogram name="Variations.SeedFetchTimeOnFirstRun" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ginnyhuang@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -721,7 +721,7 @@ </histogram> <histogram name="Variations.WebViewDownloadJobInterval" units="minutes" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ntfschr@chromium.org</owner> <owner>src/android_webview/OWNERS</owner> <summary> @@ -732,7 +732,7 @@ </histogram> <histogram name="Variations.WebViewDownloadJobQueueTime" units="minutes" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ntfschr@chromium.org</owner> <owner>src/android_webview/OWNERS</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/views/histograms.xml b/tools/metrics/histograms/metadata/views/histograms.xml index 3c7cc6c3..b8bf4a5 100644 --- a/tools/metrics/histograms/metadata/views/histograms.xml +++ b/tools/metrics/histograms/metadata/views/histograms.xml
@@ -23,7 +23,7 @@ <histograms> <histogram name="Views.ColorProviderCacheSize" units="entries" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>pkasting@chromium.org</owner> <owner>tluk@chromium.org</owner> <owner>skau@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/web_apk/histograms.xml b/tools/metrics/histograms/metadata/web_apk/histograms.xml index de47fb2e..14e4414 100644 --- a/tools/metrics/histograms/metadata/web_apk/histograms.xml +++ b/tools/metrics/histograms/metadata/web_apk/histograms.xml
@@ -126,7 +126,7 @@ </histogram> <histogram name="WebApk.Install.RequestTokenDurationV2" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>hartmanng@chromium.org</owner> <owner>rayankans@chromium.org</owner> <owner>src/chrome/android/webapk/OWNERS</owner> @@ -173,7 +173,7 @@ </histogram> <histogram name="WebApk.Notification.Permission.Status2" enum="ContentSetting" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>hartmanng@chromium.org</owner> <owner>mvanouwerkerk@chromium.org</owner> <owner>src/chrome/android/webapk/OWNERS</owner> @@ -184,7 +184,7 @@ </histogram> <histogram name="WebApk.Notification.PermissionRequestResult" - enum="ContentSetting" expires_after="2023-06-11"> + enum="ContentSetting" expires_after="2023-08-20"> <owner>mvanouwerkerk@chromium.org</owner> <owner>peconn@chromium.org</owner> <owner>src/chrome/android/webapk/OWNERS</owner>
diff --git a/tools/metrics/histograms/metadata/web_audio/histograms.xml b/tools/metrics/histograms/metadata/web_audio/histograms.xml index 53c70668..2dc8f8f 100644 --- a/tools/metrics/histograms/metadata/web_audio/histograms.xml +++ b/tools/metrics/histograms/metadata/web_audio/histograms.xml
@@ -172,7 +172,7 @@ </histogram> <histogram name="WebAudio.AudioDestination.HardwareBufferSize" units="units" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>hongchan@chromium.org</owner> <owner>mjwilson@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/web_rtc/histograms.xml b/tools/metrics/histograms/metadata/web_rtc/histograms.xml index ae95235..3dc5b7d 100644 --- a/tools/metrics/histograms/metadata/web_rtc/histograms.xml +++ b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
@@ -154,7 +154,7 @@ </histogram> <histogram name="WebRTC.Audio.AgcClippingAdjustmentAllowed" enum="Boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>hlundin@chromium.org</owner> <owner>webrtc-audio-uma@google.com</owner> <summary> @@ -516,7 +516,7 @@ <histogram name="WebRTC.Audio.EchoCanceller.ProcessingPersistentMultichannelContent" - enum="Boolean" expires_after="2023-06-18"> + enum="Boolean" expires_after="2023-08-20"> <owner>peah@chromium.org</owner> <owner>saza@chromium.org</owner> <owner>webrtc-audio-uma@google.com</owner> @@ -639,7 +639,7 @@ </histogram> <histogram name="WebRTC.Audio.SpeechExpandRatePercent" units="%" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>hlundin@chromium.org</owner> <owner>webrtc-audio-uma@google.com</owner> <summary> @@ -960,7 +960,7 @@ </histogram> <histogram name="WebRTC.DesktopCapture.Win.DesktopCapturerImpl" - enum="WebRtcDesktopCapturerImpl" expires_after="2023-06-18"> + enum="WebRtcDesktopCapturerImpl" expires_after="2023-08-20"> <owner>alcooper@chromium.org</owner> <owner>auorion@microsoft.com</owner> <owner>edgecapabilitiesdev@microsoft.com</owner> @@ -982,7 +982,7 @@ </histogram> <histogram name="WebRTC.DesktopCapture.Win.WgcCapturerResult" - enum="WebRtcWgcCapturerResult" expires_after="2023-06-18"> + enum="WebRtcWgcCapturerResult" expires_after="2023-08-20"> <owner>alcooper@chromium.org</owner> <owner>auorion@microsoft.com</owner> <owner>edgecapabilitiesdev@microsoft.com</owner> @@ -1003,7 +1003,7 @@ </histogram> <histogram name="WebRTC.DesktopCapture.Win.WgcCaptureSessionStartResult" - enum="WebRtcWgcCaptureSessionStartResult" expires_after="2023-06-18"> + enum="WebRtcWgcCaptureSessionStartResult" expires_after="2023-08-20"> <owner>alcooper@chromium.org</owner> <owner>auorion@microsoft.com</owner> <owner>edgecapabilitiesdev@microsoft.com</owner> @@ -1571,7 +1571,7 @@ </histogram> <histogram name="WebRTC.PeerConnection.SpeedLimit" units="%" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>handellm@google.com</owner> <owner>hbos@chromium.org</owner> <summary> @@ -1646,7 +1646,7 @@ </histogram> <histogram name="WebRTC.PeerConnection.ThermalThrottling" units="boolean" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>handellm@google.com</owner> <owner>hbos@chromium.org</owner> <summary> @@ -1656,7 +1656,7 @@ </histogram> <histogram name="WebRTC.PeerConnection.ThermalThrottlingEpisodes" units="count" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>handellm@google.com</owner> <owner>hbos@chromium.org</owner> <summary> @@ -1868,7 +1868,7 @@ </histogram> <histogram name="WebRTC.SentAudioTrackDuration" units="ms" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>perkj@chromium.org</owner> <summary> Durations of audio tracks sent over a PeerConnection. The stopwatch starts
diff --git a/tools/metrics/histograms/metadata/webapps/histograms.xml b/tools/metrics/histograms/metadata/webapps/histograms.xml index 8c10035..8a55e95b 100644 --- a/tools/metrics/histograms/metadata/webapps/histograms.xml +++ b/tools/metrics/histograms/metadata/webapps/histograms.xml
@@ -88,7 +88,7 @@ </histogram> <histogram name="AppBanners.UserResponse" enum="AppBannersUserResponse" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>dominickn@chromium.org</owner> <owner>pjmclachlan@google.com</owner> <summary> @@ -164,7 +164,7 @@ </histogram> <histogram name="Webapp.AddToHomescreenMediator.AppTypeToMenuEntry" - enum="AppTypeToMenuEntry" expires_after="2023-06-18"> + enum="AppTypeToMenuEntry" expires_after="2023-08-20"> <owner>finnur@chromium.org</owner> <owner>peter@chromium.org</owner> <summary> @@ -664,7 +664,7 @@ </histogram> <histogram name="Webapp.Install.InstallBounce" enum="WebappInstallSource" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>alancutter@chromium.org</owner> <owner>dominickn@chromium.org</owner> <summary> @@ -675,7 +675,7 @@ </histogram> <histogram name="Webapp.Install.InstallEvent" enum="WebappInstallSource" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>alancutter@chromium.org</owner> <owner>dominickn@chromium.org</owner> <owner>desktop-pwas-team@google.com</owner> @@ -746,7 +746,7 @@ </histogram> <histogram name="Webapp.InstallResult" enum="WebAppInstallResultCode" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <!-- Name completed by histogram_suffixes name="WebAppType" --> <owner>ortuno@chromium.org</owner> @@ -1110,7 +1110,7 @@ </histogram> <histogram name="WebApp.Shortcuts.Creation.Result" - enum="ShortcutsCreationResult" expires_after="2023-06-18"> + enum="ShortcutsCreationResult" expires_after="2023-08-20"> <owner>phillis@chromium.org</owner> <owner>dmurph@chromium.org</owner> <summary>Records the result of shortcut creation for PWA.</summary>
diff --git a/tools/metrics/histograms/metadata/windows/histograms.xml b/tools/metrics/histograms/metadata/windows/histograms.xml index e31f678b..42fa97c 100644 --- a/tools/metrics/histograms/metadata/windows/histograms.xml +++ b/tools/metrics/histograms/metadata/windows/histograms.xml
@@ -34,7 +34,7 @@ </histogram> <histogram name="Windows.CetEnabled" enum="BooleanEnabled" - expires_after="2023-06-18"> + expires_after="2023-08-20"> <owner>ajgo@chromium.org</owner> <owner>wfh@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/xr/histograms.xml b/tools/metrics/histograms/metadata/xr/histograms.xml index 463487b..f7ff311e 100644 --- a/tools/metrics/histograms/metadata/xr/histograms.xml +++ b/tools/metrics/histograms/metadata/xr/histograms.xml
@@ -39,7 +39,7 @@ </summary> </histogram> -<histogram name="VRViewerType" enum="VRViewerType" expires_after="2023-06-18"> +<histogram name="VRViewerType" enum="VRViewerType" expires_after="2023-08-20"> <owner>alcooper@chromium.org</owner> <owner>xr-dev@chromium.org</owner> <summary>The type of headset being used for VR.</summary>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index fb7a094e..d69a92f 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,24 +5,24 @@ "full_remote_path": "perfetto-luci-artifacts/3b59f000c939bfe4d05267fd68d282ef0b541334/linux-arm64/trace_processor_shell" }, "win": { - "hash": "1b7964fb57063bf31203b3599b80d69c6a4a4d29", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/0d180f46481a96cbe8340734fa5cdce3bba636c8/trace_processor_shell.exe" + "hash": "ac703781ed7ba9e9b0d0c627acae83a5e16c1d9d", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/bddab2f0f589eae7a70f8b5a6efa06fd6219bcab/trace_processor_shell.exe" }, "linux_arm": { "hash": "e945a99da7a66211f847b8049627bbec846d2d1d", "full_remote_path": "perfetto-luci-artifacts/3b59f000c939bfe4d05267fd68d282ef0b541334/linux-arm/trace_processor_shell" }, "mac": { - "hash": "9cbb2a7158ad68845684442ab4456bd78de93b68", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/0d180f46481a96cbe8340734fa5cdce3bba636c8/trace_processor_shell" + "hash": "669e56398717d141abb5d40b6486dd0cde6d06b8", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/bddab2f0f589eae7a70f8b5a6efa06fd6219bcab/trace_processor_shell" }, "mac_arm64": { "hash": "f9caa6dfbdc44573d32a21a9aeeed2058ffc3d68", "full_remote_path": "perfetto-luci-artifacts/ea816328b746af31c8b7441db2ae0c3f561e629d/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "15df64f8578f9b3f9c96fa89d636fd32d4814942", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/0d180f46481a96cbe8340734fa5cdce3bba636c8/trace_processor_shell" + "hash": "53030fbc3d6d2485ec35eb072492d32edf0cde5a", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/f396a983fe100dec36e2c7d9285ca8a74e0ade91/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/chromeos/strings/network/network_element_localized_strings_provider.cc b/ui/chromeos/strings/network/network_element_localized_strings_provider.cc index d9600982..f635e08 100644 --- a/ui/chromeos/strings/network/network_element_localized_strings_provider.cc +++ b/ui/chromeos/strings/network/network_element_localized_strings_provider.cc
@@ -29,6 +29,8 @@ constexpr webui::LocalizedString kElementLocalizedStrings[] = { {"invalidDomainSuffixMatchEntry", IDS_NETWORK_INVALID_DSM_VALUE}, {"invalidSubjectAlternativeNameMatchEntry", IDS_NETWORK_INVALID_SAN_ENTRY}, + {"missingEapDefaultServerCaSubjectVerification", + IDS_NETWORK_EAP_DEFAULT_SERVER_CA_WITHOUT_SUBJECT_VERIFICATION}, {"OncType", IDS_NETWORK_TYPE}, {"OncTypeCellular", IDS_NETWORK_TYPE_CELLULAR}, {"OncTypeEthernet", IDS_NETWORK_TYPE_ETHERNET}, @@ -48,6 +50,8 @@ {"networkListItemConnectingTo", IDS_NETWORK_LIST_CONNECTING_TO}, {"networkListItemInitializing", IDS_NETWORK_LIST_INITIALIZING}, {"networkListItemTitle", IDS_NETWORK_LIST_ITEM_TITLE}, + {"networkListItemActivateAfterDeviceSetup", + IDS_NETWORK_LIST_ACTIVATE_AFTER_DEVICE_SETUP}, {"networkListItemSubpageButtonLabel", IDS_NETWORK_LIST_ITEM_SUBPAGE_BUTTON_LABEL}, {"networkListItemLabel", IDS_NETWORK_LIST_ITEM_LABEL}, @@ -94,6 +98,14 @@ IDS_NETWORK_LIST_ITEM_LABEL_ESIM_PENDING_PROFILE}, {"networkListItemLabelESimPendingProfileWithProviderName", IDS_NETWORK_LIST_ITEM_LABEL_ESIM_PENDING_PROFILE_WITH_PROVIDER_NAME}, + {"networkListItemLabelActivateAfterSetup", + IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_ACTIVATE_AFTER_SETUP}, + {"networkListItemLabelActivateAfterSetupWithProviderName", + IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_ACTIVATE_AFTER_SETUP_WITH_PROVIDER_NAME}, + {"networkListItemLabelManagedActivateAfterSetup", + IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_MANAGED_ACTIVATE_AFTER_SETUP}, + {"networkListItemLabelManagedActivateAfterSetupWithProviderName", + IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_MANAGED_ACTIVATE_AFTER_SETUP_WITH_PROVIDER_NAME}, {"networkListItemLabelESimPendingProfileInstalling", IDS_NETWORK_LIST_ITEM_LABEL_ESIM_PENDING_PROFILE_INSTALLING}, {"networkListItemLabelESimPendingProfileWithProviderNameInstalling", @@ -528,6 +540,10 @@ // Only authenticated users can toggle the share state. html_source->AddBoolean("shareNetworkAllowEnable", ash::LoginState::Get()->IsUserAuthenticated()); + + html_source->AddBoolean( + "eapDefaultCasWithoutSubjectVerificationAllowed", + ash::features::IsEapDefaultCasWithoutSubjectVerificationAllowed()); } void AddErrorLocalizedStrings(content::WebUIDataSource* html_source) {
diff --git a/ui/chromeos/translations/ui_chromeos_strings_af.xtb b/ui/chromeos/translations/ui_chromeos_strings_af.xtb index 429ce2f4..0bcc60a1 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_af.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_af.xtb
@@ -27,6 +27,7 @@ <translation id="1201402288615127009">Volgende</translation> <translation id="1209796539517632982">Outomatiese naambedieners</translation> <translation id="1210831758834677569">Lao</translation> +<translation id="1221555006497674479">Berging is min; daar is <ph name="REMAINING_PERCENTAGE" />% van jou <ph name="TOTAL_SPACE" /> gedeelde Drive-berging oor.</translation> <translation id="1243314992276662751">Laai op</translation> <translation id="1249250836236328755">Genre</translation> <translation id="1254593899333212300">Direkte internetverbinding</translation> @@ -73,6 +74,7 @@ <translation id="1641780993263690097">Chinees-Pinjin</translation> <translation id="1646019627374511909">Maak tans <ph name="NUMBER_OF_ITEMS" /> lêers vanlyn beskikbaar</translation> <translation id="164969095109328410">Chrome-toestel</translation> +<translation id="1661207570040737402">Jy het al die Google Workspace-berging in jou gedeelde Drive gebruik.</translation> <translation id="1661867754829461514">PIN ontbreek</translation> <translation id="166439687370499867">Gedeeldenetwerkopstellings mag nie verander word nie</translation> <translation id="1665611772925418501">Die lêer kon nie verander word nie.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb index b19073f..b53001f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -27,6 +27,7 @@ <translation id="1201402288615127009">التالي</translation> <translation id="1209796539517632982">خوادم الأسماء التلقائية</translation> <translation id="1210831758834677569">اللاوية</translation> +<translation id="1221555006497674479">مساحة التخزين منخفضة. يتبقى %<ph name="REMAINING_PERCENTAGE" /> من إجمالي مساحة التخزين السحابي المشتركة التي تبلغ <ph name="TOTAL_SPACE" />.</translation> <translation id="1243314992276662751">تحميل</translation> <translation id="1249250836236328755">النوع</translation> <translation id="1254593899333212300">اتصال مباشر بالإنترنت</translation> @@ -73,6 +74,7 @@ <translation id="1641780993263690097">الصينية باستخدام لوحة مفاتيح Pinyin</translation> <translation id="1646019627374511909">جارٍ إتاحة <ph name="NUMBER_OF_ITEMS" /> ملف بلا إنترنت</translation> <translation id="164969095109328410">جهاز Chrome</translation> +<translation id="1661207570040737402">لقد استهلكت كل مساحة التخزين السحابي المشتركة في Google Workspace.</translation> <translation id="1661867754829461514">رقم التعريف الشخصي غير موجود</translation> <translation id="166439687370499867">لا يُسمح بتغيير عمليات ضبط الشبكة المشتركة.</translation> <translation id="1665611772925418501">تعذر تعديل على الملف.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb index 7c1d78c0..76ab554 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
@@ -354,6 +354,7 @@ <translation id="3971140002794351170">Stáhněte si mobilní profil, síť <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">angličtina (Velká Británie)</translation> <translation id="3975895378829046965">bengálština (fonetická)</translation> +<translation id="3999574733850440202">Nedávno otevřené soubory Microsoft byly přesunuty do služby OneDrive</translation> <translation id="4002066346123236978">Název</translation> <translation id="4017788180641807848">angličtina (USA) s klávesnicí Workman</translation> <translation id="4019998208269143058">Připnout do rychlých souborů</translation> @@ -904,6 +905,7 @@ <translation id="8300849813060516376">Selhání OTASP</translation> <translation id="8312871300878166382">Vložit do složky</translation> <translation id="8329978297633540474">Prostý text</translation> +<translation id="8332007959299458842">Nedávno otevřené soubory Microsoft byly přesunuty na Disk Google</translation> <translation id="8335587457941836791">Uvolnit z poličky</translation> <translation id="8335837413233998004">běloruština</translation> <translation id="8336153091935557858">Včera <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb index 99c323c..8676a9b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb
@@ -27,6 +27,7 @@ <translation id="1201402288615127009">შემდეგი</translation> <translation id="1209796539517632982">ავტომატური სახელის სერვერები</translation> <translation id="1210831758834677569">ლაოსური</translation> +<translation id="1221555006497674479">მეხსიერება იწურება. საზიარო დისკზე <ph name="TOTAL_SPACE" /> მეხსიერებიდან <ph name="REMAINING_PERCENTAGE" />% დაგრჩათ.</translation> <translation id="1243314992276662751">ატვირთვა</translation> <translation id="1249250836236328755">ჟანრი</translation> <translation id="1254593899333212300">პირდაპირი ინტერნეტ კავშირი</translation> @@ -73,6 +74,7 @@ <translation id="1641780993263690097">ჩინური პინ-ინი</translation> <translation id="1646019627374511909">მიმდინარეობს <ph name="NUMBER_OF_ITEMS" /> ფაილის ხაზგარეშე ხელმისაწვდომად გარდაქმნა</translation> <translation id="164969095109328410">Chrome მოწყობილობა</translation> +<translation id="1661207570040737402">საზიარო დისკზე მთლიანად გამოყენებული გაქვთ Google Workspace მეხსიერება.</translation> <translation id="1661867754829461514">PIN არ არის</translation> <translation id="166439687370499867">ზიარი ქსელების კონფიგურაციების შეცვლა დაუშვებელია</translation> <translation id="1665611772925418501">ფაილის შეცვლა შეუძლებელია.</translation> @@ -354,6 +356,7 @@ <translation id="3971140002794351170">მობილური პროფილის ჩამოტვირთვა, ქსელი <ph name="NETWORK_INDEX" /> / <ph name="NETWORK_COUNT" />-დან, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ინგლისური (გაერთიანებული სამეფო)</translation> <translation id="3975895378829046965">ბენგალური ფონეტიკური</translation> +<translation id="3999574733850440202">ბოლო დროს გახსნილი Microsoft-ის ფაილები გადატანილია OneDrive-ზე</translation> <translation id="4002066346123236978">სათაური</translation> <translation id="4017788180641807848">ინგლისური (აშშ) Workman კლავიატურით</translation> <translation id="4019998208269143058">სწრაფ ფაილებში ჩამაგრება</translation> @@ -904,6 +907,7 @@ <translation id="8300849813060516376">OTASP ვერ შესრულდა</translation> <translation id="8312871300878166382">ჩასმა საქაღალდეში</translation> <translation id="8329978297633540474">ჩვეულებრივი ტექსტი</translation> +<translation id="8332007959299458842">ბოლო დროს გახსნილი Microsoft-ის ფაილები გადატანილია Google Drive-ზე</translation> <translation id="8335587457941836791">მოხსენით თაროდან</translation> <translation id="8335837413233998004">ბელარუსული</translation> <translation id="8336153091935557858">გუშინ <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb index 6f3c3ef9..1a75ab8 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
@@ -27,6 +27,7 @@ <translation id="1201402288615127009">Келесі</translation> <translation id="1209796539517632982">Автоматты атау серверлері</translation> <translation id="1210831758834677569">Лаос</translation> +<translation id="1221555006497674479">Орын аз, <ph name="TOTAL_SPACE" /> ортақ диск жадының <ph name="REMAINING_PERCENTAGE" />%-ы ғана қалды.</translation> <translation id="1243314992276662751">Жүктеп салу</translation> <translation id="1249250836236328755">Жанр</translation> <translation id="1254593899333212300">Тікелей интернет қосылысы</translation> @@ -73,6 +74,7 @@ <translation id="1641780993263690097">Қытай (пиньинь)</translation> <translation id="1646019627374511909"><ph name="NUMBER_OF_ITEMS" /> файл офлайн режимде қолжетімді етілуде</translation> <translation id="164969095109328410">Chrome құрылғысы</translation> +<translation id="1661207570040737402">Ортақ дискінің Google Workspace жадын толық пайдаландыңыз.</translation> <translation id="1661867754829461514">PIN жоқ</translation> <translation id="166439687370499867">Ортақ желі конфигурацияларын өзгертуге рұқсат жоқ</translation> <translation id="1665611772925418501">Файлды өзгерту мүмкін болмады.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_km.xtb b/ui/chromeos/translations/ui_chromeos_strings_km.xtb index 2df52c8..a0b66ca 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_km.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_km.xtb
@@ -27,6 +27,7 @@ <translation id="1201402288615127009">បន្ទាប់</translation> <translation id="1209796539517632982">ម៉ាស៊ីនមេដែលមានឈ្មោះស្វ័យប្រវត្តិ</translation> <translation id="1210831758834677569">ភាសាឡាវ</translation> +<translation id="1221555006497674479">ទំហំផ្ទុកជិតអស់ហើយ នៅសល់ <ph name="REMAINING_PERCENTAGE" />% នៃទំហំផ្ទុកថាសរួម <ph name="TOTAL_SPACE" /> របស់អ្នក។</translation> <translation id="1243314992276662751">ទាញឡើង</translation> <translation id="1249250836236328755">ប្រភេទ</translation> <translation id="1254593899333212300">ការភ្ជាប់អ៊ីនធឺណិតផ្ទាល់</translation> @@ -73,6 +74,7 @@ <translation id="1641780993263690097">ភាសាចិនភីងអ៊ីង</translation> <translation id="1646019627374511909">កំពុងកំណត់ឱ្យឯកសារ <ph name="NUMBER_OF_ITEMS" /> អាចប្រើបានពេលគ្មានអ៊ីនធឺណិត</translation> <translation id="164969095109328410">ឧបករណ៍ Chrome</translation> +<translation id="1661207570040737402">អ្នកបានប្រើទំហំផ្ទុក Google Workspace ថាសរួមរបស់អ្នកអស់ហើយ។</translation> <translation id="1661867754829461514">បាត់បង់លេខសម្គាល់</translation> <translation id="166439687370499867">ការផ្លាស់ប្តូរការកំណត់រចនាសម្ព័ន្ធបណ្តាញដែលបានចែករំលែកមិនត្រូវបានអនុញ្ញាតទេ</translation> <translation id="1665611772925418501">ឯកសារនេះមិនអាចកែសម្រួលទេ។</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb index 47bf7f9..ecc2dc2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
@@ -27,6 +27,7 @@ <translation id="1201402288615127009">ಮುಂದೆ</translation> <translation id="1209796539517632982">ಸ್ವಯಂಚಾಲಿತ ಹೆಸರು ಸರ್ವರ್ಗಳು</translation> <translation id="1210831758834677569">ಲಾವೋ</translation> +<translation id="1221555006497674479">ಸಂಗ್ರಹಣೆ ಕಡಿಮೆಯಿದೆ, ನಿಮ್ಮ <ph name="TOTAL_SPACE" />ಹಂಚಿಕೊಂಡ ಡ್ರೈವ್ನ ಸಂಗ್ರಹಣೆಯಲ್ಲಿ <ph name="REMAINING_PERCENTAGE" />% ಉಳಿದಿದೆ.</translation> <translation id="1243314992276662751">ಅಪ್ಲೋಡ್</translation> <translation id="1249250836236328755">ಪ್ರಕಾರ</translation> <translation id="1254593899333212300">ನೇರ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ</translation> @@ -73,6 +74,7 @@ <translation id="1641780993263690097">ಚೈನೀಸ್ ಪಿನ್ಯಿನ್</translation> <translation id="1646019627374511909"><ph name="NUMBER_OF_ITEMS" /> ಫೈಲ್ಗಳನ್ನು ಆಫ್ಲೈನ್ನಲ್ಲಿ ಲಭ್ಯಗೊಳಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="164969095109328410">Chrome ಸಾಧನ</translation> +<translation id="1661207570040737402">ನಿಮ್ಮ ಎಲ್ಲಾ ಹಂಚಿಕೊಂಡ ಡ್ರೈವ್ನ Google Workspace ಸಂಗ್ರಹಣೆಯನ್ನು ನೀವು ಬಳಸಿದ್ದೀರಿ.</translation> <translation id="1661867754829461514">PIN ಕಾಣೆಯಾಗಿದೆ</translation> <translation id="166439687370499867">ಹಂಚಿದ ನೆಟ್ವರ್ಕ್ ಕಾನ್ಫಿಗರ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಅನುಮತಿಸುವುದಿಲ್ಲ</translation> <translation id="1665611772925418501">ಫೈಲ್ ಅನ್ನು ಮಾರ್ಪಡಿಸಲಾಗಲಿಲ್ಲ.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_no.xtb b/ui/chromeos/translations/ui_chromeos_strings_no.xtb index c10eaa0..b78f39c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_no.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
@@ -354,6 +354,7 @@ <translation id="3971140002794351170">Last ned mobilprofilen, nettverk <ph name="NETWORK_INDEX" /> av <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Engelsk (Storbritannia)</translation> <translation id="3975895378829046965">Bengali, fonetisk</translation> +<translation id="3999574733850440202">Nylig åpnede Microsoft-filer er flyttet til OneDrive</translation> <translation id="4002066346123236978">Tittel</translation> <translation id="4017788180641807848">Engelsk (USA) med Workman-tastatur</translation> <translation id="4019998208269143058">Fest til hurtigfiler</translation> @@ -905,6 +906,7 @@ <translation id="8300849813060516376">OTASP mislyktes</translation> <translation id="8312871300878166382">Lim inn i mappen</translation> <translation id="8329978297633540474">Ren tekst</translation> +<translation id="8332007959299458842">Nylig åpnede Microsoft-filer er flyttet til Google Disk</translation> <translation id="8335587457941836791">Løsne fra hyllen</translation> <translation id="8335837413233998004">Hviterussisk</translation> <translation id="8336153091935557858">I går kl. <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb index d204edf..12662a88 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
@@ -27,6 +27,7 @@ <translation id="1201402288615127009">Dalej</translation> <translation id="1209796539517632982">Automatyczny wybór serwerów nazw</translation> <translation id="1210831758834677569">Laotański</translation> +<translation id="1221555006497674479">Mało miejsca na dane – pozostało <ph name="REMAINING_PERCENTAGE" />% z <ph name="TOTAL_SPACE" /> miejsca na dysku współdzielonym.</translation> <translation id="1243314992276662751">Prześlij</translation> <translation id="1249250836236328755">Gatunek</translation> <translation id="1254593899333212300">Bezpośrednie połączenie internetowe</translation> @@ -73,6 +74,7 @@ <translation id="1641780993263690097">Chiński pinyin</translation> <translation id="1646019627374511909">Udostępniam pliki (<ph name="NUMBER_OF_ITEMS" />) offline</translation> <translation id="164969095109328410">Urządzenie z Chrome</translation> +<translation id="1661207570040737402">Skończyło Ci się miejsce na dysku współdzielonym w Google Workspace.</translation> <translation id="1661867754829461514">Brak kodu PIN</translation> <translation id="166439687370499867">Wprowadzanie zmian w konfiguracjach sieci współdzielonych jest niedozwolone.</translation> <translation id="1665611772925418501">Nie można zmodyfikować pliku.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb index 8193f8b..5958898 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
@@ -27,6 +27,7 @@ <translation id="1201402288615127009">Înainte</translation> <translation id="1209796539517632982">Servere de nume automate</translation> <translation id="1210831758834677569">Laoțiană</translation> +<translation id="1221555006497674479">Spațiu de stocare limitat: <ph name="REMAINING_PERCENTAGE" /> % din spațiul de stocare Drive în comun de <ph name="TOTAL_SPACE" />.</translation> <translation id="1243314992276662751">Încărcați</translation> <translation id="1249250836236328755">Gen</translation> <translation id="1254593899333212300">Conexiune directă la internet</translation> @@ -73,6 +74,7 @@ <translation id="1641780993263690097">Chineză Pinyin</translation> <translation id="1646019627374511909"><ph name="NUMBER_OF_ITEMS" /> fișiere devin disponibile offline</translation> <translation id="164969095109328410">Dispozitiv Chrome</translation> +<translation id="1661207570040737402">Ai folosit tot spațiul de stocare Drive în comun din Google Workspace.</translation> <translation id="1661867754829461514">Codul PIN lipsește</translation> <translation id="166439687370499867">Nu se permite modificarea configurațiilor de rețea cu acces comun</translation> <translation id="1665611772925418501">Fișierul nu a putut fi modificat.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb index d2e276d8..a3a645e4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
@@ -27,6 +27,7 @@ <translation id="1201402288615127009">Naprej</translation> <translation id="1209796539517632982">Samodejni imenski strežniki</translation> <translation id="1210831758834677569">laoščina</translation> +<translation id="1221555006497674479">Primanjkuje prostora za shranjevanje, še <ph name="REMAINING_PERCENTAGE" /> % od <ph name="TOTAL_SPACE" /> v deljenem prostoru za shranjevanje v Googlu Drive.</translation> <translation id="1243314992276662751">Prenesi</translation> <translation id="1249250836236328755">Zvrst</translation> <translation id="1254593899333212300">Neposredna internetna povezava</translation> @@ -73,6 +74,7 @@ <translation id="1641780993263690097">kitajščina (pinjin)</translation> <translation id="1646019627374511909">Omogočanje datotek (<ph name="NUMBER_OF_ITEMS" />) za dostop brez povezave</translation> <translation id="164969095109328410">Naprava Chrome</translation> +<translation id="1661207570040737402">Porabili ste ves deljeni prostor za shranjevanje v Googlu Drive za Google Workspace.</translation> <translation id="1661867754829461514">Manjka PIN</translation> <translation id="166439687370499867">Spreminjanje omrežnih konfiguracij v skupni rabi ni dovoljeno</translation> <translation id="1665611772925418501">Datoteke ni bilo mogoče spremeniti.</translation> @@ -354,6 +356,7 @@ <translation id="3971140002794351170">Profil za prenos v mobilni napravi, omrežje <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">angleščina (Združeno kraljestvo)</translation> <translation id="3975895378829046965">bengalščina (fonetična)</translation> +<translation id="3999574733850440202">Nedavno odprte datoteke Microsoftove zbirke programov so bile premaknjene v OneDrive.</translation> <translation id="4002066346123236978">Naslov</translation> <translation id="4017788180641807848">angleščina (ZDA) s tipkovnico Workman</translation> <translation id="4019998208269143058">Pripni na hitre datoteke</translation> @@ -905,6 +908,7 @@ <translation id="8300849813060516376">Storitev OTASP ni uspela</translation> <translation id="8312871300878166382">Prilepi v mapo</translation> <translation id="8329978297633540474">Golo besedilo</translation> +<translation id="8332007959299458842">Nedavno odprte datoteke Microsoftove zbirke programov so bile premaknjene v Google Drive.</translation> <translation id="8335587457941836791">Odpenjanje s police</translation> <translation id="8335837413233998004">beloruščina</translation> <translation id="8336153091935557858">Včeraj <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb index fb343d7..81b8583 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -356,6 +356,7 @@ <translation id="3971140002794351170">ดาวน์โหลดโปรไฟล์อุปกรณ์เคลื่อนที่, เครือข่าย <ph name="NETWORK_INDEX" /> จาก <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">อังกฤษ (สหราชอาณาจักร)</translation> <translation id="3975895378829046965">บังกลา (ตามการออกเสียง)</translation> +<translation id="3999574733850440202">ไฟล์ Microsoft ที่เปิดล่าสุดได้ย้ายไปยัง OneDrive แล้ว</translation> <translation id="4002066346123236978">ชื่อ</translation> <translation id="4017788180641807848">อังกฤษ (สหรัฐฯ) ด้วยแป้นพิมพ์ Workman</translation> <translation id="4019998208269143058">ปักหมุดไว้ที่ไฟล์ด่วน</translation> @@ -907,6 +908,7 @@ <translation id="8300849813060516376">OTASP ล้มเหลว</translation> <translation id="8312871300878166382">วางลงในโฟลเดอร์</translation> <translation id="8329978297633540474">ข้อความล้วน</translation> +<translation id="8332007959299458842">ไฟล์ Microsoft ที่เปิดล่าสุดได้ย้ายไปยัง Google ไดรฟ์แล้ว</translation> <translation id="8335587457941836791">เลิกปักหมุดในชั้นวาง</translation> <translation id="8335837413233998004">เบลารุส</translation> <translation id="8336153091935557858">เมื่อวานนี้ <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb index 6ec8b3c..4b531b92 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
@@ -27,6 +27,7 @@ <translation id="1201402288615127009">İleri</translation> <translation id="1209796539517632982">Otomatik ad sunucuları</translation> <translation id="1210831758834677569">Laoca</translation> +<translation id="1221555006497674479"><ph name="TOTAL_SPACE" /> olan ortak Drive depolama alanınızda %<ph name="REMAINING_PERCENTAGE" /> oranından daha az depolama alanı kaldı.</translation> <translation id="1243314992276662751">Yükle</translation> <translation id="1249250836236328755">Tür</translation> <translation id="1254593899333212300">Doğrudan İnternet bağlantısı</translation> @@ -73,6 +74,7 @@ <translation id="1641780993263690097">Çince Pinyin</translation> <translation id="1646019627374511909"><ph name="NUMBER_OF_ITEMS" /> dosya çevrimdışı kullanılabilir hale getiriliyor</translation> <translation id="164969095109328410">Chrome cihaz</translation> +<translation id="1661207570040737402">Google Workspace ortak Drive depolama alanınızın tamamını kullandınız.</translation> <translation id="1661867754829461514">PIN eksik</translation> <translation id="166439687370499867">Paylaşılan ağ yapılandırmalarının değiştirilmesine izin verilmez</translation> <translation id="1665611772925418501">Dosya değiştirilemedi.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb index a7d68bf1..97786ec 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
@@ -354,6 +354,7 @@ <translation id="3971140002794351170">下载移动网络配置文件,第 <ph name="NETWORK_INDEX" /> 个网络(共 <ph name="NETWORK_COUNT" /> 个),网络名称为“<ph name="NETWORK_NAME" />”,网络服务提供商为“<ph name="NETWORK_PROVIDER_NAME" />”</translation> <translation id="3973925058222872294">英语(英国)</translation> <translation id="3975895378829046965">孟加拉语注音</translation> +<translation id="3999574733850440202">最近打开的 Microsoft 文件已移至 OneDrive</translation> <translation id="4002066346123236978">标题</translation> <translation id="4017788180641807848">英语(美国)Workman 键盘</translation> <translation id="4019998208269143058">固定到“快捷文件”空间</translation> @@ -900,6 +901,7 @@ <translation id="8300849813060516376">OTASP 失败</translation> <translation id="8312871300878166382">粘贴到文件夹中</translation> <translation id="8329978297633540474">纯文本</translation> +<translation id="8332007959299458842">最近打开的 Microsoft 文件已移至 Google 云端硬盘</translation> <translation id="8335587457941836791">取消固定到任务栏</translation> <translation id="8335837413233998004">白俄罗斯语</translation> <translation id="8336153091935557858">昨天<ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb index 62677cc..bf9f584 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb
@@ -354,6 +354,7 @@ <translation id="3971140002794351170">下載流動裝置設定檔,<ph name="NETWORK_COUNT" /> 個網絡之中嘅第 <ph name="NETWORK_INDEX" /> 個,<ph name="NETWORK_NAME" />,<ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">英文 (英國)</translation> <translation id="3975895378829046965">孟加拉文 (拼音)</translation> +<translation id="3999574733850440202">最近開啟的 Microsoft 檔案已移動至 OneDrive</translation> <translation id="4002066346123236978">標題</translation> <translation id="4017788180641807848">英文 (美國),Workman 鍵盤</translation> <translation id="4019998208269143058">固定至快速檔案</translation> @@ -905,6 +906,7 @@ <translation id="8300849813060516376">OTASP 失敗</translation> <translation id="8312871300878166382">貼入資料夾</translation> <translation id="8329978297633540474">純文字</translation> +<translation id="8332007959299458842">最近開啟的 Microsoft 檔案已移動至 Google 雲端硬碟</translation> <translation id="8335587457941836791">從捷徑列中取消固定</translation> <translation id="8335837413233998004">白俄羅斯文</translation> <translation id="8336153091935557858">昨天<ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/ui_chromeos_strings.grd b/ui/chromeos/ui_chromeos_strings.grd index 49b2a03..d4ae711 100644 --- a/ui/chromeos/ui_chromeos_strings.grd +++ b/ui/chromeos/ui_chromeos_strings.grd
@@ -1436,6 +1436,9 @@ <message name="IDS_NETWORK_LIST_NOT_CONNECTED" desc="Text in the network list element when there is a network for the type, but it is not connected or connecting."> Not connected </message> + <message name="IDS_NETWORK_LIST_ACTIVATE_AFTER_DEVICE_SETUP" desc="Text in the network list element in OOBE when a Cellular network's SIM card is locked. Used to inform the user they can activate this SIM after device setup."> + Activate after device setup + </message> <message name="IDS_NETWORK_LIST_NO_NETWORK" desc="Text in the network list element when there is no network for the type."> No network </message> @@ -1529,6 +1532,18 @@ <message name="IDS_NETWORK_LIST_ITEM_LABEL_ESIM_PENDING_PROFILE_WITH_PROVIDER_NAME_INSTALLING" desc="A11y label for an eSIM profile that is currently installing, shown in a list in settings and oobe. Includes the provider name."> Installing mobile profile, Network <ph name="NETWORK_INDEX">$1<ex>1</ex></ph> of <ph name="NETWORK_COUNT">$2<ex>10</ex></ph>, <ph name="NETWORK_NAME">$3<ex>Verizon Wireless</ex></ph>, <ph name="NETWORK_PROVIDER_NAME">$4<ex>Verizon LTE</ex></ph> </message> + <message name="IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_MANAGED_ACTIVATE_AFTER_SETUP_WITH_PROVIDER_NAME" desc="A11y label for an enterprise managed cellular network in a list in oobe. Includes provider name. Informs the user to activate the network after device setup."> + Network <ph name="NETWORK_INDEX">$1<ex>1</ex></ph> of <ph name="NETWORK_COUNT">$2<ex>10</ex></ph>, <ph name="NETWORK_NAME">$3<ex>Verizon Wireless</ex></ph>, <ph name="NETWORK_PROVIDER_NAME">$4<ex>Verizon LTE</ex></ph>, Activate after device setup, Managed by your Administrator + </message> + <message name="IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_MANAGED_ACTIVATE_AFTER_SETUP" desc="A11y label for an enterprise managed cellular network in a list in oobe. Informs the user to activate the network after device setup."> + Network <ph name="NETWORK_INDEX">$1<ex>1</ex></ph> of <ph name="NETWORK_COUNT">$2<ex>10</ex></ph>, <ph name="NETWORK_NAME">$3<ex>Verizon Wireless</ex></ph>, Activate after device setup, Managed by your Administrator + </message> + <message name="IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_ACTIVATE_AFTER_SETUP" desc="A11y label for a cellular network in a list in oobe. Informs the user to activate the network after device setup."> + Network <ph name="NETWORK_INDEX">$1<ex>1</ex></ph> of <ph name="NETWORK_COUNT">$2<ex>10</ex></ph>, <ph name="NETWORK_NAME">$3<ex>Verizon Wireless</ex></ph>, Activate after device setup + </message> + <message name="IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_ACTIVATE_AFTER_SETUP_WITH_PROVIDER_NAME" desc="A11y label for a cellular network in a list in oobe. Includes provider name. Informs the user to activate the network after device setup."> + Network <ph name="NETWORK_INDEX">$1<ex>1</ex></ph> of <ph name="NETWORK_COUNT">$2<ex>10</ex></ph>, <ph name="NETWORK_NAME">$3<ex>Verizon Wireless</ex></ph>, <ph name="NETWORK_PROVIDER_NAME">$4<ex>Verizon LTE</ex></ph>, Activate after device setup + </message> <message name="IDS_NETWORK_LIST_ITEM_ACTIVATE" desc="Text for the button displayed for SIM networks that haven't been setup that opens the SIM setup dialog when clicked."> Activate </message> @@ -1888,6 +1903,9 @@ <message name="IDS_NETWORK_INVALID_SAN_ENTRY" desc="Network error message shown when the Subject Alternative Name Match list configured for an EAP network contains a malformed entry"> Invalid subject alternative name match entry </message> + <message name="IDS_NETWORK_EAP_DEFAULT_SERVER_CA_WITHOUT_SUBJECT_VERIFICATION" desc="Network error message shown when the EAP configuration uses the default server CA cert without configuring subject alt name or domain matches to validate the servers identity"> + Missing 'Subject alternative name match' or 'Domain suffix match' to validate the authentication server identity + </message> <!-- Settings strings --> <message name="IDS_SETTINGS_INTERNET_MOBILE_SEARCH" desc="Settings > Internet > Message in Mobile section when searching for mobile networks.">
diff --git a/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_EAP_DEFAULT_SERVER_CA_WITHOUT_SUBJECT_VERIFICATION.png.sha1 b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_EAP_DEFAULT_SERVER_CA_WITHOUT_SUBJECT_VERIFICATION.png.sha1 new file mode 100644 index 0000000..4295680 --- /dev/null +++ b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_EAP_DEFAULT_SERVER_CA_WITHOUT_SUBJECT_VERIFICATION.png.sha1
@@ -0,0 +1 @@ +b6cd823688915caee29ad7eb7d4b64e6b6336a39 \ No newline at end of file
diff --git a/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ACTIVATE_AFTER_DEVICE_SETUP.png.sha1 b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ACTIVATE_AFTER_DEVICE_SETUP.png.sha1 new file mode 100644 index 0000000..422e245 --- /dev/null +++ b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ACTIVATE_AFTER_DEVICE_SETUP.png.sha1
@@ -0,0 +1 @@ +475b356fee6c473768a6923404a201ec3444f455 \ No newline at end of file
diff --git a/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_ACTIVATE_AFTER_SETUP.png.sha1 b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_ACTIVATE_AFTER_SETUP.png.sha1 new file mode 100644 index 0000000..422e245 --- /dev/null +++ b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_ACTIVATE_AFTER_SETUP.png.sha1
@@ -0,0 +1 @@ +475b356fee6c473768a6923404a201ec3444f455 \ No newline at end of file
diff --git a/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_ACTIVATE_AFTER_SETUP_WITH_PROVIDER_NAME.png.sha1 b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_ACTIVATE_AFTER_SETUP_WITH_PROVIDER_NAME.png.sha1 new file mode 100644 index 0000000..422e245 --- /dev/null +++ b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_ACTIVATE_AFTER_SETUP_WITH_PROVIDER_NAME.png.sha1
@@ -0,0 +1 @@ +475b356fee6c473768a6923404a201ec3444f455 \ No newline at end of file
diff --git a/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_MANAGED_ACTIVATE_AFTER_SETUP.png.sha1 b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_MANAGED_ACTIVATE_AFTER_SETUP.png.sha1 new file mode 100644 index 0000000..422e245 --- /dev/null +++ b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_MANAGED_ACTIVATE_AFTER_SETUP.png.sha1
@@ -0,0 +1 @@ +475b356fee6c473768a6923404a201ec3444f455 \ No newline at end of file
diff --git a/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_MANAGED_ACTIVATE_AFTER_SETUP_WITH_PROVIDER_NAME.png.sha1 b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_MANAGED_ACTIVATE_AFTER_SETUP_WITH_PROVIDER_NAME.png.sha1 new file mode 100644 index 0000000..422e245 --- /dev/null +++ b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_ITEM_LABEL_CELLULAR_MANAGED_ACTIVATE_AFTER_SETUP_WITH_PROVIDER_NAME.png.sha1
@@ -0,0 +1 @@ +475b356fee6c473768a6923404a201ec3444f455 \ No newline at end of file
diff --git a/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn b/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn index 25043eb..86ff3068 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn +++ b/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn
@@ -307,6 +307,7 @@ "//ui/file_manager/file_manager/common/js:util", "//ui/file_manager/file_manager/externs:files_app_entry_interfaces", "//ui/file_manager/file_manager/externs:volume_manager", + "//ui/file_manager/file_manager/foreground/elements:files_tooltip", "//ui/file_manager/file_manager/foreground/js:file_list_model", "//ui/file_manager/file_manager/foreground/js:list_thumbnail_loader", "//ui/file_manager/file_manager/foreground/js/metadata:metadata_model", @@ -466,6 +467,7 @@ "//ui/file_manager/file_manager/externs:entry_location", "//ui/file_manager/file_manager/externs:files_app_entry_interfaces", "//ui/file_manager/file_manager/externs:volume_manager", + "//ui/file_manager/file_manager/foreground/elements:files_tooltip", "//ui/file_manager/file_manager/foreground/js:file_list_model", "//ui/file_manager/file_manager/foreground/js/metadata:metadata_model", ]
diff --git a/ui/file_manager/file_manager/foreground/js/ui/banners/google_one_offer_banner.html b/ui/file_manager/file_manager/foreground/js/ui/banners/google_one_offer_banner.html index 40a9f5b..65455bf4 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/banners/google_one_offer_banner.html +++ b/ui/file_manager/file_manager/foreground/js/ui/banners/google_one_offer_banner.html
@@ -5,7 +5,7 @@ </style> <educational-banner> <!-- Google One Offer banner is enabled only for en-*. It will be configured by the server. --> - <span slot="title">Get 100 GB of Google Drive cloud storage</span> - <span slot="subtitle">Your Chromebook comes with 100 GB of cloud storage free of charge for 12 months. All files saved in this folder will be backed up online automatically.</span> - <cr-button slot="extra-button" href="https://www.google.com/chromebook/perks/?id=google.one.2019" dismiss-banner-when-clicked>Get storage</cr-button> + <span slot="title">Get 100GB of cloud storage</span> + <span slot="subtitle">Keep your files backed up with 12 months of Google One at no charge</span> + <cr-button slot="extra-button" href="https://www.google.com/chromebook/perks/?id=google.one.2019" dismiss-banner-when-clicked>Claim now</cr-button> </educational-banner> \ No newline at end of file
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_grid.js b/ui/file_manager/file_manager/foreground/js/ui/file_grid.js index bb27724..1fcde69 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/file_grid.js +++ b/ui/file_manager/file_manager/foreground/js/ui/file_grid.js
@@ -12,6 +12,7 @@ import {str, util} from '../../../common/js/util.js'; import {FilesAppEntry} from '../../../externs/files_app_entry_interfaces.js'; import {VolumeManager} from '../../../externs/volume_manager.js'; +import {FilesTooltip} from '../../elements/files_tooltip.js'; import {FileListModel, GROUP_BY_FIELD_DIRECTORY, GROUP_BY_FIELD_MODIFICATION_TIME, GroupValue} from '../file_list_model.js'; import {ListThumbnailLoader} from '../list_thumbnail_loader.js'; import {MetadataModel} from '../metadata/metadata_model.js'; @@ -843,6 +844,10 @@ inlineStatus.appendChild(syncProgress); } + /** @type {!FilesTooltip} */ ( + li.ownerDocument.querySelector('files-tooltip')) + .addTarget(/** @type {!HTMLElement} */ (inlineStatus)); + frame.appendChild(inlineStatus); li.classList.toggle('dim-offline', availableOffline === false);
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_table_list.js b/ui/file_manager/file_manager/foreground/js/ui/file_table_list.js index be6c5cf7..be8e3dc 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/file_table_list.js +++ b/ui/file_manager/file_manager/foreground/js/ui/file_table_list.js
@@ -9,6 +9,7 @@ import {EntryLocation} from '../../../externs/entry_location.js'; import {FilesAppEntry} from '../../../externs/files_app_entry_interfaces.js'; import {VolumeManager} from '../../../externs/volume_manager.js'; +import {FilesTooltip} from '../../elements/files_tooltip.js'; import {FileListModel} from '../file_list_model.js'; import {MetadataModel} from '../metadata/metadata_model.js'; @@ -477,21 +478,25 @@ * @return {!HTMLDivElement} Created element. */ filelist.renderInlineStatus = (doc) => { - const iconDiv = /** @type {!HTMLDivElement} */ (doc.createElement('div')); - iconDiv.className = 'inline-status'; + const inlineStatus = + /** @type {!HTMLDivElement} */ (doc.createElement('div')); + inlineStatus.className = 'inline-status'; const inlineStatusIcon = doc.createElement('xf-icon'); inlineStatusIcon.size = 'extra_small'; inlineStatusIcon.type = 'offline'; - iconDiv.appendChild(inlineStatusIcon); + inlineStatus.appendChild(inlineStatusIcon); if (util.isInlineSyncStatusEnabled()) { const syncProgress = doc.createElement('xf-pie-progress'); syncProgress.className = 'progress'; - iconDiv.appendChild(syncProgress); + inlineStatus.appendChild(syncProgress); } - return iconDiv; + /** @type {!FilesTooltip} */ (document.querySelector('files-tooltip')) + .addTarget(inlineStatus); + + return inlineStatus; }; /**
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h index 8df4569..f8403279 100644 --- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h +++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
@@ -283,7 +283,8 @@ ui::mojom::DragOperation& output_drag_op); std::unique_ptr<aura::WindowTreeHost> host_; - raw_ptr<DesktopWindowTreeHost> desktop_window_tree_host_; + // DanglingUntriaged because it is assigned a DanglingUntriaged pointer. + raw_ptr<DesktopWindowTreeHost, DanglingUntriaged> desktop_window_tree_host_; // See class documentation for Widget in widget.h for a note about ownership. Widget::InitParams::Ownership ownership_ =
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h index c179c718..85e4bb8 100644 --- a/ui/views/widget/widget.h +++ b/ui/views/widget/widget.h
@@ -369,7 +369,9 @@ // of the default one. // TODO(beng): Figure out if there's a better way to expose this, e.g. get // rid of NW subclasses and do this all via message handling. - raw_ptr<DesktopWindowTreeHost> desktop_window_tree_host = nullptr; + // DanglingUntriaged because it is assigned a DanglingUntriaged pointer. + raw_ptr<DesktopWindowTreeHost, DanglingUntriaged> desktop_window_tree_host = + nullptr; // Only used by NativeWidgetAura. Specifies the type of layer for the // aura::Window.
diff --git a/weblayer/shell/android/webengine_shell_apk/res/layout/main.xml b/weblayer/shell/android/webengine_shell_apk/res/layout/main.xml index 935087c..f0e6bda 100644 --- a/weblayer/shell/android/webengine_shell_apk/res/layout/main.xml +++ b/weblayer/shell/android/webengine_shell_apk/res/layout/main.xml
@@ -18,12 +18,30 @@ android:text="x.x.x" android:layout_width="wrap_content" android:layout_height="wrap_content" /> - <EditText - android:id="@+id/url_bar" + <LinearLayout + android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="textUri" - android:selectAllOnFocus="true" /> + android:weightSum="6"> + <EditText + android:id="@+id/url_bar" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="5" + android:inputType="textUri" + android:selectAllOnFocus="true" /> + <Button + android:id="@+id/tab_count" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" /> + <Spinner + android:id="@+id/tab_list" + android:layout_width="0dp" + android:layout_height="0dp" + android:spinnerMode="dialog" + android:visibility="invisible" /> + </LinearLayout> <ProgressBar android:id="@+id/progress_bar" android:layout_width="match_parent" @@ -32,7 +50,6 @@ style="@android:style/Widget.ProgressBar.Horizontal" android:progressBackgroundTint="#0fff" android:progressTint="#4285F4" /> - <androidx.fragment.app.FragmentContainerView android:id="@+id/fragment_container_view" android:layout_width="match_parent"
diff --git a/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/WebEngineShellActivity.java b/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/WebEngineShellActivity.java index dabb67a9..a8c3a92 100644 --- a/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/WebEngineShellActivity.java +++ b/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/WebEngineShellActivity.java
@@ -11,6 +11,7 @@ import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; +import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Spinner; @@ -131,7 +132,11 @@ Tab activeTab = mTabManager.getActiveTab(); ProgressBar progressBar = findViewById(R.id.progress_bar); EditText urlBar = findViewById(R.id.url_bar); - new TopBarObservers(new TopBarImpl(this, mTabManager, urlBar, progressBar), mTabManager); + Button tabCountButton = findViewById(R.id.tab_count); + Spinner tabListSpinner = findViewById(R.id.tab_list); + new TopBarObservers(new TopBarImpl(this, mTabManager, urlBar, progressBar, tabCountButton, + tabListSpinner), + mTabManager); mTabManager.registerTabListObserver(new DefaultObservers.DefaultTabListObserver()); activeTab.getNavigationController().registerNavigationObserver(
diff --git a/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBar.java b/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBar.java index 4114f7eb..0ad1e379 100644 --- a/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBar.java +++ b/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBar.java
@@ -14,5 +14,13 @@ public abstract void setProgress(double progress); + public abstract void addTabToList(Tab tab); + + public abstract void removeTabFromList(Tab tab); + + public abstract void setTabListSelection(Tab tab); + public abstract boolean isTabActive(Tab tab); + + public abstract int getTabsCount(); }
diff --git a/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBarImpl.java b/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBarImpl.java index 049d82e..5b52b15 100644 --- a/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBarImpl.java +++ b/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBarImpl.java
@@ -10,10 +10,16 @@ import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; +import android.widget.Spinner; import android.widget.TextView; +import androidx.annotation.NonNull; + import org.chromium.webengine.Tab; import org.chromium.webengine.TabManager; @@ -25,14 +31,28 @@ private final TabManager mTabManager; private final EditText mUrlBar; private final ProgressBar mProgressBar; + private final Button mTabCountButton; + private final Spinner mTabListSpinner; + private final ArrayAdapter<TabWrapper> mTabListAdapter; - public TopBarImpl( - Context context, TabManager tabManager, EditText urlBar, ProgressBar progressBar) { + public TopBarImpl(Context context, TabManager tabManager, EditText urlBar, + ProgressBar progressBar, Button tabCountButton, Spinner tabListSpinner) { mContext = context; mTabManager = tabManager; mUrlBar = urlBar; mProgressBar = progressBar; + mTabCountButton = tabCountButton; + mTabCountButton.setText(String.valueOf(getTabsCount())); + + mTabListAdapter = new ArrayAdapter<TabWrapper>( + context, android.R.layout.simple_spinner_dropdown_item); + for (Tab t : mTabManager.getAllTabs()) { + mTabListAdapter.add(new TabWrapper(t)); + } + mTabListSpinner = tabListSpinner; + mTabListSpinner.setAdapter(mTabListAdapter); + urlBar.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { @@ -55,6 +75,17 @@ return true; } }); + + mTabCountButton.setOnClickListener(v -> mTabListSpinner.performClick()); + + mTabListSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { + mTabListAdapter.getItem(pos).getTab().setActive(); + } + @Override + public void onNothingSelected(AdapterView<?> parent) {} + }); } @Override @@ -74,7 +105,58 @@ } @Override + public void addTabToList(Tab tab) { + mTabCountButton.setText(String.valueOf(getTabsCount())); + mTabListAdapter.add(new TabWrapper(tab)); + } + + @Override + public void removeTabFromList(Tab tab) { + mTabCountButton.setText(String.valueOf(getTabsCount())); + for (int position = 0; position < mTabListAdapter.getCount(); ++position) { + TabWrapper tabAdapter = mTabListAdapter.getItem(position); + if (tabAdapter.getTab().equals(tab)) { + mTabListAdapter.remove(tabAdapter); + return; + } + } + } + + @Override + public void setTabListSelection(Tab tab) { + for (int position = 0; position < mTabListAdapter.getCount(); ++position) { + TabWrapper tabWrapper = mTabListAdapter.getItem(position); + if (tabWrapper.getTab().equals(tab)) { + mTabListSpinner.setSelection(mTabListAdapter.getPosition(tabWrapper)); + return; + } + } + } + + @Override public boolean isTabActive(Tab tab) { return mTabManager.getActiveTab() != null && mTabManager.getActiveTab().equals(tab); } + + @Override + public int getTabsCount() { + return mTabManager.getAllTabs().size(); + } + + static class TabWrapper { + final Tab mTab; + public TabWrapper(Tab tab) { + mTab = tab; + } + + public Tab getTab() { + return mTab; + } + + @NonNull + @Override + public String toString() { + return mTab.getDisplayUri().getAuthority() + mTab.getDisplayUri().getPath(); + } + } }
diff --git a/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBarObservers.java b/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBarObservers.java index d3a0196..d24b5cf 100644 --- a/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBarObservers.java +++ b/weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBarObservers.java
@@ -62,15 +62,25 @@ class TopBarTabListObserver extends TabListObserver { @Override public void onActiveTabChanged(@Nullable Tab activeTab) { + if (activeTab == null) { + return; + } mTopBar.setUrlBar(activeTab.getDisplayUri().toString()); + mTopBar.setTabListSelection(activeTab); } @Override public void onTabAdded(@NonNull Tab tab) { + mTopBar.addTabToList(tab); // Recursively add tab and navigation observers to any new tab. tab.registerTabObserver(new TopBarTabObserver(tab)); tab.getNavigationController().registerNavigationObserver( new TopBarNavigationObserver(tab)); } + + @Override + public void onTabRemoved(@NonNull Tab tab) { + mTopBar.removeTabFromList(tab); + } } }