[APC] Align outer bounding box mapping with visible rect [chromium/src : main]

0 views
Skip to first unread message

Aaron Leventhal (Gerrit)

unread,
Nov 18, 2025, 5:18:38 PMNov 18
to Khushal Sagar, Andrew Verge, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org
Attention needed from Andrew Verge and Khushal Sagar

Aaron Leventhal voted Commit-Queue+1

Commit-Queue+1
Open in Gerrit

Related details

Attention is currently required from:
  • Andrew Verge
  • Khushal Sagar
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: I9f5749db16585e490bcf84ca2e3a3a92d9830e6f
Gerrit-Change-Number: 7158770
Gerrit-PatchSet: 8
Gerrit-Owner: Aaron Leventhal <aleve...@google.com>
Gerrit-Reviewer: Aaron Leventhal <aleve...@google.com>
Gerrit-Reviewer: Andrew Verge <ave...@chromium.org>
Gerrit-Reviewer: Khushal Sagar <khusha...@chromium.org>
Gerrit-CC: AI Code Reviewer <peep-gen...@system.gserviceaccount.com>
Gerrit-CC: David Bokan <bo...@chromium.org>
Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
Gerrit-CC: Stephen Chenney <sche...@chromium.org>
Gerrit-Attention: Khushal Sagar <khusha...@chromium.org>
Gerrit-Attention: Andrew Verge <ave...@chromium.org>
Gerrit-Comment-Date: Tue, 18 Nov 2025 22:18:33 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
satisfied_requirement
unsatisfied_requirement
open
diffy

Khushal Sagar (Gerrit)

unread,
Nov 21, 2025, 6:44:55 PMNov 21
to Aaron Leventhal, Philip Rogers, Stefan Zager, Andrew Verge, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org
Attention needed from Aaron Leventhal, Andrew Verge, Philip Rogers and Stefan Zager

Khushal Sagar added 5 comments

Patchset-level comments
File-level comment, Patchset 22 (Latest):
Khushal Sagar . resolved

This is great, thank you!

+pdr/szager, wasn't sure who's more familiar with GeometryMapper so bugging you both. :)

File third_party/blink/renderer/core/frame/local_frame_view.h
Line 738, Patchset 22 (Latest): bool apply_overflow_clip = true,
bool apply_viewport_transform = false,
bool apply_viewport_clip = true);
Khushal Sagar . unresolved

nit: This is getting into enum bitflags territory. :)

File third_party/blink/renderer/core/layout/layout_box.cc
Line 1931, Patchset 22 (Latest): does_intersect = true;
Khushal Sagar . unresolved

I glanced through the call-sites to confirm this should be the return value. One of the comments says that this API returns true if no clipping was applied so this seems reasonable to me. But leaving a comment so a more familiar owner can validate.

File third_party/blink/renderer/modules/content_extraction/ai_page_content_agent.cc
Line 225, Patchset 22 (Latest): // Normalize to a (0,0) origin in the outer document's viewport space so it
// matches the coordinate system returned by MapToVisualRectInAncestorSpace().
Khushal Sagar . unresolved

This won't suffice for OOPIFs since `MapToVisualRectInAncestorSpace` does mapping into the remote frame's viewport space. But IIUC this will be the OOPIF's viewport's coordinate space.

Also looks like we can add this check in a separate CL? Keep this one focused on validating the relationship between outer_bounding_box and visible_bounding_box.

File third_party/blink/renderer/platform/graphics/visual_rect_flags.h
Line 49, Patchset 22 (Latest): // rect, ensuring both passes share identical transform logic.
Khushal Sagar . unresolved

nit: transform and scroll offset logic

Open in Gerrit

Related details

