Repository navigation
Commit 215229b
authored
docs(adr): scroll clip authority — ownership is the parent edge (#2755)
* docs(adr): record scroll clip authority for iOS snapshot presentation
An interactive snapshot of a list dropped every row after a row holding
selectable text: a UITextView is a UIScrollView, XCTest publishes its
indicator inside the text, and the presentation attributed that indicator
to the surrounding list, so the list's visible band became one line of
text and everything below it was clipped (#2214, fixed by #2740).
The type-specific fix closed one instance. ADR 0026 records the rule that
keeps the class out: indicator ownership is a fact the producer reports,
the visible band stays host interpretation, and an inferred attribution
gets hint authority only — it cannot eject a node. Reshape and eject
become separate rule APIs, scroll capability becomes a matrix instead of
one boolean answered five different ways, and every ejection carries a
typed reason the differential can check.
Design contract: #2754.
* docs(adr): read scroll indicator ownership from the parent edge
Review found the first draft built eight contracts on top of a bug that a
parent-edge lookup removes. UIKit publishes an indicator inside its own
scroll view and projection preserves that edge, because every scroll host
is regular-eligible in both languages; the ancestor walk past the parent is
what misattributed the text view's indicator in the first place. Reading the
parent instead retires the proposed IosRunnerPresentation field, its
capture-local indexing and remapping, the ownership capability matrix, and
the two-tree split.
Also corrects the band's premise: the pinned Settings tree has the
CollectionView frame at 0-874 with an indicator track at 116-812, so the
frame spans the bars and safe area rather than reporting a content extent.
Drops the two-API reshape/eject split, which does not hold against ~23
suppression sites across ten rules, and against a reshape surface that still
accepts rect. Keeps the decision: ownership is read, ejection needs
evidence, every removal carries a disposition.
Measured while revising: the full unit suite passes with parent-edge
ownership, and a synthetic WebView row keeps rows that main drops.
* docs(adr): name scrollarea as the iOS-scoped exception
Review asked the eligibility claim be scoped, since isScrollableSnapshotType
also accepts scrollarea and neither eligible set contains it. Verified the
scope is real rather than hypothetical: macOS desktop capture reaches these
rules through snapshot-desktop-surface -> ios-snapshot-runtime ->
publishIosSnapshot, and its helper emits ScrollArea from AXScrollArea while
the iOS runner never does. So "every scroll host is regular-eligible" is
written as an iOS claim, with a ScrollArea decision owed on that surface
before the parent-edge rule is reused there.
Also names the divergence left vague before: only tree.ts accepts scrollarea.
Counts made exact while there: 23 suppression sites across ten rules, and
scroll and noise-overlay already patch rects while ejecting.
* docs(adr): scope visibility ejection and name the real rect-rewriting pair
The removal row read as if every ejection needed a clip-fold result or a
parent-edge owner. Nineteen of the 23 sites delegate semantics or drop
decoration and keep their own authority, so the row and the paragraph now
name the four visibility-driven sites the ADR actually governs, plus the
clip fold's inclusion decision, and a second row states that compaction is
out of scope.
Corrects the rect-rewriting pair: transitions rewrites a field's rect and
ejects the title and image in one pass, while noise-overlay patches rects
in a presentation function that receives replacements only and ejects from
a separate suppression function. That module already has the split the
rejected API proposed, so it is cited as the precedent instead.
Names why the runtime guard was rejected: a threshold either fires on
ordinary compaction or is loose enough to pass a 74 to 20 collapse. Cites
#1797 for the fold's leak class with #1784 adjacent instead of claiming one
class, drops the drafting narrative from the refuted field, records the
unpinned self branch, and notes the table's own self case.1 parent b566eb4 commit 215229b
2 files changed
Lines changed: 115 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
| 30 | + | |
30 | 31 | | |
31 | 32 | | |
32 | 33 | | |
| |||
0 commit comments