12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- /**
- * Free the VIDEO elements: get rid of overlays, and enable the native controls.
- *
- * Useful on https://www.instagram.com/ where the stupid overlays prevent
- * showing the controls and triggering the context menu, so you don’t know how
- * long the video will take and can't play the video in full screen mode.
- *
- * @title Free Viddy
- */
- (function freeviddy() {
- /* Recursively execute the main logic on the document and its sub-documents. */
- function execute(document) {
- document.addEventListener('touchmove mousemove', function debouncer(event) {
- clearTimeout(debouncer.timeoutId);
- debouncer.timeoutId = setTimeout(function () {
- let elementsUnderPointer = document.elementsFromPoint(event.clientX, event.clientY);
- let overlaysToRemove = [];
- for (let i = 0; i < elementsUnderPointer.length; i++) {
- if ((elementsUnderPointer[i].tagName.toUpperCase() === 'VIDEO' ||
- elementsUnderPointer[i].tagName.toUpperCase() === 'IFRAME') && !elementsUnderPointer[i].xxxJanFreeViddyProcessed) {
- let video = elementsUnderPointer[i];
- video.controls = true;
- video.xxxJanFreeViddyProcessed = true;
- if (i === 0) {
- } else {
- overlaysToRemove = elementsUnderPointer.slice(0, i);
- }
- break;
- }
- }
- if (overlaysToRemove.length) {
- overlaysToRemove.forEach(element => element.remove());
- }
- }, 50);
- });
- /* Recurse for frames and iframes. */
- try {
- Array.from(
- document.querySelectorAll('frame, iframe, object[type^="text/html"], object[type^="application/xhtml+xml"]')
- ).forEach(
- elem => execute(elem.contentDocument)
- );
- } catch (e) {
- /* Catch exceptions for out-of-domain access, but do not do anything with them. */
- }
- }
- execute(document);
- })();
|