Skip to content

Keep browser address edits and recover failed navigation - #101

Merged
ralyodio merged 3 commits into
mainfrom
fix/mobile-navigation-recovery
Sep 14, 2026
Merged

ralyodio merged 3 commits into
mainfrom
fix/mobile-navigation-recovery

Conversation

@phucnguyen1707

@phucnguyen1707 phucnguyen1707 commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Keep address edits intact across redirects and make submitting the current/source URL intentional.
  • Add manual recovery for main-frame errors, preserving the native view for normal navigation and remounting only for explicit error recovery. Reset stale history controls on recovery.
  • Include Stop while loading and a dismissible slow-load notice that never stops or covers an otherwise usable page automatically.
  • Guard known superseded callbacks without classifying already-completed pages as abandoned loads. Do not bypass certificate errors.
  • Fix a native Android error-overlay gap found during emulator QA: anchor the overlay to the actual content area and isolate the failed native page from touch/accessibility without hiding Retry or the toolbar. Retain the pending address when a native error omits its URL.
  • Retain a stopped URL in the bounded superseded set when another URL starts, so late finish/error/cancellation callbacks do not overwrite the new page's address, loading controls or error state.

Verification

  • 126 tests passed; one Android-only case is explicitly skipped in the iOS parameterization. All 32 new event-order tests were run before and after the Stop fix: 12 failed/20 passed before, 32 passed after. Full suite comparison: 114 passed/12 failed/1 skipped before, 126 passed/0 failed/1 skipped after.
  • Tests render the real screen with controlled native events; an additional test executes the pinned WebView library's actual error-handling hook.
  • Mobile typecheck, lint, and Android/iOS Hermes JS exports passed.
  • Exact diff reviewed by Claude Opus before push.
  • The original CI APK at earlier head da3ff4d passed 9 focused checks on an offline Android 11/API30 emulator: pixel coverage at density160/240, Retry/loading cycle, address edit and keyboard Back, tab isolation/restoration, and a compressed accessibility-tree check. The previously exposed 5px band was fully background. No APK/JS bundle substitution was used. These native checks predate the subsequent five-line Stop callback fix; that fix has component/JS-library tests, not a new native runtime claim.

Native Release Gate

This is the Expo companion app, not the native Chromium engine. The original updated APK from Mobile CI ran on an offline Android 11/API30 emulator and confirmed the overlay fix at two densities. No successful online navigation, real TalkBack traversal, native iOS or physical-device run is claimed by that test. Before release, verify editing during redirects, same-source submit, Back/Forward, network/TLS failure and manual retry on each native engine.

Recovery remount intentionally discards native history. Native callbacks have no request ID: stopping and immediately reopening the SAME URL may still receive an old callback indistinguishable from the new load. A late redirect target not recorded in the superseded set and events older than the bounded 16-URL history also remain limitations. The fix targets replacement by a DIFFERENT URL; it is not universal native request correlation.

No paid EAS build, production deployment or store submission was triggered.

@github-actions

Copy link
Copy Markdown

ThreatCrush Security Scan

51 finding(s)

MEDIUM: 32 | LOW: 19

Severity Rule Location
MEDIUM js-open-redirect apps/desktop/extensions/ai-sidebar/install-helper.js:156
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/media.js:34
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/media.js:57
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/newtab.js:237
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/newtab.js:266
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/newtab.js:336
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/options.js:305
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/sidepanel.js:77
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/sidepanel.js:165
MEDIUM sh-remote-script-execution apps/desktop/launcher/tronbrowser:122
MEDIUM sh-remote-script-execution apps/desktop/launcher/tronbrowser:432
MEDIUM js-unescaped-html-sink apps/extensions/public/store.js:77
MEDIUM js-unescaped-html-sink apps/extensions/public/store.js:227
MEDIUM js-unescaped-html-sink apps/extensions/public/store.js:569
MEDIUM js-unescaped-html-sink apps/web/public/app.js:29
MEDIUM js-unescaped-html-sink apps/web/public/dns.js:54
MEDIUM sh-remote-script-execution apps/web/public/install.sh:161
MEDIUM sh-remote-script-execution apps/web/public/install.sh:166
MEDIUM sh-remote-script-execution apps/web/public/install.sh:279
MEDIUM sh-remote-script-execution apps/web/public/install.sh:297
MEDIUM sh-remote-script-execution apps/web/public/install.sh:704
MEDIUM sh-remote-script-execution apps/web/public/install.sh:985
MEDIUM js-unescaped-html-sink apps/web/public/settings.js:96
MEDIUM js-unescaped-html-sink apps/web/public/settings.js:168
MEDIUM js-dynamic-code-execution packages/sdk/src/mcp/tools.ts:80
MEDIUM js-dynamic-code-execution packages/sdk/src/mcp/tools.ts:92
MEDIUM js-dynamic-code-execution packages/sdk/src/mcp/tools.ts:103
MEDIUM js-dynamic-code-execution packages/sdk/src/page.ts:65
MEDIUM js-dynamic-code-execution packages/sdk/src/page.ts:70
MEDIUM sql-template-interpolation services/api/src/store/db.ts:116
MEDIUM js-dynamic-code-execution services/api/src/store/scanner.ts:44
MEDIUM sh-predictable-temp-path start.sh:25
LOW js-dynamic-code-execution packages/agent-runtime/src/analyze/form-script.test.ts:6
LOW js-unescaped-html-sink packages/agent-runtime/src/analyze/form-script.test.ts:26
LOW js-unescaped-html-sink packages/agent-runtime/src/analyze/form-script.test.ts:49
LOW js-dynamic-code-execution packages/browser-core/src/automation/extract-script.test.ts:6
LOW js-unescaped-html-sink packages/browser-core/src/automation/extract-script.test.ts:35
LOW js-unescaped-html-sink packages/browser-core/src/automation/extract-script.test.ts:47
LOW js-unescaped-html-sink packages/browser-core/src/automation/extract-script.test.ts:70
LOW js-unescaped-html-sink packages/browser-core/src/automation/extract-script.test.ts:89
LOW js-dynamic-code-execution packages/browser-core/src/automation/snapshot-script.test.ts:11
LOW js-unescaped-html-sink packages/browser-core/src/automation/snapshot-script.test.ts:24
LOW js-unescaped-html-sink packages/browser-core/src/automation/snapshot-script.test.ts:63
LOW js-unescaped-html-sink packages/provenance/src/scan.test.ts:47
LOW js-unescaped-html-sink packages/provenance/src/scan.test.ts:170
LOW js-unescaped-html-sink packages/provenance/src/scan.test.ts:216
LOW js-dynamic-code-execution packages/sdk/src/mcp/automate.test.ts:258
LOW secret-generic-api-key packages/storage/src/config.ts:51
LOW secret-generic-credential packages/storage/src/config.ts:51
LOW js-dynamic-code-execution services/api/src/store/scanner.test.ts:32

…and 1 more. Full results in the Security tab.

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio marked this pull request as ready for review September 14, 2026 17:13
@ralyodio
ralyodio merged commit 2a2d149 into main Sep 14, 2026
10 checks passed
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