Skip to content

QA pass on v1.0.0-rc1: popup width, block-inspector default, Safari shortcut, dead CSS, status docs - #76

Merged
jakemgold merged 5 commits into
WordPress:mainfrom
itzmekhokan:fix/qa-v1.0.0-rc1-fixes
Aug 2, 2026
Merged

QA pass on v1.0.0-rc1: popup width, block-inspector default, Safari shortcut, dead CSS, status docs#76
jakemgold merged 5 commits into
WordPress:mainfrom
itzmekhokan:fix/qa-v1.0.0-rc1-fixes

Conversation

@itzmekhokan

Copy link
Copy Markdown
Contributor

Summary

A QA revalidation pass over the v1.0.0-rc1 release candidate, run against both Chrome and Safari. This PR carries the issues that pass turned up, plus the cleanup that came out of it.

None of these are regressions from rc1 — they are pre-existing, and none of them break the extension. They are the kind of thing worth clearing before the 1.0 final rather than after.

There are no tracker issues for these, so they are numbered locally and referenced by that number below.

# Issue Area Impact
1 Empty-state views did not span the popup width Popup / CSS Cosmetic, dark mode only
2 Block inspector ignored the options-page default Content script Popup and page disagreed
3 Edit shortcut showed Windows notation on macOS Safari Popup / Safari Cosmetic, Safari only
4 Three unused CSS rules Popup / CSS Dead code
5 Status copy still described v0.10.x Docs Front-page accuracy

1. Empty-state views did not span the popup width

EmptyState.Root from @wordpress/ui carries max-width: 320px, narrower than the 380px popup. .wpd-empty centres itself with margin: 0 auto and paints --wpd-surface, so the 30px left over on each side showed --wpd-bg through as a band. It affected "Not a WordPress site" and "Nothing to inspect here" — the only two views that were not full-bleed.

Invisible in light mode, where both tokens resolve to #fff. Visible in dark, where they are #121315 against #1c1f22.

Measured in the real popup, before → after:

body 380px | empty 320px | gutter 30px | max-width 320px
body 380px | empty 380px | gutter  0px | max-width none

2. Block inspector ignored the options-page default

loadBlockInspectorPref read only wp_preferences_v1[origin], so a value set in the _global namespace never reached the page. loadAdminBarPref, directly above it, already implements the documented precedence — per-origin choice first, then the options-page default.

The popup's usePrefs merges _global for every key, so the two disagreed: the Highlight Blocks toggle would read on while the page never outlined anything.

Verified by setting only _global.blockInspectorEnabled and loading a page with blocks:

before:  inspector style absent, 0 blocks tagged
after:   inspector style present, 3 blocks tagged

3. Edit shortcut showed Windows notation on macOS Safari

commands.getAll() returns the binding already formatted for the platform on Chrome, but Safari returns the raw Alt+Shift+E spelling on macOS, so the popup showed a Windows-style shortcut on a Mac.

This normalises what the API returns rather than falling back to the static suggested-key hint, so a binding the user customised is still shown, just in the notation macOS uses. Splitting on + instead of substring-replacing avoids mangling MacCtrl into Mac^, and leaves an already-glyphed value untouched, since it has no + to split on:

"Alt+Shift+E"      ->  "⌥⇧E"     (Safari — the bug)
"⌥⇧E"              ->  "⌥⇧E"     (Chrome — unchanged)
"MacCtrl+Shift+E"  ->  "⌃⇧E"
"Command+Shift+K"  ->  "⌘⇧K"

4. Three unused CSS rules

.wpd-section__label, .wpd-siteinfo__row-tag (and its dark-mode contrast override), and the .wpd-info-row block are not rendered by any component. Verified against every JS, HTML and SCSS file in the tree, and by rendering all eight popup states and counting live elements — zero matches for each.

.wpd-info-row__link stays: it is still rendered, though only inside .wpd-toggle-hint, so its BEM block no longer exists. Renaming it is a refactor rather than a removal, so it is left alone here.

5. Status copy still described v0.10.x

README's Status section described v0.10.x as current and the v0.11.x store-readiness phase in the future tense, on the front page of a repo whose manifest and package version both read 1.0.0 and whose latest tag is v1.0.0-rc1.

ROADMAP carried the same drift: v0.11.x sat at "shipping" after v0.11.2 went out, and v1.0 was still gated on both store-readiness phases when only the Safari one remains.


Testing

npm run lint clean (0 problems) · npm test 282 assertions, 0 failures · production build byte-reproducible · Safari Resources/ mirrored via npm run build:safari, zero drift · npm run package:chrome integrity gate passes (22 files).

Chrome — loaded unpacked and driven over the DevTools Protocol on a throwaway profile:

  • Extension registers with no errors; service worker runs clean
  • Detection and per-origin cache correct on WordPress and non-WordPress sites; host detection correct
  • Toolbar title correct across states; My Sites auto-add works
  • Zero console errors in both page and service-worker contexts
  • All three behavioural fixes verified, Switch the build process to @wordpress/scripts #1 and Add user account menu with avatar dropdown #2 A/B tested against the pre-fix code
  • All eight popup states render; zero live elements use the removed CSS classes

Safari — Xcode project rebuilds (BUILD SUCCEEDED), all 16 shipping files byte-identical in the built .appex, and all three fixes confirmed present in the bundle. Behavioural checks against the running extension — admin-bar hide, wp-admin exclusion, per-origin pref isolation, and early.js beating first paint — all pass.

