Google Search restore URLs (undo breadcrumbs)

Brings back the full URLs in results.

Fra 20.04.2020. Se den seneste versjonen.

// ==UserScript==
// @name         Google Search restore URLs (undo breadcrumbs)
// @namespace    https://greatest.deepsurf.us/en/users/27283-mutationobserver
// @version      2020.04.20v10
// @description  Brings back the full URLs in results.
// @author       MutationObserver
// @match        https://*.google.com/search?*
// @include     /^https?://(?:www|encrypted|ipv[46])\.google\.[^/]+/(?:$|[#?]|search|webhp)/
// @grant        none
// ==/UserScript==

var results = document.querySelectorAll(".r");
if (navigator.userAgent.includes("Firefox/")) document.body.classList.add("url-restore-userscript-FIREFOX");

if (results) {
	var linkFontSize;
	var originalWidths = [];
	for (i=0; i < results.length; i++) {
		try {
			var dropdownArrow = results[i].querySelector('[aria-label="Result Options"]');
			if (dropdownArrow) { 
				dropdownArrow.parentElement.parentElement.parentElement.classList.add("url-restore-userscript-dropdownArrow");
			}
			var oldWidth = results[i].offsetWidth;
			originalWidths.push(oldWidth);
			var link = results[i].querySelector(".r a").getAttribute("href");			
			var linkElemsAll = results[i].querySelectorAll("cite");
			var linkElem = linkElemsAll[0];
			linkElemsAll.forEach(function(e) {
				e.innerHTML = link;
			});
			linkElem.innerHTML = link;
			
			if (!linkFontSize) linkFontSize = window.getComputedStyle(linkElem, null).getPropertyValue('font-size');
			linkElem.setAttribute("data-full-link", link);
		}
		catch(e){
			console.error(e, "Google Search restore URLs - ERROR on result #" + i);
			continue;
		}
	}
	
	setTimeout(function() {
		for (i=0; i < results.length; i++) {
			var linkElemsAll = results[i].querySelectorAll("cite");
			var linkElem = linkElemsAll[0];
			var currentWidth = linkElem.offsetWidth;
			if (currentWidth > (originalWidths[i] * 0.9)) {
				var link_truncated = linkTruncate(linkElem.innerHTML)
				linkElemsAll.forEach(function(e) {
					e.innerHTML = link_truncated;
					e.setAttribute("data-trunc-link", link_truncated);
					e.parentElement.setAttribute("onmouseover", 'linkTruncationState(this, "off")');
					e.parentElement.setAttribute("onmouseout", 'linkTruncationState(this, "on")');
					e.classList.add("url-restore-userscript-truncated");
				});
				results[i].classList.add("url-restore-userscript-truncated");
			}
		}
	}, 100);
	
	document.querySelector("body").insertAdjacentHTML("afterbegin", `
		<style id="url-restore-userscript">
			.url-restore-userscript-HOVER .url-restore-userscript-dropdownArrow {
				position: absolute;
			}
			
			cite[data-full-link] { color: green; }
			
			/* Firefox workaround (issue: some link <cites> are half-width) */
			.url-restore-userscript-FIREFOX .url-restore-userscript-dropdownArrow {
				position: absolute;
				right: -2em;
			}
			.url-restore-userscript-FIREFOX cite {
				display: inline-block;
				width: max-content;
			}
		</style>
	`);
	
}

function linkTruncate(str) {
  if (str.length > 80) {
    return str.substr(0, 37) + '...' + str.substr(str.length-40, str.length);
  }
  return str;
}

window.linkTruncationState = function(elem, state) {
	elems = elem.parentElement.parentElement.querySelectorAll("cite");
	switch(state) {
		case "off":
			var linkFull = elems[0].getAttribute("data-full-link");
			elems.forEach(function(e) {
				e.innerHTML = linkFull;
			});
			break;
		case "on":
			elems.forEach(function(e) {
				e.innerHTML = e.getAttribute("data-trunc-link");
			});
			break;
	}
	
	elems[0].parentElement.parentElement.parentElement.classList.toggle("url-restore-userscript-HOVER");
}