code-charity / youtube

[top~1 open YouTube & Video web-extension] Enrich your experience & choice! 🧰100+clever features📌set&forget📌Longest-standing(yet rare&tough alone. Please help/join🧩us👨‍👩‍👧‍👧) ..⋮ {playback|content discovery|player|extra buttons|distractions|related videos|shorts|ads|quality|codec|full tab|full screen}
http://improvedtube.com
Other
3.29k stars 498 forks source link

playerControls() multiple problems #2381

Closed raszpl closed 1 week ago

raszpl commented 1 week ago

1. Its being called multiple times during page load, and in different order depending on browser! :o

FF:

videoPageUpdate
initPlayer
videoPageUpdate
playerOnPause

Chrome:

playerOnPause
videoPageUpdate
initPlayer
playerOnPause

Vivaldi:

videoPageUpdate
initPlayer
videoPageUpdate

Looks like Vivaldi bug or implementation quirk - it doesnt send pause event without explicit user input (click)? :/

Its wasteful, but thats a small fry. The problem is YT mutating page multiple times while loading. Here is a log of playerand player.parentNode from FF during consequent playerControls() calls:

videoPageUpdate:

0: <div id="movie_player" class="html5-video-player ytp-t…sed-mode ytp-menu-shown" tabindex="-1" data-version="/s/player/74204f6c/player_ias.vflset/en_US/base.js" aria-label="YouTube Video Player" style="transform: translate(0px);">​
1: <div id="player-api" class="round " style="width: 1280px; height: 720px;">

initPlayer:

2: <div id="movie_player" class="html5-video-player ytp-t…sed-mode ytp-menu-shown" tabindex="-1" data-version="/s/player/74204f6c/player_ias.vflset/en_US/base.js" aria-label="YouTube Video Player" style="transform: translate(0px);">​
3: <div id="player-api" class="round " style="width: 1280px; height: 720px;">

videoPageUpdate:

4: <div id="movie_player" class="html5-video-player ytp-t…sed-mode ytp-menu-shown" tabindex="-1" data-version="/s/player/74204f6c/player_ias.vflset/en_US/base.js" aria-label="YouTube Video Player" style="transform: translate(0px);">​
5: <div id="player-api" class="round " style="width: 1280px; height: 720px;">

playerOnPause:

6: <div id="movie_player" class="html5-video-player ytp-t…sed-mode ytp-menu-shown" tabindex="-1" data-version="/s/player/74204f6c/player_ias.vflset/en_US/base.js" aria-label="YouTube Video Player" style="transform: translate(0px);">​
7: <div id="container" class="style-scope ytd-player">

playerstays the same, but playerControls() sets listeners on player.parentNode, and that becomes the proper final element only on last playerOnPause call. Vivaldi fails to send 'pause' event and breaks here.

Why is the code adding listeners on ImprovedTube.elements.player.parentNode player parent and not player itself?


2. it keeps adding new listeners on every pause

https://github.com/code-charity/youtube/blob/2bbf665a08704b5aeba467c4e55d9a940a9c87b3/js%26css/web-accessible/www.youtube.com/player.js#L996-L999 pause 10 times and you have 10 listeners doing same thing. Theoretically its possible to keep browsing videos with extension piling listeners until js engine gives up and browser crashes.

3. core.js:160 Uncaught TypeError: ImprovedTube.whenPaused is not a function

https://github.com/code-charity/youtube/blob/2bbf665a08704b5aeba467c4e55d9a940a9c87b3/js%26css/web-accessible/core.js#L200-L202

some leftover code?

4. Uncaught TypeError: player.showControls is not a function

https://github.com/code-charity/youtube/issues/2378 shows up in embeds because embeds dont have player controls :)

raszpl commented 1 week ago

all 4 handled: https://github.com/code-charity/youtube/pull/2382 + implemented https://github.com/code-charity/youtube/issues/1976

raszpl commented 1 week ago

Looks like Vivaldi bug or implementation quirk - it doesnt send pause event without explicit user input (click)? :/ Vivaldi fails to send 'pause' event and breaks here.

Fixed itself after restart. Might have been caused by disabling/enabling/restarting/reloading extension for two days straight in same browser session.