From 85d4a0588a82b50c924989a08784cd8e6047b837 Mon Sep 17 00:00:00 2001 From: Josh Patra Date: Thu, 16 Jul 2026 01:31:57 -0400 Subject: [PATCH] fix(extension): harden controls, rules, and speed persistence --- extension/content/frame-speed-snapshot.js | 10 +- extension/content/inject.css | 18 + extension/content/inject.js | 2476 ++++++++++++++++---- extension/content/shadow-bridge.js | 49 + extension/manifest.json | 4 + extension/options/import-export.js | 228 +- extension/options/options.css | 19 + extension/options/options.html | 87 +- extension/options/options.js | 417 +++- extension/popup/popup.html | 1 + extension/popup/popup.js | 227 +- extension/shared/import-export.js | 88 +- extension/shared/key-bindings.js | 53 +- extension/shared/popup-controls.js | 18 +- extension/shared/settings-core.js | 691 +++++- extension/shared/site-rules.js | 255 +- tests/helpers/browser.js | 4 +- tests/helpers/extension-test-utils.js | 5 +- tests/importExport.integration.test.js | 69 +- tests/importExport.spec.js | 62 +- tests/inject-lifecycle.regression.test.js | 851 +++++++ tests/inject.spec.js | 69 + tests/options.integration.test.js | 64 +- tests/options.spec.js | 234 +- tests/popup.integration.test.js | 39 +- tests/popup.spec.js | 14 +- tests/settings-core.spec.js | 370 +++ tests/shared.test.js | 73 +- tests/speed-persistence.regression.test.js | 501 ++++ 29 files changed, 6154 insertions(+), 842 deletions(-) create mode 100644 extension/content/shadow-bridge.js create mode 100644 tests/inject-lifecycle.regression.test.js create mode 100644 tests/settings-core.spec.js create mode 100644 tests/speed-persistence.regression.test.js diff --git a/extension/content/frame-speed-snapshot.js b/extension/content/frame-speed-snapshot.js index af921cd..fe765e6 100644 --- a/extension/content/frame-speed-snapshot.js +++ b/extension/content/frame-speed-snapshot.js @@ -8,7 +8,15 @@ if (!v) return null; return { speed: v.playbackRate, - preferred: !v.paused + preferred: !v.paused, + forceLastSavedSpeed: Boolean( + typeof tc === "object" && tc.settings && tc.settings.forceLastSavedSpeed + ), + forceLastSavedSpeedControlledBySiteRule: Boolean( + typeof tc === "object" && + tc.activeSiteRule && + tc.activeSiteRule.forceLastSavedSpeed !== undefined + ) }; } catch (e) { return null; diff --git a/extension/content/inject.css b/extension/content/inject.css index fe76a0c..2acdfed 100644 --- a/extension/content/inject.css +++ b/extension/content/inject.css @@ -12,6 +12,24 @@ overflow: visible !important; } +/* Native media controls can fullscreen the replaced