feat(dev): ask the phone instead of looking at it
The device tier could only take a screenshot and read what Go chose to log, and a screenshot cannot tell a dropped CSS declaration from a missing asset. This adds the third thing: the page's own answer, from the engine that is really rendering it. `make android-screenshot` grabs the screen, `make android-inspect` forwards the WebView's devtools socket, and `make android-eval EXPR=...` evaluates in the real page. Four details are load-bearing. Only a `debuggable` build opens that socket, so the debug build type takes `applicationIdSuffix ".dev"` and installs *beside* the release app -- the two carry different signing certificates, and Android's only remedy for a changed certificate is an uninstall, which takes the user's library with it. Playwright cannot drive a WebView (`connectOverCDP` calls `Browser.setDownloadBehavior`, which it answers "Browser context management is not supported"), so the eval is raw CDP over Node's built-in WebSocket. The socket name carries the pid, so it is resolved per launch rather than written down. And `exec-out`, not `shell`, for the screenshot: a pty translates LF and corrupts the PNG. What it immediately established is why it was worth having. The phone renders in Chrome 113 at 424x439 CSS px -- two years behind every browser the other tiers use, with no Popover API and no relaxed CSS nesting -- so a spec passing at that viewport says nothing about the device, and two conclusions drawn from version numbers alone were wrong. Both are corrected in NOTES.md and the plan.
This commit is contained in:
@@ -1998,14 +1998,29 @@ still not carried and its `includes:` entry is still dropped.
|
||||
**Its `MainActivity` owns the safe area, because `targetSdk 35` does
|
||||
not leave that to the theme.** Android 15 lays every app out
|
||||
edge-to-edge and ignores the `statusBarColor`/`navigationBarColor` the
|
||||
scaffold's theme sets, and the WebView is `match_parent` — so the page's
|
||||
bottom band, which on a phone is the transport *and* the tab bar, was
|
||||
scaffold's theme sets, and the WebView is `match_parent`, so the page's
|
||||
bottom band — the transport and, on a phone, the tab bar — would be
|
||||
drawn under the gesture bar. `applyWindowInsets()` pads the container by
|
||||
`systemBars | displayCutout | ime` and returns the insets rather than
|
||||
consuming them; the window background is black to match the app's own
|
||||
ramp, since that padding is what shows through. **No browser tier can
|
||||
see this class of fault** — a viewport has no system bars, so the phone
|
||||
specs render a shell that fits at the moment the device is clipping it.
|
||||
ramp, since that padding is what shows through. It is **pre-emptive**:
|
||||
the phone this was checked against is Android 14, where the system still
|
||||
insets the window, and the enforcement applies to an app *running on*
|
||||
15. No browser tier can see this class of fault either way — a viewport
|
||||
has no system bars.
|
||||
|
||||
**And a device is an engine, not just a screen.** The phone this app was
|
||||
first run on renders in **Chrome 113** — two years behind every browser
|
||||
any other tier uses — at a 424x439 CSS px viewport. It has `:has()`,
|
||||
`color-mix()` and `dialog.showModal()`; it does **not** have relaxed CSS
|
||||
nesting (Chrome 120, so a nested rule beginning with a bare element
|
||||
selector is silently dropped), the Popover API (114, which Web Awesome's
|
||||
popups set `popover="manual"` for), `light-dark()` or relative colour
|
||||
syntax. So "it renders at that size in Chromium" is not evidence about
|
||||
the phone, and resizing a spec cannot recover the missing signal. `make
|
||||
android-inspect` forwards the WebView's devtools socket and `make
|
||||
android-eval` asks the real page — raw CDP, because `connectOverCDP`
|
||||
calls `Browser.setDownloadBehavior` and a WebView refuses it.
|
||||
|
||||
`build/config.yml`'s `version` is the
|
||||
*metadata* version and is not what the app reports — `main.version` is
|
||||
|
||||
Reference in New Issue
Block a user