A rule-level diff of the compiled dist/popup.css confirms the stylesheet changed in exactly the intended ways: four rules removed, .wpd-empty gaining only max-width: none, and nothing else.

background.js is untouched by this branch.

EmptyState.Root from @wordpress/ui carries max-width: 320px, narrower than
the 380px popup. .wpd-empty centres itself with margin: 0 auto and paints
--wpd-surface, so the 30px left over on each side showed --wpd-bg through as
a band on "Not a WordPress site" and "Nothing to inspect here" — the only two
views that were not full-bleed.

Invisible in light mode, where both tokens resolve to #fff, and visible in
dark, where they are #121315 against #1c1f22.
loadBlockInspectorPref read only wp_preferences_v1[origin], so a value set in
the _global namespace never reached the page. loadAdminBarPref, directly
above it, already implements the documented precedence — per-origin choice
first, then the options-page default — and this brings the block inspector
in line with it.

The popup's usePrefs merges _global for every key, so the two disagreed:
its Highlight Blocks toggle would read on while the page never outlined
anything.
commands.getAll() returns the binding already formatted for the platform on
Chrome, but Safari returns the raw "Alt+Shift+E" spelling on macOS, so the
popup showed a Windows-style shortcut on a Mac.

Normalise the value the API returns rather than falling back to the static
suggested-key hint, so a binding the user customised is still shown, just in
the notation macOS uses. Splitting on "+" instead of substring-replacing
avoids mangling "MacCtrl" into "Mac^", and leaves a value that is already
glyphs untouched, since it has no "+" to split on.

IS_MAC moves to module scope: it is constant for the life of the popup
process, and reading it inside the effect would otherwise make it a
dependency.
.wpd-section__label, .wpd-siteinfo__row-tag (and its dark-mode contrast
override), and the .wpd-info-row block are not rendered by any component.
Verified against every JS, HTML and SCSS file in the tree, and by rendering
all eight popup states and counting live elements — zero matches for each.

.wpd-info-row__link stays: it is still rendered, though only inside
.wpd-toggle-hint, so its BEM block no longer exists. Renaming it is a
refactor rather than a removal and is left alone here.
README's Status section still described v0.10.x as current and the v0.11.x
store-readiness phase in the future tense, on the front page of a repo whose
manifest and package version both read 1.0.0 and whose latest tag is
v1.0.0-rc1.

ROADMAP carried the same drift: v0.11.x sat at "shipping" after v0.11.2 went
out, and v1.0 was still gated on both store-readiness phases when only the
Safari one remains.

@jakemgold jakemgold left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed with a full local verification pass: clean rebuild reproduces both committed bundles byte for byte, Safari mirror has zero drift, 282 test assertions pass, and each of the five fixes was independently verified (including a hunt for dynamically composed uses of the removed CSS classes — none exist). The precedence fix correctly mirrors loadAdminBarPref including the explicit-false guard, and the glyph conversion is display-only and correct for the shipped binding. Exceptionally well-documented QA pass; the A/B verification notes made review straightforward. A small follow-up lands next with a regression test for the new precedence path and a ROADMAP touch-up for store states not visible outside the maintainer dashboards.

@jakemgold
jakemgold merged commit a2b5824 into WordPress:main Aug 2, 2026
1 check passed
jakemgold added a commit that referenced this pull request Aug 2, 2026
)

Lands the two follow-ups from the #76 review, plus one piece of
local-tooling hygiene.

## Regression test for the precedence fix

#76's change to `loadBlockInspectorPref` shipped with no coverage; the
review verified empirically that reintroducing the exact bug the new
guard prevents (explicit per-origin `false` falling through to a
`_global` `true`) passed the whole suite. New content-lifecycle block
[41] closes that: it stubs `WPDBlockInspector` on the harness context
and asserts all four precedence outcomes through the real content
script. The suite is now 286 assertions; the injected-regression check
fails as intended with the new block in place.

## ROADMAP accuracy

Store states an external contributor cannot see from the repo:

- v0.11.x status now reads "readiness complete; CWS submission approved,
publication pending" — the unlisted Chrome Web Store submission is
approved but has not been published, so "shipped" overstated it.
- The Safari row moves the App Store Connect record, listing assets, and
the submitted 1.0.0 build into Done, with App Review outcome as the
remaining gate; status is now "in review". The store-readiness checklist
ticks the bundle-identifier rename (#72) and the publisher account to
match.

## eslint ignore for build/

`build/` (gitignored since #75) holds the App Store archive and exported
installer. The archived `.app` contains copies of the shipped bundles,
so a local archive breaks `npm run lint` with ~175 errors on files that
are not lintable source. Added to the eslint ignores alongside
`safari-build/`.

No runtime changes; `dist/` untouched.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
jakemgold added a commit that referenced this pull request Aug 3, 2026
The Status section still named v1.0.0-rc1 (written in #76 before rc2
existed) and linked no release. Visitors and testers landing on the repo
front page had no direct path to the build they should actually test,
and the GitHub "Latest" badge compounds it by pointing at v0.11.2.

Now the section links the current candidate, tells testers to start
there, and explains the Latest badge in one sentence. The companion
change is already live outside the repo: the v0.11.2 release notes carry
a pointer to rc2 at the top, so both places a "latest release" seeker
can land now route forward.

Docs only; no runtime changes.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants