Add user affiliation on CrOS check into logic checking if WebAuthn call allowed by policy [chromium/src : main]

0 views
Skip to first unread message

Olga Korokhina (Gerrit)

unread,
Jan 27, 2026, 3:19:33 PM (14 days ago) Jan 27
to (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Andrii Natiahlyi, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
Attention needed from Andrii Natiahlyi and Martin Kreichgauer

Olga Korokhina added 2 comments

File chrome/browser/webauthn/chrome_web_authentication_delegate_base.cc
Line 73, Patchset 7: // served from Admin Panel on W/M/L yet it is still possible to
// set it via custom profile JSON
Martin Kreichgauer . resolved

This would mean whoever sets the policy can run code on the device. That's an acceptable bar for us for this policy.

Olga Korokhina

Copy, so we only check affiliation on CrOS, no additional actions on other platforms expected.

Olga Korokhina

Done

Line 84, Patchset 7: if (!isUserPlatformDependantAffiliated(profile)) {
Olga Korokhina . resolved
@mart...@google.com @nati...@google.com
Gentlemen I'd like to get you opinion on this change, if this is a correct place to do the affiliation check, and what do we do on other platforms - immediately reject or proceed with further checks as it is now. Do we need to check a version of a CrOS as well?
Martin Kreichgauer

This looks like a good place for this check, yes.

Since the method doesn't actually check affiliation on ChromeOS, we should just not define it for !OS_CHROMEOS. (Or just inline the entire check into this method, it's 4 lines.)

Do we need to check a version of a CrOS as well?

I'm not sure I understand what purpose that would serve. Could you expand?

Olga Korokhina

My question was do we need to preserve the existing behavior for older version of Chrome but I see this doesn't make sense indeed - this code will simply not be there.
So we only do affiliation check on ChromeOS, effective immediately with this code merge. Thank you!

Olga Korokhina

Done

Open in Gerrit

Related details

Attention is currently required from:
  • Andrii Natiahlyi
  • Martin Kreichgauer
Submit Requirements:
  • requirement satisfiedCode-Coverage
  • requirement is not satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: chromium/src
Gerrit-Branch: main
Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
Gerrit-Change-Number: 7513593
Gerrit-PatchSet: 18
Gerrit-Owner: Olga Korokhina <koro...@google.com>
Gerrit-Reviewer: Andrii Natiahlyi <nati...@google.com>
Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
Gerrit-Attention: Martin Kreichgauer <mart...@google.com>
Gerrit-Attention: Andrii Natiahlyi <nati...@google.com>
Gerrit-Comment-Date: Tue, 27 Jan 2026 20:19:16 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: Martin Kreichgauer <mart...@google.com>
Comment-In-Reply-To: Olga Korokhina <koro...@google.com>
satisfied_requirement
unsatisfied_requirement
open
diffy

Martin Kreichgauer (Gerrit)

unread,
Jan 27, 2026, 4:15:00 PM (14 days ago) Jan 27
to Olga Korokhina, (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Andrii Natiahlyi, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
Attention needed from Andrii Natiahlyi and Olga Korokhina

Martin Kreichgauer added 10 comments

File chrome/browser/webauthn/chrome_web_authentication_delegate_base_unittest.cc
Line 19, Patchset 18 (Latest):// Necessary includes for user affiliation set up
Martin Kreichgauer . unresolved

We typically don't comment includes

Line 34, Patchset 18 (Latest): ChromeRenderViewHostTestHarness::SetUp(); // Call base SetUp
Martin Kreichgauer . unresolved

This comment is superfluous.

Line 37, Patchset 18 (Latest): fake_user_manager_ = user_manager.get();
Martin Kreichgauer . unresolved

Does `scoped_user_manager_.Get()` return the same value?

Line 46, Patchset 18 (Latest): ChromeRenderViewHostTestHarness::TearDown(); // Call base TearDown
Martin Kreichgauer . unresolved

Same here.

Line 65, Patchset 18 (Latest): nullptr; // = raw_ptr<ash::FakeChromeUserManager>();
Martin Kreichgauer . unresolved

Spurious comment

Line 90, Patchset 18 (Latest): if (!user) {
return;
}
Martin Kreichgauer . unresolved

Should it be allowed to call this method with effectively an unknown user ID? Wouldn't this just hide a potential error in the test?

Line 94, Patchset 18 (Latest): if (fake_user_manager_->IsUserLoggedIn()) {
if (fake_user_manager_->GetActiveUser() == user) {
Martin Kreichgauer . unresolved

Nit: These two if statements can be combined.

Line 94, Patchset 18 (Latest): if (fake_user_manager_->IsUserLoggedIn()) {
if (fake_user_manager_->GetActiveUser() == user) {
Martin Kreichgauer . unresolved

Similar question as above: Is it a good idea to allow a test to attempt to log out a user that isn't logged in?

Line 191, Patchset 18 (Latest): base::ScopedAllowBlockingForTesting allow_blocking;
Martin Kreichgauer . unresolved

Can you comment why that's needed?

Line 210, Patchset 18 (Latest):// Both the origin specified by the command-line switch and the origin in the
// allowed origins pref should be allowed. Affiliation check happening on
// CrOS needs to be taken into account as well.
#if !BUILDFLAG(IS_CHROMEOS)
EXPECT_TRUE(delegate.OriginMayUseRemoteDesktopClientOverride(
browser_context(), url::Origin::Create(GURL(kExampleOrigin))));
EXPECT_TRUE(delegate.OriginMayUseRemoteDesktopClientOverride(
browser_context(), url::Origin::Create(GURL(kAnotherExampleOrigin))));
#elif BUILDFLAG(IS_CHROMEOS)
// False when user is not affiliated
EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
browser_context(), url::Origin::Create(GURL(kExampleOrigin))));
EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
browser_context(), url::Origin::Create(GURL(kAnotherExampleOrigin))));

// set user as affiliated for example.com
SetupUserAffiliation(true, "te...@example.com");

// True when user is affiliated for same origin
EXPECT_TRUE(delegate.OriginMayUseRemoteDesktopClientOverride(
browser_context(), url::Origin::Create(GURL(kExampleOrigin))));

EXPECT_TRUE(delegate.OriginMayUseRemoteDesktopClientOverride(
browser_context(), url::Origin::Create(GURL(kAnotherExampleOrigin))));

// Log out user
LogOutUser("te...@example.com");

EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
browser_context(), url::Origin::Create(GURL(kExampleOrigin))));
EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
browser_context(), url::Origin::Create(GURL(kAnotherExampleOrigin))));

// set user as affiliated for another.example.com
SetupUserAffiliation(true, "te...@another.example.com");
#endif
Martin Kreichgauer . unresolved

I think relying on ifdefs in the test body to test different scenarios based on the OS hurts readability. Would the following work:

  • In the test suite, set up the user affiliation for ChromeOS.
  • In dedicated tests (perhaps an extra suite, perhaps a single test in the same suite), explicitly test the additional behavior for users that aren't affiliate on ChromeOS.
Open in Gerrit

Related details

Attention is currently required from:
  • Andrii Natiahlyi
  • Olga Korokhina
Submit Requirements:
    • requirement satisfiedCode-Coverage
    • requirement is not satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
    Gerrit-Change-Number: 7513593
    Gerrit-PatchSet: 18
    Gerrit-Owner: Olga Korokhina <koro...@google.com>
    Gerrit-Reviewer: Andrii Natiahlyi <nati...@google.com>
    Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
    Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
    Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
    Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
    Gerrit-Attention: Olga Korokhina <koro...@google.com>
    Gerrit-Attention: Andrii Natiahlyi <nati...@google.com>
    Gerrit-Comment-Date: Tue, 27 Jan 2026 21:14:47 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Olga Korokhina (Gerrit)

    unread,
    Jan 28, 2026, 1:02:22 AM (13 days ago) Jan 28
    to (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Andrii Natiahlyi, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
    Attention needed from Andrii Natiahlyi and Martin Kreichgauer

    Olga Korokhina added 4 comments

    File chrome/browser/webauthn/chrome_web_authentication_delegate_base_unittest.cc
    Line 90, Patchset 18 (Latest): if (!user) {
    return;
    }
    Martin Kreichgauer . unresolved

    Should it be allowed to call this method with effectively an unknown user ID? Wouldn't this just hide a potential error in the test?

    Olga Korokhina

    would you recommend to throw an error in this case?

    Line 94, Patchset 18 (Latest): if (fake_user_manager_->IsUserLoggedIn()) {
    if (fake_user_manager_->GetActiveUser() == user) {
    Martin Kreichgauer . unresolved

    Similar question as above: Is it a good idea to allow a test to attempt to log out a user that isn't logged in?

    Olga Korokhina

    Haven't thought about it this way, we use this method only on logged in user. We can throw an error above, as you suggested, and also here, if user is not logged in, but I see no harm really in not doing it: we log user out after checking is she is affiliated so - already logged in by design.
    For the purity of isolated method, will throwing errors here improve it?

    Line 191, Patchset 18 (Latest): base::ScopedAllowBlockingForTesting allow_blocking;
    Martin Kreichgauer . unresolved

    Can you comment why that's needed?

    Olga Korokhina

    It is a left over from my experiments, you're rights, it is not needed here, thank you!

    Olga Korokhina

    I implemented it this way because of number of code/test cases will be higher in this case. And we will probably need to change all existing cases names, but let me try. We can have behavior described above for the whole test class in a big comments section.

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Andrii Natiahlyi
    • Martin Kreichgauer
    Submit Requirements:
    • requirement satisfiedCode-Coverage
    • requirement is not satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
    Gerrit-Change-Number: 7513593
    Gerrit-PatchSet: 18
    Gerrit-Owner: Olga Korokhina <koro...@google.com>
    Gerrit-Reviewer: Andrii Natiahlyi <nati...@google.com>
    Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
    Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
    Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
    Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
    Gerrit-Attention: Martin Kreichgauer <mart...@google.com>
    Gerrit-Attention: Andrii Natiahlyi <nati...@google.com>
    Gerrit-Comment-Date: Wed, 28 Jan 2026 06:02:05 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    Comment-In-Reply-To: Martin Kreichgauer <mart...@google.com>
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Martin Kreichgauer (Gerrit)

    unread,
    Jan 28, 2026, 11:52:48 AM (13 days ago) Jan 28
    to Olga Korokhina, (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Andrii Natiahlyi, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
    Attention needed from Olga Korokhina

    Martin Kreichgauer added 3 comments

    File chrome/browser/webauthn/chrome_web_authentication_delegate_base_unittest.cc
    Line 90, Patchset 18 (Latest): if (!user) {
    return;
    }
    Martin Kreichgauer . unresolved

    Should it be allowed to call this method with effectively an unknown user ID? Wouldn't this just hide a potential error in the test?

    Olga Korokhina

    would you recommend to throw an error in this case?

    Martin Kreichgauer

    If it's an invariant in the code, you'd use a CHECK(). If it's a behavior of the code under test that you want to verify, ASSERT_* or EXPECT_* would be more appropriate and provide better diagnostic.

    Since this is a utility method, and the thing you're unit testing isn't login itself, CHECK-ing would be fine. Or you could also return success as a bool (preferably with `[[nodiscard]]`) and `ASSERT_TRUE(LogoutUser(...))` in the test method.

    Line 94, Patchset 18 (Latest): if (fake_user_manager_->IsUserLoggedIn()) {
    if (fake_user_manager_->GetActiveUser() == user) {
    Martin Kreichgauer . unresolved

    Similar question as above: Is it a good idea to allow a test to attempt to log out a user that isn't logged in?

    Olga Korokhina

    Haven't thought about it this way, we use this method only on logged in user. We can throw an error above, as you suggested, and also here, if user is not logged in, but I see no harm really in not doing it: we log user out after checking is she is affiliated so - already logged in by design.
    For the purity of isolated method, will throwing errors here improve it?

    Martin Kreichgauer

    I think making the tests robust against e.g. a typo in the username string passed to `LogOutUser()` is a small improvement, yes. It's not a big deal, but it could hide errors otherwise.

    Martin Kreichgauer

    I'd say that having a larger of number of test cases that are each well defined and test a particular thing is generally preferred over having a single test method that asserts multiple behaviors. See e.g. http://go/tott/726.md

    This way you also don't need to sprinkle `SetupUserAffiliation(true, "te...@example.com");` into all of the various test cases below. The purpose of that isn't straightforward to understand. If it'd happen once during SetUp(), you could just put a comment next to it, explaining why that's relevant on ChromeOS.

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Olga Korokhina
    Submit Requirements:
    • requirement satisfiedCode-Coverage
    • requirement is not satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
    Gerrit-Change-Number: 7513593
    Gerrit-PatchSet: 18
    Gerrit-Owner: Olga Korokhina <koro...@google.com>
    Gerrit-Reviewer: Andrii Natiahlyi <nati...@google.com>
    Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
    Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
    Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
    Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
    Gerrit-Attention: Olga Korokhina <koro...@google.com>
    Gerrit-Comment-Date: Wed, 28 Jan 2026 16:52:37 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    Comment-In-Reply-To: Martin Kreichgauer <mart...@google.com>
    Comment-In-Reply-To: Olga Korokhina <koro...@google.com>
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Olga Korokhina (Gerrit)

    unread,
    Jan 28, 2026, 12:58:48 PM (13 days ago) Jan 28
    to (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Andrii Natiahlyi, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
    Attention needed from Martin Kreichgauer

    Olga Korokhina added 9 comments

    File chrome/browser/webauthn/chrome_web_authentication_delegate_base_unittest.cc
    Line 19, Patchset 18:// Necessary includes for user affiliation set up
    Martin Kreichgauer . resolved

    We typically don't comment includes

    Olga Korokhina

    removed, thank you

    Line 34, Patchset 18: ChromeRenderViewHostTestHarness::SetUp(); // Call base SetUp
    Martin Kreichgauer . resolved

    This comment is superfluous.

    Olga Korokhina

    comment removed, thank you

    Line 37, Patchset 18: fake_user_manager_ = user_manager.get();
    Martin Kreichgauer . resolved

    Does `scoped_user_manager_.Get()` return the same value?

    Olga Korokhina

    No, we can not replace it and we need both of them: scoped_user_manager_.Get() returns UserManager instance which is missing additional methods (AddUserWithAffiliationAndTypeAndProfile, AddUserWithAffiliation etc.) we need in a test, they are incapsulated in FakeUserManager.

    How it works (AI generated content below, sorry!):

    ash::FakeChromeUserManager *fake_user_manager_:

    This is a raw pointer to the actual fake implementation of the UserManager. You need this pointer to call the specific methods of FakeChromeUserManager within your test setup functions (like SetupAshUser) to add users, log them in, set their affiliation status, etc. This is how you control the fake behavior.

    std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_:

    The UserManager is a global singleton, accessed via user_manager::UserManager::Get(). Many parts of the Chrome browser code, including potentially the code being tested in ChromeWebAuthenticationDelegateBase or its dependencies like ash::ProfileHelper, will call UserManager::Get() to retrieve the current user manager instance.
    ScopedUserManager is a test utility that takes ownership of a UserManager instance (in this case, your FakeChromeUserManager) and sets it as the global instance returned by UserManager::Get() for the lifetime of the ScopedUserManager object.
    When scoped_user_manager_ is created in SetUp(), it injects your fake_user_manager_.
    When scoped_user_manager_ is destroyed in TearDown(), it cleans up and restores the previous global UserManager instance, ensuring test isolation.

    Line 46, Patchset 18: ChromeRenderViewHostTestHarness::TearDown(); // Call base TearDown
    Martin Kreichgauer . resolved

    Same here.

    Olga Korokhina

    comment removed, thank you

    Line 65, Patchset 18: nullptr; // = raw_ptr<ash::FakeChromeUserManager>();
    Martin Kreichgauer . resolved

    Spurious comment

    Olga Korokhina

    removed, thank you

    Line 90, Patchset 18: if (!user) {
    return;
    }
    Martin Kreichgauer . unresolved

    Should it be allowed to call this method with effectively an unknown user ID? Wouldn't this just hide a potential error in the test?

    Olga Korokhina

    would you recommend to throw an error in this case?

    Martin Kreichgauer

    If it's an invariant in the code, you'd use a CHECK(). If it's a behavior of the code under test that you want to verify, ASSERT_* or EXPECT_* would be more appropriate and provide better diagnostic.

    Since this is a utility method, and the thing you're unit testing isn't login itself, CHECK-ing would be fine. Or you could also return success as a bool (preferably with `[[nodiscard]]`) and `ASSERT_TRUE(LogoutUser(...))` in the test method.

    Olga Korokhina

    Addressed, thank you

    Line 94, Patchset 18: if (fake_user_manager_->IsUserLoggedIn()) {

    if (fake_user_manager_->GetActiveUser() == user) {
    Martin Kreichgauer . unresolved

    Nit: These two if statements can be combined.

    Olga Korokhina

    Addressed, thank you

    Line 94, Patchset 18: if (fake_user_manager_->IsUserLoggedIn()) {

    if (fake_user_manager_->GetActiveUser() == user) {
    Martin Kreichgauer . unresolved

    Similar question as above: Is it a good idea to allow a test to attempt to log out a user that isn't logged in?

    Olga Korokhina

    Haven't thought about it this way, we use this method only on logged in user. We can throw an error above, as you suggested, and also here, if user is not logged in, but I see no harm really in not doing it: we log user out after checking is she is affiliated so - already logged in by design.
    For the purity of isolated method, will throwing errors here improve it?

    Martin Kreichgauer

    I think making the tests robust against e.g. a typo in the username string passed to `LogOutUser()` is a small improvement, yes. It's not a big deal, but it could hide errors otherwise.

    Olga Korokhina

    Copy, thank you, comment addressed

    Line 210, Patchset 18:// Both the origin specified by the command-line switch and the origin in the
    Olga Korokhina

    Cleaned up the other test cases and added one dedicated to CrOS to test behavior with and without affiliation. Thank you, comment addressed.

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Martin Kreichgauer
    Submit Requirements:
    • requirement satisfiedCode-Coverage
    • requirement is not satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
    Gerrit-Change-Number: 7513593
    Gerrit-PatchSet: 19
    Gerrit-Owner: Olga Korokhina <koro...@google.com>
    Gerrit-Reviewer: Andrii Natiahlyi <nati...@google.com>
    Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
    Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
    Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
    Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
    Gerrit-Attention: Martin Kreichgauer <mart...@google.com>
    Gerrit-Comment-Date: Wed, 28 Jan 2026 17:58:35 +0000
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Olga Korokhina (Gerrit)

    unread,
    Jan 29, 2026, 3:35:00 AM (12 days ago) Jan 29
    to (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Andrii Natiahlyi, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
    Attention needed from Andrii Natiahlyi and Martin Kreichgauer

    Olga Korokhina added 5 comments

    File chrome/browser/webauthn/chrome_web_authentication_delegate_base_unittest.cc
    Line 90, Patchset 18: if (!user) {
    return;
    }
    Martin Kreichgauer . resolved

    Should it be allowed to call this method with effectively an unknown user ID? Wouldn't this just hide a potential error in the test?

    Olga Korokhina

    would you recommend to throw an error in this case?

    Martin Kreichgauer

    If it's an invariant in the code, you'd use a CHECK(). If it's a behavior of the code under test that you want to verify, ASSERT_* or EXPECT_* would be more appropriate and provide better diagnostic.

    Since this is a utility method, and the thing you're unit testing isn't login itself, CHECK-ing would be fine. Or you could also return success as a bool (preferably with `[[nodiscard]]`) and `ASSERT_TRUE(LogoutUser(...))` in the test method.

    Olga Korokhina

    Addressed, thank you

    Olga Korokhina

    Marked as resolved.

    Line 94, Patchset 18: if (fake_user_manager_->IsUserLoggedIn()) {
    if (fake_user_manager_->GetActiveUser() == user) {
    Martin Kreichgauer . resolved

    Nit: These two if statements can be combined.

    Olga Korokhina

    Addressed, thank you

    Olga Korokhina

    Marked as resolved.

    Line 94, Patchset 18: if (fake_user_manager_->IsUserLoggedIn()) {
    if (fake_user_manager_->GetActiveUser() == user) {
    Martin Kreichgauer . resolved

    Similar question as above: Is it a good idea to allow a test to attempt to log out a user that isn't logged in?

    Olga Korokhina

    Haven't thought about it this way, we use this method only on logged in user. We can throw an error above, as you suggested, and also here, if user is not logged in, but I see no harm really in not doing it: we log user out after checking is she is affiliated so - already logged in by design.
    For the purity of isolated method, will throwing errors here improve it?

    Martin Kreichgauer

    I think making the tests robust against e.g. a typo in the username string passed to `LogOutUser()` is a small improvement, yes. It's not a big deal, but it could hide errors otherwise.

    Olga Korokhina

    Copy, thank you, comment addressed

    Olga Korokhina

    Marked as resolved.

    Line 191, Patchset 18: base::ScopedAllowBlockingForTesting allow_blocking;
    Martin Kreichgauer . resolved

    Can you comment why that's needed?

    Olga Korokhina

    It is a left over from my experiments, you're rights, it is not needed here, thank you!

    Olga Korokhina

    Marked as resolved.

    Martin Kreichgauer . resolved

    I think relying on ifdefs in the test body to test different scenarios based on the OS hurts readability. Would the following work:

    • In the test suite, set up the user affiliation for ChromeOS.
    • In dedicated tests (perhaps an extra suite, perhaps a single test in the same suite), explicitly test the additional behavior for users that aren't affiliate on ChromeOS.
    Olga Korokhina

    I implemented it this way because of number of code/test cases will be higher in this case. And we will probably need to change all existing cases names, but let me try. We can have behavior described above for the whole test class in a big comments section.

    Martin Kreichgauer

    I'd say that having a larger of number of test cases that are each well defined and test a particular thing is generally preferred over having a single test method that asserts multiple behaviors. See e.g. http://go/tott/726.md

    This way you also don't need to sprinkle `SetupUserAffiliation(true, "te...@example.com");` into all of the various test cases below. The purpose of that isn't straightforward to understand. If it'd happen once during SetUp(), you could just put a comment next to it, explaining why that's relevant on ChromeOS.

    Olga Korokhina

    Cleaned up the other test cases and added one dedicated to CrOS to test behavior with and without affiliation. Thank you, comment addressed.

    Olga Korokhina

    Marked as resolved.

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Andrii Natiahlyi
    • Martin Kreichgauer
    Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement is not satisfiedCode-Owners
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
      Gerrit-Change-Number: 7513593
      Gerrit-PatchSet: 19
      Gerrit-Owner: Olga Korokhina <koro...@google.com>
      Gerrit-Reviewer: Andrii Natiahlyi <nati...@google.com>
      Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
      Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
      Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
      Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
      Gerrit-Attention: Martin Kreichgauer <mart...@google.com>
      Gerrit-Attention: Andrii Natiahlyi <nati...@google.com>
      Gerrit-Comment-Date: Thu, 29 Jan 2026 08:34:41 +0000
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Andrii Natiahlyi (Gerrit)

      unread,
      Jan 30, 2026, 8:07:51 AM (11 days ago) Jan 30
      to Olga Korokhina, (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
      Attention needed from Martin Kreichgauer and Olga Korokhina

      Andrii Natiahlyi added 1 comment

      File chrome/browser/webauthn/chrome_web_authentication_delegate_base_unittest.cc
      Line 230, Patchset 19 (Latest):TEST_F(OriginMayUseRemoteDesktopClientOverrideTest,
      AdditionalOriginSwitch_WithAllowedOriginsPolicy_ChromeOsNoAffiliation) {
      // Version of a test case above but for non-affiliated user on ChromeOS
      ChromeWebAuthenticationDelegateBase delegate;
      base::test::ScopedCommandLine scoped_command_line;
      scoped_command_line.GetProcessCommandLine()->AppendSwitchASCII(
      webauthn::switches::kRemoteProxiedRequestsAllowedAdditionalOrigin,
      kExampleOrigin);

      // Initially, no origins should be allowed because the allowed origins pref
      // hasn't been set yet.

      EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
      browser_context(), url::Origin::Create(GURL(kExampleOrigin))));
      EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
      browser_context(), url::Origin::Create(GURL(kAnotherExampleOrigin))));

      // Set the allowed origins pref to include another origin.
      PrefService* prefs =
      Profile::FromBrowserContext(GetBrowserContext())->GetPrefs();
      prefs->SetList(webauthn::pref_names::kRemoteDesktopAllowedOrigins,
      base::ListValue().Append(kAnotherExampleOrigin));


      // Both the origin specified by the command-line switch and the origin in the
      // allowed origins pref should be allowed. Affiliation check happening on
      // CrOS needs to be taken into account as well. On the test set up user
      // affiliated with example.com domain, so with same origin we get trus

      EXPECT_TRUE(delegate.OriginMayUseRemoteDesktopClientOverride(
      browser_context(), url::Origin::Create(GURL(kExampleOrigin))));
      EXPECT_TRUE(delegate.OriginMayUseRemoteDesktopClientOverride(
      browser_context(), url::Origin::Create(GURL(kAnotherExampleOrigin))));

      // Log user out
      ASSERT_TRUE(LogOutUser(kTestAtExampleDotCom));

      // False when user is not affiliated or no user

      EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
      browser_context(), url::Origin::Create(GURL(kExampleOrigin))));
      EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
      browser_context(), url::Origin::Create(GURL(kAnotherExampleOrigin))));

      // set user as affiliated for another.example.com, same origin
      SetupUserAffiliation(true, kTestAtAnotherExampleDotCom);


      // True when user is affiliated for same origin
      EXPECT_TRUE(delegate.OriginMayUseRemoteDesktopClientOverride(
      browser_context(), url::Origin::Create(GURL(kExampleOrigin))));
      EXPECT_TRUE(delegate.OriginMayUseRemoteDesktopClientOverride(
      browser_context(), url::Origin::Create(GURL(kAnotherExampleOrigin))));

      // Google Corp CRD origins are not affected by either the switch or this
      // policy, regardless if we have or not affiliated user
      for (auto* origin : kCorpCrdOrigins) {
      EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
      browser_context(), url::Origin::Create(GURL(origin))));
      }

      // Origins not listed in either the switch or the policy remain disallowed.
      EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
      browser_context(),
      url::Origin::Create(GURL("https://very.other.example.com"))));
      }
      Andrii Natiahlyi . unresolved

      nit: please split this test into smaller, more focused tests 😊

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Martin Kreichgauer
      • Olga Korokhina
      Submit Requirements:
        • requirement satisfiedCode-Coverage
        • requirement is not satisfiedCode-Owners
        • requirement is not satisfiedCode-Review
        • requirement is not satisfiedNo-Unresolved-Comments
        • requirement is not satisfiedReview-Enforcement
        Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
        Gerrit-MessageType: comment
        Gerrit-Project: chromium/src
        Gerrit-Branch: main
        Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
        Gerrit-Change-Number: 7513593
        Gerrit-PatchSet: 19
        Gerrit-Owner: Olga Korokhina <koro...@google.com>
        Gerrit-Reviewer: Andrii Natiahlyi <nati...@google.com>
        Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
        Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
        Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
        Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
        Gerrit-Attention: Martin Kreichgauer <mart...@google.com>
        Gerrit-Attention: Olga Korokhina <koro...@google.com>
        Gerrit-Comment-Date: Fri, 30 Jan 2026 13:07:34 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Olga Korokhina (Gerrit)

        unread,
        Jan 30, 2026, 10:45:47 AM (11 days ago) Jan 30
        to Andrii Natiahlyi, (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
        Attention needed from Andrii Natiahlyi and Martin Kreichgauer

        Olga Korokhina added 1 comment

        File chrome/browser/webauthn/chrome_web_authentication_delegate_base_unittest.cc
        Andrii Natiahlyi . resolved

        nit: please split this test into smaller, more focused tests 😊

        Olga Korokhina

        I did it intentionally in one flow, to test how setting/unsetting users affiliation influence checks.

        Open in Gerrit

        Related details

        Attention is currently required from:
        • Andrii Natiahlyi
        • Martin Kreichgauer
        Submit Requirements:
          • requirement satisfiedCode-Coverage
          • requirement is not satisfiedCode-Owners
          • requirement is not satisfiedCode-Review
          • requirement is not satisfiedReview-Enforcement
          Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
          Gerrit-MessageType: comment
          Gerrit-Project: chromium/src
          Gerrit-Branch: main
          Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
          Gerrit-Change-Number: 7513593
          Gerrit-PatchSet: 19
          Gerrit-Owner: Olga Korokhina <koro...@google.com>
          Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
          Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
          Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
          Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
          Gerrit-CC: Andrii Natiahlyi <nati...@google.com>
          Gerrit-Attention: Martin Kreichgauer <mart...@google.com>
          Gerrit-Attention: Andrii Natiahlyi <nati...@google.com>
          Gerrit-Comment-Date: Fri, 30 Jan 2026 15:45:30 +0000
          Gerrit-HasComments: Yes
          Gerrit-Has-Labels: No
          Comment-In-Reply-To: Andrii Natiahlyi <nati...@google.com>
          satisfied_requirement
          unsatisfied_requirement
          open
          diffy

          Martin Kreichgauer (Gerrit)

          unread,
          Jan 30, 2026, 12:40:26 PM (11 days ago) Jan 30
          to Olga Korokhina, Andrii Natiahlyi, (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
          Attention needed from Andrii Natiahlyi and Olga Korokhina

          Martin Kreichgauer added 8 comments

          File chrome/browser/webauthn/chrome_web_authentication_delegate_base.cc
          Line 67, Patchset 19 (Latest):bool IsAllowedByPlatformEnterprisePolicy(
          Martin Kreichgauer . unresolved

          Unrelated nit: This doesn't really say what is allowed by it, and it's not clear from context. Can we rename this to something more descriptive, like `bool RemoteDesktopClientOverrideAllowedByPolicy`?

          Line 77, Patchset 19 (Latest): // managing organization, then the policy doesn't allow WebAuthn.
          Martin Kreichgauer . unresolved

          This doesn't sound right. The origin isn't allowed to use the remoteDesktopClientOverride.

          File chrome/browser/webauthn/chrome_web_authentication_delegate_base_unittest.cc
          Line 37, Patchset 18: fake_user_manager_ = user_manager.get();
          Martin Kreichgauer . unresolved

          Does `scoped_user_manager_.Get()` return the same value?

          Olga Korokhina

          No, we can not replace it and we need both of them: scoped_user_manager_.Get() returns UserManager instance which is missing additional methods (AddUserWithAffiliationAndTypeAndProfile, AddUserWithAffiliation etc.) we need in a test, they are incapsulated in FakeUserManager.

          How it works (AI generated content below, sorry!):

          ash::FakeChromeUserManager *fake_user_manager_:

          This is a raw pointer to the actual fake implementation of the UserManager. You need this pointer to call the specific methods of FakeChromeUserManager within your test setup functions (like SetupAshUser) to add users, log them in, set their affiliation status, etc. This is how you control the fake behavior.

          std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_:

          The UserManager is a global singleton, accessed via user_manager::UserManager::Get(). Many parts of the Chrome browser code, including potentially the code being tested in ChromeWebAuthenticationDelegateBase or its dependencies like ash::ProfileHelper, will call UserManager::Get() to retrieve the current user manager instance.
          ScopedUserManager is a test utility that takes ownership of a UserManager instance (in this case, your FakeChromeUserManager) and sets it as the global instance returned by UserManager::Get() for the lifetime of the ScopedUserManager object.
          When scoped_user_manager_ is created in SetUp(), it injects your fake_user_manager_.
          When scoped_user_manager_ is destroyed in TearDown(), it cleans up and restores the previous global UserManager instance, ensuring test isolation.

          Martin Kreichgauer

          Ah, I think casting the pointer to Get() to FakeChromeUserManager would be ok. But turns out there is a better way to do this, just use the generic TypedScopedUserManager: https://source.chromium.org/chromium/chromium/src/+/main:components/user_manager/scoped_user_manager.h;l=47-57?q=scopedusermanager

          So if you make scoped_user_manager a `TypedScopedUserManager<FakeChromeUserManager>`, I think you don't need `fake_user_manager_`: https://source.chromium.org/search?q=TypedScopedUserManager%3CFakeChromeUserManager%3E

          Line 63, Patchset 19 (Latest): const std::string_view kTestAtExampleDotCom = "te...@example.com";
          Martin Kreichgauer . unresolved

          I think these should be `static constexpr` http://go/totw/140#a-static-class-member

          Line 68, Patchset 19 (Latest): raw_ptr<ash::FakeChromeUserManager> fake_user_manager_ = nullptr;
          std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
          Martin Kreichgauer . unresolved

          Declaration order requires data members to be last: http://go/cstyle#Declaration_Order

          Line 254, Patchset 19 (Latest): // CrOS needs to be taken into account as well. On the test set up user

          // affiliated with example.com domain, so with same origin we get trus
          Martin Kreichgauer . unresolved

          This is suggesting a relationship between the affiliated domain name of the user should have and the origins allowed to use the enterprise policy, which doesn't exist I think.

          If the user was affiliated with example.com, but the enterprise policy allowed exampleremotedesktopclient.com, only the latter would be allowed to use the extension.

          Line 270, Patchset 19 (Latest): // set user as affiliated for another.example.com, same origin
          SetupUserAffiliation(true, kTestAtAnotherExampleDotCom);
          Martin Kreichgauer . unresolved

          What does "same origin" refer to? The domain of the affiliated user and the origin specified in the enterprise policy (or override switch) have no relation with each other.

          Andrii Natiahlyi . unresolved

          nit: please split this test into smaller, more focused tests 😊

          Olga Korokhina

          I did it intentionally in one flow, to test how setting/unsetting users affiliation influence checks.

          Martin Kreichgauer

          Aren't ll230-260 a verbatim copy of the previous test though? I don't think we need to repeat that. If you remove it the test becomes more focused: Test that an with an unaffiliated user, the enterprise setting the policy has no effect.

          Open in Gerrit

          Related details

          Attention is currently required from:
          • Andrii Natiahlyi
          • Olga Korokhina
          Submit Requirements:
            • requirement satisfiedCode-Coverage
            • requirement is not satisfiedCode-Owners
            • requirement is not satisfiedCode-Review
            • requirement is not satisfiedNo-Unresolved-Comments
            • requirement is not satisfiedReview-Enforcement
            Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
            Gerrit-MessageType: comment
            Gerrit-Project: chromium/src
            Gerrit-Branch: main
            Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
            Gerrit-Change-Number: 7513593
            Gerrit-PatchSet: 19
            Gerrit-Owner: Olga Korokhina <koro...@google.com>
            Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
            Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
            Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
            Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
            Gerrit-CC: Andrii Natiahlyi <nati...@google.com>
            Gerrit-Attention: Olga Korokhina <koro...@google.com>
            Gerrit-Attention: Andrii Natiahlyi <nati...@google.com>
            Gerrit-Comment-Date: Fri, 30 Jan 2026 17:40:15 +0000
            Gerrit-HasComments: Yes
            Gerrit-Has-Labels: No
            Comment-In-Reply-To: Martin Kreichgauer <mart...@google.com>
            Comment-In-Reply-To: Olga Korokhina <koro...@google.com>
            Comment-In-Reply-To: Andrii Natiahlyi <nati...@google.com>
            satisfied_requirement
            unsatisfied_requirement
            open
            diffy

            Olga Korokhina (Gerrit)

            unread,
            Jan 31, 2026, 4:36:59 AM (10 days ago) Jan 31
            to Andrii Natiahlyi, (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
            Attention needed from Andrii Natiahlyi and Martin Kreichgauer

            Olga Korokhina added 8 comments

            File chrome/browser/webauthn/chrome_web_authentication_delegate_base.cc
            Line 67, Patchset 19:bool IsAllowedByPlatformEnterprisePolicy(
            Martin Kreichgauer . resolved

            Unrelated nit: This doesn't really say what is allowed by it, and it's not clear from context. Can we rename this to something more descriptive, like `bool RemoteDesktopClientOverrideAllowedByPolicy`?

            Olga Korokhina

            Agree, changing the name.

            Line 77, Patchset 19: // managing organization, then the policy doesn't allow WebAuthn.
            Martin Kreichgauer . resolved

            This doesn't sound right. The origin isn't allowed to use the remoteDesktopClientOverride.

            Olga Korokhina

            Comment adjusted, thank you.

            File chrome/browser/webauthn/chrome_web_authentication_delegate_base_unittest.cc
            Line 37, Patchset 18: fake_user_manager_ = user_manager.get();
            Martin Kreichgauer . resolved

            Does `scoped_user_manager_.Get()` return the same value?

            Olga Korokhina

            No, we can not replace it and we need both of them: scoped_user_manager_.Get() returns UserManager instance which is missing additional methods (AddUserWithAffiliationAndTypeAndProfile, AddUserWithAffiliation etc.) we need in a test, they are incapsulated in FakeUserManager.

            How it works (AI generated content below, sorry!):

            ash::FakeChromeUserManager *fake_user_manager_:

            This is a raw pointer to the actual fake implementation of the UserManager. You need this pointer to call the specific methods of FakeChromeUserManager within your test setup functions (like SetupAshUser) to add users, log them in, set their affiliation status, etc. This is how you control the fake behavior.

            std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_:

            The UserManager is a global singleton, accessed via user_manager::UserManager::Get(). Many parts of the Chrome browser code, including potentially the code being tested in ChromeWebAuthenticationDelegateBase or its dependencies like ash::ProfileHelper, will call UserManager::Get() to retrieve the current user manager instance.
            ScopedUserManager is a test utility that takes ownership of a UserManager instance (in this case, your FakeChromeUserManager) and sets it as the global instance returned by UserManager::Get() for the lifetime of the ScopedUserManager object.
            When scoped_user_manager_ is created in SetUp(), it injects your fake_user_manager_.
            When scoped_user_manager_ is destroyed in TearDown(), it cleans up and restores the previous global UserManager instance, ensuring test isolation.

            Martin Kreichgauer

            Ah, I think casting the pointer to Get() to FakeChromeUserManager would be ok. But turns out there is a better way to do this, just use the generic TypedScopedUserManager: https://source.chromium.org/chromium/chromium/src/+/main:components/user_manager/scoped_user_manager.h;l=47-57?q=scopedusermanager

            So if you make scoped_user_manager a `TypedScopedUserManager<FakeChromeUserManager>`, I think you don't need `fake_user_manager_`: https://source.chromium.org/search?q=TypedScopedUserManager%3CFakeChromeUserManager%3E

            Olga Korokhina

            That worked, thank you very much, improved.

            Line 63, Patchset 19: const std::string_view kTestAtExampleDotCom = "te...@example.com";
            Martin Kreichgauer . resolved

            I think these should be `static constexpr` http://go/totw/140#a-static-class-member

            Olga Korokhina

            changed, thank you.

            Line 68, Patchset 19: raw_ptr<ash::FakeChromeUserManager> fake_user_manager_ = nullptr;

            std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
            Martin Kreichgauer . resolved

            Declaration order requires data members to be last: http://go/cstyle#Declaration_Order

            Olga Korokhina

            addressed, thank you

            Line 254, Patchset 19: // CrOS needs to be taken into account as well. On the test set up user

            // affiliated with example.com domain, so with same origin we get trus
            Martin Kreichgauer . resolved

            This is suggesting a relationship between the affiliated domain name of the user should have and the origins allowed to use the enterprise policy, which doesn't exist I think.

            If the user was affiliated with example.com, but the enterprise policy allowed exampleremotedesktopclient.com, only the latter would be allowed to use the extension.

            Olga Korokhina

            Copy, thank you, removed misleading comment.

            Line 270, Patchset 19: // set user as affiliated for another.example.com, same origin
            SetupUserAffiliation(true, kTestAtAnotherExampleDotCom);
            Martin Kreichgauer . resolved

            What does "same origin" refer to? The domain of the affiliated user and the origin specified in the enterprise policy (or override switch) have no relation with each other.

            Olga Korokhina

            misleading comment removed. I meant here we setup user affiliated with 'another.example.com' and add 'another.example.com' to allowed origins in a policy.

            Line 230, Patchset 19:TEST_F(OriginMayUseRemoteDesktopClientOverrideTest,
            Andrii Natiahlyi . resolved

            nit: please split this test into smaller, more focused tests 😊

            Olga Korokhina

            I did it intentionally in one flow, to test how setting/unsetting users affiliation influence checks.

            Martin Kreichgauer

            Aren't ll230-260 a verbatim copy of the previous test though? I don't think we need to repeat that. If you remove it the test becomes more focused: Test that an with an unaffiliated user, the enterprise setting the policy has no effect.

            Olga Korokhina

            Took another attempt, please have a look on new version. Thank you.

            Open in Gerrit

            Related details

            Attention is currently required from:
            • Andrii Natiahlyi
            • Martin Kreichgauer
            Submit Requirements:
              • requirement satisfiedCode-Coverage
              • requirement is not satisfiedCode-Owners
              • requirement is not satisfiedCode-Review
              • requirement is not satisfiedReview-Enforcement
              Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
              Gerrit-MessageType: comment
              Gerrit-Project: chromium/src
              Gerrit-Branch: main
              Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
              Gerrit-Change-Number: 7513593
              Gerrit-PatchSet: 20
              Gerrit-Owner: Olga Korokhina <koro...@google.com>
              Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
              Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
              Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
              Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
              Gerrit-CC: Andrii Natiahlyi <nati...@google.com>
              Gerrit-Attention: Martin Kreichgauer <mart...@google.com>
              Gerrit-Attention: Andrii Natiahlyi <nati...@google.com>
              Gerrit-Comment-Date: Sat, 31 Jan 2026 09:36:43 +0000
              satisfied_requirement
              unsatisfied_requirement
              open
              diffy

              Martin Kreichgauer (Gerrit)

              unread,
              Feb 4, 2026, 11:19:16 AM (6 days ago) Feb 4
              to Olga Korokhina, Andrii Natiahlyi, (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
              Attention needed from Andrii Natiahlyi and Olga Korokhina

              Martin Kreichgauer added 5 comments

              File chrome/browser/webauthn/chrome_web_authentication_delegate_base_unittest.cc
              Line 39, Patchset 21 (Latest): user_manager::TypedScopedUserManager<chromeos::FakeChromeUserManager>
              scoped_user_manager_{std::make_unique<chromeos::FakeChromeUserManager>()};
              Martin Kreichgauer . unresolved

              Nit: member variable should go after instance methods go/cstyle#Declaration_Order

              Line 75, Patchset 21 (Latest): static constexpr std::string_view kTestAtExampleDotCom = "te...@example.com";
              static constexpr std::string_view kTestAtAnotherExampleDotCom =
              "te...@another.example.com";
              #endif

              static constexpr char kCorpCrdOrigin[] =
              "https://remotedesktop.corp.google.com";
              static constexpr char kCorpCrdAutopushOrigin[] =
              "https://remotedesktop-autopush.corp.google.com/";
              static constexpr char kCorpCrdDailyOrigin[] =
              "https://remotedesktop-daily-6.corp.google.com/";

              const std::array<const char*, 3> kCorpCrdOrigins = {
              kCorpCrdOrigin, kCorpCrdAutopushOrigin, kCorpCrdDailyOrigin};

              static constexpr char kExampleOrigin[] = "https://example.com";
              static constexpr char kAnotherExampleOrigin[] = "https://another.example.com";
              Martin Kreichgauer . unresolved

              Nit: static constants should preceed ctors and member functions go/cstyle#Declaration_Order

              Line 243, Patchset 21 (Latest): // set user as affiliated for another.example.com
              Martin Kreichgauer . unresolved
              ```suggestion
              // Set user as affiliated for another.example.com
              ```

              SetupUserAffiliation(true, kTestAtAnotherExampleDotCom);

              // True when user is affiliated
              EXPECT_TRUE(delegate.OriginMayUseRemoteDesktopClientOverride(
              browser_context(), url::Origin::Create(GURL(kExampleOrigin))));
              EXPECT_TRUE(delegate.OriginMayUseRemoteDesktopClientOverride(
              browser_context(), url::Origin::Create(GURL(kAnotherExampleOrigin))));

              // Google Corp CRD origins are not affected by either the switch or this
              // policy, regardless if we have or not affiliated user
              for (auto* origin : kCorpCrdOrigins) {
              EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
              browser_context(), url::Origin::Create(GURL(origin))));
              }

              // Origins not listed in either the switch or the policy remain disallowed.
              EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
              browser_context(),
              url::Origin::Create(GURL("https://very.other.example.com"))));
              Martin Kreichgauer . unresolved

              Is this block from ll243-262 testing the same behavior as `AdditionalOriginSwitch_WithAllowedOriginsPolicy` on ll179-214?

              Line 334, Patchset 21 (Latest):
              Martin Kreichgauer . unresolved

              Nit: Spurious edit? Same on l349.

              Open in Gerrit

              Related details

              Attention is currently required from:
              • Andrii Natiahlyi
              • Olga Korokhina
              Submit Requirements:
                • requirement satisfiedCode-Coverage
                • requirement is not satisfiedCode-Owners
                • requirement is not satisfiedCode-Review
                • requirement is not satisfiedNo-Unresolved-Comments
                • requirement is not satisfiedReview-Enforcement
                Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
                Gerrit-MessageType: comment
                Gerrit-Project: chromium/src
                Gerrit-Branch: main
                Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
                Gerrit-Change-Number: 7513593
                Gerrit-PatchSet: 21
                Gerrit-Owner: Olga Korokhina <koro...@google.com>
                Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
                Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
                Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
                Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
                Gerrit-CC: Andrii Natiahlyi <nati...@google.com>
                Gerrit-Attention: Olga Korokhina <koro...@google.com>
                Gerrit-Attention: Andrii Natiahlyi <nati...@google.com>
                Gerrit-Comment-Date: Wed, 04 Feb 2026 16:19:04 +0000
                Gerrit-HasComments: Yes
                Gerrit-Has-Labels: No
                satisfied_requirement
                unsatisfied_requirement
                open
                diffy

                Olga Korokhina (Gerrit)

                unread,
                Feb 5, 2026, 11:18:17 AM (5 days ago) Feb 5
                to Andrii Natiahlyi, (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
                Attention needed from Andrii Natiahlyi and Martin Kreichgauer

                Olga Korokhina added 5 comments

                File chrome/browser/webauthn/chrome_web_authentication_delegate_base_unittest.cc
                Line 39, Patchset 21: user_manager::TypedScopedUserManager<chromeos::FakeChromeUserManager>

                scoped_user_manager_{std::make_unique<chromeos::FakeChromeUserManager>()};
                Martin Kreichgauer . resolved

                Nit: member variable should go after instance methods go/cstyle#Declaration_Order

                Olga Korokhina

                Moved down, thank you!

                Line 75, Patchset 21: static constexpr std::string_view kTestAtExampleDotCom = "te...@example.com";

                static constexpr std::string_view kTestAtAnotherExampleDotCom =
                "te...@another.example.com";
                #endif

                static constexpr char kCorpCrdOrigin[] =
                "https://remotedesktop.corp.google.com";
                static constexpr char kCorpCrdAutopushOrigin[] =
                "https://remotedesktop-autopush.corp.google.com/";
                static constexpr char kCorpCrdDailyOrigin[] =
                "https://remotedesktop-daily-6.corp.google.com/";

                const std::array<const char*, 3> kCorpCrdOrigins = {
                kCorpCrdOrigin, kCorpCrdAutopushOrigin, kCorpCrdDailyOrigin};

                static constexpr char kExampleOrigin[] = "https://example.com";
                static constexpr char kAnotherExampleOrigin[] = "https://another.example.com";
                Martin Kreichgauer . resolved

                Nit: static constants should preceed ctors and member functions go/cstyle#Declaration_Order

                Olga Korokhina

                1. Types and type aliases (typedef, using, enum, nested structs and classes, and friend types)
                2. (Optionally, for structs only) non-static data members
                3. Static constants
                4. Factory functions
                5. Constructors and assignment operators
                6. Destructor
                7. All other functions (static and non-static member functions, and friend functions)
                8. All other data members (static and non-static)

                Hope I organized it well now, taken into account we have some section under build flag

                Line 243, Patchset 21: // set user as affiliated for another.example.com
                Martin Kreichgauer . resolved
                ```suggestion
                // Set user as affiliated for another.example.com
                ```
                Olga Korokhina

                Correcting, thank you

                Line 243, Patchset 21: // set user as affiliated for another.example.com

                SetupUserAffiliation(true, kTestAtAnotherExampleDotCom);

                // True when user is affiliated
                EXPECT_TRUE(delegate.OriginMayUseRemoteDesktopClientOverride(
                browser_context(), url::Origin::Create(GURL(kExampleOrigin))));
                EXPECT_TRUE(delegate.OriginMayUseRemoteDesktopClientOverride(
                browser_context(), url::Origin::Create(GURL(kAnotherExampleOrigin))));

                // Google Corp CRD origins are not affected by either the switch or this
                // policy, regardless if we have or not affiliated user
                for (auto* origin : kCorpCrdOrigins) {
                EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
                browser_context(), url::Origin::Create(GURL(origin))));
                }

                // Origins not listed in either the switch or the policy remain disallowed.
                EXPECT_FALSE(delegate.OriginMayUseRemoteDesktopClientOverride(
                browser_context(),
                url::Origin::Create(GURL("https://very.other.example.com"))));
                Martin Kreichgauer . resolved

                Is this block from ll243-262 testing the same behavior as `AdditionalOriginSwitch_WithAllowedOriginsPolicy` on ll179-214?

                Olga Korokhina

                Basically ll243- yes, but after re-logged out user. So you're right, what it basically tests is the re-logout works as expected, not a purpose of this test, removing.

                Line 334, Patchset 21:
                Martin Kreichgauer . resolved

                Nit: Spurious edit? Same on l349.

                Olga Korokhina

                addressed, thank you

                Open in Gerrit

                Related details

                Attention is currently required from:
                • Andrii Natiahlyi
                • Martin Kreichgauer
                Submit Requirements:
                  • requirement satisfiedCode-Coverage
                  • requirement is not satisfiedCode-Owners
                  • requirement is not satisfiedCode-Review
                  • requirement is not satisfiedReview-Enforcement
                  Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
                  Gerrit-MessageType: comment
                  Gerrit-Project: chromium/src
                  Gerrit-Branch: main
                  Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
                  Gerrit-Change-Number: 7513593
                  Gerrit-PatchSet: 21
                  Gerrit-Owner: Olga Korokhina <koro...@google.com>
                  Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
                  Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
                  Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
                  Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
                  Gerrit-CC: Andrii Natiahlyi <nati...@google.com>
                  Gerrit-Attention: Martin Kreichgauer <mart...@google.com>
                  Gerrit-Attention: Andrii Natiahlyi <nati...@google.com>
                  Gerrit-Comment-Date: Thu, 05 Feb 2026 16:17:59 +0000
                  Gerrit-HasComments: Yes
                  Gerrit-Has-Labels: No
                  Comment-In-Reply-To: Martin Kreichgauer <mart...@google.com>
                  satisfied_requirement
                  unsatisfied_requirement
                  open
                  diffy

                  Andrew Rayskiy (Gerrit)

                  unread,
                  10:21 AM (2 hours ago) 10:21 AM
                  to Olga Korokhina, Denis Kuznetsov, Andrii Natiahlyi, (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
                  Attention needed from Andrii Natiahlyi, Denis Kuznetsov, Martin Kreichgauer and Olga Korokhina

                  Andrew Rayskiy added 1 comment

                  File chrome/browser/webauthn/chrome_web_authentication_delegate_base.cc
                  Line 73, Patchset 23 (Latest): const user_manager::User* user =
                  Andrew Rayskiy . unresolved

                  FWIW on ChromeOS this is always equal to `user_manager::UserManager::Get()->GetActiveUser()`; @ant...@chromium.org to confirm (this could be better than introducing another cross-dep to `c/b/ash`).

                  Open in Gerrit

                  Related details

                  Attention is currently required from:
                  • Andrii Natiahlyi
                  • Denis Kuznetsov
                  • Martin Kreichgauer
                  • Olga Korokhina
                  Submit Requirements:
                    • requirement satisfiedCode-Coverage
                    • requirement is not satisfiedCode-Owners
                    • requirement is not satisfiedCode-Review
                    • requirement is not satisfiedNo-Unresolved-Comments
                    • requirement is not satisfiedReview-Enforcement
                    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
                    Gerrit-MessageType: comment
                    Gerrit-Project: chromium/src
                    Gerrit-Branch: main
                    Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
                    Gerrit-Change-Number: 7513593
                    Gerrit-PatchSet: 23
                    Gerrit-Owner: Olga Korokhina <koro...@google.com>
                    Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
                    Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
                    Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
                    Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
                    Gerrit-CC: Andrew Rayskiy <green...@google.com>
                    Gerrit-CC: Andrii Natiahlyi <nati...@google.com>
                    Gerrit-CC: Denis Kuznetsov <ant...@chromium.org>
                    Gerrit-Attention: Martin Kreichgauer <mart...@google.com>
                    Gerrit-Attention: Olga Korokhina <koro...@google.com>
                    Gerrit-Attention: Denis Kuznetsov <ant...@chromium.org>
                    Gerrit-Attention: Andrii Natiahlyi <nati...@google.com>
                    Gerrit-Comment-Date: Tue, 10 Feb 2026 15:21:33 +0000
                    Gerrit-HasComments: Yes
                    Gerrit-Has-Labels: No
                    satisfied_requirement
                    unsatisfied_requirement
                    open
                    diffy

                    Olga Korokhina (Gerrit)

                    unread,
                    11:14 AM (1 hour ago) 11:14 AM
                    to Denis Kuznetsov, Andrew Rayskiy, Andrii Natiahlyi, (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
                    Attention needed from Andrew Rayskiy, Andrii Natiahlyi, Denis Kuznetsov and Martin Kreichgauer

                    Olga Korokhina added 1 comment

                    File chrome/browser/webauthn/chrome_web_authentication_delegate_base.cc
                    Line 73, Patchset 23 (Latest): const user_manager::User* user =
                    Andrew Rayskiy . unresolved

                    FWIW on ChromeOS this is always equal to `user_manager::UserManager::Get()->GetActiveUser()`; @ant...@chromium.org to confirm (this could be better than introducing another cross-dep to `c/b/ash`).

                    Olga Korokhina

                    UserMamnger is also 'from' components (components/user_manager/user_manager.h) so we might still need to add another dept. Let me check and prove.

                    Open in Gerrit

                    Related details

                    Attention is currently required from:
                    • Andrew Rayskiy
                    • Andrii Natiahlyi
                    • Denis Kuznetsov
                    • Martin Kreichgauer
                    Gerrit-Attention: Andrew Rayskiy <green...@google.com>
                    Gerrit-Attention: Denis Kuznetsov <ant...@chromium.org>
                    Gerrit-Attention: Andrii Natiahlyi <nati...@google.com>
                    Gerrit-Comment-Date: Tue, 10 Feb 2026 16:13:55 +0000
                    Gerrit-HasComments: Yes
                    Gerrit-Has-Labels: No
                    Comment-In-Reply-To: Andrew Rayskiy <green...@google.com>
                    satisfied_requirement
                    unsatisfied_requirement
                    open
                    diffy

                    Olga Korokhina (Gerrit)

                    unread,
                    11:28 AM (1 hour ago) 11:28 AM
                    to Denis Kuznetsov, Andrew Rayskiy, Andrii Natiahlyi, (Julie)Jeongeun Kim, AyeAye, Martin Kreichgauer, Chromium LUCI CQ, chromium...@chromium.org, francisjp...@google.com, josiah...@chromium.org, nektar...@chromium.org, kyungjunle...@google.com, penghuan...@chromium.org, yuzo+...@chromium.org, cblume...@chromium.org, dtseng...@chromium.org, devtools...@chromium.org, abigailbk...@google.com, derinel+wat...@google.com, webauthn...@chromium.org
                    Attention needed from Andrew Rayskiy, Andrii Natiahlyi, Denis Kuznetsov and Martin Kreichgauer

                    Olga Korokhina added 1 comment

                    File chrome/browser/webauthn/chrome_web_authentication_delegate_base.cc
                    Line 73, Patchset 23: const user_manager::User* user =
                    Andrew Rayskiy . resolved

                    FWIW on ChromeOS this is always equal to `user_manager::UserManager::Get()->GetActiveUser()`; @ant...@chromium.org to confirm (this could be better than introducing another cross-dep to `c/b/ash`).

                    Olga Korokhina

                    UserMamnger is also 'from' components (components/user_manager/user_manager.h) so we might still need to add another dept. Let me check and prove.

                    Olga Korokhina

                    UPD: we already have this dep added, so we can get rid of one but not of both. Seems like you proposal works, adjusted the code, thank you very much!

                    Open in Gerrit

                    Related details

                    Attention is currently required from:
                    • Andrew Rayskiy
                    • Andrii Natiahlyi
                    • Denis Kuznetsov
                    • Martin Kreichgauer
                    Submit Requirements:
                      • requirement satisfiedCode-Coverage
                      • requirement is not satisfiedCode-Owners
                      • requirement is not satisfiedCode-Review
                      • requirement is not satisfiedReview-Enforcement
                      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
                      Gerrit-MessageType: comment
                      Gerrit-Project: chromium/src
                      Gerrit-Branch: main
                      Gerrit-Change-Id: Ie1f8642bfbd0a55b56a5f3d15651ae7798635911
                      Gerrit-Change-Number: 7513593
                      Gerrit-PatchSet: 23
                      Gerrit-Owner: Olga Korokhina <koro...@google.com>
                      Gerrit-Reviewer: Martin Kreichgauer <mart...@google.com>
                      Gerrit-Reviewer: Olga Korokhina <koro...@google.com>
                      Gerrit-CC: (Julie)Jeongeun Kim <je_jul...@chromium.org>
                      Gerrit-CC: Akihiro Ota <akihi...@chromium.org>
                      Gerrit-CC: Andrew Rayskiy <green...@google.com>
                      Gerrit-CC: Andrii Natiahlyi <nati...@google.com>
                      Gerrit-CC: Denis Kuznetsov <ant...@chromium.org>
                      Gerrit-Attention: Martin Kreichgauer <mart...@google.com>
                      Gerrit-Attention: Andrew Rayskiy <green...@google.com>
                      Gerrit-Attention: Denis Kuznetsov <ant...@chromium.org>
                      Gerrit-Attention: Andrii Natiahlyi <nati...@google.com>
                      Gerrit-Comment-Date: Tue, 10 Feb 2026 16:28:33 +0000
                      Gerrit-HasComments: Yes
                      Gerrit-Has-Labels: No
                      Comment-In-Reply-To: Andrew Rayskiy <green...@google.com>
                      Comment-In-Reply-To: Olga Korokhina <koro...@google.com>
                      satisfied_requirement
                      unsatisfied_requirement
                      open
                      diffy
                      Reply all
                      Reply to author
                      Forward
                      0 new messages