[STTS] Add direct-send pipeline for Send Tab to Self [chromium/src : main]

0 views
Skip to first unread message

Marc Treib (Gerrit)

unread,
Jun 24, 2026, 8:57:19 AM (4 days ago) Jun 24
to Michael Tatarski, Chromium LUCI CQ, Marc Treib, yuzo+...@chromium.org, feature-me...@chromium.org, blink-revi...@chromium.org, gcasto+w...@chromium.org, omnibox-...@chromium.org, gavinp...@chromium.org, tranbaod...@chromium.org, loading...@chromium.org, net-r...@chromium.org, bartek...@chromium.org, blink-revie...@chromium.org, katie...@chromium.org, kinuko...@chromium.org, devtools...@chromium.org, christia...@chromium.org, blink-revie...@chromium.org, hirokisa...@chromium.org, loading-rev...@chromium.org, scheduler-...@chromium.org, loading-re...@chromium.org, keithle...@chromium.org, zol...@webkit.org, jdonnel...@chromium.org, translat...@chromium.org, yhanad...@chromium.org, blink-re...@chromium.org, nektar...@chromium.org, droger+w...@chromium.org, vasilii+watchlis...@chromium.org, srahim...@chromium.org, lize...@chromium.org, anastas...@google.com, dtapuska+...@chromium.org, blink-revi...@chromium.org, csharris...@chromium.org, extension...@chromium.org, mfoltz+wa...@chromium.org, speed-metr...@chromium.org, chromium-a...@chromium.org, asvitkine...@chromium.org, blink-re...@chromium.org, android-web...@chromium.org, francisjp...@google.com, abigailbk...@google.com, asvitki...@chromium.org, bmcquad...@chromium.org, shuche...@chromium.org, apavlo...@chromium.org, creis...@chromium.org, alexmo...@chromium.org, mac-r...@chromium.org, lizeb...@chromium.org, oshima...@chromium.org, wfh+...@chromium.org, core-timi...@chromium.org, nona+...@chromium.org, jmedle...@chromium.org, blink-revie...@chromium.org, josiah...@chromium.org, chromiumme...@microsoft.com, tbarzi...@chromium.org, dtraino...@chromium.org, blink-...@chromium.org, speed-metrics...@chromium.org, chikamu...@chromium.org, rrsilva+wat...@google.com, navigation...@chromium.org, dtseng...@chromium.org, kyungjunle...@google.com, ios-revie...@chromium.org, ios-r...@chromium.org, jeffreycohen+watc...@chromium.org, knollr+wat...@chromium.org, marq+...@chromium.org, tgupta...@chromium.org
Attention needed from Michael Tatarski

Marc Treib added 4 comments

File ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
Line 2814, Patchset 6 (Latest): [_sendTabToSelfCoordinator sendTabToTargetDeviceCacheGUID:cacheGUID
Marc Treib . unresolved

The coordinator is a UI concept, so going through it if we're not actually showing any UI seems a bit weird. But maybe showing the confirmation toast is "enough UI" to warrant going through the coordinator?

File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator.h
Line 39, Patchset 6 (Latest):- (void)sendTabToTargetDeviceCacheGUID:(NSString*)cacheGUID
Marc Treib . unresolved

Exposing this feels odd. AFAIK usually the pattern of using a coordinator is: Create it via init..., then call start.
So maybe instead of exposing this, we should have another init variant, and then call start to actually kick off the process?

File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator.mm
Line 577, Patchset 6 (Latest): deviceName:(NSString*)deviceName {
// Avoid performing any UI updates or delegate callbacks if the coordinator
// has already been stopped.
if (self.stopped) {
return;
}
Marc Treib . unresolved

Is this change related to the direct-send flow somehow?

File ios/chrome/browser/shared/public/commands/browser_coordinator_commands.h
Line 102, Patchset 6 (Latest):- (void)sendTabToSelfWithoutTargetPickerUI:(const GURL&)url
Marc Treib . unresolved

This is a bit of an odd name - can we find a name that describes what this does, rather than what it does not do? Something like `sendTabToSelfToSpecificDevice`?

Open in Gerrit

Related details

Attention is currently required from:
  • Michael Tatarski
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: Ic35f60a597d35d8108c560137338a4eb79f74e67
Gerrit-Change-Number: 7992618
Gerrit-PatchSet: 6
Gerrit-Owner: Michael Tatarski <mtat...@google.com>
Gerrit-Reviewer: Marc Treib <tr...@chromium.org>
Gerrit-Reviewer: Michael Tatarski <mtat...@google.com>
Gerrit-Attention: Michael Tatarski <mtat...@google.com>
Gerrit-Comment-Date: Wed, 24 Jun 2026 12:56:59 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
satisfied_requirement
unsatisfied_requirement
open
diffy

Michael Tatarski (Gerrit)

unread,
Jun 24, 2026, 9:30:12 AM (4 days ago) Jun 24
to Chromium LUCI CQ, Marc Treib, yuzo+...@chromium.org, feature-me...@chromium.org, blink-revi...@chromium.org, gcasto+w...@chromium.org, omnibox-...@chromium.org, gavinp...@chromium.org, tranbaod...@chromium.org, loading...@chromium.org, net-r...@chromium.org, bartek...@chromium.org, blink-revie...@chromium.org, katie...@chromium.org, kinuko...@chromium.org, devtools...@chromium.org, christia...@chromium.org, blink-revie...@chromium.org, hirokisa...@chromium.org, loading-rev...@chromium.org, scheduler-...@chromium.org, loading-re...@chromium.org, keithle...@chromium.org, zol...@webkit.org, jdonnel...@chromium.org, translat...@chromium.org, yhanad...@chromium.org, blink-re...@chromium.org, nektar...@chromium.org, droger+w...@chromium.org, vasilii+watchlis...@chromium.org, srahim...@chromium.org, lize...@chromium.org, anastas...@google.com, dtapuska+...@chromium.org, blink-revi...@chromium.org, csharris...@chromium.org, extension...@chromium.org, mfoltz+wa...@chromium.org, speed-metr...@chromium.org, chromium-a...@chromium.org, asvitkine...@chromium.org, blink-re...@chromium.org, android-web...@chromium.org, francisjp...@google.com, abigailbk...@google.com, asvitki...@chromium.org, bmcquad...@chromium.org, shuche...@chromium.org, apavlo...@chromium.org, creis...@chromium.org, alexmo...@chromium.org, mac-r...@chromium.org, lizeb...@chromium.org, oshima...@chromium.org, wfh+...@chromium.org, core-timi...@chromium.org, nona+...@chromium.org, jmedle...@chromium.org, blink-revie...@chromium.org, josiah...@chromium.org, chromiumme...@microsoft.com, tbarzi...@chromium.org, dtraino...@chromium.org, blink-...@chromium.org, speed-metrics...@chromium.org, chikamu...@chromium.org, rrsilva+wat...@google.com, navigation...@chromium.org, dtseng...@chromium.org, kyungjunle...@google.com, ios-revie...@chromium.org, ios-r...@chromium.org, jeffreycohen+watc...@chromium.org, knollr+wat...@chromium.org, marq+...@chromium.org, tgupta...@chromium.org
Attention needed from Marc Treib

Michael Tatarski added 5 comments

Patchset-level comments
File-level comment, Patchset 8 (Latest):
Michael Tatarski . resolved

Thanks

File ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
Line 2814, Patchset 6: [_sendTabToSelfCoordinator sendTabToTargetDeviceCacheGUID:cacheGUID
Marc Treib . unresolved

The coordinator is a UI concept, so going through it if we're not actually showing any UI seems a bit weird. But maybe showing the confirmation toast is "enough UI" to warrant going through the coordinator?

Michael Tatarski

Yeah, that's a fair point. Coordinators are usually UI-only concepts. However, going through SendTabToSelfCoordinator here is the cleanest way IMHO.

It prevents us from bloating the fairly generic `BrowserCoordinator` with feature-specific logic like sync model listeners, error handling, and toast triggering.

The toast can be considered the UI representation for this command, and keeping it encapsulated in the coordinator keeps everything modular.

File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator.h
Line 39, Patchset 6:- (void)sendTabToTargetDeviceCacheGUID:(NSString*)cacheGUID
Marc Treib . resolved

Exposing this feels odd. AFAIK usually the pattern of using a coordinator is: Create it via init..., then call start.
So maybe instead of exposing this, we should have another init variant, and then call start to actually kick off the process?

Michael Tatarski

Good point. I will refactor the coordinator to expose a new initializer that accepts the target device's cacheGUID and deviceName. If a target device is specified, the coordinator will execute the direct-send command.

File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator.mm
Line 577, Patchset 6: deviceName:(NSString*)deviceName {

// Avoid performing any UI updates or delegate callbacks if the coordinator
// has already been stopped.
if (self.stopped) {
return;
}
Marc Treib . resolved

Is this change related to the direct-send flow somehow?

Michael Tatarski

Yes. In the direct-send flow, no view controller is created (`self.sendTabToSelfViewController` is nil). This guard is necessary to prevent attempting to dismiss a non-existent view controller.

File ios/chrome/browser/shared/public/commands/browser_coordinator_commands.h
Line 102, Patchset 6:- (void)sendTabToSelfWithoutTargetPickerUI:(const GURL&)url
Marc Treib . resolved

This is a bit of an odd name - can we find a name that describes what this does, rather than what it does not do? Something like `sendTabToSelfToSpecificDevice`?

Michael Tatarski

Agreed completely. I will rename the command to `sendTabToSelfToSpecificDevice`.

Open in Gerrit

Related details

Attention is currently required from:
  • Marc Treib
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: Ic35f60a597d35d8108c560137338a4eb79f74e67
Gerrit-Change-Number: 7992618
Gerrit-PatchSet: 8
Gerrit-Owner: Michael Tatarski <mtat...@google.com>
Gerrit-Reviewer: Marc Treib <tr...@chromium.org>
Gerrit-Reviewer: Michael Tatarski <mtat...@google.com>
Gerrit-Attention: Marc Treib <tr...@chromium.org>
Gerrit-Comment-Date: Wed, 24 Jun 2026 13:29:52 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: Marc Treib <tr...@chromium.org>
satisfied_requirement
unsatisfied_requirement
open
diffy

Marc Treib (Gerrit)

unread,
Jun 24, 2026, 10:35:20 AM (4 days ago) Jun 24
to Michael Tatarski, android-bu...@system.gserviceaccount.com, Mark Cogan, Chromium LUCI CQ, Marc Treib, webauthn...@chromium.org, derinel+wat...@google.com, yuzo+...@chromium.org, feature-me...@chromium.org, blink-revi...@chromium.org, gcasto+w...@chromium.org, omnibox-...@chromium.org, gavinp...@chromium.org, tranbaod...@chromium.org, loading...@chromium.org, net-r...@chromium.org, bartek...@chromium.org, blink-revie...@chromium.org, katie...@chromium.org, kinuko...@chromium.org, devtools...@chromium.org, christia...@chromium.org, blink-revie...@chromium.org, hirokisa...@chromium.org, loading-rev...@chromium.org, scheduler-...@chromium.org, loading-re...@chromium.org, keithle...@chromium.org, zol...@webkit.org, jdonnel...@chromium.org, translat...@chromium.org, yhanad...@chromium.org, blink-re...@chromium.org, nektar...@chromium.org, droger+w...@chromium.org, vasilii+watchlis...@chromium.org, srahim...@chromium.org, lize...@chromium.org, anastas...@google.com, dtapuska+...@chromium.org, blink-revi...@chromium.org, csharris...@chromium.org, extension...@chromium.org, mfoltz+wa...@chromium.org, speed-metr...@chromium.org, chromium-a...@chromium.org, asvitkine...@chromium.org, blink-re...@chromium.org, android-web...@chromium.org, francisjp...@google.com, abigailbk...@google.com, asvitki...@chromium.org, bmcquad...@chromium.org, shuche...@chromium.org, apavlo...@chromium.org, creis...@chromium.org, alexmo...@chromium.org, mac-r...@chromium.org, lizeb...@chromium.org, oshima...@chromium.org, wfh+...@chromium.org, core-timi...@chromium.org, nona+...@chromium.org, jmedle...@chromium.org, blink-revie...@chromium.org, josiah...@chromium.org, chromiumme...@microsoft.com, tbarzi...@chromium.org, dtraino...@chromium.org, blink-...@chromium.org, speed-metrics...@chromium.org, chikamu...@chromium.org, rrsilva+wat...@google.com, navigation...@chromium.org, dtseng...@chromium.org, kyungjunle...@google.com, ios-revie...@chromium.org, ios-r...@chromium.org, jeffreycohen+watc...@chromium.org, knollr+wat...@chromium.org, marq+...@chromium.org, tgupta...@chromium.org
Attention needed from Mark Cogan and Michael Tatarski

Marc Treib added 11 comments

File ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
Line 2814, Patchset 6: [_sendTabToSelfCoordinator sendTabToTargetDeviceCacheGUID:cacheGUID
Marc Treib . unresolved

The coordinator is a UI concept, so going through it if we're not actually showing any UI seems a bit weird. But maybe showing the confirmation toast is "enough UI" to warrant going through the coordinator?

Michael Tatarski

Yeah, that's a fair point. Coordinators are usually UI-only concepts. However, going through SendTabToSelfCoordinator here is the cleanest way IMHO.

It prevents us from bloating the fairly generic `BrowserCoordinator` with feature-specific logic like sync model listeners, error handling, and toast triggering.

The toast can be considered the UI representation for this command, and keeping it encapsulated in the coordinator keeps everything modular.

Marc Treib

It prevents us from bloating the fairly generic BrowserCoordinator with feature-specific logic

Well, that's not the *only* alternative to the current approach. The relevant parts could also be pulled into some other (non-coordinator) helper class. But I guess if there's *some* UI involved, then using the same coordinator probably makes sense.

But then by that argument, it's probably best to go through `ExecuteWhenTransitionsComplete` after all. I'm not *sure* it's required in this case, but it can't hurt, and it's more consistent.

File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator.h
Line 38, Patchset 10:
Marc Treib . unresolved

Also add a comment for this one? Or add an "otherwise" to the comment above.

File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator.mm
Line 294, Patchset 10: send_tab_to_self::ShareEntryPoint _entryPoint;
Marc Treib . unresolved

Also add a comment here, since otherwise these fields (or what it means when they're nil) aren't really obvious

Line 356, Patchset 10: _title = title;
_targetDeviceCacheGUID = [targetDeviceCacheGUID copy];
_targetDeviceName = [targetDeviceName copy];
Marc Treib . unresolved

Why copy? The title is not copied.

Line 577, Patchset 6: deviceName:(NSString*)deviceName {
// Avoid performing any UI updates or delegate callbacks if the coordinator
// has already been stopped.
if (self.stopped) {
return;
}
Marc Treib . unresolved

Is this change related to the direct-send flow somehow?

Michael Tatarski

Yes. In the direct-send flow, no view controller is created (`self.sendTabToSelfViewController` is nil). This guard is necessary to prevent attempting to dismiss a non-existent view controller.

Marc Treib

Sorry, this comment makes no sense to me. Why does that influence whether the coordinator is stopped?

Line 599, Patchset 10: if (self.sendTabToSelfViewController &&
Marc Treib . unresolved

I find this kinda hard to read. What does it mean if there's no view controller?
Would it be equivalent to check for a non-nil _targetDeviceCacheGUID? (If so, should there be a helper like isDirectSend?)

Line 608, Patchset 10: deviceName:(NSString*)deviceName {

// Avoid performing any UI updates or delegate callbacks if the coordinator
// has already been stopped.
if (self.stopped) {
return;
}
Marc Treib . unresolved

I still don't understand this. Why can the coordinator *now* be stopped already at this point?

File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator_unittest.mm
Line 120, Patchset 10: SendTabToSelfCoordinator* CreateDirectSendCoordinator(NSString* cacheGUID,
NSString* deviceName) {
Marc Treib . unresolved

Misaligned - run `git cl format`?

Line 152, Patchset 10: // Enable post-send toast flag for toast behavior tests.
Marc Treib . unresolved

Even if the flag is somewhat-required for the test, this comment is just confusing - this is not a "toast behavior test".

Line 188, Patchset 10: task_environment_.RunUntilIdle();
Marc Treib . unresolved

RunUntilIdle is an antipattern. Can we wait for something more specific?

File ios/chrome/browser/send_tab_to_self/model/BUILD.gn
Line 170, Patchset 10:}
Marc Treib . unresolved

Why was this moved here? Having a separate build file made more sense to me.

Open in Gerrit

Related details

Attention is currently required from:
  • Mark Cogan
  • Michael Tatarski
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: Ic35f60a597d35d8108c560137338a4eb79f74e67
Gerrit-Change-Number: 7992618
Gerrit-PatchSet: 10
Gerrit-Owner: Michael Tatarski <mtat...@google.com>
Gerrit-Reviewer: Marc Treib <tr...@chromium.org>
Gerrit-Reviewer: Mark Cogan <ma...@chromium.org>
Gerrit-Reviewer: Michael Tatarski <mtat...@google.com>
Gerrit-Attention: Mark Cogan <ma...@chromium.org>
Gerrit-Attention: Michael Tatarski <mtat...@google.com>
Gerrit-Comment-Date: Wed, 24 Jun 2026 14:34:57 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: Marc Treib <tr...@chromium.org>
Comment-In-Reply-To: Michael Tatarski <mtat...@google.com>
satisfied_requirement
unsatisfied_requirement
open
diffy

Michael Tatarski (Gerrit)

unread,
Jun 24, 2026, 5:01:09 PM (4 days ago) Jun 24
to android-bu...@system.gserviceaccount.com, Mark Cogan, Chromium LUCI CQ, Marc Treib, webauthn...@chromium.org, derinel+wat...@google.com, yuzo+...@chromium.org, feature-me...@chromium.org, blink-revi...@chromium.org, gcasto+w...@chromium.org, omnibox-...@chromium.org, gavinp...@chromium.org, tranbaod...@chromium.org, loading...@chromium.org, net-r...@chromium.org, bartek...@chromium.org, blink-revie...@chromium.org, katie...@chromium.org, kinuko...@chromium.org, devtools...@chromium.org, christia...@chromium.org, blink-revie...@chromium.org, hirokisa...@chromium.org, loading-rev...@chromium.org, scheduler-...@chromium.org, loading-re...@chromium.org, keithle...@chromium.org, zol...@webkit.org, jdonnel...@chromium.org, translat...@chromium.org, yhanad...@chromium.org, blink-re...@chromium.org, nektar...@chromium.org, droger+w...@chromium.org, vasilii+watchlis...@chromium.org, srahim...@chromium.org, lize...@chromium.org, anastas...@google.com, dtapuska+...@chromium.org, blink-revi...@chromium.org, csharris...@chromium.org, extension...@chromium.org, mfoltz+wa...@chromium.org, speed-metr...@chromium.org, chromium-a...@chromium.org, asvitkine...@chromium.org, blink-re...@chromium.org, android-web...@chromium.org, francisjp...@google.com, abigailbk...@google.com, asvitki...@chromium.org, bmcquad...@chromium.org, shuche...@chromium.org, apavlo...@chromium.org, creis...@chromium.org, alexmo...@chromium.org, mac-r...@chromium.org, lizeb...@chromium.org, oshima...@chromium.org, wfh+...@chromium.org, core-timi...@chromium.org, nona+...@chromium.org, jmedle...@chromium.org, blink-revie...@chromium.org, josiah...@chromium.org, chromiumme...@microsoft.com, tbarzi...@chromium.org, dtraino...@chromium.org, blink-...@chromium.org, speed-metrics...@chromium.org, chikamu...@chromium.org, rrsilva+wat...@google.com, navigation...@chromium.org, dtseng...@chromium.org, kyungjunle...@google.com, ios-revie...@chromium.org, ios-r...@chromium.org, jeffreycohen+watc...@chromium.org, knollr+wat...@chromium.org, marq+...@chromium.org, tgupta...@chromium.org
Attention needed from Marc Treib and Mark Cogan

Michael Tatarski added 11 comments

File ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
Line 2814, Patchset 6: [_sendTabToSelfCoordinator sendTabToTargetDeviceCacheGUID:cacheGUID
Marc Treib . unresolved

The coordinator is a UI concept, so going through it if we're not actually showing any UI seems a bit weird. But maybe showing the confirmation toast is "enough UI" to warrant going through the coordinator?

Michael Tatarski

Yeah, that's a fair point. Coordinators are usually UI-only concepts. However, going through SendTabToSelfCoordinator here is the cleanest way IMHO.

It prevents us from bloating the fairly generic `BrowserCoordinator` with feature-specific logic like sync model listeners, error handling, and toast triggering.

The toast can be considered the UI representation for this command, and keeping it encapsulated in the coordinator keeps everything modular.

Marc Treib

It prevents us from bloating the fairly generic BrowserCoordinator with feature-specific logic

Well, that's not the *only* alternative to the current approach. The relevant parts could also be pulled into some other (non-coordinator) helper class. But I guess if there's *some* UI involved, then using the same coordinator probably makes sense.

But then by that argument, it's probably best to go through `ExecuteWhenTransitionsComplete` after all. I'm not *sure* it's required in this case, but it can't hurt, and it's more consistent.

Michael Tatarski

SG, I have wrapped the direct-send start call inside `ExecuteWhenTransitionsComplete`

File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator.h
Line 38, Patchset 10:
Marc Treib . resolved

Also add a comment for this one? Or add an "otherwise" to the comment above.

Michael Tatarski

Added a comment above the initializer to document that it runs in the standard picker mode.

File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator.mm
Line 294, Patchset 10: send_tab_to_self::ShareEntryPoint _entryPoint;
Marc Treib . resolved

Also add a comment here, since otherwise these fields (or what it means when they're nil) aren't really obvious

Michael Tatarski

Done

Line 356, Patchset 10: _title = title;
_targetDeviceCacheGUID = [targetDeviceCacheGUID copy];
_targetDeviceName = [targetDeviceName copy];
Marc Treib . resolved

Why copy? The title is not copied.

Michael Tatarski

Removed the copy calls and assigned the strings directly for consistency with _title and other properties.

Line 577, Patchset 6: deviceName:(NSString*)deviceName {
// Avoid performing any UI updates or delegate callbacks if the coordinator
// has already been stopped.
if (self.stopped) {
return;
}
Marc Treib . resolved

Is this change related to the direct-send flow somehow?

Michael Tatarski

Yes. In the direct-send flow, no view controller is created (`self.sendTabToSelfViewController` is nil). This guard is necessary to prevent attempting to dismiss a non-existent view controller.

Marc Treib

Sorry, this comment makes no sense to me. Why does that influence whether the coordinator is stopped?

Michael Tatarski

In the standard picker flow, if the enhanced bottom sheet is disabled, the picker is dismissed synchronously on tap, so the coordinator requests immediate teardown.

In the direct-send flow, there is obvisouly no picker UI. Thus, we must keep the coordinator active to await the asynchronous background transaction before showing the snackbar and stopping.

I added a detailed comment explaining the lifecycle.

Line 599, Patchset 10: if (self.sendTabToSelfViewController &&
Marc Treib . resolved

I find this kinda hard to read. What does it mean if there's no view controller?
Would it be equivalent to check for a non-nil _targetDeviceCacheGUID? (If so, should there be a helper like isDirectSend?)

Michael Tatarski

Okay, good suggestion.

Line 608, Patchset 10: deviceName:(NSString*)deviceName {
// Avoid performing any UI updates or delegate callbacks if the coordinator
// has already been stopped.
if (self.stopped) {
return;
}
Marc Treib . unresolved

I still don't understand this. Why can the coordinator *now* be stopped already at this point?

Michael Tatarski

This guard is a safety check for the asynchronous callback. Because SendEntry executes an asynchronously, there is a delay before handleSendResult is called. During this asynchronous window, it is possible for the parent coordinator to stop and tear down this coordinator (for example, if the user closes the tab, navigates away, or logs out).

If the coordinator has already been stopped by its parent (self.stopped is YES), this check prevents us from performing any subsequent UI updates (like displaying the snackbar) or invoking delegate callbacks on a coordinator that is already dead, avoiding crashes.

File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator_unittest.mm
Line 120, Patchset 10: SendTabToSelfCoordinator* CreateDirectSendCoordinator(NSString* cacheGUID,
NSString* deviceName) {
Marc Treib . resolved

Misaligned - run `git cl format`?

Michael Tatarski

Done

Line 152, Patchset 10: // Enable post-send toast flag for toast behavior tests.
Marc Treib . resolved

Even if the flag is somewhat-required for the test, this comment is just confusing - this is not a "toast behavior test".

Michael Tatarski

Rewrote the comment.

Line 188, Patchset 10: task_environment_.RunUntilIdle();
Marc Treib . resolved

RunUntilIdle is an antipattern. Can we wait for something more specific?

Michael Tatarski

Used a future.

File ios/chrome/browser/send_tab_to_self/model/BUILD.gn
Line 170, Patchset 10:}
Marc Treib . resolved

Why was this moved here? Having a separate build file made more sense to me.

Michael Tatarski

Done

Open in Gerrit

Related details

Attention is currently required from:
  • Marc Treib
  • Mark Cogan
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: Ic35f60a597d35d8108c560137338a4eb79f74e67
Gerrit-Change-Number: 7992618
Gerrit-PatchSet: 14
Gerrit-Owner: Michael Tatarski <mtat...@google.com>
Gerrit-Reviewer: Marc Treib <tr...@chromium.org>
Gerrit-Reviewer: Mark Cogan <ma...@chromium.org>
Gerrit-Reviewer: Michael Tatarski <mtat...@google.com>
Gerrit-Attention: Mark Cogan <ma...@chromium.org>
Gerrit-Attention: Marc Treib <tr...@chromium.org>
Gerrit-Comment-Date: Wed, 24 Jun 2026 21:00:47 +0000
satisfied_requirement
unsatisfied_requirement
open
diffy

Marc Treib (Gerrit)

unread,
Jun 25, 2026, 4:51:33 AM (3 days ago) Jun 25
to Michael Tatarski, android-bu...@system.gserviceaccount.com, Mark Cogan, Chromium LUCI CQ, Marc Treib, webauthn...@chromium.org, derinel+wat...@google.com, yuzo+...@chromium.org, feature-me...@chromium.org, blink-revi...@chromium.org, gcasto+w...@chromium.org, omnibox-...@chromium.org, gavinp...@chromium.org, tranbaod...@chromium.org, loading...@chromium.org, net-r...@chromium.org, bartek...@chromium.org, blink-revie...@chromium.org, katie...@chromium.org, kinuko...@chromium.org, devtools...@chromium.org, christia...@chromium.org, blink-revie...@chromium.org, hirokisa...@chromium.org, loading-rev...@chromium.org, scheduler-...@chromium.org, loading-re...@chromium.org, keithle...@chromium.org, zol...@webkit.org, jdonnel...@chromium.org, translat...@chromium.org, yhanad...@chromium.org, blink-re...@chromium.org, nektar...@chromium.org, droger+w...@chromium.org, vasilii+watchlis...@chromium.org, srahim...@chromium.org, lize...@chromium.org, anastas...@google.com, dtapuska+...@chromium.org, blink-revi...@chromium.org, csharris...@chromium.org, extension...@chromium.org, mfoltz+wa...@chromium.org, speed-metr...@chromium.org, chromium-a...@chromium.org, asvitkine...@chromium.org, blink-re...@chromium.org, android-web...@chromium.org, francisjp...@google.com, abigailbk...@google.com, asvitki...@chromium.org, bmcquad...@chromium.org, shuche...@chromium.org, apavlo...@chromium.org, creis...@chromium.org, alexmo...@chromium.org, mac-r...@chromium.org, lizeb...@chromium.org, oshima...@chromium.org, wfh+...@chromium.org, core-timi...@chromium.org, nona+...@chromium.org, jmedle...@chromium.org, blink-revie...@chromium.org, josiah...@chromium.org, chromiumme...@microsoft.com, tbarzi...@chromium.org, dtraino...@chromium.org, blink-...@chromium.org, speed-metrics...@chromium.org, chikamu...@chromium.org, rrsilva+wat...@google.com, navigation...@chromium.org, dtseng...@chromium.org, kyungjunle...@google.com, ios-revie...@chromium.org, ios-r...@chromium.org, jeffreycohen+watc...@chromium.org, knollr+wat...@chromium.org, marq+...@chromium.org, tgupta...@chromium.org
Attention needed from Mark Cogan and Michael Tatarski

Marc Treib added 4 comments

File ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
Line 2814, Patchset 6: [_sendTabToSelfCoordinator sendTabToTargetDeviceCacheGUID:cacheGUID
Marc Treib . resolved

The coordinator is a UI concept, so going through it if we're not actually showing any UI seems a bit weird. But maybe showing the confirmation toast is "enough UI" to warrant going through the coordinator?

Michael Tatarski

Yeah, that's a fair point. Coordinators are usually UI-only concepts. However, going through SendTabToSelfCoordinator here is the cleanest way IMHO.

It prevents us from bloating the fairly generic `BrowserCoordinator` with feature-specific logic like sync model listeners, error handling, and toast triggering.

The toast can be considered the UI representation for this command, and keeping it encapsulated in the coordinator keeps everything modular.

Marc Treib

It prevents us from bloating the fairly generic BrowserCoordinator with feature-specific logic

Well, that's not the *only* alternative to the current approach. The relevant parts could also be pulled into some other (non-coordinator) helper class. But I guess if there's *some* UI involved, then using the same coordinator probably makes sense.

But then by that argument, it's probably best to go through `ExecuteWhenTransitionsComplete` after all. I'm not *sure* it's required in this case, but it can't hurt, and it's more consistent.

Michael Tatarski

SG, I have wrapped the direct-send start call inside `ExecuteWhenTransitionsComplete`

Marc Treib

Acknowledged

File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator_unittest.mm
Line 69, Patchset 14 (Latest): base::BindRepeating(
[](ProfileIOS* profile) -> std::unique_ptr<KeyedService> {
return std::make_unique<syncer::TestSyncService>();
}));
Line 152, Patchset 10: // Enable post-send toast flag for toast behavior tests.
Marc Treib . unresolved

Even if the flag is somewhat-required for the test, this comment is just confusing - this is not a "toast behavior test".

Michael Tatarski

Rewrote the comment.

Marc Treib

No you didn't

File ios/chrome/browser/send_tab_to_self/model/BUILD.gn
Line 170, Patchset 10:}
Marc Treib . unresolved

Why was this moved here? Having a separate build file made more sense to me.

Michael Tatarski

Done

Marc Treib

Not actually done

Open in Gerrit

Related details

Attention is currently required from:
  • Mark Cogan
  • Michael Tatarski
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: Ic35f60a597d35d8108c560137338a4eb79f74e67
Gerrit-Change-Number: 7992618
Gerrit-PatchSet: 14
Gerrit-Owner: Michael Tatarski <mtat...@google.com>
Gerrit-Reviewer: Marc Treib <tr...@chromium.org>
Gerrit-Reviewer: Mark Cogan <ma...@chromium.org>
Gerrit-Reviewer: Michael Tatarski <mtat...@google.com>
Gerrit-Attention: Mark Cogan <ma...@chromium.org>
Gerrit-Attention: Michael Tatarski <mtat...@google.com>
Gerrit-Comment-Date: Thu, 25 Jun 2026 08:51:16 +0000
satisfied_requirement
unsatisfied_requirement
open
diffy

Michael Tatarski (Gerrit)

unread,
Jun 25, 2026, 6:13:06 AM (3 days ago) Jun 25
to android-bu...@system.gserviceaccount.com, Mark Cogan, Chromium LUCI CQ, Marc Treib, webauthn...@chromium.org, derinel+wat...@google.com, yuzo+...@chromium.org, feature-me...@chromium.org, blink-revi...@chromium.org, gcasto+w...@chromium.org, omnibox-...@chromium.org, gavinp...@chromium.org, tranbaod...@chromium.org, loading...@chromium.org, net-r...@chromium.org, bartek...@chromium.org, blink-revie...@chromium.org, katie...@chromium.org, kinuko...@chromium.org, devtools...@chromium.org, christia...@chromium.org, blink-revie...@chromium.org, hirokisa...@chromium.org, loading-rev...@chromium.org, scheduler-...@chromium.org, loading-re...@chromium.org, keithle...@chromium.org, zol...@webkit.org, jdonnel...@chromium.org, translat...@chromium.org, yhanad...@chromium.org, blink-re...@chromium.org, nektar...@chromium.org, droger+w...@chromium.org, vasilii+watchlis...@chromium.org, srahim...@chromium.org, lize...@chromium.org, anastas...@google.com, dtapuska+...@chromium.org, blink-revi...@chromium.org, csharris...@chromium.org, extension...@chromium.org, mfoltz+wa...@chromium.org, speed-metr...@chromium.org, chromium-a...@chromium.org, asvitkine...@chromium.org, blink-re...@chromium.org, android-web...@chromium.org, francisjp...@google.com, abigailbk...@google.com, asvitki...@chromium.org, bmcquad...@chromium.org, shuche...@chromium.org, apavlo...@chromium.org, creis...@chromium.org, alexmo...@chromium.org, mac-r...@chromium.org, lizeb...@chromium.org, oshima...@chromium.org, wfh+...@chromium.org, core-timi...@chromium.org, nona+...@chromium.org, jmedle...@chromium.org, blink-revie...@chromium.org, josiah...@chromium.org, chromiumme...@microsoft.com, tbarzi...@chromium.org, dtraino...@chromium.org, blink-...@chromium.org, speed-metrics...@chromium.org, chikamu...@chromium.org, rrsilva+wat...@google.com, navigation...@chromium.org, dtseng...@chromium.org, kyungjunle...@google.com, ios-revie...@chromium.org, ios-r...@chromium.org, jeffreycohen+watc...@chromium.org, knollr+wat...@chromium.org, marq+...@chromium.org, tgupta...@chromium.org
Attention needed from Marc Treib and Mark Cogan

Michael Tatarski added 4 comments

File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator.mm
Line 608, Patchset 10: deviceName:(NSString*)deviceName {
// Avoid performing any UI updates or delegate callbacks if the coordinator
// has already been stopped.
if (self.stopped) {
return;
}
Marc Treib . resolved

I still don't understand this. Why can the coordinator *now* be stopped already at this point?

Michael Tatarski

This guard is a safety check for the asynchronous callback. Because SendEntry executes an asynchronously, there is a delay before handleSendResult is called. During this asynchronous window, it is possible for the parent coordinator to stop and tear down this coordinator (for example, if the user closes the tab, navigates away, or logs out).

If the coordinator has already been stopped by its parent (self.stopped is YES), this check prevents us from performing any subsequent UI updates (like displaying the snackbar) or invoking delegate callbacks on a coordinator that is already dead, avoiding crashes.

Michael Tatarski

Done

File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator_unittest.mm
Line 69, Patchset 14: base::BindRepeating(

[](ProfileIOS* profile) -> std::unique_ptr<KeyedService> {
return std::make_unique<syncer::TestSyncService>();
}));
Marc Treib . resolved
Michael Tatarski

Cool, thanks for the work.

Line 152, Patchset 10: // Enable post-send toast flag for toast behavior tests.
Marc Treib . resolved

Even if the flag is somewhat-required for the test, this comment is just confusing - this is not a "toast behavior test".

Michael Tatarski

Rewrote the comment.

Marc Treib

No you didn't

Michael Tatarski

Done

File ios/chrome/browser/send_tab_to_self/model/BUILD.gn
Line 170, Patchset 10:}
Marc Treib . resolved

Why was this moved here? Having a separate build file made more sense to me.

Michael Tatarski

Done

Marc Treib

Not actually done

Michael Tatarski

Done

Open in Gerrit

Related details

Attention is currently required from:
  • Marc Treib
  • Mark Cogan
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: Ic35f60a597d35d8108c560137338a4eb79f74e67
    Gerrit-Change-Number: 7992618
    Gerrit-PatchSet: 18
    Gerrit-Owner: Michael Tatarski <mtat...@google.com>
    Gerrit-Reviewer: Marc Treib <tr...@chromium.org>
    Gerrit-Reviewer: Mark Cogan <ma...@chromium.org>
    Gerrit-Reviewer: Michael Tatarski <mtat...@google.com>
    Gerrit-Attention: Mark Cogan <ma...@chromium.org>
    Gerrit-Attention: Marc Treib <tr...@chromium.org>
    Gerrit-Comment-Date: Thu, 25 Jun 2026 10:12:48 +0000
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Marc Treib (Gerrit)

    unread,
    Jun 25, 2026, 6:24:05 AM (3 days ago) Jun 25
    to Michael Tatarski, Marc Treib, android-bu...@system.gserviceaccount.com, Mark Cogan, Chromium LUCI CQ, webauthn...@chromium.org, derinel+wat...@google.com, yuzo+...@chromium.org, feature-me...@chromium.org, blink-revi...@chromium.org, gcasto+w...@chromium.org, omnibox-...@chromium.org, gavinp...@chromium.org, tranbaod...@chromium.org, loading...@chromium.org, net-r...@chromium.org, bartek...@chromium.org, blink-revie...@chromium.org, katie...@chromium.org, kinuko...@chromium.org, devtools...@chromium.org, christia...@chromium.org, blink-revie...@chromium.org, hirokisa...@chromium.org, loading-rev...@chromium.org, scheduler-...@chromium.org, loading-re...@chromium.org, keithle...@chromium.org, zol...@webkit.org, jdonnel...@chromium.org, translat...@chromium.org, yhanad...@chromium.org, blink-re...@chromium.org, nektar...@chromium.org, droger+w...@chromium.org, vasilii+watchlis...@chromium.org, srahim...@chromium.org, lize...@chromium.org, anastas...@google.com, dtapuska+...@chromium.org, blink-revi...@chromium.org, csharris...@chromium.org, extension...@chromium.org, mfoltz+wa...@chromium.org, speed-metr...@chromium.org, chromium-a...@chromium.org, asvitkine...@chromium.org, blink-re...@chromium.org, android-web...@chromium.org, francisjp...@google.com, abigailbk...@google.com, asvitki...@chromium.org, bmcquad...@chromium.org, shuche...@chromium.org, apavlo...@chromium.org, creis...@chromium.org, alexmo...@chromium.org, mac-r...@chromium.org, lizeb...@chromium.org, oshima...@chromium.org, wfh+...@chromium.org, core-timi...@chromium.org, nona+...@chromium.org, jmedle...@chromium.org, blink-revie...@chromium.org, josiah...@chromium.org, chromiumme...@microsoft.com, tbarzi...@chromium.org, dtraino...@chromium.org, blink-...@chromium.org, speed-metrics...@chromium.org, chikamu...@chromium.org, rrsilva+wat...@google.com, navigation...@chromium.org, dtseng...@chromium.org, kyungjunle...@google.com, ios-revie...@chromium.org, ios-r...@chromium.org, jeffreycohen+watc...@chromium.org, knollr+wat...@chromium.org, marq+...@chromium.org, tgupta...@chromium.org
    Attention needed from Mark Cogan and Michael Tatarski

    Marc Treib voted and added 2 comments

    Votes added by Marc Treib

    Code-Review+1

    2 comments

    File ios/chrome/browser/send_tab_to_self/coordinator/BUILD.gn
    Line 45, Patchset 18 (Parent): "//ui/base",
    Marc Treib . unresolved

    Isn't this one needed for `l10n_util`? (I haven't checked all of the other ones, but `gn gen --check out/myoutdir` should tell you if anything's missing.)

    File ios/chrome/browser/send_tab_to_self/coordinator/send_tab_to_self_coordinator.mm
    Line 628, Patchset 18: if (self.sendTabToSelfViewController &&
    Marc Treib . unresolved

    `!self.isDirectSend`?

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Mark Cogan
    • Michael Tatarski
    Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement is not satisfiedCode-Owners
      • requirement 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: Ic35f60a597d35d8108c560137338a4eb79f74e67
      Gerrit-Change-Number: 7992618
      Gerrit-PatchSet: 19
      Gerrit-Owner: Michael Tatarski <mtat...@google.com>
      Gerrit-Reviewer: Marc Treib <tr...@chromium.org>
      Gerrit-Reviewer: Mark Cogan <ma...@chromium.org>
      Gerrit-Reviewer: Michael Tatarski <mtat...@google.com>
      Gerrit-Attention: Mark Cogan <ma...@chromium.org>
      Gerrit-Attention: Michael Tatarski <mtat...@google.com>
      Gerrit-Comment-Date: Thu, 25 Jun 2026 10:23:48 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: Yes
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Mark Cogan (Gerrit)

      unread,
      Jun 25, 2026, 7:54:40 AM (3 days ago) Jun 25
      to Michael Tatarski, Marc Treib, android-bu...@system.gserviceaccount.com, Chromium LUCI CQ, webauthn...@chromium.org, derinel+wat...@google.com, yuzo+...@chromium.org, feature-me...@chromium.org, blink-revi...@chromium.org, gcasto+w...@chromium.org, omnibox-...@chromium.org, gavinp...@chromium.org, tranbaod...@chromium.org, loading...@chromium.org, net-r...@chromium.org, bartek...@chromium.org, blink-revie...@chromium.org, katie...@chromium.org, kinuko...@chromium.org, devtools...@chromium.org, christia...@chromium.org, blink-revie...@chromium.org, hirokisa...@chromium.org, loading-rev...@chromium.org, scheduler-...@chromium.org, loading-re...@chromium.org, keithle...@chromium.org, zol...@webkit.org, jdonnel...@chromium.org, translat...@chromium.org, yhanad...@chromium.org, blink-re...@chromium.org, nektar...@chromium.org, droger+w...@chromium.org, vasilii+watchlis...@chromium.org, srahim...@chromium.org, lize...@chromium.org, anastas...@google.com, dtapuska+...@chromium.org, blink-revi...@chromium.org, csharris...@chromium.org, extension...@chromium.org, mfoltz+wa...@chromium.org, speed-metr...@chromium.org, chromium-a...@chromium.org, asvitkine...@chromium.org, blink-re...@chromium.org, android-web...@chromium.org, francisjp...@google.com, abigailbk...@google.com, asvitki...@chromium.org, bmcquad...@chromium.org, shuche...@chromium.org, apavlo...@chromium.org, creis...@chromium.org, alexmo...@chromium.org, mac-r...@chromium.org, lizeb...@chromium.org, oshima...@chromium.org, wfh+...@chromium.org, core-timi...@chromium.org, nona+...@chromium.org, jmedle...@chromium.org, blink-revie...@chromium.org, josiah...@chromium.org, chromiumme...@microsoft.com, tbarzi...@chromium.org, dtraino...@chromium.org, blink-...@chromium.org, speed-metrics...@chromium.org, chikamu...@chromium.org, rrsilva+wat...@google.com, navigation...@chromium.org, dtseng...@chromium.org, kyungjunle...@google.com, ios-revie...@chromium.org, ios-r...@chromium.org, jeffreycohen+watc...@chromium.org, knollr+wat...@chromium.org, marq+...@chromium.org, tgupta...@chromium.org
      Attention needed from Michael Tatarski

      Mark Cogan added 1 comment

      Commit Message
      Line 12, Patchset 14:
      It introduces the command to execute the background send action and
      display the post-send snackbar upon completion.
      Mark Cogan . unresolved

      So the intent behind UI commands is that they are used to (in a decoupled way) induce UI changes. But this sounds like a model-layer action which shows a snackbar afterwards, so it's not really a UI change.

      The usual structure for handling model-layer actions like this is a browser agent, which has a lifetime unrelated to any UI objects and is simpler to unit test.

      I don't know the details of the feature well enough to judge how much of the logic this CL adds to the coordinator could be moved to a browser agent.

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Michael Tatarski
      Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement is not satisfiedCode-Owners
      • requirement 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: Ic35f60a597d35d8108c560137338a4eb79f74e67
      Gerrit-Change-Number: 7992618
      Gerrit-PatchSet: 19
      Gerrit-Owner: Michael Tatarski <mtat...@google.com>
      Gerrit-Reviewer: Marc Treib <tr...@chromium.org>
      Gerrit-Reviewer: Mark Cogan <ma...@chromium.org>
      Gerrit-Reviewer: Michael Tatarski <mtat...@google.com>
      Gerrit-Attention: Michael Tatarski <mtat...@google.com>
      Gerrit-Comment-Date: Thu, 25 Jun 2026 11:54:21 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy
      Reply all
      Reply to author
      Forward
      0 new messages