SYMBOL INDEX (294 symbols across 50 files) FILE: scripts/build.mjs function copyStaticFiles (line 23) | async function copyStaticFiles() { function build (line 57) | async function build() { FILE: src/background.js function updateIcon (line 5) | async function updateIcon(enabled) { function initializeIcon (line 24) | async function initializeIcon() { function migrateConfig (line 39) | async function migrateConfig() { FILE: src/content/inject.js class VideoSpeedExtension (line 6) | class VideoSpeedExtension { method constructor (line 7) | constructor() { method initialize (line 19) | async initialize() { method initializeDocument (line 66) | initializeDocument(document) { method deferExpensiveOperations (line 91) | deferExpensiveOperations(document) { method deferredMediaScan (line 121) | deferredMediaScan(document) { method scheduleComprehensiveScan (line 157) | scheduleComprehensiveScan(document) { method applyDomainStyles (line 184) | applyDomainStyles(document) { method setupObservers (line 198) | setupObservers() { method onVideoFound (line 216) | onVideoFound(video, parent) { method onVideoRemoved (line 254) | onVideoRemoved(video) { method setupDocumentCSS (line 269) | setupDocumentCSS(document) { FILE: src/content/injection-bridge.js function injectScript (line 11) | async function injectScript(scriptPath) { function setupMessageBridge (line 31) | function setupMessageBridge() { FILE: src/content/injector-simplified.js function injectScript (line 11) | async function injectScript(scriptPath) { function setupMessageBridge (line 31) | function setupMessageBridge() { FILE: src/core/action-handler.js class ActionHandler (line 8) | class ActionHandler { method constructor (line 9) | constructor(config, eventManager) { method runAction (line 20) | runAction(action, value, e) { method executeAction (line 61) | executeAction(action, value, video, e) { method seek (line 187) | seek(video, seekSeconds) { method pause (line 196) | pause(video) { method resetSpeed (line 211) | resetSpeed(video, target) { method muted (line 247) | muted(video) { method volumeUp (line 256) | volumeUp(video, value) { method volumeDown (line 265) | volumeDown(video, value) { method setMark (line 273) | setMark(video) { method jumpToMark (line 282) | jumpToMark(video) { method blinkController (line 294) | blinkController(controller, duration) { method isAudioController (line 331) | isAudioController(controller) { method adjustSpeed (line 353) | adjustSpeed(video, value, options = {}) { method _adjustSpeedInternal (line 382) | _adjustSpeedInternal(video, value, options) { method getPreferredSpeed (line 429) | getPreferredSpeed(video) { method setSpeed (line 440) | setSpeed(video, speed, source = 'internal') { FILE: src/core/settings.js class VideoSpeedConfig (line 8) | class VideoSpeedConfig { method constructor (line 9) | constructor() { method load (line 20) | async load() { method save (line 66) | async save(newSettings = {}) { method getKeyBinding (line 113) | getKeyBinding(action, property = 'value') { method setKeyBinding (line 128) | setKeyBinding(action, value) { method ensureDisplayBinding (line 155) | ensureDisplayBinding() { FILE: src/core/state-manager.js class VSCStateManager (line 8) | class VSCStateManager { method constructor (line 9) | constructor() { method registerController (line 20) | registerController(controller) { method unregisterController (line 43) | unregisterController(controllerId) { method getAllMediaElements (line 54) | getAllMediaElements() { method getMediaByControllerId (line 76) | getMediaByControllerId(controllerId) { method getFirstMedia (line 85) | getFirstMedia() { method hasControllers (line 94) | hasControllers() { method removeController (line 102) | removeController(controllerId) { method getControlledElements (line 110) | getControlledElements() { FILE: src/core/storage-manager.js class StorageManager (line 9) | class StorageManager { method onError (line 16) | static onError(callback) { method get (line 25) | static async get(defaults = {}) { method set (line 67) | static async set(data) { method remove (line 111) | static async remove(keys) { method clear (line 144) | static async clear() { method onChanged (line 175) | static onChanged(callback) { FILE: src/core/video-controller.js class VideoController (line 8) | class VideoController { method constructor (line 9) | constructor(target, parent, config, actionHandler, shouldStartHidden =... method initializeSpeed (line 57) | initializeSpeed() { method getTargetSpeed (line 75) | getTargetSpeed(media = this.video) { method initializeControls (line 94) | initializeControls() { method insertIntoDOM (line 163) | insertIntoDOM(document, wrapper) { method setupEventHandlers (line 198) | setupEventHandlers() { method setupMutationObserver (line 223) | setupMutationObserver() { method remove (line 249) | remove() { method generateControllerId (line 287) | generateControllerId(target) { method isVideoVisible (line 306) | isVideoVisible() { method updateVisibility (line 331) | updateVisibility() { FILE: src/entries/content-entry.js function init (line 9) | async function init() { FILE: src/observers/media-observer.js class MediaElementObserver (line 7) | class MediaElementObserver { method constructor (line 8) | constructor(config, siteHandler) { method scanForMedia (line 18) | scanForMedia(document) { method scanForMediaLight (line 65) | scanForMediaLight(document) { method scanIframes (line 99) | scanIframes(document) { method scanSiteSpecificContainers (line 125) | scanSiteSpecificContainers(document) { method scanAll (line 150) | scanAll(document) { method isValidMediaElement (line 177) | isValidMediaElement(media) { method shouldStartHidden (line 206) | shouldStartHidden(media) { method findControllerParent (line 245) | findControllerParent(media) { FILE: src/observers/mutation-observer.js class VideoMutationObserver (line 7) | class VideoMutationObserver { method constructor (line 8) | constructor(config, onVideoFound, onVideoRemoved, mediaObserver) { method start (line 21) | start(document) { method processMutations (line 47) | processMutations(mutations) { method processChildListMutation (line 65) | processChildListMutation(mutation) { method processAttributeMutation (line 98) | processAttributeMutation(mutation) { method handleVisibilityChanges (line 133) | handleVisibilityChanges(element) { method recheckVideoElement (line 158) | recheckVideoElement(video) { method checkForVideoAndShadowRoot (line 189) | checkForVideoAndShadowRoot(node, parent, added) { method processNodeChildren (line 218) | processNodeChildren(node, parent, added) { method observeShadowRoot (line 243) | observeShadowRoot(shadowRoot) { method onDocumentReplaced (line 273) | onDocumentReplaced() { method stop (line 281) | stop() { FILE: src/site-handlers/amazon-handler.js class AmazonHandler (line 7) | class AmazonHandler extends window.VSC.BaseSiteHandler { method matches (line 12) | static matches() { method getControllerPosition (line 27) | getControllerPosition(parent, video) { method shouldIgnoreVideo (line 47) | shouldIgnoreVideo(video) { method getVideoContainerSelectors (line 62) | getVideoContainerSelectors() { FILE: src/site-handlers/apple-handler.js class AppleHandler (line 7) | class AppleHandler extends window.VSC.BaseSiteHandler { method matches (line 12) | static matches() { method getControllerPosition (line 22) | getControllerPosition(parent, _video) { method getVideoContainerSelectors (line 35) | getVideoContainerSelectors() { method detectSpecialVideos (line 44) | detectSpecialVideos(document) { FILE: src/site-handlers/base-handler.js class BaseSiteHandler (line 7) | class BaseSiteHandler { method constructor (line 8) | constructor() { method matches (line 16) | static matches() { method getControllerPosition (line 26) | getControllerPosition(parent, _video) { method handleSeek (line 40) | handleSeek(video, seekSeconds) { method initialize (line 56) | initialize(_document) { method cleanup (line 63) | cleanup() { method shouldIgnoreVideo (line 72) | shouldIgnoreVideo(_video) { method getVideoContainerSelectors (line 80) | getVideoContainerSelectors() { method detectSpecialVideos (line 89) | detectSpecialVideos(_document) { FILE: src/site-handlers/facebook-handler.js class FacebookHandler (line 7) | class FacebookHandler extends window.VSC.BaseSiteHandler { method matches (line 12) | static matches() { method getControllerPosition (line 22) | getControllerPosition(parent, _video) { method initialize (line 47) | initialize(document) { method setupFacebookObserver (line 59) | setupFacebookObserver(document) { method onNewVideosDetected (line 92) | onNewVideosDetected(videos) { method shouldIgnoreVideo (line 103) | shouldIgnoreVideo(video) { method getVideoContainerSelectors (line 116) | getVideoContainerSelectors() { method cleanup (line 123) | cleanup() { FILE: src/site-handlers/index.js class SiteHandlerManager (line 7) | class SiteHandlerManager { method constructor (line 8) | constructor() { method getCurrentHandler (line 23) | getCurrentHandler() { method detectHandler (line 35) | detectHandler() { method initialize (line 51) | initialize(document) { method getControllerPosition (line 62) | getControllerPosition(parent, video) { method handleSeek (line 73) | handleSeek(video, seekSeconds) { method shouldIgnoreVideo (line 83) | shouldIgnoreVideo(video) { method getVideoContainerSelectors (line 92) | getVideoContainerSelectors() { method detectSpecialVideos (line 102) | detectSpecialVideos(document) { method cleanup (line 110) | cleanup() { method refresh (line 120) | refresh() { FILE: src/site-handlers/netflix-handler.js class NetflixHandler (line 7) | class NetflixHandler extends window.VSC.BaseSiteHandler { method matches (line 12) | static matches() { method getControllerPosition (line 22) | getControllerPosition(parent, _video) { method handleSeek (line 37) | handleSeek(video, seekSeconds) { method initialize (line 62) | initialize(document) { method shouldIgnoreVideo (line 77) | shouldIgnoreVideo(video) { method getVideoContainerSelectors (line 89) | getVideoContainerSelectors() { FILE: src/site-handlers/youtube-handler.js class YouTubeHandler (line 7) | class YouTubeHandler extends window.VSC.BaseSiteHandler { method matches (line 12) | static matches() { method getControllerPosition (line 22) | getControllerPosition(parent, _video) { method initialize (line 37) | initialize(document) { method setupYouTubeCSS (line 48) | setupYouTubeCSS() { method shouldIgnoreVideo (line 59) | shouldIgnoreVideo(video) { method getVideoContainerSelectors (line 71) | getVideoContainerSelectors() { method detectSpecialVideos (line 80) | detectSpecialVideos(document) { method onPlayerStateChange (line 108) | onPlayerStateChange(_video) { FILE: src/ui/controls.js class ControlsManager (line 7) | class ControlsManager { method constructor (line 8) | constructor(actionHandler, config) { method setupControlEvents (line 18) | setupControlEvents(shadow, video) { method setupDragHandler (line 30) | setupDragHandler(shadow) { method setupButtonHandlers (line 49) | setupButtonHandlers(shadow) { method setupWheelHandler (line 91) | setupWheelHandler(shadow, video) { method setupClickPrevention (line 127) | setupClickPrevention(shadow) { FILE: src/ui/drag-handler.js class DragHandler (line 7) | class DragHandler { method handleDrag (line 13) | static handleDrag(video, e) { FILE: src/ui/options/options.js function debounce (line 18) | function debounce(func, wait) { constant BLACKLISTED_KEYCODES (line 33) | const BLACKLISTED_KEYCODES = [ function recordKeyPress (line 105) | function recordKeyPress(e) { function inputFilterNumbersOnly (line 139) | function inputFilterNumbersOnly(e) { function inputFocus (line 147) | function inputFocus(e) { function inputBlur (line 151) | function inputBlur(e) { function updateShortcutInputText (line 157) | function updateShortcutInputText(inputId, keyCode) { function updateCustomShortcutInputText (line 164) | function updateCustomShortcutInputText(inputItem, keyCode) { function add_shortcut (line 171) | function add_shortcut() { function createKeyBindings (line 213) | function createKeyBindings(item) { function validate (line 231) | function validate() { function save_options (line 275) | async function save_options() { function restore_options (line 347) | async function restore_options() { function restore_defaults (line 455) | async function restore_defaults() { function show_experimental (line 498) | function show_experimental() { function eventCaller (line 600) | function eventCaller(event, className, funcName) { FILE: src/ui/popup/popup.js function toggleEnabled (line 30) | function toggleEnabled(enabled, callback) { function toggleEnabledUI (line 42) | function toggleEnabledUI(enabled) { function settingsSavedReloadMessage (line 62) | function settingsSavedReloadMessage(enabled) { function setStatusMessage (line 68) | function setStatusMessage(str) { function loadSettingsAndInitialize (line 75) | function loadSettingsAndInitialize() { function updateSpeedControlsUI (line 106) | function updateSpeedControlsUI(slowerStep, fasterStep, resetSpeed) { function initializeSpeedControls (line 129) | function initializeSpeedControls(slowerStep, fasterStep) { function setSpeed (line 156) | function setSpeed(speed) { function adjustSpeed (line 167) | function adjustSpeed(delta) { function resetSpeed (line 178) | function resetSpeed() { FILE: src/ui/shadow-dom.js class ShadowDOMManager (line 7) | class ShadowDOMManager { method createShadowDOM (line 14) | static createShadowDOM(wrapper, options = {}) { method getController (line 199) | static getController(shadow) { method getControls (line 208) | static getControls(shadow) { method getSpeedIndicator (line 217) | static getSpeedIndicator(shadow) { method getButtons (line 226) | static getButtons(shadow) { method updateSpeedDisplay (line 235) | static updateSpeedDisplay(shadow, speed) { method calculatePosition (line 247) | static calculatePosition(video) { FILE: src/ui/vsc-controller-element.js class VSCControllerElement (line 8) | class VSCControllerElement extends HTMLElement { method constructor (line 9) | constructor() { method connectedCallback (line 13) | connectedCallback() { method disconnectedCallback (line 17) | disconnectedCallback() { method register (line 22) | static register() { FILE: src/utils/blacklist.js function isBlacklisted (line 12) | function isBlacklisted(blacklist, href) { FILE: src/utils/debug-helper.js class DebugHelper (line 8) | class DebugHelper { method constructor (line 9) | constructor() { method enable (line 16) | enable() { method checkMediaElements (line 44) | checkMediaElements() { method checkShadowDOMMedia (line 102) | checkShadowDOMMedia() { method checkControllers (line 130) | checkControllers() { method testPopupCommunication (line 188) | testPopupCommunication() { method testPopupMessageBridge (line 253) | testPopupMessageBridge() { method forceShowControllers (line 285) | forceShowControllers() { method forceShowAudioControllers (line 308) | forceShowAudioControllers() { method getElementVisibility (line 340) | getElementVisibility(element) { method monitorControllerChanges (line 364) | monitorControllerChanges() { FILE: src/utils/dom-utils.js function getChild (line 30) | function getChild(element, depth = 0) { FILE: src/utils/event-manager.js class EventManager (line 7) | class EventManager { method constructor (line 8) | constructor(config, actionHandler) { method setupEventListeners (line 23) | setupEventListeners(document) { method setupKeyboardShortcuts (line 32) | setupKeyboardShortcuts(document) { method handleKeydown (line 64) | handleKeydown(event) { method hasActiveModifier (line 120) | hasActiveModifier(event) { method isTypingContext (line 138) | isTypingContext(target) { method setupRateChangeListener (line 148) | setupRateChangeListener(document) { method handleRateChange (line 168) | handleRateChange(event) { method refreshCoolDown (line 251) | refreshCoolDown() { method showController (line 269) | showController(controller) { method cleanup (line 299) | cleanup() { FILE: src/utils/logger.js class Logger (line 8) | class Logger { method constructor (line 9) | constructor() { method setVerbosity (line 19) | setVerbosity(level) { method setDefaultLevel (line 27) | setDefaultLevel(level) { method generateContext (line 36) | generateContext() { method formatVideoId (line 49) | formatVideoId(video) { method pushContext (line 68) | pushContext(context) { method popContext (line 79) | popContext() { method withContext (line 89) | withContext(context, fn) { method log (line 103) | log(message, level) { method error (line 138) | error(message) { method warn (line 146) | warn(message) { method info (line 154) | info(message) { method debug (line 162) | debug(message) { method verbose (line 170) | verbose(message) { FILE: tests/e2e/basic.e2e.js function runBasicE2ETests (line 19) | async function runBasicE2ETests() { FILE: tests/e2e/display-toggle.e2e.js function testDisplayToggle (line 12) | async function testDisplayToggle() { function run (line 135) | async function run() { FILE: tests/e2e/e2e-utils.js function launchChromeWithExtension (line 23) | async function launchChromeWithExtension() { function waitForExtension (line 112) | async function waitForExtension(page, timeout = 15000) { function waitForVideo (line 205) | async function waitForVideo(page, selector = 'video', timeout = 15000) { function waitForController (line 233) | async function waitForController(page, timeout = 10000) { function getVideoSpeed (line 265) | async function getVideoSpeed(page, selector = 'video') { function controlVideo (line 278) | async function controlVideo(page, action) { function testKeyboardShortcut (line 324) | async function testKeyboardShortcut(page, key) { function getControllerSpeedDisplay (line 344) | async function getControllerSpeedDisplay(page) { function takeScreenshot (line 367) | async function takeScreenshot(page, filename) { FILE: tests/e2e/icon.e2e.js function testUltraSimplified (line 17) | async function testUltraSimplified() { FILE: tests/e2e/run-e2e.js function runE2ETests (line 24) | async function runE2ETests() { FILE: tests/e2e/settings-injection.e2e.js function runSettingsInjectionE2ETests (line 8) | async function runSettingsInjectionE2ETests() { FILE: tests/e2e/validate-extension.js function validateExtension (line 16) | function validateExtension() { FILE: tests/e2e/youtube.e2e.js constant YOUTUBE_TEST_URL (line 19) | const YOUTUBE_TEST_URL = 'https://www.youtube.com/watch?v=gGCJOTvECVQ'; function runYouTubeE2ETests (line 21) | async function runYouTubeE2ETests() { FILE: tests/helpers/chrome-mock.js function installChromeMock (line 88) | function installChromeMock() { function cleanupChromeMock (line 95) | function cleanupChromeMock() { function resetMockStorage (line 102) | function resetMockStorage() { FILE: tests/helpers/module-loader.js function loadCoreModules (line 10) | async function loadCoreModules() { function loadInjectModules (line 51) | async function loadInjectModules() { function loadMinimalModules (line 59) | async function loadMinimalModules() { function loadObserverModules (line 69) | async function loadObserverModules() { FILE: tests/helpers/test-utils.js function createMockVideo (line 10) | function createMockVideo(options = {}) { function createMockAudio (line 115) | function createMockAudio(options = {}) { function createMockDOM (line 144) | function createMockDOM() { function wait (line 164) | function wait(ms) { function createMockEvent (line 174) | function createMockEvent(type, properties = {}) { function createMockKeyboardEvent (line 187) | function createMockKeyboardEvent(type, keyCode, options = {}) { class SimpleTestRunner (line 253) | class SimpleTestRunner { method constructor (line 254) | constructor() { method beforeEach (line 260) | beforeEach(fn) { method afterEach (line 264) | afterEach(fn) { method test (line 268) | test(name, fn) { method run (line 272) | async run() { FILE: tests/integration/blacklist-blocking.test.js function setTestURL (line 40) | function setTestURL(url) { FILE: tests/integration/state-manager-integration.test.js function setupPostMessageMock (line 28) | function setupPostMessageMock() { FILE: tests/run-tests.js constant JSDOM (line 17) | let JSDOM; function runTests (line 121) | async function runTests() { FILE: tests/unit/content/inject.test.js function createVideoWithoutParentElement (line 61) | function createVideoWithoutParentElement() { FILE: tests/unit/core/action-handler.test.js function createTestVideoWithController (line 36) | function createTestVideoWithController(config, actionHandler, videoOptio... FILE: tests/unit/core/icon-integration.test.js function createMockVideo (line 32) | function createMockVideo(options = {}) { FILE: tests/unit/observers/audio-size-handling.test.js constant SMALL_AUDIO_SIZE (line 16) | const SMALL_AUDIO_SIZE = { constant SMALL_VIDEO_SIZE (line 21) | const SMALL_VIDEO_SIZE = { function createMockAudio (line 43) | function createMockAudio(options = {}) { FILE: tests/unit/utils/recursive-shadow-dom.test.js function createNestedShadowDOM (line 45) | function createNestedShadowDOM(depth, includeVideo = true) { function createComplexPlayerStructure (line 80) | function createComplexPlayerStructure() {