From 082b69f50981171b70d1feae0ae4c59e42f56353 Mon Sep 17 00:00:00 2001 From: KoalaDev <6156589+Shik3i@users.noreply.github.com> Date: Mon, 17 Aug 2026 16:49:53 +0200 Subject: [PATCH] fix(extension): support cross-origin media frames --- .github/workflows/release.yml | 14 +- docs/CHANGELOG.md | 21 + docs/ROADMAP.md | 19 +- docs/TESTED_SERVICES.md | 4 +- docs/devops.md | 1 + extension/background.js | 784 +++++++++++++++--- extension/content.js | 358 +++++--- extension/manifest.base.json | 3 +- extension/media-frame-monitor.js | 196 +++++ extension/media-frame-target.js | 536 ++++++++++++ extension/media-frame-target.test.mjs | 483 +++++++++++ extension/modules/tab-manager.js | 5 +- extension/popup.js | 4 +- extension/target-tab-lifecycle.test.mjs | 40 +- scripts/test-content-video-finder.cjs | 98 ++- tests/e2e/extension.spec.mjs | 313 ++++++- tests/e2e/fixture-server.mjs | 7 + .../cross-origin-internal-switching.html | 32 + .../e2e/fixtures/pages/cross-origin-late.html | 10 + .../fixtures/pages/cross-origin-nested.html | 18 + .../pages/cross-origin-reloading.html | 13 + .../pages/cross-origin-switching.html | 38 + .../pages/deep-hidden-cross-origin.html | 10 + .../pages/frames/cross-origin-wrapper.html | 9 + .../fixtures/pages/frames/deep-wrapper-1.html | 5 + .../fixtures/pages/frames/deep-wrapper-2.html | 9 + .../pages/frames/late-player-frame.html | 15 + .../pages/frames/wrapper-switch-player.html | 30 + .../pages/hidden-redirect-cross-origin.html | 10 + .../fixtures/pages/hidden-same-origin.html | 14 + .../e2e/fixtures/pages/player-css-switch.html | 22 + 31 files changed, 2858 insertions(+), 263 deletions(-) create mode 100644 extension/media-frame-monitor.js create mode 100644 extension/media-frame-target.js create mode 100644 extension/media-frame-target.test.mjs create mode 100644 tests/e2e/fixtures/pages/cross-origin-internal-switching.html create mode 100644 tests/e2e/fixtures/pages/cross-origin-late.html create mode 100644 tests/e2e/fixtures/pages/cross-origin-nested.html create mode 100644 tests/e2e/fixtures/pages/cross-origin-reloading.html create mode 100644 tests/e2e/fixtures/pages/cross-origin-switching.html create mode 100644 tests/e2e/fixtures/pages/deep-hidden-cross-origin.html create mode 100644 tests/e2e/fixtures/pages/frames/cross-origin-wrapper.html create mode 100644 tests/e2e/fixtures/pages/frames/deep-wrapper-1.html create mode 100644 tests/e2e/fixtures/pages/frames/deep-wrapper-2.html create mode 100644 tests/e2e/fixtures/pages/frames/late-player-frame.html create mode 100644 tests/e2e/fixtures/pages/frames/wrapper-switch-player.html create mode 100644 tests/e2e/fixtures/pages/hidden-redirect-cross-origin.html create mode 100644 tests/e2e/fixtures/pages/hidden-same-origin.html create mode 100644 tests/e2e/fixtures/pages/player-css-switch.html diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bda4da8..b7014be 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -103,19 +103,23 @@ jobs: jq --arg v "$VERSION" '.version = $v' package.json > tmp.json && mv tmp.json package.json echo " ✓ package.json -> $VERSION" - # 4. website/version.json + # 4. package-lock.json root package metadata + jq --arg v "$VERSION" '.version = $v | .packages[""].version = $v' package-lock.json > tmp.json && mv tmp.json package-lock.json + echo " ✓ package-lock.json -> $VERSION" + + # 5. website/version.json jq -n --arg v "$VERSION" --arg d "$DATE" '{version: $v, date: $d}' > website/version.json echo " ✓ website/version.json -> version $VERSION, date $DATE" - # 5. website/template.html — SoftwareApplication schema + # 6. website/template.html — SoftwareApplication schema sed -i "s/\"softwareVersion\": \".*\"/\"softwareVersion\": \"$VERSION\"/" website/template.html echo " ✓ website/template.html -> softwareVersion $VERSION" - # 6. website/llms.txt — machine-readable release metadata + # 7. website/llms.txt — machine-readable release metadata sed -i "s/Current website release: .*/Current website release: $VERSION/" website/llms.txt echo " ✓ website/llms.txt -> $VERSION" - # 7. README.md — version badge & banner + # 8. README.md — version badge & banner sed -i "s|Release-v[0-9]\+\.[0-9]\+\.[0-9]\+-blue|Release-v$VERSION-blue|g" README.md sed -i "s/New v[0-9]\+\.[0-9]\+\.[0-9]\+ Release/New v$VERSION Release/g" README.md echo " ✓ README.md -> v$VERSION" @@ -126,7 +130,7 @@ jobs: run: | git config --local user.email "action@github.com" git config --local user.name "GitHub Action" - git add extension/manifest.base.json shared/constants.js package.json website/version.json website/template.html website/llms.txt README.md + git add extension/manifest.base.json shared/constants.js package.json package-lock.json website/version.json website/template.html website/llms.txt README.md git commit -m "chore(release): update versions to $GITHUB_REF_NAME [skip ci]" || echo "No changes to commit" git push origin HEAD:main env: diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 3be5676..b7672bc 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -4,6 +4,27 @@ All notable changes to the KoalaSync browser extension and relay server. --- +## [v3.1.2] — 2026-08-17 + +This release adds generic control for HTML5 players inside cross-origin frames. +It restores the intended Google Drive support, whose earlier workaround was +developed on a separate branch but never merged into `main`, and covers nested +external players such as YummyAnime without a site-specific host list. + +### Added +- **Extension: Cross-origin player targeting** — Probes every accessible frame, elects the visible real player from video readiness, source, rendering, playback, controls, size and background-video signals, then injects and routes playback, force sync, heartbeat, chat and audio processing to that exact frame and document. +- **Extension: Embedded-player recovery** — Re-elects the target when a player frame becomes hidden, loses its video, reloads or is replaced by another frame. Equally ranked frames without visibility evidence are rejected instead of controlling an arbitrary preload or ad. +- **Testing: Cross-origin lifecycle E2E coverage** — Drives the packed Chromium extension through ordered play, pause and seek in a two-level external player; verifies hidden duplicate rejection, CSS visibility switches without a remote-command trigger, selected-frame document reloads and videos inserted late inside child frames. + +### Fixed +- **Extension: Google Drive playback** — Detects Drive's current visible `youtube.googleapis.com/embed` player and keeps Drive's top-page title, URL and platform identity in debug output while controlling the embedded video. +- **Extension: External anime players** — Supports same-origin wrappers whose real player is hosted on a different origin, including the current YummyAnime structure with a visible external player and hidden duplicate frames. +- **Extension: Frame-specific message routing** — Sends remote commands, state reads, audio settings, host-control feedback, episode-lobby events and teardown only to the selected frame/document instead of assuming the top frame. +- **Extension: Force Sync in embedded players** — Reads the current time through the background's selected-frame route, so Jump to Me no longer queries only the top document. + +### Changed +- **Extension: Debug frame context** — Reports the selected frame ID and origin while preserving the selected tab's top-level URL and title. Google Drive is identified as Google Drive instead of the embedded YouTube API host. + ## [v3.1.1] — 2026-08-15 A single fix: the popup could get stuck at double width for the rest of a diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index db8c1f8..e052443 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -49,14 +49,6 @@ *Ideas and feature requests under evaluation.* -### Cross-origin frame video detection and control - -- **Priority:** P3 -- **Category:** Compatibility / Embedded Players -- **Background:** KoalaSync injects on demand into the selected tab's top frame. Since the same-origin frame walk shipped, the top-frame script also reaches players inside first-party iframes (`jkanime.net`-style `/jkplayer/` frames, `srcdoc` and `about:blank` frames that inherit the parent origin). What remains uncovered is the real `