From 9177566262274c4105dd14270af3cb587b1d8501 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Mon, 1 Jul 2024 17:24:16 +0200 Subject: [PATCH 01/28] shortcuts.js continue #2421 rewrite --- .../www.youtube.com/shortcuts.js | 227 +++++++++--------- 1 file changed, 112 insertions(+), 115 deletions(-) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index e36303c20..fdafef706 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -6,107 +6,22 @@ WARNING: Browser Debugger Breakpoint downstream from keydown() event will eat co is disabled and key pressed again OR switching tabs/windows to trigger 'improvedtube-blur'. Make sure to have that in mind when debugging. ------------------------------------------------------------------------------*/ -ImprovedTube.shortcuts = function () { - const ignoreElements = ['EMBED', 'INPUT', 'OBJECT', 'TEXTAREA', 'IFRAME'], - modifierKeys = ['AltLeft','AltRight','ControlLeft','ControlRight','ShiftLeft','ShiftRight'], - handlers = { - keydown: function (event) { - if (document.activeElement && ignoreElements.includes(document.activeElement.tagName) || event.target.isContentEditable) return; - - ImprovedTube.input.pressed.wheel = 0; - ImprovedTube.input.pressed.alt = event.altKey; - ImprovedTube.input.pressed.ctrl = event.ctrlKey; - ImprovedTube.input.pressed.shift = event.shiftKey; - if (!modifierKeys.includes(event.code) && !ImprovedTube.input.pressed.keys.includes(event.keyCode)) { - ImprovedTube.input.pressed.keys.push(event.keyCode); - } - - handler(); - }, - keyup: function (event) { - ImprovedTube.input.pressed.wheel = 0; - ImprovedTube.input.pressed.alt = event.altKey; - ImprovedTube.input.pressed.ctrl = event.ctrlKey; - ImprovedTube.input.pressed.shift = event.shiftKey; - if (ImprovedTube.input.pressed.keys.includes(event.keyCode)) { - ImprovedTube.input.pressed.keys.splice(ImprovedTube.input.pressed.keys.indexOf(event.keyCode), 1); - } - // cancel keyup events corresponding to keys that triggered one of our shortcuts - if (ImprovedTube.input.cancelled.includes(event.keyCode)) { - event.preventDefault(); - event.stopPropagation(); - ImprovedTube.input.cancelled.splice(ImprovedTube.input.cancelled.indexOf(event.keyCode), 1); - } - }, - wheel: function (event) { - if (document.activeElement && ignoreElements.includes(document.activeElement.tagName) || event.target.isContentEditable) return; - - ImprovedTube.input.pressed.wheel = event.deltaY > 0 ? 1 : -1; - ImprovedTube.input.pressed.alt = event.altKey; - ImprovedTube.input.pressed.ctrl = event.ctrlKey; - ImprovedTube.input.pressed.shift = event.shiftKey; - - handler(); - }, - 'improvedtube-player-loaded': function () { - //Please Fix: November2023: this parentNode doesnt exist on youtube.com/shorts - if (ImprovedTube.elements.player && ImprovedTube.elements.player.parentNode) { - ImprovedTube.elements.player?.parentNode?.addEventListener('mouseover', function () { - ImprovedTube.input.pressed.player = true; - ImprovedTube.input.pressed.wheel = 0; - }, true); - - ImprovedTube.elements.player?.parentNode?.addEventListener('mouseout', function () { - ImprovedTube.input.pressed.player = false; - ImprovedTube.input.pressed.wheel = 0; - }, true); - } - }, - 'improvedtube-blur': function () { - ImprovedTube.input.pressed.keys = []; - ImprovedTube.input.pressed.alt = false; - ImprovedTube.input.pressed.ctrl = false; - ImprovedTube.input.pressed.shift = false; - ImprovedTube.input.pressed.player = false; - ImprovedTube.input.pressed.wheel = 0; - } - }; - - function handler() { - for (const [key, shortcut] of Object.entries(ImprovedTube.input.listening)) { - if ((ImprovedTube.input.pressed.keys - && ImprovedTube.input.pressed.keys.length === shortcut.keys.length - && ImprovedTube.input.pressed.keys.every((k, i) => k === shortcut.keys[i])) - && ImprovedTube.input.pressed.alt === shortcut.alt - && ImprovedTube.input.pressed.ctrl === shortcut.ctrl - && ImprovedTube.input.pressed.shift === shortcut.shift - && (ImprovedTube.input.pressed.wheel === shortcut.wheel - // shortcuts with wheel allowed ONLY inside player - && (!ImprovedTube.input.pressed.wheel || ImprovedTube.input.pressed.player))) { - - if (key.startsWith('shortcutQuality')) { - ImprovedTube['shortcutQuality'](key); - } else if (typeof ImprovedTube[key] === 'function') { - ImprovedTube[key](); - } - // cancel keydown/wheel event - event.preventDefault(); - event.stopPropagation(); - // build 'cancelled' list so we also cancel keyup events - ImprovedTube.input.pressed.keys.every((k, i) => ImprovedTube.input.cancelled.push(k)); - } - } - }; - - // reset 'listening' - this.input.listening = {}; +ImprovedTube.shortcutsInit = function () { + // those four are _references_ to source Objects, not copies + const listening = ImprovedTube.input.listening, + listeners = ImprovedTube.input.listeners, + pressed = ImprovedTube.input.pressed, + cancelled = ImprovedTube.input.cancelled; + + // reset 'listening' shortcuts + for (var key in listening) delete listening[key]; // extract shortcuts from User Settings and initialize 'listening' for (const [name, keys] of Object.entries(this.storage).filter(v => v[0].startsWith('shortcut_'))) { if (!keys) continue; // camelCase(name) const camelName = name.replace(/_(.)/g, (m, l) => l.toUpperCase()); let potentialShortcut = {}; - for (const button of ['alt','ctrl','shift','wheel','keys']) { + for (const button of ['alt','ctrl','shift','wheel','keys','toggle']) { switch(button) { case 'alt': case 'ctrl': @@ -125,16 +40,102 @@ ImprovedTube.shortcuts = function () { break } } - if (potentialShortcut['keys'] || potentialShortcut['wheel']) this.input.listening[camelName] = potentialShortcut; + if (potentialShortcut['keys'] || potentialShortcut['wheel']) listening[camelName] = potentialShortcut; } - // initialize Listeners, but only once! - for (const [name, handler] of Object.entries(handlers)) { - if (!this.input.listeners[name]) { - this.input.listeners[name] = true; - window.addEventListener(name, handler, {passive: false, capture: true}); + // initialize 'listeners' only if there are actual shortcuts active + if (Object.keys(listening).length) { + for (const [name, handler] of Object.entries(this.shortcutsListeners)) { + // only one listener per handle + if (!listeners[name]) { + listeners[name] = true; + window.addEventListener(name, handler, {passive: false, capture: true}); + } + } + } else { + // no shortcuts means we dont need 'listeners', uninstall all + for (const [name, handler] of Object.entries(this.shortcutsListeners)) { + if (listeners[name]) { + delete listeners[name]; + window.removeEventListener(name, handler, {passive: false, capture: true}); + } } } }; + +ImprovedTube.shortcutsHandler = function () { + for (const [key, shortcut] of Object.entries(ImprovedTube.input.listening)) { + if ((ImprovedTube.input.pressed.keys.length === shortcut.keys.length + && ImprovedTube.input.pressed.keys.sort().every((k, i) => k === shortcut.keys[i])) + && ImprovedTube.input.pressed.wheel === shortcut.wheel + && ImprovedTube.input.pressed.alt === shortcut.alt + && ImprovedTube.input.pressed.ctrl === shortcut.ctrl + && ImprovedTube.input.pressed.shift === shortcut.shift) { + + if (key.startsWith('shortcutQuality')) { + ImprovedTube['shortcutQuality'](key); + } else if (typeof ImprovedTube[key] === 'function') { + ImprovedTube[key](); + } + // cancel keydown/wheel event + event.preventDefault(); + event.stopPropagation(); + // build 'cancelled' list so we also cancel keyup events + ImprovedTube.input.pressed.keys.every(key => ImprovedTube.input.cancelled.push(key)); + } + } +}; + +ImprovedTube.shortcutsListeners = { + keydown: function (event) { + ImprovedTube.user_interacted = true; + // no shortcuts over 'ignoreElements' + if ((document.activeElement && ImprovedTube.input.ignoreElements.includes(document.activeElement.tagName)) || event.target.isContentEditable) return; + + if (!ImprovedTube.input.modifierKeys.includes(event.code) && !ImprovedTube.input.pressed.keys.includes(event.keyCode)) { + ImprovedTube.input.pressed.keys.push(event.keyCode); + } + ImprovedTube.input.pressed.wheel = 0; + ImprovedTube.input.pressed.alt = event.altKey; + ImprovedTube.input.pressed.ctrl = event.ctrlKey; + ImprovedTube.input.pressed.shift = event.shiftKey; + + ImprovedTube.shortcutsHandler(); + }, + keyup: function (event) { + if (ImprovedTube.input.pressed.keys.includes(event.keyCode)) { + ImprovedTube.input.pressed.keys.splice(ImprovedTube.input.pressed.keys.indexOf(event.keyCode), 1); + } + ImprovedTube.input.pressed.wheel = 0; + ImprovedTube.input.pressed.alt = event.altKey; + ImprovedTube.input.pressed.ctrl = event.ctrlKey; + ImprovedTube.input.pressed.shift = event.shiftKey; + + // cancel keyup events corresponding to keys that triggered one of our shortcuts + if (ImprovedTube.input.cancelled.includes(event.keyCode)) { + event.preventDefault(); + event.stopPropagation(); + ImprovedTube.input.cancelled.splice(ImprovedTube.input.cancelled.indexOf(event.keyCode), 1); + } + }, + wheel: function (event) { + // shortcuts with wheel allowed ONLY inside player + if (!ImprovedTube.elements.player.contains(event.target)) return; + + ImprovedTube.input.pressed.wheel = event.deltaY > 0 ? 1 : -1; + ImprovedTube.input.pressed.alt = event.altKey; + ImprovedTube.input.pressed.ctrl = event.ctrlKey; + ImprovedTube.input.pressed.shift = event.shiftKey; + + ImprovedTube.shortcutsHandler(); + }, + 'improvedtube-blur': function () { + ImprovedTube.input.pressed.keys = []; + ImprovedTube.input.pressed.wheel = 0 + ImprovedTube.input.pressed.alt = false; + ImprovedTube.input.pressed.ctrl = false; + ImprovedTube.input.pressed.shift = false; + } +}; /*------------------------------------------------------------------------------ Ambient lighting ------------------------------------------------------------------------------*/ @@ -420,16 +421,12 @@ ImprovedTube.shortcutActivateCaptions = function () { } }; /*------Chapters------*/ -ImprovedTube.shortcutChapters = function () { - try{var height = document.querySelector('*[target-id*=chapters]').clientHeight;}catch{} - if (height) {try{document.querySelector('*[target-id*=chapters] #visibility-button button').click(); console.log("chapters shortcut close")} catch{}} - else { try{document.querySelector('*[target-id*=chapters]').removeAttribute('visibility'); console.log("chapters shortcut open")} catch{} } -}; +ImprovedTube.shortcutChapters = function () { + document.querySelector('[target-id*=chapters][visibility*=HIDDEN]') ? document.querySelector('[modern-chapters] button[aria-label="View all"]')?.click() : document.querySelector('[target-id*=chapters][visibility*=EXPANDED] button[aria-label="Close"]')?.click(); +}; /*------Transcript------*/ -ImprovedTube.shortcutTranscript = function () { - try{var height = document.querySelector('*[target-id*=transcript]').clientHeight;}catch{} - if (height) {try{document.querySelector('*[target-id*=transcript] #visibility-button button').click(); console.log("transcriptshortcut close")} catch{}} - else { try{document.querySelector('*[target-id*=transcript]').removeAttribute('visibility'); console.log("transcriptshortcut open")} catch{} } +ImprovedTube.shortcutTranscript = function () { + document.querySelector('[target-id*=transcript][visibility*=HIDDEN]') ? document.querySelector('button[aria-label="Show transcript"]')?.click() : document.querySelector('button[aria-label="Close transcript"]')?.click(); }; /*------------------------------------------------------------------------------ 4.7.22 LIKE @@ -445,16 +442,16 @@ ImprovedTube.shortcutDislike = function () { }; /*------Report------*/ ImprovedTube.shortcutReport = function () { -try{document.querySelectorAll("tp-yt-iron-dropdown").forEach(el => el.style.opacity = 0); - document.querySelector('svg path[d^="M7.5,12c0,0.83-0.67,1.5-1.5"]').closest("button").click();document.querySelectorAll("tp-yt-iron-dropdown").forEach(el => el.style.opacity = 0)} +try{document.querySelectorAll("tp-yt-iron-dropdown").forEach(el => el.style.opacity = 0); + document.querySelector('svg path[d^="M7.5,12c0,0.83-0.67,1.5-1.5"]').closest("button").click();document.querySelectorAll("tp-yt-iron-dropdown").forEach(el => el.style.opacity = 0)} catch{console.log("'...' failed"); setTimeout(function(){try{document.querySelector('svg path[d^="M7.5,12c0,0.83-0.67,1.5-1.5"]').closest("button").click();document.querySelectorAll("tp-yt-iron-dropdown").forEach(el => el.style.opacity = 0)} catch{console.log("'...' failed2")}},100) } - + setTimeout(function(){try{document.querySelectorAll("tp-yt-iron-dropdown").forEach(el => el.style.opacity = 0); document.querySelector('tp-yt-iron-dropdown svg path[d^="M13.18,4l0.24,1.2L13.58,6h0.82H19v7h-5.18l-0"]').closest("tp-yt-paper-item").click();} catch{console.log("report failed");setTimeout(function() {try{document.querySelector('tp-yt-iron-dropdown svg path[d^="M13.18,4l0.24,1.2L13.58,6h0.82H19v7h-5.18l-0"]').closest("tp-yt-paper-item").click();} catch{console.log("report failed2");document.querySelector('svg path[d^="M7.5,12c0,0.83-0.67,1.5-1.5"]').closest("button").click();}},800); } -},200); +},200); setTimeout(function(){try{document.querySelectorAll("tp-yt-iron-dropdown").forEach(el => el.style.opacity = 1)}catch{console.log("dropdown visible failed"); setTimeout(function(){try{document.querySelectorAll("tp-yt-iron-dropdown").forEach(el => el.style.opacity = 1)}catch{console.log("dropdown visible failed2");}},1700)}},700) @@ -514,7 +511,7 @@ ImprovedTube.shortcutStatsForNerds = function () { console.error('shortcutStatsForNerds: Need valid Player element'); return; } - + if (player.isVideoInfoVisible()) { player.hideVideoInfo(); } else { From d318806c354de9607bc0d1e0220e62b1b0c09864 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Mon, 1 Jul 2024 18:14:16 +0200 Subject: [PATCH 02/28] Update init.js shortcuts->shortcutsInit, formatting, playlist functions only on playlist --- js&css/web-accessible/init.js | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/js&css/web-accessible/init.js b/js&css/web-accessible/init.js index 34ea02155..09686b909 100644 --- a/js&css/web-accessible/init.js +++ b/js&css/web-accessible/init.js @@ -84,30 +84,23 @@ if (ImprovedTube.storage.channel_default_tab && ImprovedTube.storage.channel_def ImprovedTube.init = function () { window.addEventListener('yt-page-data-updated', function () { ImprovedTube.pageType(); - if (document.documentElement.dataset.pageType === 'video' && /[?&]list=([^&]+).*$/.test(location.href)) { + if (location.search.match(ImprovedTube.regex.playlist_id)) { ImprovedTube.playlistRepeat(); ImprovedTube.playlistShuffle(); ImprovedTube.playlistReverse(); + ImprovedTube.playlistPopup(); } - ImprovedTube.playlistPopupUpdate(); }); - ImprovedTube.pageType(); - var yt_player_updated = function () { - document.dispatchEvent(new CustomEvent('improvedtube-player-loaded')); - - window.removeEventListener('yt-player-updated', yt_player_updated); - }; - - window.addEventListener('yt-player-updated', yt_player_updated); + this.pageType(); this.playerOnPlay(); this.playerSDR(); - this.shortcuts(); + this.shortcutsInit(); this.onkeydown(); this.onmousedown(); this.youtubeLanguage(); this.myColors(); - if(this.storage.undo_the_new_sidebar === true){this.undoTheNewSidebar();} - if(this.storage.description === "sidebar"){this.descriptionSidebar();} + if (this.storage.undo_the_new_sidebar) this.undoTheNewSidebar(); + if (this.storage.description === "sidebar") this.descriptionSidebar(); this.channelCompactTheme(); if (ImprovedTube.elements.player && ImprovedTube.elements.player.setPlaybackRate) { From fc46d21bfdd2fc6083353f653f05242e40672b9d Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Mon, 1 Jul 2024 18:22:49 +0200 Subject: [PATCH 03/28] Update core.js shortcuts work --- js&css/web-accessible/core.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/js&css/web-accessible/core.js b/js&css/web-accessible/core.js index 6075d832a..9719ebc6b 100644 --- a/js&css/web-accessible/core.js +++ b/js&css/web-accessible/core.js @@ -63,13 +63,14 @@ var ImprovedTube = { listeners: {}, pressed: { keys: [], + wheel: 0, alt: false, ctrl: false, - shift: false, - player: false, - wheel: 0 + shift: false }, - cancelled: [] + cancelled: [], + ignoreElements: ['EMBED', 'INPUT', 'OBJECT', 'TEXTAREA', 'IFRAME'], + modifierKeys: ['AltLeft','AltRight','ControlLeft','ControlRight','ShiftLeft','ShiftRight'], }, mini_player__mode: false, mini_player__move: false, From 65b5dc7e7b5a66f152b0ab83d2605c5d61b36744 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Mon, 1 Jul 2024 18:40:38 +0200 Subject: [PATCH 04/28] Update messages.json let user know those are Toggles --- _locales/en/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 1071c3419..6b0ee0e6f 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1128,7 +1128,7 @@ "message": "Share" }, "shortcut_chapters": { - "message": "Show chapters Sidebar" + "message": "Toggle sidebar Chapters" }, "shortcut_screenshot": { "message": "Screenshot" @@ -1281,7 +1281,7 @@ "message": "Trailer autoplay" }, "Transcript": { - "message": "Transcript" + "message": "Toggle sidebar Transcript" }, "translations": { "message": "Translations" From 6c4a69be4e3dd0f9e2e2f0d618cd59af463981fb Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Mon, 1 Jul 2024 19:06:34 +0200 Subject: [PATCH 05/28] Update messages.json shortcut_transcript --- _locales/en/messages.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 6b0ee0e6f..81489258c 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1133,6 +1133,9 @@ "shortcut_screenshot": { "message": "Screenshot" }, + "shortcut_transcript": { + "message": "Toggle sidebar Transcript" + }, "shortcuts": { "message": "Shortcuts" }, @@ -1281,7 +1284,7 @@ "message": "Trailer autoplay" }, "Transcript": { - "message": "Toggle sidebar Transcript" + "message": "Transcript" }, "translations": { "message": "Translations" From 1c8e71d40d88246284ad914e2a7327875c7ff9b8 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Mon, 1 Jul 2024 19:07:52 +0200 Subject: [PATCH 06/28] Update shortcuts.js shortcut_transcript --- menu/skeleton-parts/shortcuts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/skeleton-parts/shortcuts.js b/menu/skeleton-parts/shortcuts.js index 03f2db8c7..9dbebc313 100644 --- a/menu/skeleton-parts/shortcuts.js +++ b/menu/skeleton-parts/shortcuts.js @@ -338,7 +338,7 @@ extension.skeleton.main.layers.section.shortcuts = { }, shortcut_transcript: { component: 'shortcut', - text: 'transcript' + text: 'shortcut_transcript' }, shortcut_like: { component: 'shortcut', From 75d08f2b0c93bba1304269292337c5b0716ee67c Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Wed, 3 Jul 2024 01:15:18 +0200 Subject: [PATCH 07/28] shortcuts.js language independent shortcutChapters shortcutTranscript --- js&css/web-accessible/www.youtube.com/shortcuts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index fdafef706..f6f90612c 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -422,11 +422,11 @@ ImprovedTube.shortcutActivateCaptions = function () { }; /*------Chapters------*/ ImprovedTube.shortcutChapters = function () { - document.querySelector('[target-id*=chapters][visibility*=HIDDEN]') ? document.querySelector('[modern-chapters] button[aria-label="View all"]')?.click() : document.querySelector('[target-id*=chapters][visibility*=EXPANDED] button[aria-label="Close"]')?.click(); + document.querySelector('[target-id*=chapters][visibility*=HIDDEN]') ? document.querySelector('[modern-chapters] #navigation-button button[aria-label]').click() : document.querySelector('[target-id*=chapters][visibility*=EXPANDED] #visibility-button button[aria-label]')?.click() }; /*------Transcript------*/ ImprovedTube.shortcutTranscript = function () { - document.querySelector('[target-id*=transcript][visibility*=HIDDEN]') ? document.querySelector('button[aria-label="Show transcript"]')?.click() : document.querySelector('button[aria-label="Close transcript"]')?.click(); + document.querySelector('[target-id*=transcript][visibility*=HIDDEN]') ? document.querySelector('ytd-video-description-transcript-section-renderer button[aria-label]')?.click() : document.querySelector('[target-id*=transcript][visibility*=EXPANDED] #visibility-button button[aria-label]').click(); }; /*------------------------------------------------------------------------------ 4.7.22 LIKE From 59438d55d0a19376a6af8eb37e3afd5d976e0ca2 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Wed, 3 Jul 2024 01:18:09 +0200 Subject: [PATCH 08/28] shortcuts.js simplified shortcutNextVideo shortcutPrevVideo --- .../www.youtube.com/shortcuts.js | 28 ++----------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index f6f90612c..4ddb7d797 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -213,37 +213,13 @@ ImprovedTube.shortcutToggleAutoplay = function () { 4.7.7 NEXT VIDEO ------------------------------------------------------------------------------*/ ImprovedTube.shortcutNextVideo = function () { - if (this.elements.player) { - var playlist_loop_button = document.querySelector('[aria-label="Loop playlist"]'); - - if (playlist_loop_button) { - if (playlist_loop_button.ariaPressed === 'true') { - this.elements.player.setLoop(true); - } else { - this.elements.player.setLoop(false) - } - } - - this.elements.player.nextVideo(); - } + this.elements.player?.nextVideo(); }; /*------------------------------------------------------------------------------ 4.7.8 PREVIOUS VIDEO ------------------------------------------------------------------------------*/ ImprovedTube.shortcutPrevVideo = function () { - if (this.elements.player) { - var playlist_loop_button = document.querySelector('[aria-label="Loop playlist"]'); - - if (playlist_loop_button) { - if (playlist_loop_button.ariaPressed === 'true') { - this.elements.player.setLoop(true); - } else { - this.elements.player.setLoop(false) - } - } - - this.elements.player.previousVideo(); - } + this.elements.player?.previousVideo(); }; /*------------------------------------------------------------------------------ 4.7.9 SEEK BACKWARD From 2889a9c804d5b6a9d811e667407c2bc964b0e29b Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 08:43:01 +0200 Subject: [PATCH 09/28] Update shortcuts.js potentially more reliable like/dislike --- js&css/web-accessible/www.youtube.com/shortcuts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index 4ddb7d797..70e8fd98e 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -408,13 +408,13 @@ ImprovedTube.shortcutTranscript = function () { 4.7.22 LIKE ------------------------------------------------------------------------------*/ ImprovedTube.shortcutLike = function () { - document.querySelector('like-button-view-model * * *')?.click(); + document.querySelector('like-button-view-model button')?.click(); }; /*------------------------------------------------------------------------------ 4.7.23 DISLIKE ------------------------------------------------------------------------------*/ ImprovedTube.shortcutDislike = function () { - document.querySelector('dislike-button-view-model * * *')?.click(); + document.querySelector('dislike-button-view-model button')?.click(); }; /*------Report------*/ ImprovedTube.shortcutReport = function () { From b84f8977e3accbb800de03ee0c028be334c75b91 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 08:46:08 +0200 Subject: [PATCH 10/28] Update shortcuts.js missing ; --- js&css/web-accessible/www.youtube.com/shortcuts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index 70e8fd98e..5858e58cd 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -398,7 +398,7 @@ ImprovedTube.shortcutActivateCaptions = function () { }; /*------Chapters------*/ ImprovedTube.shortcutChapters = function () { - document.querySelector('[target-id*=chapters][visibility*=HIDDEN]') ? document.querySelector('[modern-chapters] #navigation-button button[aria-label]').click() : document.querySelector('[target-id*=chapters][visibility*=EXPANDED] #visibility-button button[aria-label]')?.click() + document.querySelector('[target-id*=chapters][visibility*=HIDDEN]') ? document.querySelector('[modern-chapters] #navigation-button button[aria-label]').click() : document.querySelector('[target-id*=chapters][visibility*=EXPANDED] #visibility-button button[aria-label]')?.click(); }; /*------Transcript------*/ ImprovedTube.shortcutTranscript = function () { From 88254f52718a7780ec8a7f5b2da237deeb5b8721 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 08:58:32 +0200 Subject: [PATCH 11/28] shortcuts.js cancel keydown/wheel event before we call target handler cancel keydown/wheel event before we call target handler, crashing handler wont keep 'cancelled' keys stuck cancelled a Set so it dosnt hold multiple keys --- .../web-accessible/www.youtube.com/shortcuts.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index 5858e58cd..a2ac76d55 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -71,16 +71,18 @@ ImprovedTube.shortcutsHandler = function () { && ImprovedTube.input.pressed.ctrl === shortcut.ctrl && ImprovedTube.input.pressed.shift === shortcut.shift) { + // cancel keydown/wheel event before we call target handler + // this way crashing handler wont keep 'cancelled' keys stuck + event.preventDefault(); + event.stopPropagation(); + // build 'cancelled' list so we also cancel keyup events + ImprovedTube.input.pressed.keys.every(key => ImprovedTube.input.cancelled.add(key)); + if (key.startsWith('shortcutQuality')) { ImprovedTube['shortcutQuality'](key); } else if (typeof ImprovedTube[key] === 'function') { ImprovedTube[key](); } - // cancel keydown/wheel event - event.preventDefault(); - event.stopPropagation(); - // build 'cancelled' list so we also cancel keyup events - ImprovedTube.input.pressed.keys.every(key => ImprovedTube.input.cancelled.push(key)); } } }; @@ -111,10 +113,10 @@ ImprovedTube.shortcutsListeners = { ImprovedTube.input.pressed.shift = event.shiftKey; // cancel keyup events corresponding to keys that triggered one of our shortcuts - if (ImprovedTube.input.cancelled.includes(event.keyCode)) { + if (ImprovedTube.input.cancelled.has(event.keyCode)) { event.preventDefault(); event.stopPropagation(); - ImprovedTube.input.cancelled.splice(ImprovedTube.input.cancelled.indexOf(event.keyCode), 1); + ImprovedTube.input.cancelled.delete(event.keyCode); } }, wheel: function (event) { From 6532abf39a156b5a7e10fb1ca44916dce4e0dd03 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 10:37:56 +0200 Subject: [PATCH 12/28] Update shortcuts.js pressed.keys turned into Set for more reliability --- .../www.youtube.com/shortcuts.js | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index a2ac76d55..6c48a49ab 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -36,7 +36,7 @@ ImprovedTube.shortcutsInit = function () { case 'keys': // array of sorted scancodes - potentialShortcut[button] = keys[button] ? Object.keys(keys[button]).map(s=>Number(s)).sort() : []; + potentialShortcut[button] = keys[button] ? new Set(Object.keys(keys[button]).map(s=>Number(s)).sort()) : new Set(); break } } @@ -63,26 +63,30 @@ ImprovedTube.shortcutsInit = function () { }; ImprovedTube.shortcutsHandler = function () { - for (const [key, shortcut] of Object.entries(ImprovedTube.input.listening)) { - if ((ImprovedTube.input.pressed.keys.length === shortcut.keys.length - && ImprovedTube.input.pressed.keys.sort().every((k, i) => k === shortcut.keys[i])) - && ImprovedTube.input.pressed.wheel === shortcut.wheel - && ImprovedTube.input.pressed.alt === shortcut.alt - && ImprovedTube.input.pressed.ctrl === shortcut.ctrl - && ImprovedTube.input.pressed.shift === shortcut.shift) { - - // cancel keydown/wheel event before we call target handler - // this way crashing handler wont keep 'cancelled' keys stuck - event.preventDefault(); - event.stopPropagation(); - // build 'cancelled' list so we also cancel keyup events - ImprovedTube.input.pressed.keys.every(key => ImprovedTube.input.cancelled.add(key)); + check: for (const [key, shortcut] of Object.entries(ImprovedTube.input.listening)) { + if (ImprovedTube.input.pressed.keys.size != shortcut.keys.size + || ImprovedTube.input.pressed.wheel != shortcut.wheel + || ImprovedTube.input.pressed.alt != shortcut.alt + || ImprovedTube.input.pressed.ctrl != shortcut.ctrl + || ImprovedTube.input.pressed.shift != shortcut.shift) continue; + + for (const pressedKey of ImprovedTube.input.pressed.keys.values()) { + if (!shortcut.keys.has(pressedKey)) continue check; + } - if (key.startsWith('shortcutQuality')) { - ImprovedTube['shortcutQuality'](key); - } else if (typeof ImprovedTube[key] === 'function') { - ImprovedTube[key](); - } + // cancel keydown/wheel event before we call target handler + // this way crashing handler wont keep 'cancelled' keys stuck + event.preventDefault(); + event.stopPropagation(); + // build 'cancelled' list so we also cancel keyup events + for (const pressedKey of ImprovedTube.input.pressed.keys.values()) { + ImprovedTube.input.cancelled.add(pressedKey); + } + + if (key.startsWith('shortcutQuality')) { + ImprovedTube['shortcutQuality'](key); + } else if (typeof ImprovedTube[key] === 'function') { + ImprovedTube[key](); } } }; @@ -93,8 +97,8 @@ ImprovedTube.shortcutsListeners = { // no shortcuts over 'ignoreElements' if ((document.activeElement && ImprovedTube.input.ignoreElements.includes(document.activeElement.tagName)) || event.target.isContentEditable) return; - if (!ImprovedTube.input.modifierKeys.includes(event.code) && !ImprovedTube.input.pressed.keys.includes(event.keyCode)) { - ImprovedTube.input.pressed.keys.push(event.keyCode); + if (!ImprovedTube.input.modifierKeys.includes(event.code)) { + ImprovedTube.input.pressed.keys.add(event.keyCode); } ImprovedTube.input.pressed.wheel = 0; ImprovedTube.input.pressed.alt = event.altKey; @@ -104,9 +108,7 @@ ImprovedTube.shortcutsListeners = { ImprovedTube.shortcutsHandler(); }, keyup: function (event) { - if (ImprovedTube.input.pressed.keys.includes(event.keyCode)) { - ImprovedTube.input.pressed.keys.splice(ImprovedTube.input.pressed.keys.indexOf(event.keyCode), 1); - } + ImprovedTube.input.pressed.keys.delete(event.keyCode); ImprovedTube.input.pressed.wheel = 0; ImprovedTube.input.pressed.alt = event.altKey; ImprovedTube.input.pressed.ctrl = event.ctrlKey; @@ -131,7 +133,7 @@ ImprovedTube.shortcutsListeners = { ImprovedTube.shortcutsHandler(); }, 'improvedtube-blur': function () { - ImprovedTube.input.pressed.keys = []; + ImprovedTube.input.pressed.keys.clear(); ImprovedTube.input.pressed.wheel = 0 ImprovedTube.input.pressed.alt = false; ImprovedTube.input.pressed.ctrl = false; From 78dfb74195e664d5e117cb7374bb226afb21c0a9 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 10:39:31 +0200 Subject: [PATCH 13/28] core.js pressed.keys cancelled turned into Set() for reliability --- js&css/web-accessible/core.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js&css/web-accessible/core.js b/js&css/web-accessible/core.js index 9719ebc6b..8e13771e5 100644 --- a/js&css/web-accessible/core.js +++ b/js&css/web-accessible/core.js @@ -62,13 +62,13 @@ var ImprovedTube = { listening: {}, listeners: {}, pressed: { - keys: [], + keys: new Set(), wheel: 0, alt: false, ctrl: false, shift: false }, - cancelled: [], + cancelled: new Set(), ignoreElements: ['EMBED', 'INPUT', 'OBJECT', 'TEXTAREA', 'IFRAME'], modifierKeys: ['AltLeft','AltRight','ControlLeft','ControlRight','ShiftLeft','ShiftRight'], }, From 58c2f51bbfaf1f5ba76098f089c00ff7e3a9237d Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 11:07:41 +0200 Subject: [PATCH 14/28] Update init.js playlistPopup, removed no longer needed invocation YT doesnt appear to remove this button, if it ever comes up individual mutation observer will be much lighter --- js&css/web-accessible/init.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/js&css/web-accessible/init.js b/js&css/web-accessible/init.js index 09686b909..9e6783bc4 100644 --- a/js&css/web-accessible/init.js +++ b/js&css/web-accessible/init.js @@ -14,10 +14,6 @@ ImprovedTube.observer = new MutationObserver(function (mutationList) { for (var j = 0, k = mutation.addedNodes.length; j < k; j++) { ImprovedTube.childHandler(mutation.addedNodes[j]); } - - for (const node of mutation.removedNodes){ - if(node.nodeName === 'BUTTON' && node.id === 'it-popup-playlist-button') ImprovedTube.playlistPopupUpdate(); - } } if (mutation.target && mutation.target.id === 'owner-sub-count') { // Extract and store the subscriber count @@ -39,7 +35,7 @@ ImprovedTube.observer = new MutationObserver(function (mutationList) { //console.log("p"+i+"c"+j+":"+node.id+",class:"+node.className+","+node+"("+node.nodeName+")"); j++;} let r = 0; for (const node of mutated.removedNodes){ //might fix our other playlist buttons equally? - if(node.nodeName === 'BUTTON' && node.id === 'it-popup-playlist-button') ImprovedTube.playlistPopupUpdate(); + if(node.nodeName === 'BUTTON' && node.id === 'it-popup-playlist-button') ImprovedTube.playlistPopup(); //console.log("p"+i+"removed"+r+":"+node.id+",class:"+node.className+","+node+"("+node.nodeName+")"+"(from:"+mutated.target.id+",class:"+mutated.target.className+","+mutated.target+"("+mutated.target.nodeName+")"); r++;} if(mutated.target.id === 'owner-sub-count') From 319d79a075690d44b088dcae769dd0e8e357d803 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 11:09:31 +0200 Subject: [PATCH 15/28] Update playlist.js playlistPopupUpdate > playlistPopup --- js&css/web-accessible/www.youtube.com/playlist.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js&css/web-accessible/www.youtube.com/playlist.js b/js&css/web-accessible/www.youtube.com/playlist.js index 39b62317b..16c4f231f 100644 --- a/js&css/web-accessible/www.youtube.com/playlist.js +++ b/js&css/web-accessible/www.youtube.com/playlist.js @@ -131,7 +131,7 @@ ImprovedTube.playlistShuffle = function () { ------------------------------------------------------------------------------*/ /** * ## Creates a playlist popup button (with ID `it-popup-playlist-button`) - * - used by/in {@linkcode ImprovedTube.playlistPopupUpdate} + * - used by/in {@linkcode ImprovedTube.playlistPopup} * - checks {@linkcode ImprovedTube.storage.player_autoplay_disable} if to autoplay the popuped playlist/video * - checks {@linkcode ImprovedTube.elements.player} to get video ID and current time, if available, otherwise starts first video of playlist * - popup has video players width/height or window (inner) width/height when video player is not available @@ -222,7 +222,7 @@ ImprovedTube.playlistPopupCreateButton = function (playlistID, altButtonStyle, c * - saves each button in {@linkcode ImprovedTube.elements.buttons} as `it-popup-playlist-button-playlist`, `it-popup-playlist-button-mini`, and `it-popup-playlist-button-panel` * - called from {@linkcode ImprovedTube.ytElementsHandler} and {@linkcode ImprovedTube.hrefObserver} when DOM changes (somewhat related to playlist renderers) */ -ImprovedTube.playlistPopupUpdate = function () { +ImprovedTube.playlistPopup = function () { "use strict"; if (this.storage.playlist_popup === true){ From 8d0b7e1f2b330bbef9aa170075555e0f67990af4 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 11:15:07 +0200 Subject: [PATCH 16/28] functions.js playlistPopupUpdate > playlistPopup, removed redundant invocation --- js&css/web-accessible/functions.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/js&css/web-accessible/functions.js b/js&css/web-accessible/functions.js index dc13ea260..10ef905da 100644 --- a/js&css/web-accessible/functions.js +++ b/js&css/web-accessible/functions.js @@ -85,7 +85,6 @@ ImprovedTube.ytElementsHandler = function (node) { this.playlistReverse(); } } - this.playlistPopupUpdate(); } else if (name === 'YTD-GUIDE-SECTION-RENDERER') { if (!this.elements.sidebar_section) { this.elements.sidebar_section = node; @@ -113,7 +112,7 @@ ImprovedTube.ytElementsHandler = function (node) { // this.hideDetailButton(node.querySelector('#flexible-item-buttons').children); // } else if (name === 'YTD-PLAYLIST-HEADER-RENDERER' || (name === 'YTD-MENU-RENDERER' && node.classList.contains('ytd-playlist-panel-renderer'))) { - this.playlistPopupUpdate(); + this.playlistPopup(); } else if (name === 'YTD-SUBSCRIBE-BUTTON-RENDERER' || name === 'YT-SUBSCRIBE-BUTTON-VIEW-MODEL' || (name === 'YTD-BUTTON-RENDERER' && node.classList.contains('ytd-c4-tabbed-header-renderer'))) { From 386c18a2ec8d9b27e395adf627af0ea5cf0e86b0 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 11:27:58 +0200 Subject: [PATCH 17/28] Update messages.json Chapter (Sidebar) On/Off --- _locales/en/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 81489258c..60c9898f9 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1128,13 +1128,13 @@ "message": "Share" }, "shortcut_chapters": { - "message": "Toggle sidebar Chapters" + "message": "Chapter (Sidebar) On/Off" }, "shortcut_screenshot": { "message": "Screenshot" }, "shortcut_transcript": { - "message": "Toggle sidebar Transcript" + "message": "Transcript (Sidebar) On/Off" }, "shortcuts": { "message": "Shortcuts" From df5e55268706b9ed903ccb809c83d293a3eab476 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 20:31:39 +0200 Subject: [PATCH 18/28] Update shortcuts.js missed Set().size --- .../www.youtube.com/shortcuts.js | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index edcb9dda5..264727cd9 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -23,25 +23,24 @@ ImprovedTube.shortcutsInit = function () { let potentialShortcut = {}; for (const button of ['alt','ctrl','shift','wheel','keys','toggle']) { switch(button) { - case 'alt': - case 'ctrl': - case 'shift': - case 'toggle': - potentialShortcut[button] = keys[button] || false; + case 'alt': + case 'ctrl': + case 'shift': + case 'toggle': + potentialShortcut[button] = keys[button] || false; break - case 'wheel': - potentialShortcut[button] = keys[button] || 0; + case 'wheel': + potentialShortcut[button] = keys[button] || 0; break case 'keys': - // array of sorted scancodes - potentialShortcut[button] = keys[button] ? new Set(Object.keys(keys[button]).map(s=>Number(s)).sort()) : new Set(); - + // set of unique scancodes + potentialShortcut[button] = keys[button] ? new Set(Object.keys(keys[button]).map(s=>Number(s))) : new Set(); break } } - if (potentialShortcut['keys'] || potentialShortcut['wheel']) listening[camelName] = potentialShortcut; + if (potentialShortcut['keys'].size || potentialShortcut['wheel']) listening[camelName] = potentialShortcut; } // initialize 'listeners' only if there are actual shortcuts active if (Object.keys(listening).length) { From 9ad481f6db41f76d24bbbcc7e64d80681c8d7b47 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 20:56:16 +0200 Subject: [PATCH 19/28] core.js setPlaybackRate > playbackSpeed, ESLint Errors --- js&css/web-accessible/core.js | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/js&css/web-accessible/core.js b/js&css/web-accessible/core.js index c66dee9ef..c5e032be4 100644 --- a/js&css/web-accessible/core.js +++ b/js&css/web-accessible/core.js @@ -70,7 +70,7 @@ var ImprovedTube = { }, cancelled: new Set(), ignoreElements: ['EMBED', 'INPUT', 'OBJECT', 'TEXTAREA', 'IFRAME'], - modifierKeys: ['AltLeft','AltRight','ControlLeft','ControlRight','ShiftLeft','ShiftRight'], + modifierKeys: ['AltLeft', 'AltRight', 'ControlLeft', 'ControlRight', 'ShiftLeft', 'ShiftRight'], }, mini_player__mode: false, mini_player__move: false, @@ -435,18 +435,14 @@ document.addEventListener('it-message-from-extension', function () { ImprovedTube.played_before_blur = ImprovedTube.elements.player.getPlayerState() === 1; ImprovedTube.elements.player.pauseVideo(); } - } else if (message.hasOwnProperty('setVolume')) { - if (ImprovedTube.elements.player) { - ImprovedTube.elements.player.setVolume(message.setVolume); - } - } else if (message.hasOwnProperty('setPlaybackSpeed')) { - if (ImprovedTube.elements.player) { - ImprovedTube.elements.player.setPlaybackRate(message.setPlaybackSpeed); - } + } else if (message.setVolume) { + ImprovedTube.elements.player?.setVolume(message.setVolume); + } else if (message.setPlaybackSpeed) { + ImprovedTube.playbackSpeed(message.setPlaybackSpeed); } else if (message.deleteCookies === true) { ImprovedTube.deleteYoutubeCookies(); - } else if (message.hasOwnProperty('responseOptionsUrl')) { - var iframe = document.querySelector('.it-button__iframe'); + } else if (message.responseOptionsUrl) { + const iframe = document.querySelector('.it-button__iframe'); if (iframe) { iframe.src = message.responseOptionsUrl; From dee8f3b7beaf9c1938a38f2108994f3f4d539990 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 21:09:34 +0200 Subject: [PATCH 20/28] Update init.js dangling space --- js&css/web-accessible/init.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js&css/web-accessible/init.js b/js&css/web-accessible/init.js index 9c3f490f1..a599b78c8 100644 --- a/js&css/web-accessible/init.js +++ b/js&css/web-accessible/init.js @@ -80,7 +80,7 @@ if (ImprovedTube.storage.channel_default_tab && ImprovedTube.storage.channel_def ImprovedTube.init = function () { window.addEventListener('yt-page-data-updated', function () { - ImprovedTube.pageType(); + ImprovedTube.pageType(); if (location.search.match(ImprovedTube.regex.playlist_id)) { ImprovedTube.playlistRepeat(); ImprovedTube.playlistShuffle(); From 57e544a4175523bf5d803971491901094e706a1a Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 21:25:38 +0200 Subject: [PATCH 21/28] Update shortcuts.js ESLint errors --- js&css/web-accessible/www.youtube.com/shortcuts.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index 95d4878c1..4c304d5c3 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -9,9 +9,7 @@ WARNING: Browser Debugger Breakpoint downstream from keydown() event will eat co ImprovedTube.shortcutsInit = function () { // those four are _references_ to source Objects, not copies const listening = ImprovedTube.input.listening, - listeners = ImprovedTube.input.listeners, - pressed = ImprovedTube.input.pressed, - cancelled = ImprovedTube.input.cancelled; + listeners = ImprovedTube.input.listeners; // reset 'listening' shortcuts for (var key in listening) delete listening[key]; @@ -22,7 +20,7 @@ ImprovedTube.shortcutsInit = function () { const camelName = name.replace(/_(.)/g, (m, l) => l.toUpperCase()); let potentialShortcut = {}; for (const button of ['alt', 'ctrl', 'shift', 'wheel', 'keys', 'toggle']) { - switch(button) { + switch (button) { case 'alt': case 'ctrl': case 'shift': @@ -549,7 +547,7 @@ ImprovedTube.shortcutPopupPlayer = function () { if (player && document.documentElement.dataset.pageType === 'video') { player.pauseVideo(); - window.open('//www.youtube.com/embed/' + location.href.match(/watch\?v=([A-Za-z0-9\-\_]+)/g)[0].slice(8) + '?start=' + parseInt(player.getCurrentTime()) + '&autoplay=' + (ImprovedTube.storage.player_autoplay_disable ? '0' : '1'), '_blank', 'directories=no,toolbar=no,location=no,menubar=no,status=no,titlebar=no,scrollbars=no,resizable=no,width=' + player.offsetWidth + ',height=' + player.offsetHeight); + window.open('//www.youtube.com/embed/' + location.href.match(ImprovedTube.regex.video_id)?.[1] + '?start=' + parseInt(player.getCurrentTime()) + '&autoplay=' + (ImprovedTube.storage.player_autoplay_disable ? '0' : '1'), '_blank', 'directories=no,toolbar=no,location=no,menubar=no,status=no,titlebar=no,scrollbars=no,resizable=no,width=' + player.offsetWidth + ',height=' + player.offsetHeight); } }; /*------------------------------------------------------------------------------ From 8b1ff5317f17cc3d5313eb90c4be1ab6a2d4290e Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Thu, 4 Jul 2024 21:28:25 +0200 Subject: [PATCH 22/28] Update playlist.js eslint --- js&css/web-accessible/www.youtube.com/playlist.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/js&css/web-accessible/www.youtube.com/playlist.js b/js&css/web-accessible/www.youtube.com/playlist.js index d38ee36a9..88eb3d1bf 100644 --- a/js&css/web-accessible/www.youtube.com/playlist.js +++ b/js&css/web-accessible/www.youtube.com/playlist.js @@ -58,8 +58,6 @@ ImprovedTube.playlistReverse = function () { button.id = 'it-reverse-playlist'; button.className = 'style-scope yt-icon-button'; button.addEventListener('click', function (event) { - var playlist_manager = document.querySelector('yt-playlist-manager'); - event.preventDefault(); event.stopPropagation(); From e036f1779ea602a07f9ca00a06c25480ca3bd55c Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Fri, 5 Jul 2024 03:56:32 +0200 Subject: [PATCH 23/28] shortcuts.js shortcutChapters shortcutTranscript btureforce fallback --- .../www.youtube.com/shortcuts.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index 4c304d5c3..789fa9963 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -400,11 +400,25 @@ ImprovedTube.shortcutActivateCaptions = function () { }; /*------Chapters------*/ ImprovedTube.shortcutChapters = function () { - document.querySelector('[target-id*=chapters][visibility*=HIDDEN]') ? document.querySelector('[modern-chapters] #navigation-button button[aria-label]').click() : document.querySelector('[target-id*=chapters][visibility*=EXPANDED] #visibility-button button[aria-label]')?.click(); + const available = document.querySelector('[target-id*=chapters][visibility*=HIDDEN]') || document.querySelector('[target-id*=chapters]').clientHeight; + if (available) { + const modernChapters = document.querySelector('[modern-chapters] #navigation-button button[aria-label]'); + modernChapters ? modernChapters.click() || document.querySelector('[target-id*=chapters]')?.removeAttribute('visibility'); + } else { + const visibilityButton = document.querySelector('[target-id*=chapters][visibility*=EXPANDED] #visibility-button button[aria-label]'); + visibilityButton ? visibilityButton.click() || document.querySelector('*[target-id*=chapters] #visibility-button button')?.click(); + } }; /*------Transcript------*/ ImprovedTube.shortcutTranscript = function () { - document.querySelector('[target-id*=transcript][visibility*=HIDDEN]') ? document.querySelector('ytd-video-description-transcript-section-renderer button[aria-label]')?.click() : document.querySelector('[target-id*=transcript][visibility*=EXPANDED] #visibility-button button[aria-label]').click(); + const available = document.querySelector('[target-id*=transcript][visibility*=HIDDEN]') || document.querySelector('[target-id*=transcript]').clientHeight; + if (available) { + const descriptionTranscript = document.querySelector('ytd-video-description-transcript-section-renderer button[aria-label]'); + descriptionTranscript ? descriptionTranscript.click() || document.querySelector('[target-id*=transcript]')?.removeAttribute('visibility'); + } else { + const transcriptButton = document.querySelector('ytd-video-description-transcript-section-renderer button[aria-label]'); + visibilityButton ? visibilityButton.click() || document.querySelector('[target-id*=transcript] #visibility-button button')?.click(); + } }; /*------------------------------------------------------------------------------ 4.7.22 LIKE From 966f3fbbb4f6f6c98412856cb9a167d270e4f8fc Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Fri, 5 Jul 2024 04:00:14 +0200 Subject: [PATCH 24/28] Update shortcuts.js error messages --- js&css/web-accessible/www.youtube.com/shortcuts.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index 789fa9963..9b69de214 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -408,6 +408,9 @@ ImprovedTube.shortcutChapters = function () { const visibilityButton = document.querySelector('[target-id*=chapters][visibility*=EXPANDED] #visibility-button button[aria-label]'); visibilityButton ? visibilityButton.click() || document.querySelector('*[target-id*=chapters] #visibility-button button')?.click(); } + if (!modernChapters && visibilityButton) { + console.error('shortcutChapters: Cant fint proper Enble button, falling back to unreliable bruteforce method'); + } }; /*------Transcript------*/ ImprovedTube.shortcutTranscript = function () { @@ -419,6 +422,9 @@ ImprovedTube.shortcutTranscript = function () { const transcriptButton = document.querySelector('ytd-video-description-transcript-section-renderer button[aria-label]'); visibilityButton ? visibilityButton.click() || document.querySelector('[target-id*=transcript] #visibility-button button')?.click(); } + if (!descriptionTranscript && transcriptButton) { + console.error('shortcutTranscript: Cant fint proper Enble button, falling back to unreliable bruteforce method'); + } }; /*------------------------------------------------------------------------------ 4.7.22 LIKE From e369e601400048f639de7a7809027a51d704a696 Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Fri, 5 Jul 2024 04:10:57 +0200 Subject: [PATCH 25/28] Update shortcuts.js typos --- js&css/web-accessible/www.youtube.com/shortcuts.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index 9b69de214..25f337499 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -403,10 +403,10 @@ ImprovedTube.shortcutChapters = function () { const available = document.querySelector('[target-id*=chapters][visibility*=HIDDEN]') || document.querySelector('[target-id*=chapters]').clientHeight; if (available) { const modernChapters = document.querySelector('[modern-chapters] #navigation-button button[aria-label]'); - modernChapters ? modernChapters.click() || document.querySelector('[target-id*=chapters]')?.removeAttribute('visibility'); + modernChapters ? modernChapters.click() : document.querySelector('[target-id*=chapters]')?.removeAttribute('visibility'); } else { const visibilityButton = document.querySelector('[target-id*=chapters][visibility*=EXPANDED] #visibility-button button[aria-label]'); - visibilityButton ? visibilityButton.click() || document.querySelector('*[target-id*=chapters] #visibility-button button')?.click(); + visibilityButton ? visibilityButton.click() : document.querySelector('*[target-id*=chapters] #visibility-button button')?.click(); } if (!modernChapters && visibilityButton) { console.error('shortcutChapters: Cant fint proper Enble button, falling back to unreliable bruteforce method'); @@ -417,10 +417,10 @@ ImprovedTube.shortcutTranscript = function () { const available = document.querySelector('[target-id*=transcript][visibility*=HIDDEN]') || document.querySelector('[target-id*=transcript]').clientHeight; if (available) { const descriptionTranscript = document.querySelector('ytd-video-description-transcript-section-renderer button[aria-label]'); - descriptionTranscript ? descriptionTranscript.click() || document.querySelector('[target-id*=transcript]')?.removeAttribute('visibility'); + descriptionTranscript ? descriptionTranscript.click() : document.querySelector('[target-id*=transcript]')?.removeAttribute('visibility'); } else { const transcriptButton = document.querySelector('ytd-video-description-transcript-section-renderer button[aria-label]'); - visibilityButton ? visibilityButton.click() || document.querySelector('[target-id*=transcript] #visibility-button button')?.click(); + visibilityButton ? visibilityButton.click() : document.querySelector('[target-id*=transcript] #visibility-button button')?.click(); } if (!descriptionTranscript && transcriptButton) { console.error('shortcutTranscript: Cant fint proper Enble button, falling back to unreliable bruteforce method'); From e828ff6d6f7db1eae10a40da3c97891ccf48f26e Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Fri, 5 Jul 2024 04:13:11 +0200 Subject: [PATCH 26/28] Update shortcuts.js cut&paste error --- js&css/web-accessible/www.youtube.com/shortcuts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index 25f337499..53b1605fb 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -420,7 +420,7 @@ ImprovedTube.shortcutTranscript = function () { descriptionTranscript ? descriptionTranscript.click() : document.querySelector('[target-id*=transcript]')?.removeAttribute('visibility'); } else { const transcriptButton = document.querySelector('ytd-video-description-transcript-section-renderer button[aria-label]'); - visibilityButton ? visibilityButton.click() : document.querySelector('[target-id*=transcript] #visibility-button button')?.click(); + transcriptButton ? transcriptButton.click() : document.querySelector('[target-id*=transcript] #visibility-button button')?.click(); } if (!descriptionTranscript && transcriptButton) { console.error('shortcutTranscript: Cant fint proper Enble button, falling back to unreliable bruteforce method'); From 5eccbc9b53cba044cd2266645eb48a1bdae9853c Mon Sep 17 00:00:00 2001 From: Rasz_pl Date: Sun, 7 Jul 2024 12:09:49 +0200 Subject: [PATCH 27/28] Update shortcuts.js safety --- js&css/web-accessible/www.youtube.com/shortcuts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js&css/web-accessible/www.youtube.com/shortcuts.js b/js&css/web-accessible/www.youtube.com/shortcuts.js index 53b1605fb..97d7a0a71 100644 --- a/js&css/web-accessible/www.youtube.com/shortcuts.js +++ b/js&css/web-accessible/www.youtube.com/shortcuts.js @@ -121,7 +121,7 @@ ImprovedTube.shortcutsListeners = { }, wheel: function (event) { // shortcuts with wheel allowed ONLY inside player - if (!ImprovedTube.elements.player.contains(event.target)) return; + if (!ImprovedTube.elements.player?.contains(event.target)) return; ImprovedTube.input.pressed.wheel = event.deltaY > 0 ? 1 : -1; ImprovedTube.input.pressed.alt = event.altKey; From 3bcc3b724bfd35943a2f53cd53313efd1f836fa2 Mon Sep 17 00:00:00 2001 From: ImprovedTube Date: Mon, 8 Jul 2024 09:24:42 +0200 Subject: [PATCH 28/28] Update messages.json --- _locales/en/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index e5fb86f86..a2e44c150 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1131,7 +1131,7 @@ "message": "Share" }, "shortcut_chapters": { - "message": "Chapter (Sidebar) On/Off" + "message": "Chapters (Sidebar) On/Off" }, "shortcut_screenshot": { "message": "Screenshot"