Greasy Fork

Video Full Screen In Tab

让所有视频网页全屏 Maximize all video players

目前为 2014-09-23 提交的版本。查看 最新版本

// ==UserScript==
// @name        Video Full Screen In Tab
// @namespace   http://www.icycat.com
// @description 让所有视频网页全屏 Maximize all video players
// @author      冻猫
// @include     *
// @version     3.0
// @grant       none
// @run-at      document-end
// ==/UserScript==

(function() {

	var fullStatus = false,
		parentArray = new Array(),
		parentStyle = new Array(),
		browser, btnText, player, parent, backStyle, controlBtn, leftBtn, rightBtn, observer;

	addStyle('.videoToothbrush .parentToothbrush, .videoToothbrush .parentToothbrush object {width:100% !important;height:100% !important;}');
	addStyle('.videoToothbrush .parentToothbrush .playerToothbrush {width:calc(100% - 2px) !important;height:100% !important;}');

	if (navigator.language == 'zh-CN') {
		btnText = {
			out: '网页全屏',
			inner: '内层全屏',
			restore: '还原大小'
		};
	} else {
		btnText = {
			out: 'Maximize',
			inner: 'Maximize',
			restore: 'Restore'
		};
	}

	if (navigator.userAgent.match(/Firefox/i)) {
		browser = 'firefox';
	} else if (navigator.userAgent.match(/Chrome/i)) {
		browser = 'chrome';
	} else {
		browser = 'other';
	}

	createButton();
	createFullButton();

	observer = new MutationObserver(function(mutation) {
		if (fullStatus) {
			observer.disconnect();
			resizeHandle();
			observer.observe(parent, {
				attributes: true,
				subtree: true
			});
		} else {
			if (isFull()) {
				observer.disconnect();
				controlBtn.style.display = '';
			}
		}
	});

	document.addEventListener('mouseover', getPlayer, false);

	function getPlayer(e) {
		if (fullStatus) {
			return;
		}
		var target = e.target;
		var nodeName = target.nodeName;
		switch (nodeName) {
			case 'OBJECT':
			case 'EMBED':
				if (target.type == 'application/x-shockwave-flash' && target.offsetWidth > 99 && target.offsetHeight > 99) {
					player = target;
					parent = player.parentNode;
					if (parent.nodeName == 'OBJECT') {
						parent = parent.parentNode;
					}
					buttonHandle();
				}
				break;
			case 'IFRAME':
			case 'VIDEO':
				if (target.offsetWidth > 99 && target.offsetHeight > 99) {
					player = target;
					parent = player.parentNode;
					buttonHandle();
				}
				break;
		}
	}

	function createButton() {
		addStyle('#playerControlBtn {visibility:hidden;opacity:0;transition: all 0.5s ease;display:none;cursor: pointer;font: 12px "微软雅黑";padding: 2px 2px 3px 2px;margin:0;width:60px;height:16px;border:none;text-align: center;position: absolute;z-index:2147483646;background-color: #27A9D8;color: #FFF;} #playerControlBtn:hover {visibility:visible;opacity:1;background-color:#2774D8;}');
		var btn = document.createElement('tbdiv');
		btn.id = 'playerControlBtn';
		btn.onclick = function() {
			playerControl();
		};
		document.body.appendChild(btn);
		controlBtn = document.getElementById('playerControlBtn');
	}

	function createFullButton() {
		var leftButton = document.createElement('tbdiv');
		leftButton.id = 'leftFullStackButton';
		leftButton.onclick = function() {
			playerControl();
		};
		document.body.appendChild(leftButton);
		addStyle('#leftFullStackButton{display:none;position:fixed;width:1px;height:100%;top:0;left:0;z-index:2147483646;}');
		var rightButton = document.createElement('tbdiv');
		rightButton.id = 'rightFullStackButton';
		rightButton.onclick = function() {
			playerControl();
		};
		document.body.appendChild(rightButton);
		addStyle('#rightFullStackButton{display:none;position:fixed;width:1px;height:100%;top:0;right:0;z-index:2147483646;}');
		leftBtn = document.getElementById('leftFullStackButton');
		rightBtn = document.getElementById('rightFullStackButton');
	}

	function buttonHandle() {
		if (isFull()) {
			return;
		}
		observer.observe(parent, {
			attributes: true,
			subtree: true
		});
		buttonRect();
	}

	function buttonRect() {
		player.addEventListener('mouseleave', hideHandle, false);
		controlBtn.style.display = 'block';
		controlBtn.style.visibility = 'visible';
		var playerRect = getRect(player);
		if (playerRect.pageY < 21 || fullStatus) {
			if (fullStatus) {
				playerRect.pageY = playerRect.pageY + 50;
				playerRect.pageX = playerRect.pageX - 30;
				controlBtn.innerHTML = btnText.restore;
			} else {
				playerRect.pageY = playerRect.pageY + 26;
				playerRect.pageX = playerRect.pageX - 31;
				controlBtn.innerHTML = btnText.inner;
			}
			if (browser == 'firefox') {
				controlBtn.style.transition = 'all 0s';
				controlBtn.style.opacity = '1';
			} else {
				controlBtn.style.transition = '';
				controlBtn.style.opacity = '0.5';
			}
		} else {
			controlBtn.style.transition = '';
			controlBtn.style.opacity = '0.5';
			controlBtn.innerHTML = btnText.out;
		}
		controlBtn.style.top = playerRect.pageY - 21 + 'px';
		controlBtn.style.left = playerRect.pageX - 64 + player.offsetWidth + 'px';
	}

	function hideHandle() {
		controlBtn.style.opacity = '';
		controlBtn.style.visibility = '';
		if (!fullStatus) {
			observer.disconnect();
		}
		player.removeEventListener('mouseleave', hideHandle, false);
	}

	function getRect(element) {
		var rect = element.getBoundingClientRect();
		var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
		var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
		return {
			pageX: rect.left + scrollLeft,
			pageY: rect.top + scrollTop
		};
	}

	function isFull() {
		if (Math.abs(document.body.offsetWidth - player.offsetWidth) < 5 && Math.abs(document.body.offsetHeight - player.offsetHeight) < 5) {
			return true;
		} else {
			return false;
		}
	}

	function addStyle(css) {
		var style = document.createElement('style');
		style.type = 'text/css';
		var node = document.createTextNode(css);
		style.appendChild(node);
		document.head.appendChild(style);
	}

	function playerControl() {
		checkPlayer();
		if (!fullStatus) {
			fullWin();
			observer.observe(parent, {
				attributes: true,
				subtree: true
			});
		} else {
			observer.disconnect();
			smallWin();
		}
	}

	function checkPlayer() {
		parentArray = [];
		var full = parent;
		while (full = full.parentNode) {
			if (full.getAttribute) {
				parentArray.push(full);
			}
			if (full.nodeName == 'HTML') {
				break;
			}
		}
	}

	function resizeHandle() {
		if (parent.style.width != '100%') {
			backStyle.parentWidth = parent.style.width;
		}
		if (parent.style.height != '100%') {
			backStyle.parentHeight = parent.style.height;
		}
		if (player.style.width != 'calc(100% - 2px)') {
			backStyle.playerWidth = player.style.width;
		}
		if (player.style.height != '100%') {
			backStyle.playerHeight = player.style.height;
		}
		if (parent.style.width != '100%' || parent.style.height != '100%' || player.style.width != 'calc(100% - 2px)' || player.style.height != '100%') {
			fullWin();
		}
	}

	function fullWin() {
		if (!fullStatus) {
			document.removeEventListener('mouseover', getPlayer, false);
			if (browser == 'chrome') {
				player.addEventListener('mouseover', buttonRect, false);
			}
			parent.parentNode.classList.add('videoToothbrush');
			parent.classList.add('parentToothbrush')
			player.classList.add('playerToothbrush');
			window.addEventListener('resize', resizeHandle, false);
			backStyle = {
				html: document.body.parentNode.style.overflow,
				body: document.body.style.overflow,
				parent: parent.style.cssText,
				parentWidth: parent.style.width,
				parentHeight: parent.style.height,
				player: player.style.cssText,
				playerWidth: player.style.width,
				playerHeight: player.style.height
			};
			leftBtn.style.display = 'block';
			rightBtn.style.display = 'block';
			controlBtn.style.display = '';
			if (player.nodeName == 'VIDEO') {
				backStyle.controls = player.controls;
				player.controls = true;
			}
		}
		document.body.parentNode.style.overflow = 'hidden';
		document.body.style.overflow = 'hidden';
		for (var i = 0; i < parentArray.length; i++) {
			if (!fullStatus) {
				parentStyle[i] = {
					zIndex: parentArray[i].style.zIndex
				};
			}
			parentArray[i].style.setProperty('z-index', 'auto', 'important');
		}
		parent.style.cssText = 'width:100%;height:100%;margin:0px !important;padding:0px !important;top:0px !important;left:0px !important;z-index:2147483645 !important;overflow:hidden !important;position:fixed !important;background:#000 !important;border:none !important;display:block !important;';
		player.style.cssText = 'display:' + getComputedStyle(player).display + ' !important;visibility:' + getComputedStyle(player).visibility + ' !important;width:calc(100% - 2px);height:100%;z-index:2147483645 !important;position:relative !important;border:none !important;';
		var rect = player.getBoundingClientRect();
		player.style.left = (1 - rect.left) + 'px';
		player.style.top = (0 - rect.top) + 'px';
		fullStatus = true;
	}

	function smallWin() {
		if (browser == 'chrome') {
			player.removeEventListener('mouseover', buttonRect, false);
		}
		parent.parentNode.classList.remove('videoToothbrush');
		parent.classList.remove('parentToothbrush')
		player.classList.remove('playerToothbrush');
		window.removeEventListener('resize', resizeHandle, false);
		document.body.parentNode.style.overflow = backStyle.html;
		document.body.style.overflow = backStyle.body;
		for (var i = 0; i < parentArray.length; i++) {
			parentArray[i].style.zIndex = parentStyle[i].zIndex;
		}
		parent.style.cssText = backStyle.parent;
		parent.style.width = backStyle.parentWidth;
		parent.style.height = backStyle.parentHeight;
		player.style.cssText = backStyle.player;
		player.style.width = backStyle.playerWidth;
		player.style.height = backStyle.playerHeight;
		if (player.nodeName == 'VIDEO') {
			player.controls = backStyle.controls;
		}
		leftBtn.style.display = '';
		rightBtn.style.display = '';
		controlBtn.style.display = '';
		document.addEventListener('mouseover', getPlayer, false);
		fullStatus = false;
	}

})();