Attention is currently required from:
  • Aaron Leventhal
  • Andrew Verge
  • Philip Rogers
  • Stefan Zager
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: I9f5749db16585e490bcf84ca2e3a3a92d9830e6f
    Gerrit-Change-Number: 7158770
    Gerrit-PatchSet: 22
    Gerrit-Owner: Aaron Leventhal <aleve...@google.com>
    Gerrit-Reviewer: Aaron Leventhal <aleve...@google.com>
    Gerrit-Reviewer: Andrew Verge <ave...@chromium.org>
    Gerrit-Reviewer: Khushal Sagar <khusha...@chromium.org>
    Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
    Gerrit-Reviewer: Stefan Zager <sza...@chromium.org>
    Gerrit-CC: AI Code Reviewer <peep-gen...@system.gserviceaccount.com>
    Gerrit-CC: David Bokan <bo...@chromium.org>
    Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
    Gerrit-CC: Stephen Chenney <sche...@chromium.org>
    Gerrit-Attention: Aaron Leventhal <aleve...@google.com>
    Gerrit-Attention: Andrew Verge <ave...@chromium.org>
    Gerrit-Attention: Philip Rogers <p...@chromium.org>
    Gerrit-Attention: Stefan Zager <sza...@chromium.org>
    Gerrit-Comment-Date: Fri, 21 Nov 2025 23:44:46 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Philip Rogers (Gerrit)

    unread,
    Nov 21, 2025, 7:06:45 PMNov 21
    to Aaron Leventhal, Stefan Zager, Khushal Sagar, Andrew Verge, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org
    Attention needed from Aaron Leventhal, Andrew Verge and Stefan Zager

    Philip Rogers added 1 comment

    Commit Message
    Line 12, Patchset 22 (Latest): still respecting ancestor transforms, scroll offsets, and filters.
    Philip Rogers . unresolved

    Mapping while respecting transforms and scroll offsets, but without clipping, sounds like GeometryMapper::SourceToDestinationProjection (see ObjectToViewTransform for an example of this in use). Can you just use SourceToDestinationProjection?

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Aaron Leventhal
    • Andrew Verge
    • Stefan Zager
    Gerrit-Attention: Stefan Zager <sza...@chromium.org>
    Gerrit-Comment-Date: Sat, 22 Nov 2025 00:06:33 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Andrew Verge (Gerrit)

    unread,
    Nov 24, 2025, 12:21:52 PMNov 24
    to Aaron Leventhal, Philip Rogers, Stefan Zager, Khushal Sagar, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org
    Attention needed from Aaron Leventhal and Stefan Zager

    Andrew Verge voted and added 1 comment

    Votes added by Andrew Verge

    Code-Review+1

    1 comment

    Patchset-level comments
    Andrew Verge . resolved

    I am pretty new to this space so thanks for letting me review this! Overall +1, but deferring to other domain experts for approval.

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Aaron Leventhal
    • Stefan Zager
    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: I9f5749db16585e490bcf84ca2e3a3a92d9830e6f
      Gerrit-Change-Number: 7158770
      Gerrit-PatchSet: 22
      Gerrit-Owner: Aaron Leventhal <aleve...@google.com>
      Gerrit-Reviewer: Aaron Leventhal <aleve...@google.com>
      Gerrit-Reviewer: Andrew Verge <ave...@chromium.org>
      Gerrit-Reviewer: Khushal Sagar <khusha...@chromium.org>
      Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
      Gerrit-Reviewer: Stefan Zager <sza...@chromium.org>
      Gerrit-CC: AI Code Reviewer <peep-gen...@system.gserviceaccount.com>
      Gerrit-CC: David Bokan <bo...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-Attention: Aaron Leventhal <aleve...@google.com>
      Gerrit-Attention: Stefan Zager <sza...@chromium.org>
      Gerrit-Comment-Date: Mon, 24 Nov 2025 17:21:45 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: Yes
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Aaron Leventhal (Gerrit)

      unread,
      Dec 1, 2025, 12:19:08 PMDec 1
      to Stefan Zager, Andrew Verge, Philip Rogers, Khushal Sagar, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org
      Attention needed from Aaron Leventhal

      Aaron Leventhal removed Stefan Zager from this change

      Deleted Reviewers:
      • Stefan Zager
      Open in Gerrit

      Related details

      Attention is currently required from:
      • Aaron Leventhal
      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: deleteReviewer
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: I9f5749db16585e490bcf84ca2e3a3a92d9830e6f
      Gerrit-Change-Number: 7158770
      Gerrit-PatchSet: 23
      Gerrit-Owner: Aaron Leventhal <aleve...@google.com>
      Gerrit-Reviewer: Aaron Leventhal <aleve...@google.com>
      Gerrit-Reviewer: Andrew Verge <ave...@chromium.org>
      Gerrit-Reviewer: Khushal Sagar <khusha...@chromium.org>
      Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Aaron Leventhal (Gerrit)

      unread,
      Dec 1, 2025, 4:03:40 PMDec 1
      to Andrew Verge, Philip Rogers, Khushal Sagar, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org
      Attention needed from Khushal Sagar and Philip Rogers

      Aaron Leventhal added 4 comments

      Commit Message
      Line 12, Patchset 22: still respecting ancestor transforms, scroll offsets, and filters.
      Philip Rogers . unresolved

      Mapping while respecting transforms and scroll offsets, but without clipping, sounds like GeometryMapper::SourceToDestinationProjection (see ObjectToViewTransform for an example of this in use). Can you just use SourceToDestinationProjection?

      Aaron Leventhal

      Hi pdr, unfortunately, tons of tests fail our DCHECKs with that approach. See
      https://chromium-review.googlesource.com/c/chromium/src/+/7214166?tab=checks

      Maybe you have another suggestion? What I like about the approach here, although it does add some complexity to layout, is that it's clearly following the same code path and just not applying clipping. That means there won't be any surprises from divergent math.

      File third_party/blink/renderer/core/frame/local_frame_view.h
      Line 738, Patchset 22: bool apply_overflow_clip = true,

      bool apply_viewport_transform = false,
      bool apply_viewport_clip = true);
      Khushal Sagar . unresolved

      nit: This is getting into enum bitflags territory. :)

      Aaron Leventhal

      I put this part of the change in https://chromium-review.googlesource.com/c/chromium/src/+/7213198

      Note that it adds 35 lines of code. Not sure whether it's worth it.

      File third_party/blink/renderer/modules/content_extraction/ai_page_content_agent.cc
      Line 225, Patchset 22: // Normalize to a (0,0) origin in the outer document's viewport space so it

      // matches the coordinate system returned by MapToVisualRectInAncestorSpace().
      Khushal Sagar . resolved

      This won't suffice for OOPIFs since `MapToVisualRectInAncestorSpace` does mapping into the remote frame's viewport space. But IIUC this will be the OOPIF's viewport's coordinate space.

      Also looks like we can add this check in a separate CL? Keep this one focused on validating the relationship between outer_bounding_box and visible_bounding_box.

      File third_party/blink/renderer/platform/graphics/visual_rect_flags.h
      Line 49, Patchset 22: // rect, ensuring both passes share identical transform logic.
      Khushal Sagar . resolved

      nit: transform and scroll offset logic

      Aaron Leventhal

      Done

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Khushal Sagar
      • Philip Rogers
      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: I9f5749db16585e490bcf84ca2e3a3a92d9830e6f
      Gerrit-Change-Number: 7158770
      Gerrit-PatchSet: 24
      Gerrit-Owner: Aaron Leventhal <aleve...@google.com>
      Gerrit-Reviewer: Aaron Leventhal <aleve...@google.com>
      Gerrit-Reviewer: Andrew Verge <ave...@chromium.org>
      Gerrit-Reviewer: Khushal Sagar <khusha...@chromium.org>
      Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
      Gerrit-CC: AI Code Reviewer <peep-gen...@system.gserviceaccount.com>
      Gerrit-CC: David Bokan <bo...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-Attention: Khushal Sagar <khusha...@chromium.org>
      Gerrit-Attention: Philip Rogers <p...@chromium.org>
      Gerrit-Comment-Date: Mon, 01 Dec 2025 21:03:32 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Khushal Sagar <khusha...@chromium.org>
      Comment-In-Reply-To: Philip Rogers <p...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Philip Rogers (Gerrit)

      unread,
      Dec 1, 2025, 7:13:15 PMDec 1
      to Aaron Leventhal, Andrew Verge, Khushal Sagar, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org
      Attention needed from Aaron Leventhal and Khushal Sagar

      Philip Rogers added 1 comment

      Commit Message
      Line 12, Patchset 22: still respecting ancestor transforms, scroll offsets, and filters.
      Philip Rogers . unresolved

      Mapping while respecting transforms and scroll offsets, but without clipping, sounds like GeometryMapper::SourceToDestinationProjection (see ObjectToViewTransform for an example of this in use). Can you just use SourceToDestinationProjection?

      Aaron Leventhal

      Hi pdr, unfortunately, tons of tests fail our DCHECKs with that approach. See
      https://chromium-review.googlesource.com/c/chromium/src/+/7214166?tab=checks

      Maybe you have another suggestion? What I like about the approach here, although it does add some complexity to layout, is that it's clearly following the same code path and just not applying clipping. That means there won't be any surprises from divergent math.

      Philip Rogers

      I'm sorry but I tried to get this test to run but couldn't get it to. I may have made a mistake fixing the merge conflicts.

      I'd like to understand the difference between this patch and SourceToDestinationProjection. What is being handled in one but not the other, etc.

      Can you describe how the result from SourceToDestinationProjection differs from the result here? For example, https://chromium-review.googlesource.com/c/chromium/src/+/7214166 says that virtual/content-extraction/compositing/geometry/layer-due-to-layer-children-deep.html fails with:
      ```
      DCHECK failed: outer_box_in_viewport_coords.Contains(visible_box_in_viewport_coords). Visible box must lie within outer box. Visible: 31,43 300x294, Outer: 31,43 289x218
      STDERR: For: 0x10400521560:LayoutBlockFlow (relative positioned, children-inline) DIV id="greatgrandchild"
      ```

      Can you print Outer with this patch? I'm curious what the difference is.

      There is a small difference between https://chromium-review.googlesource.com/c/chromium/src/+/7214166 and ObjectToViewTransform in the non-GeometryMapper codepath, where the patch does:
      ```
      object.MapLocalToAncestor(nullptr, transform_state, 0);
      transform_state.Flatten();
      unclipped_box = transform_state.LastPlanarQuad().BoundingBox();
      ```
      But ObjectToViewTransform does:
      ```
      gfx::Transform target_to_view_transform = ObjectToViewTransform(*target);
      target_rect_ = target_to_view_transform.MapRect(target_rect_);
      ```
      I'm not sure if this is relevant or not.
      Open in Gerrit

      Related details

      Attention is currently required from:
      • Aaron Leventhal
      • Khushal Sagar
      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: I9f5749db16585e490bcf84ca2e3a3a92d9830e6f
      Gerrit-Change-Number: 7158770
      Gerrit-PatchSet: 25
      Gerrit-Owner: Aaron Leventhal <aleve...@google.com>
      Gerrit-Reviewer: Aaron Leventhal <aleve...@google.com>
      Gerrit-Reviewer: Andrew Verge <ave...@chromium.org>
      Gerrit-Reviewer: Khushal Sagar <khusha...@chromium.org>
      Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
      Gerrit-CC: AI Code Reviewer <peep-gen...@system.gserviceaccount.com>
      Gerrit-CC: David Bokan <bo...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-Attention: Aaron Leventhal <aleve...@google.com>
      Gerrit-Attention: Khushal Sagar <khusha...@chromium.org>
      Gerrit-Comment-Date: Tue, 02 Dec 2025 00:13:03 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Aaron Leventhal <aleve...@google.com>
      Comment-In-Reply-To: Philip Rogers <p...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Aaron Leventhal (Gerrit)

      unread,
      Dec 2, 2025, 12:38:56 PMDec 2
      to Andrew Verge, Philip Rogers, Khushal Sagar, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org
      Attention needed from Khushal Sagar and Philip Rogers

      Aaron Leventhal added 1 comment

      Commit Message
      Line 12, Patchset 22: still respecting ancestor transforms, scroll offsets, and filters.
      Philip Rogers . unresolved

      Mapping while respecting transforms and scroll offsets, but without clipping, sounds like GeometryMapper::SourceToDestinationProjection (see ObjectToViewTransform for an example of this in use). Can you just use SourceToDestinationProjection?

      Aaron Leventhal

      Hi pdr, unfortunately, tons of tests fail our DCHECKs with that approach. See
      https://chromium-review.googlesource.com/c/chromium/src/+/7214166?tab=checks

      Maybe you have another suggestion? What I like about the approach here, although it does add some complexity to layout, is that it's clearly following the same code path and just not applying clipping. That means there won't be any surprises from divergent math.

      Philip Rogers

      I'm sorry but I tried to get this test to run but couldn't get it to. I may have made a mistake fixing the merge conflicts.

      I'd like to understand the difference between this patch and SourceToDestinationProjection. What is being handled in one but not the other, etc.

      Can you describe how the result from SourceToDestinationProjection differs from the result here? For example, https://chromium-review.googlesource.com/c/chromium/src/+/7214166 says that virtual/content-extraction/compositing/geometry/layer-due-to-layer-children-deep.html fails with:
      ```
      DCHECK failed: outer_box_in_viewport_coords.Contains(visible_box_in_viewport_coords). Visible box must lie within outer box. Visible: 31,43 300x294, Outer: 31,43 289x218
      STDERR: For: 0x10400521560:LayoutBlockFlow (relative positioned, children-inline) DIV id="greatgrandchild"
      ```

      Can you print Outer with this patch? I'm curious what the difference is.

      There is a small difference between https://chromium-review.googlesource.com/c/chromium/src/+/7214166 and ObjectToViewTransform in the non-GeometryMapper codepath, where the patch does:
      ```
      object.MapLocalToAncestor(nullptr, transform_state, 0);
      transform_state.Flatten();
      unclipped_box = transform_state.LastPlanarQuad().BoundingBox();
      ```
      But ObjectToViewTransform does:
      ```
      gfx::Transform target_to_view_transform = ObjectToViewTransform(*target);
      target_rect_ = target_to_view_transform.MapRect(target_rect_);
      ```
      I'm not sure if this is relevant or not.
      Aaron Leventhal

      You'll need to update your source to run the tests as I just landed it.

      I've written up a comparison of outer bounding boxes here:
      https://docs.google.com/document/d/1sVSTn_4BPGXafXm-MhBABbNngfcFeu3vNfGXbLv63CI/edit?tab=t.0

      Thanks for telling me about the missing MapRect() call. I've fixed that, but it did not help. In any case it's more similar to the previous code, so I updated the CL with that change.

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Khushal Sagar
      • Philip Rogers
      Gerrit-Attention: Khushal Sagar <khusha...@chromium.org>
      Gerrit-Attention: Philip Rogers <p...@chromium.org>
      Gerrit-Comment-Date: Tue, 02 Dec 2025 17:38:47 +0000
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Philip Rogers (Gerrit)

      unread,
      Dec 3, 2025, 6:13:33 PMDec 3
      to Aaron Leventhal, Andrew Verge, Khushal Sagar, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org
      Attention needed from Aaron Leventhal, Andrew Verge and Khushal Sagar

      Philip Rogers added 1 comment

      File third_party/blink/renderer/core/layout/visual_rect_mapping_test.cc
      Line 392, Patchset 27 (Latest): nullptr, unclipped, kSkipAncestorAndViewportClips));
      Philip Rogers . unresolved
      Can you also check the result when using geometry mapper?
      ```
      unclipped = local_rect;
      EXPECT_TRUE(target->MapToVisualRectInAncestorSpace(
      &GetLayoutView(), unclipped, static_cast<VisualRectFlags>(kSkipAncestorAndViewportClips | kUseGeometryMapper)));
      EXPECT_EQ(unclipped, PhysicalRect(-30, -35, 40, 40));
      ```
      (similarly for the others)
      Open in Gerrit

      Related details

      Attention is currently required from:
      • Aaron Leventhal
      • Andrew Verge
      • Khushal Sagar
      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: I9f5749db16585e490bcf84ca2e3a3a92d9830e6f
        Gerrit-Change-Number: 7158770
        Gerrit-PatchSet: 27
        Gerrit-Owner: Aaron Leventhal <aleve...@google.com>
        Gerrit-Reviewer: Aaron Leventhal <aleve...@google.com>
        Gerrit-Reviewer: Andrew Verge <ave...@chromium.org>
        Gerrit-Reviewer: Khushal Sagar <khusha...@chromium.org>
        Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
        Gerrit-CC: AI Code Reviewer <peep-gen...@system.gserviceaccount.com>
        Gerrit-CC: David Bokan <bo...@chromium.org>
        Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
        Gerrit-CC: Stephen Chenney <sche...@chromium.org>
        Gerrit-Attention: Aaron Leventhal <aleve...@google.com>
        Gerrit-Attention: Andrew Verge <ave...@chromium.org>
        Gerrit-Attention: Khushal Sagar <khusha...@chromium.org>
        Gerrit-Comment-Date: Wed, 03 Dec 2025 23:13:24 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Aaron Leventhal (Gerrit)

        unread,
        Dec 16, 2025, 11:03:18 AM (4 days ago) Dec 16
        to Code Review Nudger, Andrew Verge, Philip Rogers, Khushal Sagar, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org

        Aaron Leventhal abandoned this change

        Related details

        Attention set is empty
        Submit Requirements:
        • requirement satisfiedCode-Coverage
        • 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: abandon
        Gerrit-Project: chromium/src
        Gerrit-Branch: main
        Gerrit-Change-Id: I9f5749db16585e490bcf84ca2e3a3a92d9830e6f
        Gerrit-Change-Number: 7158770
        Gerrit-PatchSet: 27
        Gerrit-Owner: Aaron Leventhal <aleve...@google.com>
        Gerrit-Reviewer: Aaron Leventhal <aleve...@google.com>
        Gerrit-Reviewer: Andrew Verge <ave...@chromium.org>
        Gerrit-Reviewer: Khushal Sagar <khusha...@chromium.org>
        Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
        Gerrit-CC: AI Code Reviewer <peep-gen...@system.gserviceaccount.com>
        Gerrit-CC: Code Review Nudger <android-build...@prod.google.com>
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Aaron Leventhal (Gerrit)

        unread,
        Dec 16, 2025, 2:44:46 PM (4 days ago) Dec 16
        to Code Review Nudger, Andrew Verge, Philip Rogers, Khushal Sagar, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org

        Aaron Leventhal restored this change

        Related details

        Attention set is empty
        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: restore
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Aaron Leventhal (Gerrit)

        unread,
        Dec 17, 2025, 2:22:36 PM (3 days ago) Dec 17
        to Code Review Nudger, Andrew Verge, Philip Rogers, Khushal Sagar, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org
        Attention needed from Philip Rogers

        Aaron Leventhal added 2 comments

        Commit Message
        Aaron Leventhal

        I tried switching outer box mapping to GeometryMapper::SourceToDestinationProjection following the ObjectToViewTransform pattern (GeometryMapper fast-path when possible, otherwise fallback) in CL:7214166. Unfortunately it still triggers the outer.Contains(visible) DCHECK in a number of tests, and it doesn’t look like a quick fit as a general replacement for “MapToVisualRectInAncestorSpace but without clipping”.

        A few representative problem cases, which I've added to the virtual/content-extraction VirtualTestSuite.

        1. Page scale / scaling (including fixed-position + iframe interactions)
        These appear to be transform-tree scale / pageScaleFactor scenarios where
        transform-only projection diverges from the visual-rect
        mapping pipeline (which is what visible_bounding_box uses).
        Example: compositing/geometry/fixed-position-composited-page-scale.html
        (also ...-page-scale-scroll.html, ...-iframe-...-page-
        scale.html, ...-transform-...-page-scale.html, and
        compositing/scaling/tiled-layer-recursion.html).
        2. Fragmentation (documented limitation in the suggested pattern).
        The ObjectToViewTransform helper that demonstrates this pattern is documented
        with: “NOTE: This doesn't work if object has multiple block fragments.” Even if
        we start from a single local bounding rect, mapping via FirstFragment() /
        PaintOffset() is inherently fragment-dependent, so it can under-map relative to
        MapToVisualRectInAncestorSpace() which is built to handle visual-
        rect mapping through layout/paint state.
        Example: compositing/gestures/gesture-tapHighlight-block-in-multicol.html
        (and generally multicol / fragmentation/* coverage).
        3. Viewport/visual viewport / scrollbars (often combined with scaling).
        A bunch of failures cluster around viewport sizing and scrolling behavior,
        suggesting “viewport space” as computed by the visual-
        rect mapping codepath isn’t consistently reproducible via projection.
        Example: css3/viewport-percentage-lengths/viewport-percentage-lengths-scaled-
        normal-scrollbars.html (also ...scaled-overlay-
        scrollbars.html, fast/dom/viewport/viewport-dimensions-*.html).

        Apologies if I'm misunderstanding and this is simple. Do you want me to try to
        address these issues?

        Or perhaps the new flag in this CL is still worth considering, in that using a
        single mapping pipeline makes outer.Contains(visible) true by definition.

        File third_party/blink/renderer/core/layout/visual_rect_mapping_test.cc
        Line 392, Patchset 27: nullptr, unclipped, kSkipAncestorAndViewportClips));
        Philip Rogers . resolved
        Can you also check the result when using geometry mapper?
        ```
        unclipped = local_rect;
        EXPECT_TRUE(target->MapToVisualRectInAncestorSpace(
        &GetLayoutView(), unclipped, static_cast<VisualRectFlags>(kSkipAncestorAndViewportClips | kUseGeometryMapper)));
        EXPECT_EQ(unclipped, PhysicalRect(-30, -35, 40, 40));
        ```
        (similarly for the others)
        Aaron Leventhal

        Good suggestion. This was a good thing to check especially with the new fast path code for null ancestor as viewport. It led to a failure and then fix.

        Open in Gerrit

        Related details

        Attention is currently required from:
        • Philip Rogers
        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: I9f5749db16585e490bcf84ca2e3a3a92d9830e6f
        Gerrit-Change-Number: 7158770
        Gerrit-PatchSet: 29
        Gerrit-Owner: Aaron Leventhal <aleve...@google.com>
        Gerrit-Reviewer: Aaron Leventhal <aleve...@google.com>
        Gerrit-Reviewer: Andrew Verge <ave...@chromium.org>
        Gerrit-Reviewer: Khushal Sagar <khusha...@chromium.org>
        Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
        Gerrit-CC: AI Code Reviewer <peep-gen...@system.gserviceaccount.com>
        Gerrit-CC: Code Review Nudger <android-build...@prod.google.com>
        Gerrit-CC: David Bokan <bo...@chromium.org>
        Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
        Gerrit-CC: Stephen Chenney <sche...@chromium.org>
        Gerrit-Attention: Philip Rogers <p...@chromium.org>
        Gerrit-Comment-Date: Wed, 17 Dec 2025 19:22:30 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Aaron Leventhal (Gerrit)

        unread,
        Dec 17, 2025, 2:26:22 PM (3 days ago) Dec 17
        to Code Review Nudger, Andrew Verge, Philip Rogers, Khushal Sagar, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org
        Attention needed from Philip Rogers

        Aaron Leventhal added 1 comment

        File third_party/blink/renderer/platform/runtime_enabled_features.json5
        Line 324, Patchset 29 (Parent): // Only supported for DCHECK-enabled builds.
        Aaron Leventhal . unresolved

        As per the AI review agent, `AIPageContentBuildOnLoadForTesting` is also only enabled for DCHECK builds. This comment should probably be duplicated for `AIPageContentCheckGeometry` rather than moved.

        Gerrit-Comment-Date: Wed, 17 Dec 2025 19:26:16 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Philip Rogers (Gerrit)

        unread,
        Dec 17, 2025, 4:15:40 PM (3 days ago) Dec 17
        to Aaron Leventhal, Code Review Nudger, Andrew Verge, Khushal Sagar, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org
        Attention needed from Aaron Leventhal

        Philip Rogers added 2 comments

        Commit Message
        Line 12, Patchset 22: still respecting ancestor transforms, scroll offsets, and filters.
        Philip Rogers . resolved
        Philip Rogers

        I think the geometry mapper codepath should be able to handle #1 and #3 correctly, and is generally more stable infra. I am not sure #2 is handled correctly in either codepath. In any case, let's continue with this patch for now, and you can consider switching to the fast-path in the future.

        File third_party/blink/renderer/core/layout/layout_box.cc
        Line 1927, Patchset 29 (Latest): transform_state.Flatten();
        Philip Rogers . unresolved

        Should we just return true above this, rather than doing any of this function?

        This test demonstrates the issue:
        ```
        TEST_P(VisualRectMappingTest, RegressionTest_SkipAncestorClipExpansion) {
        SetBodyInnerHTML(R"HTML(
        <style>
        body { margin: 0; }
        #grandparent {
        position: relative;
        left: 100px; top: 100px;
        }
        #parent {
        width: 100px; height: 100px;
        transform: rotate(45deg);
        overflow: hidden;
        }
        #child {
        width: 20px; height: 20px;
        background: green;
        transform: rotate(-45deg);
        }
        </style>
        <div id="grandparent">
        <div id="parent">
        <div id="child"></div>
        </div>
        </div>
        )HTML");
          auto* grandparent = GetLayoutObjectByElementId("grandparent");
        auto* child = GetLayoutObjectByElementId("child");
          UpdateAllLifecyclePhasesForTest();
          PhysicalRect local_rect(0, 0, 20, 20);
          // Slow path.
        PhysicalRect slow_result = local_rect;
        child->MapToVisualRectInAncestorSpace(To<LayoutBoxModelObject>(grandparent), slow_result, kSkipAncestorAndViewportClips);

        // Fast path (GeometryMapper).
        PhysicalRect fast_result = local_rect;
        child->MapToVisualRectInAncestorSpace(To<LayoutBoxModelObject>(grandparent), fast_result, static_cast<VisualRectFlags>(kSkipAncestorAndViewportClips | kUseGeometryMapper));
          EXPECT_NEAR(slow_result.Width().ToFloat(), 20.0f, 0.1f);
        EXPECT_NEAR(slow_result.Height().ToFloat(), 20.0f, 0.1f);
        EXPECT_NEAR(fast_result.Width().ToFloat(), 20.0f, 0.1f);
        EXPECT_NEAR(fast_result.Height().ToFloat(), 20.0f, 0.1f);
          EXPECT_EQ(slow_result, fast_result);
        }
        ```
        Open in Gerrit

        Related details

        Attention is currently required from:
        • Aaron Leventhal
        Gerrit-Attention: Aaron Leventhal <aleve...@google.com>
        Gerrit-Comment-Date: Wed, 17 Dec 2025 21:15:30 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Aaron Leventhal (Gerrit)

        unread,
        Dec 19, 2025, 9:55:15 AM (23 hours ago) Dec 19
        to Code Review Nudger, Andrew Verge, Philip Rogers, Khushal Sagar, Stephen Chenney, David Bokan, Dirk Schulze, AyeAye, AI Code Reviewer, Chromium LUCI CQ, chromium...@chromium.org, jmedle...@chromium.org, blink-reviews-p...@chromium.org, blink-revi...@chromium.org, drott+bl...@chromium.org, blink-revi...@chromium.org, fmalit...@chromium.org, kinuko...@chromium.org, zol...@webkit.org, fserb...@chromium.org, aleventh...@chromium.org, blink-...@chromium.org, mfoltz+wa...@chromium.org
        Attention needed from Khushal Sagar and Philip Rogers

        Aaron Leventhal added 4 comments

        File third_party/blink/renderer/core/frame/local_frame_view.h
        Line 738, Patchset 22: bool apply_overflow_clip = true,
        bool apply_viewport_transform = false,
        bool apply_viewport_clip = true);
        Khushal Sagar . resolved

        nit: This is getting into enum bitflags territory. :)

        Aaron Leventhal

        I put this part of the change in https://chromium-review.googlesource.com/c/chromium/src/+/7213198

        Note that it adds 35 lines of code. Not sure whether it's worth it.

        Aaron Leventhal

        Done

        File third_party/blink/renderer/core/layout/layout_box.cc
        Line 1927, Patchset 29: transform_state.Flatten();
        Philip Rogers . resolved
        Aaron Leventhal

        Done

        Line 1931, Patchset 22: does_intersect = true;
        Khushal Sagar . resolved

        I glanced through the call-sites to confirm this should be the return value. One of the comments says that this API returns true if no clipping was applied so this seems reasonable to me. But leaving a comment so a more familiar owner can validate.

        Aaron Leventhal

        Done. Looks like it was answered above essentially. Not only return true, but make this function a noop

        File third_party/blink/renderer/platform/runtime_enabled_features.json5
        Line 324, Patchset 29 (Parent): // Only supported for DCHECK-enabled builds.
        Aaron Leventhal . resolved

        As per the AI review agent, `AIPageContentBuildOnLoadForTesting` is also only enabled for DCHECK builds. This comment should probably be duplicated for `AIPageContentCheckGeometry` rather than moved.

        Aaron Leventhal

        Done

        Open in Gerrit

        Related details

        Attention is currently required from:
        • Khushal Sagar
        • Philip Rogers
        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: I9f5749db16585e490bcf84ca2e3a3a92d9830e6f
          Gerrit-Change-Number: 7158770
          Gerrit-PatchSet: 31
          Gerrit-Owner: Aaron Leventhal <aleve...@google.com>
          Gerrit-Reviewer: Aaron Leventhal <aleve...@google.com>
          Gerrit-Reviewer: Andrew Verge <ave...@chromium.org>
          Gerrit-Reviewer: Khushal Sagar <khusha...@chromium.org>
          Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
          Gerrit-CC: AI Code Reviewer <peep-gen...@system.gserviceaccount.com>
          Gerrit-CC: Code Review Nudger <android-build...@prod.google.com>
          Gerrit-CC: David Bokan <bo...@chromium.org>
          Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
          Gerrit-CC: Stephen Chenney <sche...@chromium.org>
          Gerrit-Attention: Khushal Sagar <khusha...@chromium.org>
          Gerrit-Attention: Philip Rogers <p...@chromium.org>
          Gerrit-Comment-Date: Fri, 19 Dec 2025 14:55:09 +0000
          Gerrit-HasComments: Yes
          Gerrit-Has-Labels: No
          Comment-In-Reply-To: Aaron Leventhal <aleve...@google.com>
          satisfied_requirement
          unsatisfied_requirement
          open
          diffy
          Reply all
          Reply to author
          Forward
          0 new messages