@@ -8,7 +8,9 @@ const YT_SELECTORS = {
8
8
embedPlayer : '.html5-video-player' ,
9
9
largePlayButton : '.ytp-large-play-button' ,
10
10
thumbnail : '.ytp-cued-thumbnail-overlay-image' ,
11
- embedTitle : '.ytp-title-text'
11
+ embedTitle : '.ytp-title-text' ,
12
+ queueHandle : 'ytd-playlist-panel-video-renderer' ,
13
+ playbackControls : '.ytp-left-controls'
12
14
} ;
13
15
const ENABLE_LOGS = true ;
14
16
const logDebug = ( ...args ) => ENABLE_LOGS && console . log ( LOGTAG , ...args ) ;
@@ -142,6 +144,56 @@ class YoutubeExtension {
142
144
}
143
145
}
144
146
147
+ // Fix for the draggable items to continue being draggable when a context menu is displayed.
148
+ // https://github.com/MozillaReality/FirefoxReality/issues/2611
149
+ fixQueueContextMenu ( ) {
150
+ const handles = document . querySelectorAll ( YT_SELECTORS . queueHandle ) ;
151
+ for ( var i = 0 ; i < handles . length ; i ++ ) {
152
+ handles [ i ] . removeEventListener ( 'contextmenu' , this . onContextMenu ) ;
153
+ handles [ i ] . addEventListener ( 'contextmenu' , this . onContextMenu ) ;
154
+ }
155
+ }
156
+
157
+ onContextMenu ( event ) {
158
+ setTimeout ( ( ) => {
159
+ var evt = document . createEvent ( "MouseEvents" ) ;
160
+ evt . initEvent ( "mouseup" , true , true ) ;
161
+ event . target . dispatchEvent ( evt ) ;
162
+ } ) ;
163
+
164
+ // This is supposed to prevent the context menu from showing but it doesn't seem to work
165
+ event . preventDefault ( ) ;
166
+ event . stopPropagation ( ) ;
167
+ event . stopImmediatePropagation ( ) ;
168
+ return false ;
169
+ }
170
+
171
+ // Prevent the double click to reach the player to avoid double clicking
172
+ // to trigger a playback forward event.
173
+ // https://github.com/MozillaReality/FirefoxReality/issues/2947
174
+ videoControlsForwardFix ( ) {
175
+ const playbackControls = document . querySelector ( YT_SELECTORS . playbackControls ) ;
176
+ playbackControls . removeEventListener ( "touchstart" , this . videoControlsOnTouchStart ) ;
177
+ playbackControls . addEventListener ( "touchstart" , this . videoControlsOnTouchStart ) ;
178
+ playbackControls . removeEventListener ( "touchend" , this . videoControlsOnTouchEnd ) ;
179
+ playbackControls . addEventListener ( "touchend" , this . videoControlsOnTouchEnd ) ;
180
+ }
181
+
182
+ videoControlsOnTouchStart ( evt ) {
183
+ evt . stopPropagation ( ) ;
184
+ return false ;
185
+ }
186
+
187
+ videoControlsOnTouchEnd ( evt ) {
188
+ evt . stopPropagation ( ) ;
189
+ return false ;
190
+ }
191
+
192
+ playerFixes ( ) {
193
+ this . fixQueueContextMenu ( ) ;
194
+ this . videoControlsForwardFix ( ) ;
195
+ }
196
+
145
197
// Runs the callback when the video is ready (has loaded the first frame).
146
198
waitForVideoReady ( callback ) {
147
199
this . retry ( "VideoReady" , ( ) => {
@@ -235,6 +287,7 @@ youtube.overrideViewport();
235
287
window . addEventListener ( 'load' , ( ) => {
236
288
logDebug ( 'page load' ) ;
237
289
youtube . overrideVideoProjection ( ) ;
290
+ youtube . fixQueueContextMenu ( ) ;
238
291
// Wait until video has loaded the first frame to force quality change.
239
292
// This prevents the infinite spinner problem.
240
293
// See https://github.com/MozillaReality/FirefoxReality/issues/1433
@@ -246,3 +299,5 @@ window.addEventListener('load', () => {
246
299
window . addEventListener ( 'pushstate' , ( ) => youtube . overrideVideoProjection ( ) ) ;
247
300
window . addEventListener ( 'popstate' , ( ) => youtube . overrideVideoProjection ( ) ) ;
248
301
window . addEventListener ( 'click' , event => youtube . overrideClick ( event ) ) ;
302
+ window . addEventListener ( 'mouseup' , event => youtube . playerFixes ( ) ) ;
303
+ window . addEventListener ( "yt-navigate-start" , ( ) => youtube . playerFixes ( ) ) ;
0 commit comments