feat(wasm): YouTube embed search + thumbnail grid - #149
Conversation
…minimize The WASM Video Embed app shipped as a stub (text input → iframe). This wires it up: typed queries hit Invidious for real search results, the app renders a paged 3x2 thumbnail grid in the canvas, and clicking a thumbnail loads the youtube-nocookie embed in an iframe glued to the window's content rect. - New `WasmYoutubeSearchFetcher` (oasis-backend-wasm/src/youtube.rs): async Invidious client with per-instance timeout race so a dead instance can't stall the whole search; thumbnails are loaded via crossOrigin `<img>` into offscreen canvases registered as textures. - VFS IPC protocol on `/tmp/video_embed_request`: `search:<q>`, `play:<id>`, `stop`. Backend publishes a JSON result blob to `/tmp/video_embed_results`; app reads it back via `App::refresh`. - WASM tick loop now drives `refresh_video_embed` (matching the existing `refresh_radio` pattern) so the app picks up backend-published results. - Generic `TextInput`/`Backspace` events now route to any focused `AppRunner`, fixing the keyboard-doesn't-register issue for typed-input apps launched from the dashboard. - Per-window draw callback positions the iframe at the Video Embed window's content rect each frame, so drag/resize tracks correctly. - Pre-draw guard hides the iframe when the window is minimized; uses a new `IframeOverlay::soft_hide` (display: none, src preserved) so the YouTube player keeps its playhead/state and resumes on restore. - WindowClosed for `video_embed` clears `youtube_active_id` and frees thumbnail textures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Openrouter AI General ReviewIssues (if any)
Previous Issues (for incremental reviews)(none) Suggestions (if any)
Notes
Generated by Openrouter AI (qwen/qwen3.6-plus). Supplementary to human reviews. |
Claude AI Security & Correctness ReviewIssues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Claude AI Incremental Architecture & Quality ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Automated fix by Claude in response to AI review feedback. Iteration: 1/5 Co-Authored-By: AI Review Agent <noreply@anthropic.com>
Review Response Agent (Iteration 1)Status: Changes committed, pushing... Commit: Fixed Issues
Ignored Issues
Deferred to Human
Notes
Automated summary of agent fixes. |
Claude AI Incremental Architecture & Quality ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Claude AI Incremental Security & Correctness ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none new) Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Openrouter AI Incremental General ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Openrouter AI (qwen/qwen3.6-plus). Supplementary to human reviews. |
Automated fix by Claude in response to AI review feedback. Iteration: 2/5 Co-Authored-By: AI Review Agent <noreply@anthropic.com>
Review Response Agent (Iteration 2)Status: Changes committed, pushing... Commit: Fixed Issues
Ignored Issues
Deferred to Human
Notes
Automated summary of agent fixes. |
Claude AI Incremental Architecture & Quality ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Claude AI Incremental Security & Correctness ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Openrouter AI Incremental General ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Openrouter AI (qwen/qwen3.6-plus). Supplementary to human reviews. |
Automated fix by Claude in response to AI review feedback. Iteration: 3/5 Co-Authored-By: AI Review Agent <noreply@anthropic.com>
Review Response Agent (Iteration 3)Status: Changes committed, pushing... Commit: Fixed Issues
Ignored Issues
Deferred to Human
Notes
Automated summary of agent fixes. |
Openrouter AI Incremental General ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Openrouter AI (qwen/qwen3.6-plus). Supplementary to human reviews. |
Claude AI Incremental Architecture & Quality ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none new in the changed files) Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Claude AI Incremental Security & Correctness ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none new) Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Automated fix by Claude in response to AI review feedback. Iteration: 4/5 Co-Authored-By: AI Review Agent <noreply@anthropic.com>
Review Response Agent (Iteration 4)Status: Changes committed, pushing... Commit: Fixed Issues
Ignored Issues
Deferred to Human
Notes
Automated summary of agent fixes. |
Openrouter AI Incremental General ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none) Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Openrouter AI (qwen/qwen3.6-plus). Supplementary to human reviews. |
Claude AI Incremental Architecture & Quality ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none new) Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Claude AI Incremental Security & Correctness ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Automated fix by Claude in response to AI review feedback. Iteration: 5/5 Co-Authored-By: AI Review Agent <noreply@anthropic.com>
Review Response Agent (Iteration 5)Status: Changes committed, pushing... Commit: Fixed Issues
Ignored Issues
Deferred to Human
Notes
Automated summary of agent fixes. |
Claude AI Incremental Architecture & Quality ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none) Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Openrouter AI Incremental General ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Openrouter AI (qwen/qwen3.6-plus). Supplementary to human reviews. |
Claude AI Incremental Security & Correctness ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |



Summary
youtube-nocookieiframe glued to the window's content rect.WasmYoutubeSearchFetcherwith per-instance timeout race + crossOrigin<img>thumbnail loader that registers each thumb as a texture.search:<q>/play:<id>/stop; backend publishes a JSON result blob the app reads viaApp::refresh.TextInput/Backspaceevents were dropped for any non-browser, non-terminal app window.Test plan
cargo test -p oasis-core --features wasm-youtube --lib video_embed(18 passing, including new tests for IPC protocol, click hit-testing, grid navigation, paging, JSON refresh)cargo clippy -p oasis-backend-wasm --target wasm32-unknown-unknown -- -D warningscleancargo fmt --all -- --checkcleanGenerated with Claude Code