mirror of
				https://github.com/SoPat712/videospeed.git
				synced 2025-10-29 18:30:35 -04:00 
			
		
		
		
	imported shadowMutations from ally.js
This commit is contained in:
		
							
								
								
									
										209
									
								
								inject.js
									
									
									
									
									
								
							
							
						
						
									
										209
									
								
								inject.js
									
									
									
									
									
								
							| @@ -449,6 +449,215 @@ | |||||||
|       if (document.querySelector('apple-tv-plus-player')) { |       if (document.querySelector('apple-tv-plus-player')) { | ||||||
|         console.log('Congratulations. There is the apple-tv-plus-player.') |         console.log('Congratulations. There is the apple-tv-plus-player.') | ||||||
|       } |       } | ||||||
|  |  | ||||||
|  |       // start of ally.js/src/observe/shadow-mutations.js | ||||||
|  |       // import nodeArray from '../util/node-array'; | ||||||
|  |         // input may be undefined, selector-tring, Node, NodeList, HTMLCollection, array of Nodes | ||||||
|  |         // yes, to some extent this is a bad replica of jQuery's constructor function | ||||||
|  |         function nodeArray(input) { | ||||||
|  |           if (!input) { | ||||||
|  |             return []; | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           if (Array.isArray(input)) { | ||||||
|  |             return input; | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           // instanceof Node - does not work with iframes | ||||||
|  |           if (input.nodeType !== undefined) { | ||||||
|  |             return [input]; | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           if (typeof input === 'string') { | ||||||
|  |             input = document.querySelectorAll(input); | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           if (input.length !== undefined) { | ||||||
|  |             return [].slice.call(input, 0); | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           throw new TypeError('unexpected input ' + String(input)); | ||||||
|  |         } | ||||||
|  |       //import queryShadowHosts from '../query/shadow-hosts'; | ||||||
|  |         //import contextToElement from '../util/context-to-element'; | ||||||
|  |           //import nodeArray from '../util/node-array'; already imported | ||||||
|  |  | ||||||
|  |         function contextToElement({ | ||||||
|  |           context, | ||||||
|  |           label = 'context-to-element', | ||||||
|  |           resolveDocument, | ||||||
|  |           defaultToDocument, | ||||||
|  |         }) { | ||||||
|  |           let element = nodeArray(context)[0]; | ||||||
|  |  | ||||||
|  |           if (resolveDocument && element && element.nodeType === Node.DOCUMENT_NODE) { | ||||||
|  |             element = element.documentElement; | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           if (!element && defaultToDocument) { | ||||||
|  |             return document.documentElement; | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           if (!element) { | ||||||
|  |             throw new TypeError(label + ' requires valid options.context'); | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           if (element.nodeType !== Node.ELEMENT_NODE && element.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) { | ||||||
|  |             throw new TypeError(label + ' requires options.context to be an Element'); | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           return element; | ||||||
|  |         } | ||||||
|  |           //import getDocument from '../util/get-document'; | ||||||
|  |           function getDocument(node) { | ||||||
|  |           if (!node) { | ||||||
|  |             return document; | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           if (node.nodeType === Node.DOCUMENT_NODE) { | ||||||
|  |             return node; | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           return node.ownerDocument || document; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // see https://developer.mozilla.org/en-US/docs/Web/API/NodeFilter | ||||||
|  |         const filter = function(node) { | ||||||
|  |         if (node.shadowRoot) { | ||||||
|  |           return NodeFilter.FILTER_ACCEPT; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return NodeFilter.FILTER_SKIP; | ||||||
|  |         }; | ||||||
|  |         // IE requires a function, Browsers require {acceptNode: function} | ||||||
|  |         // see http://www.bennadel.com/blog/2607-finding-html-comment-nodes-in-the-dom-using-treewalker.htm | ||||||
|  |         filter.acceptNode = filter; | ||||||
|  |  | ||||||
|  |         function queryShadowHosts({ context } = {}) { | ||||||
|  |         const element = contextToElement({ | ||||||
|  |           label: 'query/shadow-hosts', | ||||||
|  |           resolveDocument: true, | ||||||
|  |           defaultToDocument: true, | ||||||
|  |           context, | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         const _document = getDocument(context); | ||||||
|  |         // see https://developer.mozilla.org/en-US/docs/Web/API/Document/createTreeWalker | ||||||
|  |         const walker = _document.createTreeWalker( | ||||||
|  |           // root element to start search in | ||||||
|  |           element, | ||||||
|  |           // element type filter | ||||||
|  |           NodeFilter.SHOW_ELEMENT, | ||||||
|  |           // custom NodeFilter filter | ||||||
|  |           filter, | ||||||
|  |           // deprecated, but IE requires it | ||||||
|  |           false | ||||||
|  |         ); | ||||||
|  |  | ||||||
|  |         let list = []; | ||||||
|  |  | ||||||
|  |         if (element.shadowRoot) { | ||||||
|  |           // TreeWalker does not run the filter on the context element | ||||||
|  |           list.push(element); | ||||||
|  |           list = list.concat(queryShadowHosts({ | ||||||
|  |             context: element.shadowRoot, | ||||||
|  |           })); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         while (walker.nextNode()) { | ||||||
|  |           list.push(walker.currentNode); | ||||||
|  |           list = list.concat(queryShadowHosts({ | ||||||
|  |             context: walker.currentNode.shadowRoot, | ||||||
|  |           })); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return list; | ||||||
|  |         } | ||||||
|  |       //import contextToElement from '../util/context-to-element'; already imported | ||||||
|  |  | ||||||
|  |       const shadowObserverConfig = { | ||||||
|  |         childList: true, | ||||||
|  |         subtree: true, | ||||||
|  |       }; | ||||||
|  |  | ||||||
|  |       class ShadowMutationObserver { | ||||||
|  |         constructor({context, callback, config} = {}) { | ||||||
|  |           this.config = config; | ||||||
|  |  | ||||||
|  |           this.disengage = this.disengage.bind(this); | ||||||
|  |  | ||||||
|  |           this.clientObserver = new MutationObserver(callback); | ||||||
|  |           this.hostObserver = new MutationObserver(mutations => mutations.forEach(this.handleHostMutation, this)); | ||||||
|  |  | ||||||
|  |           this.observeContext(context); | ||||||
|  |           this.observeShadowHosts(context); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         disengage() { | ||||||
|  |           this.clientObserver && this.clientObserver.disconnect(); | ||||||
|  |           this.clientObserver = null; | ||||||
|  |           this.hostObserver && this.hostObserver.disconnect(); | ||||||
|  |           this.hostObserver = null; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         observeShadowHosts(context) { | ||||||
|  |           const hosts = queryShadowHosts({ | ||||||
|  |             context, | ||||||
|  |           }); | ||||||
|  |  | ||||||
|  |           hosts.forEach(element => this.observeContext(element.shadowRoot)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         observeContext(context) { | ||||||
|  |           this.clientObserver.observe(context, this.config); | ||||||
|  |           this.hostObserver.observe(context, shadowObserverConfig); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         handleHostMutation(mutation) { | ||||||
|  |           if (mutation.type !== 'childList') { | ||||||
|  |             return; | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           const addedElements = nodeArray(mutation.addedNodes).filter(element => element.nodeType === Node.ELEMENT_NODE); | ||||||
|  |           addedElements.forEach(this.observeShadowHosts, this); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       function shadowMutations(context, callback, config) { | ||||||
|  |         if (typeof callback !== 'function') { | ||||||
|  |           throw new TypeError('observe/shadow-mutations requires options.callback to be a function'); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (typeof config !== 'object') { | ||||||
|  |           throw new TypeError('observe/shadow-mutations requires options.config to be an object'); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (!window.MutationObserver) { | ||||||
|  |           // not supporting IE10 via Mutation Events, because they're too expensive | ||||||
|  |           // https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events | ||||||
|  |           return { | ||||||
|  |             disengage: function() {}, | ||||||
|  |           }; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         const element = contextToElement({ | ||||||
|  |           label: 'observe/shadow-mutations', | ||||||
|  |           resolveDocument: true, | ||||||
|  |           defaultToDocument: true, | ||||||
|  |           context, | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         const service = new ShadowMutationObserver({ | ||||||
|  |           context: element, | ||||||
|  |           callback, | ||||||
|  |           config, | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         return { | ||||||
|  |           disengage: service.disengage, | ||||||
|  |         }; | ||||||
|  |       } | ||||||
|  |       //end of ally.js/src/observe/shadow-mutations.js | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   function runAction(action, document, value, e) { |   function runAction(action, document, value, e) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jonathan Dawson
					Jonathan Dawson