feat(mobile): deep links + system share + external browser (Phase 6a)#36
Merged
Merged
Conversation
…nk handler
- AndroidManifest: etherpad:// custom scheme + https /p/* with autoVerify.
- main.tsx wires App.addListener('appUrlOpen') → parsePadUrl → either
open in matching workspace's tab store or prompt to add the workspace.
- PadActionsOverlay (share + external-browser) renders on the active iframe.
Native permissions plugin (Android Kotlin, camera/mic delegation) lands
separately as Phase 6b once a real device is available to validate.
Adds two Playwright cases: - share + external-browser actions appear over the active pad - deep link to a known workspace opens the pad in that workspace main.tsx also exposes window.__test_handleUrl so Playwright can invoke the deep-link entry point without needing to fire a real appUrlOpen.
ⓘ You've reached your Qodo monthly free-tier limit. Reviews pause until next month — upgrade your plan to continue now, or link your paid account if you already have one. |
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.
Summary
Phase 6a of the mobile rollout (Phase 6 split, see plan
docs/superpowers/plans/2026-05-11-etherpad-mobile-phase6a-deeplinks-share-browser.md):iframe calls
@capacitor/share. Web fallback usesnavigator.sharewhen present.
a Chrome Custom Tab via
@capacitor/browser. Doubles as the user-drivenX-Frame-Options DENY escape hatch (auto-detection of DENY needs a
native hook on WebChromeClient — that's Phase 6b).
@capacitor/app'sappUrlOpenlistener parsesetherpad://...andhttps://*/p/...URLs using the shell's existingparsePadUrl. Matches by origin against persisted workspaces — opensthe pad on match, prompts
addWorkspace(withinitialServerUrl+initialPadNameindialogContext) on miss.etherpadcustom scheme/p/*withandroid:autoVerify="true".window.__test_handleUrlfor Playwright; theCapacitor
appUrlOpenevent itself is harder to fire from a browsertest, but the URL routing logic is what we actually want to verify.
Deferred to Phase 6b (needs hardware to validate)
PadWebviewPermissionsPlugin(Kotlin) that overridesWebChromeClient.onPermissionRequestand maps the WebView'sVIDEO_CAPTURE/AUDIO_CAPTUREto runtimeCAMERA/RECORD_AUDIO. Lands when a real Android device is available forep_webrtcsmoke testing.WKUIDelegate.requestMediaCapturePermissionFor) —same constraint, plus the iOS GA is a v2 milestone.
automatically rather than waiting for the manual "↗" tap. Requires
the same WebChromeClient hook.
Smoke tests
6 mobile Playwright cases now (added 2 in this PR):
Test plan
pnpm typecheckacross shell + desktop + mobilepnpm test(204 shell + 281 desktop + 6 mobile = 491 total)pnpm test:e2e(Playwright Electron, unchanged surface)🤖 Generated with Claude Code