Repository navigation
fix(playback): input guards, media-time replays, auto-pause, loop rebinding, hover-pause ownership, timeline (#108 #111 #121 #127 #128 #129 #130 #131 #137 #142 #150 #151 #152 #155) - #166
Merged
Conversation
…, plaintext-only editors and links (#111, #127, #128, #137) - #111: keyboard shortcuts and mouse bindings do nothing while the extension is disabled, so the site gets its keys and buttons back. - #127: toggle shortcuts (D, B, T, R, L, \, H) act once per press and ignore OS auto-repeat; the speed steps (, and .) keep repeating. - #128: editable targets use isContentEditable / the contenteditable inheritance rules (plaintext-only included) and the composed path, so typing in any editor, even inside a shadow root, is never intercepted. - #137: an assigned middle/side-button action leaves links, dialogs and menus layered over the player to the browser. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ons (#108, #129, #130, #131, #142) - #108: slow replay ends in media time (watchMediaWindow) and restores the current speed setting, not the one captured at start; a newer slow replay, a speed change, a new video or disabling the extension cancels it, so an old timer can no longer override a newer speed or cut a later replay short. - #129: replay pauses only when playback runs through the cue end; a seek forward past it (or backward) hands the video back without pausing the new scene. Any explicit seek (transcript, timeline, history) cancels it. - #130: when captions change, an active loop follows the same line (same id and text, e.g. a delay resync) or ends; it never keeps seeking to a window from the old captions. - #131: auto-pause also pauses when sparse time updates skip the 250 ms window, as long as normal playback crossed the cue end; seeks never pause, and resuming does not pause at the same line again. - #142: the hover pause is dropped once playback starts by any other means, so leaving the subtitles never resumes a newer manual pause; it is also reset when the video element is replaced. Disabling the extension stops replays and loops it started (#111). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…es, click relative to the bar (#150, #151, #152) - #151: the timeline indexes the track once and finds visible cues with a binary search; a frame whose time and width are unchanged (paused video) does no work and publishes no state. - #152: visibility is interval overlap (end > from && start < to), so a cue spanning the whole window shows; markers are clipped to the window. - #150: a click maps clientX through the timeline's own rectangle (clamped) instead of the clicked element's offsetX. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…active at a boundary (#121) getCurrentSubs (primary) and the secondary-track selection now use start <= t < end and ignore zero-length cues; genuine overlaps stay. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…f keeping both (#155) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Owner
Author
Hermes review failedHermes could not produce a code-review verdict for this head SHA. Engine: Safe summary: Local logs: |
This was referenced Oct 4, 2026
Owner
Author
|
/hermes review |
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.
Playback, input and timeline fixes from the 30 Sep / 2 Oct audits.
Fixes
Input
\, H) now act once per press and ignore OS auto-repeat. The speed steps (,and.) still repeat.plaintext-onlyeditors. The editable check now usesisContentEditableand the contenteditable inheritance rules (includingplaintext-only, and an explicitfalsestops it). It also follows the composed path into shadow roots.Replay / auto-pause
timeupdates skip the 250 ms window, as long as normal playback crossed the end. Seeks never pause, and resuming doesn't pause at the same line again.[start, end)intervals for both the primary and secondary tracks, so only the next cue is active at a shared boundary. Zero-length cues are never active; real overlaps still show together.timeupdatelistener. Exactly one listener now lives on the current video. A replaced element is detached and can no longer drive the clock.Timeline
end > from && start < to), so a spanning cue shows. Markers are clipped to the window.clientXthrough the timeline's own rectangle (clamped), not the clicked element'soffsetX.Visible changes
Only the subtitle timeline changes: a cue spanning the whole 30 s window now draws a full-width marker, and markers no longer extend past the bar's edges. I could not capture a screenshot, because the in-player timeline isn't rendered by the repo's fixture harness and needs a live player.
Verification
pnpm exec tsc --noEmit: clean.pnpm lint: 0 errors.pnpm test:unit(full stack): 48 files and 430 tests pass. New tests:inputTargets.test.ts,inputHandlers.test.ts: real handlers with DOM doubles.slowReplay.test.ts,replayVideoClip.test.ts: fake media clock.cuePlayback.test.ts,playbackWiring.test.ts: the real video/subtitle Effector graph.cueWindow.test.ts: randomized comparison against a full scan, overlap policy, click geometry.getCurrentSubs.test.ts,videoClock.test.ts.pnpm build+pnpm test(Chromium regressions): all PASS, 0 runtime errors. A new browser check covers [P2] Leaving subtitles resumes playback after a newer manual pause #142: hover pauses, leaving resumes, and a manual play+pause made over the line survives leaving it. I confirmed that this check fails without the fix.slow-replay,disabled-input, which assert the buggy behaviour). The disabled-input cases no longer reproduce. The slow-replay doubles have noaddEventListenerand can't drive the new media-time code;slowReplay.test.tsandplaybackWiring.test.tscover those scenarios instead.🤖 Generated with Claude Code