Fix breadcrumb bridge keyboard-navigation defects: Enter-key binding, scroll-into-view, and #440 router-test coverage gap - #750
Merged
drmoisan merged 8 commits intoSep 3, 2026
Conversation
… keyboard-navigation defects Preparation-mode delivery for issue #737: research confirms Findings 1/2 (scroll-into-view, Enter key) are Efc-pipeline-only in BreadcrumbDocumentAssets.cs, while Finding 3 (discarded test assertions) is Qfc-pipeline-only, contradicting the issue's single-chain framing. Verifies the #440 ancestor-walk fix remains live on origin/main and documents no overlap with this fix's scope. Atomic plan cleared atomic-executor preflight after three rounds (test-count arithmetic, scope-verification gate exclusion, stray bootstrap-stub guard). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LTjXvNFHVh7Fo7kYGgWsx2
…ation-defects-737 before atomic execution
…440 router-test assertion fix Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LTjXvNFHVh7Fo7kYGgWsx2
…ion evidence Housekeeping commit reconciling the plan checklist state that necessarily post-dates the P5-T13 commit it records (plan-checkoff fixpoint), plus the P5-T14 evidence artifact written after that commit. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LTjXvNFHVh7Fo7kYGgWsx2
Records the confirmed-empty filtered git status --porcelain after the P5-T13/P5-T14 check-off housekeeping commit, closing the plan-checkoff fixpoint gap. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LTjXvNFHVh7Fo7kYGgWsx2
…ation-defects-737 before feature review
…ifacts Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fix breadcrumb bridge keyboard-navigation defects: Enter-key binding, scroll-into-view, and #440 router-test coverage gap
Summary
Enterkey branch to the breadcrumb WebView2 bridge's inline JS keydown map, posting{ type: 'rowSelected', rowId: id }so keyboard-only users can commit a highlighted suggestion (Finding 2, source Bug: efc-enter-activates-valid-highlighted-suggestion #641).render/subfolderResultDOM update (Finding 1, source Bug: efc-keyboard-navigation-keeps-highlighted-row-visible #640).BreadcrumbDocumentAssets.BridgeJsconstant, following this repo's existing string-containment precedent for JS content with no headless-browser harness.FolderBreadcrumbBridgeRouterTests.Route_LeftArrow_NothingToCollapse_ReportsUnhandledLeft: the test previously discarded the results of its first two Arrange-phaseArrowAsynccalls; it now asserts each parses to aRenderMessage, preserving the Bug: breadcrumb-left-right-arrow-parent-child-navigation #440 ancestor-walk contract (two presses to reach root,UnhandledArrowMessageonly on the third) (Finding 3, source Bug: breadcrumb-router-test-cr1-defect-neutral #693).rowSelected/SelectRowinfrastructure.Why
A code-review sweep of the breadcrumb WebView2 keyboard-bridge path found three related gaps, grouped into one issue because all three touch the same keyboard-routing path from WebView2 through to
FolderBreadcrumbBridgeRouter: the inline JS keydown map was missing an Enter binding entirely, arrow-key navigation had no scroll-into-view feedback, and a router test masked a left-arrow collapse coverage gap by discarding two of its own Arrange-phase results. Findings 1 and 2 share a root cause: the inline JS keydown map inBreadcrumbDocumentAssets.cswas built out incrementally (arrow keys first) and was never extended with an Enter branch or scroll-into-view logic. Finding 3 is an unrelated test-coverage gap found during the same review pass. Full details are recorded indocs/features/active/2026-09-02-breadcrumb-bridge-keyboard-navigation-defects-737/issue.mdandspec.md.What Changed
Core feature (production):
UtilitiesCS/OutlookObjects/Folder/BreadcrumbDocumentAssets.cs— two additive insertions to theBridgeJsJS constant: (1) anEnterbranch in thekeydownlistener that looks up the.rowwrap.selectedelement and posts{ type: 'rowSelected', rowId: id }, mirroring the existing arrow-key handler's lookup pattern; (2) a scroll-into-view call (scrollTarget.scrollIntoView({ block: 'nearest' })) added to the inboundrender/subfolderResultmessage listener.Tests:
UtilitiesCS.Test/OutlookObjects/Folder/BreadcrumbHtmlRendererTests.cs— new[TestMethod]Issue737BridgeJsPostsRowSelectedOnEnterAndScrollsSelectedRowIntoView, asserting theBridgeJsconstant contains the Enter-key branch and the scroll-into-view call, following the existingIssue439...string-containment precedent.UtilitiesCS.Test/OutlookObjects/Folder/FolderBreadcrumbBridgeRouterTests.cs—Route_LeftArrow_NothingToCollapse_ReportsUnhandledLeftnow captures and asserts both previously-discardedArrowAsync(router, "left")Arrange-phase results asRenderMessage, in addition to the pre-existing third-pressUnhandledArrowMessageassertion. No helper method (ArrowAsync,PopulatedRouterAsync) or provider-mock factory was modified.Docs/evidence:
docs/features/active/2026-09-02-breadcrumb-bridge-keyboard-navigation-defects-737/— issue, spec, research, atomic plan, policy-audit, code-review, feature-audit, and full baseline/QA-gate evidence trail (Phase 0 through Phase 5).Architecture / How It Fits Together
The breadcrumb bridge is a WebView2-hosted inline-JS component (
BridgeJs, defined as a C# string constant inBreadcrumbDocumentAssets.cs) that posts messages to the host viawindow.chrome.webview.postMessage. The C# side (FolderBreadcrumbBridgeRouter) already recognizes and handlesrowSelectedmessages from the existing mouse-click path; the new Enter-key branch reuses that same message shape and C#-side handling, so no new message type, codec branch, or router case is required. The scroll-into-view addition is a pure client-side DOM operation inside the same inbound message listener that already re-renders the document onrender/subfolderResult; it has no C#-side counterpart. The router-test fix (FolderBreadcrumbBridgeRouterTests.cs) is test-only and does not touchQuickFiler/Controllers/BreadcrumbBridgeRouter.Arrows.cs(the #440 production logic) or any Qfc-pipeline file.Verification
Completed (see
docs/features/active/2026-09-02-breadcrumb-bridge-keyboard-navigation-defects-737/evidence/for full artifacts):-EnableNETAnalyzers -EnforceCodeStyleInBuild): exit 0.-TreatWarningsAsErrors): exit 0.FolderBreadcrumbBridgeRouterTests,FolderBreadcrumbBridgeRouterInFlightTests,BreadcrumbHtmlRendererTests): 41 total, 0 failed.Issue737BridgeJsPostsRowSelectedOnEnterAndScrollsSelectedRowIntoView(1 passed),Route_LeftArrow_NothingToCollapse_ReportsUnhandledLeft(1 passed), and the sibling Bug: breadcrumb-left-right-arrow-parent-child-navigation #440 regression testArrowAsync_QfcLeftOnMultiSegmentRow_RoutesParentSelectTransition(1 passed) to confirm consistency with the Bug: breadcrumb-left-right-arrow-parent-child-navigation #440 ancestor-walk contract.BreadcrumbDocumentAssets.cs) is const-string-only and contributes zero new coverable lines, so the coverage delta reflects no regression on changed lines.Recommended: CI re-run of the full C# toolchain against the merge commit, as with any other PR in this repository.
Backward Compatibility / Migration Notes
No breaking changes. No public API, message-wire-format, or router-contract change. No renamed or removed paths.
Risks and Mitigations
.rowwrap.selectedlookup androwSelectedpost shape the mouse-click path already uses; no new C#-side handling was introduced, so existingrowSelectedhandling coverage applies unchanged.if (scrollTarget)check; it is a no-op when.rowwrap.selecteddoes not resolve to an element.Review Guide
Suggested order:
UtilitiesCS/OutlookObjects/Folder/BreadcrumbDocumentAssets.cs— the two production JS insertions (Enter branch, scroll-into-view).UtilitiesCS.Test/OutlookObjects/Folder/BreadcrumbHtmlRendererTests.cs— the new string-containment test.UtilitiesCS.Test/OutlookObjects/Folder/FolderBreadcrumbBridgeRouterTests.cs— the router-test assertion fix.docs/features/active/2026-09-02-breadcrumb-bridge-keyboard-navigation-defects-737/— issue/spec/plan/evidence, for traceability only.No mechanical moves, renames, or large generated diffs are present; the change is small and self-contained.
Follow-ups
None. Issue #737 (all three consolidated findings) is fully resolved by this change.