Voice Typing: Add a Toast UI notification for dictation errors [chromium/src : main]

0 views
Skip to first unread message

Amya Singhal (Gerrit)

unread,
Jun 23, 2026, 5:24:20 PM (2 days ago) Jun 23
to Chromium LUCI CQ, Chromium Metrics Reviews, android-bu...@system.gserviceaccount.com, chromium...@chromium.org, net-r...@chromium.org, penghuan...@chromium.org, chrome-intell...@chromium.org, chrome-intelligence-te...@google.com, cblume...@chromium.org, devtools...@chromium.org, asvitkine...@chromium.org, chromium-a...@chromium.org, extension...@chromium.org, srahim...@chromium.org

Amya Singhal abandoned this change.

View Change

Abandoned Superceded by crrev.com/c/7987795

Amya Singhal abandoned this change

Related details

Attention set is empty
Submit Requirements:
  • requirement satisfiedCode-Coverage
  • 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: abandon
Gerrit-Project: chromium/src
Gerrit-Branch: main
Gerrit-Change-Id: I3af88635850e7d5359affabbd2e0d631952c13ee
Gerrit-Change-Number: 7986684
Gerrit-PatchSet: 12
Gerrit-Owner: Amya Singhal <amyas...@google.com>
Gerrit-Reviewer: Amya Singhal <amyas...@google.com>
Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
satisfied_requirement
unsatisfied_requirement
open
diffy

David Bokan (Gerrit)

unread,
Jun 24, 2026, 2:52:24 PM (yesterday) Jun 24
to Amya Singhal, Kevin McNee, Chromium LUCI CQ, Chromium Metrics Reviews, chromium...@chromium.org, asvitkine...@chromium.org, chromium-a...@chromium.org, extension...@chromium.org, srahim...@chromium.org
Attention needed from Amya Singhal and Kevin McNee

David Bokan added 4 comments

File chrome/browser/dictation/dictation_keyed_service_browsertest.cc
Line 355, Patchset 5 (Latest):IN_PROC_BROWSER_TEST_F(DictationKeyedServiceBrowserTest, ShowsToastOnError) {
David Bokan . unresolved
Line 381, Patchset 5 (Latest): provider->OnStreamStateChanged(StreamProvider::StreamState::kFailed);
David Bokan . unresolved

In session_ui tests use `ExcentionAPISetStreamState` to inject a failure (that'll exercise the extension API as well).

File chrome/browser/dictation/session_controller.cc
Line 95, Patchset 5 (Latest): (attached_stream_provider_.get() == &stream_provider) &&
David Bokan . unresolved

Bit debatable but I think we might want to show an error if a background finalizing stream encounters an error.

I think the API should be (see my other comment about moving the handler to SessionUi) something like:

```
ui->OnError(stream_type)
```

Where `stream_type` is an enum `kAttached` or `kFinalizing` depending on which value it's in. We should also check `old_state` and ignore if the stream's old state is `kComplete`.

And no need to PostTask here - in SessionUiImpl you can call `UiRequestEndSession` which already posts. Avoid ending the session if the failing stream is finalizing.

File chrome/browser/dictation/session_controller_delegate.h
Line 34, Patchset 5 (Latest): // Called when the session encounters a fatal error.
virtual void OnSessionError() = 0;
David Bokan . unresolved

Showing an error is a responsibility of the SessionUi rather than the DictationKeyedService/SessionControllerDelegate. Lets move it to SessionUiImpl and the corresponding interface.

Open in Gerrit

Related details

Attention is currently required from:
  • Amya Singhal
  • Kevin McNee
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: Ida98cd34a47e9eb0541d7aca0cbf9cc0c50ed761
Gerrit-Change-Number: 7987795
Gerrit-PatchSet: 5
Gerrit-Owner: Amya Singhal <amyas...@google.com>
Gerrit-Reviewer: Amya Singhal <amyas...@google.com>
Gerrit-Reviewer: David Bokan <bo...@chromium.org>
Gerrit-Reviewer: Kevin McNee <mc...@chromium.org>
Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
Gerrit-Attention: Kevin McNee <mc...@chromium.org>
Gerrit-Attention: Amya Singhal <amyas...@google.com>
Gerrit-Comment-Date: Wed, 24 Jun 2026 18:51:55 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
satisfied_requirement
unsatisfied_requirement
open
diffy

Kevin McNee (Gerrit)

unread,
Jun 24, 2026, 3:48:35 PM (yesterday) Jun 24
to Amya Singhal, David Bokan, Chromium LUCI CQ, Chromium Metrics Reviews, chromium...@chromium.org, asvitkine...@chromium.org, chromium-a...@chromium.org, extension...@chromium.org, srahim...@chromium.org
Attention needed from Amya Singhal

Kevin McNee added 3 comments

File chrome/browser/dictation/dictation_keyed_service_browsertest.cc
Line 371, Patchset 5 (Latest): base::RunLoop run_loop;
Kevin McNee . unresolved

This is never run.

Line 386, Patchset 5 (Latest): EXPECT_TRUE(base::test::RunUntil(
Kevin McNee . unresolved

Relatedly, if we synchronize on the end of the session, then we may not need to poll for this.

But both of these points are probably moot if this is rewritten as a ui test per bokan's comment.

File chrome/browser/ui/toasts/toast_service.cc
Line 606, Patchset 5 (Latest): toast_registry_->RegisterToast(
Kevin McNee . unresolved

Let's gate this on our feature flag.

Open in Gerrit

Related details

Attention is currently required from:
  • Amya Singhal
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: Ida98cd34a47e9eb0541d7aca0cbf9cc0c50ed761
Gerrit-Change-Number: 7987795
Gerrit-PatchSet: 5
Gerrit-Owner: Amya Singhal <amyas...@google.com>
Gerrit-Reviewer: Amya Singhal <amyas...@google.com>
Gerrit-Reviewer: David Bokan <bo...@chromium.org>
Gerrit-Reviewer: Kevin McNee <mc...@chromium.org>
Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
Gerrit-Attention: Amya Singhal <amyas...@google.com>
Gerrit-Comment-Date: Wed, 24 Jun 2026 19:48:18 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
satisfied_requirement
unsatisfied_requirement
open
diffy

Amya Singhal (Gerrit)

unread,
Jun 24, 2026, 5:32:07 PM (yesterday) Jun 24
to David Bokan, Kevin McNee, Chromium LUCI CQ, Chromium Metrics Reviews, chromium...@chromium.org, asvitkine...@chromium.org, chromium-a...@chromium.org, extension...@chromium.org, srahim...@chromium.org
Attention needed from David Bokan and Kevin McNee

Amya Singhal added 7 comments

File chrome/browser/dictation/dictation_keyed_service_browsertest.cc
Line 355, Patchset 5:IN_PROC_BROWSER_TEST_F(DictationKeyedServiceBrowserTest, ShowsToastOnError) {
David Bokan . resolved
Amya Singhal

done!

Line 371, Patchset 5: base::RunLoop run_loop;
Kevin McNee . resolved

This is never run.

Amya Singhal

removed!

Line 381, Patchset 5: provider->OnStreamStateChanged(StreamProvider::StreamState::kFailed);
David Bokan . resolved

In session_ui tests use `ExcentionAPISetStreamState` to inject a failure (that'll exercise the extension API as well).

Amya Singhal

done, thank you!

Line 386, Patchset 5: EXPECT_TRUE(base::test::RunUntil(
Kevin McNee . resolved

Relatedly, if we synchronize on the end of the session, then we may not need to poll for this.

But both of these points are probably moot if this is rewritten as a ui test per bokan's comment.

Amya Singhal

done!

File chrome/browser/dictation/session_controller.cc
Line 95, Patchset 5: (attached_stream_provider_.get() == &stream_provider) &&
David Bokan . resolved

Bit debatable but I think we might want to show an error if a background finalizing stream encounters an error.

I think the API should be (see my other comment about moving the handler to SessionUi) something like:

```
ui->OnError(stream_type)
```

Where `stream_type` is an enum `kAttached` or `kFinalizing` depending on which value it's in. We should also check `old_state` and ignore if the stream's old state is `kComplete`.

And no need to PostTask here - in SessionUiImpl you can call `UiRequestEndSession` which already posts. Avoid ending the session if the failing stream is finalizing.

Amya Singhal

done, introduced ```ui->OnError(stream_type)```

File chrome/browser/dictation/session_controller_delegate.h
Line 34, Patchset 5: // Called when the session encounters a fatal error.

virtual void OnSessionError() = 0;
David Bokan . resolved

Showing an error is a responsibility of the SessionUi rather than the DictationKeyedService/SessionControllerDelegate. Lets move it to SessionUiImpl and the corresponding interface.

Amya Singhal

done!

File chrome/browser/ui/toasts/toast_service.cc
Line 606, Patchset 5: toast_registry_->RegisterToast(
Kevin McNee . resolved

Let's gate this on our feature flag.

Amya Singhal

done!

Open in Gerrit

Related details

Attention is currently required from:
  • David Bokan
  • Kevin McNee
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: Ida98cd34a47e9eb0541d7aca0cbf9cc0c50ed761
    Gerrit-Change-Number: 7987795
    Gerrit-PatchSet: 8
    Gerrit-Owner: Amya Singhal <amyas...@google.com>
    Gerrit-Reviewer: Amya Singhal <amyas...@google.com>
    Gerrit-Reviewer: David Bokan <bo...@chromium.org>
    Gerrit-Reviewer: Kevin McNee <mc...@chromium.org>
    Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
    Gerrit-Attention: Kevin McNee <mc...@chromium.org>
    Gerrit-Attention: David Bokan <bo...@chromium.org>
    Gerrit-Comment-Date: Wed, 24 Jun 2026 21:31:53 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    Comment-In-Reply-To: Kevin McNee <mc...@chromium.org>
    Comment-In-Reply-To: David Bokan <bo...@chromium.org>
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    David Bokan (Gerrit)

    unread,
    12:33 PM (9 hours ago) 12:33 PM
    to Amya Singhal, Kevin McNee, Chromium LUCI CQ, Chromium Metrics Reviews, chromium...@chromium.org, asvitkine...@chromium.org, chromium-a...@chromium.org, extension...@chromium.org, srahim...@chromium.org
    Attention needed from Amya Singhal and Kevin McNee

    David Bokan added 5 comments

    Patchset-level comments
    File-level comment, Patchset 10 (Latest):
    David Bokan . resolved

    Thanks, just a few small comments.

    File chrome/browser/dictation/session_controller.cc
    Line 94, Patchset 10 (Latest): const bool is_attached =
    attached_stream_provider_.get() == &stream_provider;
    const bool is_failure =
    stream_provider.GetState() == StreamProvider::StreamState::kFailed;
    David Bokan . unresolved

    Given my below comment these won't be useful when you move it. One nit you can do to improve readability is add `using StreamState = StreamProvider::StreamState;` at the top of the method body to at least remove some of the qualifiers

    Line 119, Patchset 10 (Latest): if (is_failure && old_state != StreamProvider::StreamState::kComplete) {
    const SessionUi::StreamType stream_type =
    is_attached ? SessionUi::StreamType::kAttached
    : SessionUi::StreamType::kFinalizing;
    if (ui_) {
    ui_->OnError(stream_type);
    }
    }
    David Bokan . unresolved

    This is conceptually unrelated to what's being done in the outer `if` block so move it out.

    Also, we should do this after movig to the failure state below so that, if the stream is attached, the UI sees a consistent controller state if it calls GetState.

    File chrome/browser/dictation/session_ui_impl.cc
    Line 42, Patchset 10 (Latest):SessionUiImpl::SessionUiImpl(base::WeakPtr<BrowserWindowInterface> window,
    David Bokan . unresolved

    Leave this as a ref, when you need to store it as a WeakPtr get one via GetWeakPtr. That said, the comment in [the header](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ui/browser_window/public/browser_window_interface.h;l=205;drc=1a9fa755794756545ee0fb5d941a8527d56c37be) suggests avoiding this pattern.

    Lets register a window close callback and _synchronously_ (because otherwise we'd be racing window deletion) notify the controller from the callback that the UI needs to be deleted. (e.g. add a UiDidClose() method on SessionUiDelegate). That way we can store window_ as a raw_ptr with the understanding that it will always be deleted before the window.

    File chrome/browser/dictation/session_ui_impl_browsertest.cc
    Line 212, Patchset 10 (Latest): Check([this]() {
    ToastController* toast_controller =
    browser()->GetFeatures().toast_controller();
    return toast_controller && !toast_controller->IsShowingToast();
    }),
    David Bokan . unresolved

    nit: add a helper `IsShowingDictationErrorToast(bool)` to the test harness for this and the check that it's showing below. (I think it's fine for this check to just ensure no DictationError toast is showing.)

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Amya Singhal
    • Kevin McNee
    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: Ida98cd34a47e9eb0541d7aca0cbf9cc0c50ed761
      Gerrit-Change-Number: 7987795
      Gerrit-PatchSet: 10
      Gerrit-Owner: Amya Singhal <amyas...@google.com>
      Gerrit-Reviewer: Amya Singhal <amyas...@google.com>
      Gerrit-Reviewer: David Bokan <bo...@chromium.org>
      Gerrit-Reviewer: Kevin McNee <mc...@chromium.org>
      Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
      Gerrit-Attention: Kevin McNee <mc...@chromium.org>
      Gerrit-Attention: Amya Singhal <amyas...@google.com>
      Gerrit-Comment-Date: Thu, 25 Jun 2026 16:33:32 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Amya Singhal (Gerrit)

      unread,
      1:54 PM (8 hours ago) 1:54 PM
      to David Bokan, Kevin McNee, Chromium LUCI CQ, Chromium Metrics Reviews, chromium...@chromium.org, asvitkine...@chromium.org, chromium-a...@chromium.org, extension...@chromium.org, srahim...@chromium.org
      Attention needed from David Bokan and Kevin McNee

      Amya Singhal added 4 comments

      File chrome/browser/dictation/session_controller.cc
      Line 94, Patchset 10: const bool is_attached =

      attached_stream_provider_.get() == &stream_provider;
      const bool is_failure =
      stream_provider.GetState() == StreamProvider::StreamState::kFailed;
      David Bokan . resolved

      Given my below comment these won't be useful when you move it. One nit you can do to improve readability is add `using StreamState = StreamProvider::StreamState;` at the top of the method body to at least remove some of the qualifiers

      Amya Singhal

      great idea, done!

      Line 119, Patchset 10: if (is_failure && old_state != StreamProvider::StreamState::kComplete) {

      const SessionUi::StreamType stream_type =
      is_attached ? SessionUi::StreamType::kAttached
      : SessionUi::StreamType::kFinalizing;
      if (ui_) {
      ui_->OnError(stream_type);
      }
      }
      David Bokan . resolved

      This is conceptually unrelated to what's being done in the outer `if` block so move it out.

      Also, we should do this after movig to the failure state below so that, if the stream is attached, the UI sees a consistent controller state if it calls GetState.

      Amya Singhal

      done!

      File chrome/browser/dictation/session_ui_impl.cc
      Line 42, Patchset 10:SessionUiImpl::SessionUiImpl(base::WeakPtr<BrowserWindowInterface> window,
      David Bokan . resolved

      Leave this as a ref, when you need to store it as a WeakPtr get one via GetWeakPtr. That said, the comment in [the header](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ui/browser_window/public/browser_window_interface.h;l=205;drc=1a9fa755794756545ee0fb5d941a8527d56c37be) suggests avoiding this pattern.

      Lets register a window close callback and _synchronously_ (because otherwise we'd be racing window deletion) notify the controller from the callback that the UI needs to be deleted. (e.g. add a UiDidClose() method on SessionUiDelegate). That way we can store window_ as a raw_ptr with the understanding that it will always be deleted before the window.

      Amya Singhal

      done!

      File chrome/browser/dictation/session_ui_impl_browsertest.cc
      Line 212, Patchset 10: Check([this]() {

      ToastController* toast_controller =
      browser()->GetFeatures().toast_controller();
      return toast_controller && !toast_controller->IsShowingToast();
      }),
      David Bokan . resolved

      nit: add a helper `IsShowingDictationErrorToast(bool)` to the test harness for this and the check that it's showing below. (I think it's fine for this check to just ensure no DictationError toast is showing.)

      Amya Singhal

      done!

      Open in Gerrit

      Related details

      Attention is currently required from:
      • David Bokan
      • Kevin McNee
      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: Ida98cd34a47e9eb0541d7aca0cbf9cc0c50ed761
        Gerrit-Change-Number: 7987795
        Gerrit-PatchSet: 11
        Gerrit-Owner: Amya Singhal <amyas...@google.com>
        Gerrit-Reviewer: Amya Singhal <amyas...@google.com>
        Gerrit-Reviewer: David Bokan <bo...@chromium.org>
        Gerrit-Reviewer: Kevin McNee <mc...@chromium.org>
        Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
        Gerrit-Attention: Kevin McNee <mc...@chromium.org>
        Gerrit-Attention: David Bokan <bo...@chromium.org>
        Gerrit-Comment-Date: Thu, 25 Jun 2026 17:54:12 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        Comment-In-Reply-To: David Bokan <bo...@chromium.org>
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        David Bokan (Gerrit)

        unread,
        4:28 PM (5 hours ago) 4:28 PM
        to Amya Singhal, Kevin McNee, Chromium LUCI CQ, Chromium Metrics Reviews, chromium...@chromium.org, asvitkine...@chromium.org, chromium-a...@chromium.org, extension...@chromium.org, srahim...@chromium.org
        Attention needed from Amya Singhal and Kevin McNee

        David Bokan voted and added 9 comments

        Votes added by David Bokan

        Code-Review+1

        9 comments

        Patchset-level comments
        File-level comment, Patchset 11 (Latest):
        David Bokan . resolved

        Thank you! LGTM % a few minor nitpicks with naming/comments (partly my own choices from last round...)

        File chrome/browser/dictation/session_controller.cc
        Line 90, Patchset 11 (Latest): delegate_->EndSession();
        David Bokan . unresolved

        We usually add a scary comment after a line like this because this call deletes `this`, e.g.:

        ```
        // WARNING: `this` is deleted, do not add code below here.
        ```

        Also, add a comment above explaining that we're intentionally ending the session synchronously in this path to avoid dangling pointers to deleted UI components.

        Line 148, Patchset 11 (Latest): if (is_failure && old_state != StreamState::kComplete) {
        David Bokan . unresolved

        Please add a test case for both these scenarios - failure state after non-complete state and failure state after complete state. Ensure only the former calls SessionUi::OnError.

        You can do this from the session controller unit test where you can mock the Provider state and observe calls on the MockSessionUi.

        File chrome/browser/dictation/session_ui.h
        Line 17, Patchset 11 (Latest): // Called when a stream encounters an error.
        David Bokan . unresolved

        nit: when a _live_ stream encounters an error

        File chrome/browser/dictation/session_ui_delegate.h
        Line 35, Patchset 11 (Latest): virtual void UiDidClose() = 0;
        David Bokan . unresolved

        Sorry - now that I see this I think "UiDidClose" is a bit ambiguous (since Ui is more obviously referring to SessionUi). I think HostWindowDidClose would be cleaerer.

        File chrome/browser/dictation/session_ui_impl.h
        Line 43, Patchset 11 (Latest): const raw_ptr<BrowserWindowInterface> window_;
        David Bokan . unresolved

        Make this a raw_ref since it should never be null

        Also add a comment that it's a raw_ref because we observe window close events and synchronously end the session which owns `this` so SessionUi will never outlive the window. (and maybe a short comment for the below member that `// owns this`

        File chrome/browser/dictation/session_ui_impl.cc
        Line 74, Patchset 11 (Latest): if (window_) {
        David Bokan . unresolved

        Remove, this should never be null now

        File chrome/browser/dictation/session_ui_impl_browsertest.cc
        Line 126, Patchset 11 (Latest): auto IsShowingDictationErrorToast(bool showing) {
        David Bokan . unresolved

        Sorry (again - it's hard to visualize until I see the code :/)

        Lets make this CheckShowingDictationErrorToast to make it clearer this is a check

        Line 130, Patchset 11 (Latest): if (!toast_controller) {
        return !showing;
        }
        David Bokan . unresolved

        In what case do we not have a toast controller? I think this should be a CHECK (i.e. the tests aren't relevant if there's no toast system)

        Open in Gerrit

        Related details

        Attention is currently required from:
        • Amya Singhal
        • Kevin McNee
        Submit Requirements:
          • requirement satisfiedCode-Coverage
          • requirement is not satisfiedCode-Owners
          • requirement is not satisfiedCode-Review
          • requirement is not satisfiedNo-Unresolved-Comments
          • requirement 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: Ida98cd34a47e9eb0541d7aca0cbf9cc0c50ed761
          Gerrit-Change-Number: 7987795
          Gerrit-PatchSet: 11
          Gerrit-Owner: Amya Singhal <amyas...@google.com>
          Gerrit-Reviewer: Amya Singhal <amyas...@google.com>
          Gerrit-Reviewer: David Bokan <bo...@chromium.org>
          Gerrit-Reviewer: Kevin McNee <mc...@chromium.org>
          Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
          Gerrit-Attention: Kevin McNee <mc...@chromium.org>
          Gerrit-Attention: Amya Singhal <amyas...@google.com>
          Gerrit-Comment-Date: Thu, 25 Jun 2026 20:28:03 +0000
          Gerrit-HasComments: Yes
          Gerrit-Has-Labels: Yes
          satisfied_requirement
          unsatisfied_requirement
          open
          diffy
          Reply all
          Reply to author
          Forward
          0 new messages