290 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			290 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html>
 | 
						|
<html>
 | 
						|
 | 
						|
<head>
 | 
						|
	<meta charset="UTF-8">
 | 
						|
	<style>
 | 
						|
		html {
 | 
						|
			height: 100%;
 | 
						|
			width: 100%;
 | 
						|
			margin: 0px;
 | 
						|
		}
 | 
						|
 | 
						|
		::-webkit-scrollbar { display: none; }
 | 
						|
 | 
						|
		body {
 | 
						|
			margin: 0px;
 | 
						|
			padding: 0px;
 | 
						|
			width: 100%;
 | 
						|
			height: 100%;
 | 
						|
			font-family: sans-serif;
 | 
						|
			font-size: 22pt;
 | 
						|
			-webkit-tap-highlight-color: #ccc;
 | 
						|
			background-color: #DDD;
 | 
						|
			-webkit-user-select: none;
 | 
						|
			-khtml-user-select: none;
 | 
						|
			-moz-user-select: none;
 | 
						|
			-ms-user-select: none;
 | 
						|
			user-select: none;
 | 
						|
			-webkit-hyphens: auto;
 | 
						|
			hyphens: auto;
 | 
						|
			/* https://davidwalsh.name/font-smoothing */
 | 
						|
			-webkit-font-smoothing: antialiased;
 | 
						|
			-moz-osx-font-smoothing: grayscale;
 | 
						|
			-webkit-app-region: drag;
 | 
						|
		}
 | 
						|
 | 
						|
		header {
 | 
						|
			position: absolute;
 | 
						|
			width: 100%;
 | 
						|
			height: 24px;
 | 
						|
		}
 | 
						|
 | 
						|
		#progressBar {
 | 
						|
			position: absolute;
 | 
						|
			background-color: rgb(165, 165, 196);
 | 
						|
			width: 0%;
 | 
						|
			height: 24px;
 | 
						|
		}
 | 
						|
 | 
						|
		#info {
 | 
						|
			width: 100%;
 | 
						|
			margin: 3px;
 | 
						|
			font-size: 16px;
 | 
						|
			position: absolute;
 | 
						|
			text-align:center;
 | 
						|
		}
 | 
						|
	</style>
 | 
						|
	<title>
 | 
						|
		Browser
 | 
						|
	</title>
 | 
						|
</head>
 | 
						|
 | 
						|
<body style="width: 100%; height: 100%; -webkit-app-region: no-drag">
 | 
						|
	<header id="header" style="-webkit-app-region: drag">
 | 
						|
		<div id="progressBar"></div>
 | 
						|
		<span id="info">Minimal Header</span>
 | 
						|
	</header>
 | 
						|
	<main></main>
 | 
						|
</body>
 | 
						|
<script>
 | 
						|
	const { ipcRenderer } = require("electron")
 | 
						|
 | 
						|
	let urls = new Set()
 | 
						|
	let favicons = new Set()
 | 
						|
	let progress = 0
 | 
						|
 | 
						|
	info.innerHTML = window.location.href
 | 
						|
 | 
						|
	function notify(url) {
 | 
						|
		if (urls.has(url)) return
 | 
						|
		console.log(url)
 | 
						|
		//header.innerHTML += `<p>${url}</p>`
 | 
						|
		urls.add(url)
 | 
						|
	}
 | 
						|
 | 
						|
	let colorExtractorCanvas = document.createElement('canvas')
 | 
						|
	let colorExtractorContext = colorExtractorCanvas.getContext('2d')
 | 
						|
	let colorExtractorImage = document.createElement('img')
 | 
						|
 | 
						|
	function getColor(url, callback) {
 | 
						|
		colorExtractorImage.onload = function (e) {
 | 
						|
			let w = colorExtractorImage.width
 | 
						|
			let h = colorExtractorImage.height
 | 
						|
			colorExtractorCanvas.width = w
 | 
						|
			colorExtractorCanvas.height = h
 | 
						|
			let offset = Math.max(1, Math.round(0.00032 * w * h))
 | 
						|
			colorExtractorContext.drawImage(colorExtractorImage, 0, 0, w, h)
 | 
						|
			let data = colorExtractorContext.getImageData(0, 0, w, h).data
 | 
						|
			let pixels = {}
 | 
						|
			let d, add, sum
 | 
						|
			for (let i = 0; i < data.length; i += 4 * offset) {
 | 
						|
				d = Math.round(data[i] / 5) * 5 + ',' + Math.round(data[i + 1] / 5) * 5 + ',' + Math.round(data[i + 2] / 5) * 5
 | 
						|
				add = 1
 | 
						|
				sum = data[i] + data[i + 1] + data[i + 2]
 | 
						|
				// very dark or light pixels shouldn't be counted as heavily
 | 
						|
				if (sum < 310) {
 | 
						|
					add = 0.35
 | 
						|
				}
 | 
						|
				if (sum < 50) {
 | 
						|
					add = 0.01
 | 
						|
				}
 | 
						|
				if (data[i] > 210 || data[i + 1] > 210 || data[i + 2] > 210) {
 | 
						|
					add = 0.5 - (0.0001 * sum)
 | 
						|
				}
 | 
						|
				if (pixels[d]) {
 | 
						|
					pixels[d] = pixels[d] + add
 | 
						|
				} else {
 | 
						|
					pixels[d] = add
 | 
						|
				}
 | 
						|
			}
 | 
						|
			// find the largest pixel set
 | 
						|
			let largestPixelSet = null
 | 
						|
			let ct = 0
 | 
						|
			for (let k in pixels) {
 | 
						|
				if (k === '255,255,255' || k === '0,0,0') {
 | 
						|
					pixels[k] *= 0.05
 | 
						|
				}
 | 
						|
				if (pixels[k] > ct) {
 | 
						|
					largestPixelSet = k
 | 
						|
					ct = pixels[k]
 | 
						|
				}
 | 
						|
			}
 | 
						|
			let res = largestPixelSet.split(',')
 | 
						|
 | 
						|
			for (let i = 0; i < res.length; i++) {
 | 
						|
				res[i] = parseInt(res[i])
 | 
						|
			}
 | 
						|
			callback(res)
 | 
						|
		}
 | 
						|
		colorExtractorImage.src = url
 | 
						|
	}
 | 
						|
 | 
						|
	function getTextColor(bgColor) {
 | 
						|
		let output = runNetwork(bgColor)
 | 
						|
		if (output.black > 0.5) {
 | 
						|
			return 'black'
 | 
						|
		}
 | 
						|
		return 'white'
 | 
						|
	}
 | 
						|
 | 
						|
	var runNetwork = function anonymous(input) {
 | 
						|
		var net = {
 | 
						|
			'layers': [{
 | 
						|
				'r': {},
 | 
						|
				'g': {},
 | 
						|
				'b': {}
 | 
						|
			}, {
 | 
						|
				'0': {
 | 
						|
					'bias': 14.176907520571566,
 | 
						|
					'weights': {
 | 
						|
						'r': -3.2764240497480652,
 | 
						|
						'g': -16.90247884718719,
 | 
						|
						'b': -2.9976364179397814
 | 
						|
					}
 | 
						|
				},
 | 
						|
				'1': {
 | 
						|
					'bias': 9.086071102351246,
 | 
						|
					'weights': {
 | 
						|
						'r': -4.327474143397604,
 | 
						|
						'g': -15.780660155750773,
 | 
						|
						'b': 2.879230202567851
 | 
						|
					}
 | 
						|
				},
 | 
						|
				'2': {
 | 
						|
					'bias': 22.274487339773476,
 | 
						|
					'weights': {
 | 
						|
						'r': -3.5830205067960965,
 | 
						|
						'g': -25.498384261673618,
 | 
						|
						'b': -6.998329189107962
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}, {
 | 
						|
				'black': {
 | 
						|
					'bias': 17.873962570788997,
 | 
						|
					'weights': {
 | 
						|
						'0': -15.542217788633987,
 | 
						|
						'1': -13.377152708685674,
 | 
						|
						'2': -24.52215186113144
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}],
 | 
						|
			'outputLookup': true,
 | 
						|
			'inputLookup': true
 | 
						|
		}
 | 
						|
 | 
						|
		for (var i = 1; i < net.layers.length; i++) {
 | 
						|
			var layer = net.layers[i]
 | 
						|
			var output = {}
 | 
						|
 | 
						|
			for (var id in layer) {
 | 
						|
				var node = layer[id]
 | 
						|
				var sum = node.bias
 | 
						|
 | 
						|
				for (var iid in node.weights) {
 | 
						|
					sum += node.weights[iid] * input[iid]
 | 
						|
				}
 | 
						|
				output[id] = (1 / (1 + Math.exp(-sum)))
 | 
						|
			}
 | 
						|
			input = output
 | 
						|
		}
 | 
						|
		return output
 | 
						|
	}
 | 
						|
 | 
						|
	function applyColors(backgroundColor, foregroundColor) {
 | 
						|
		console.log("applyColors", backgroundColor, foregroundColor)
 | 
						|
		progressBar.style.backgroundColor = backgroundColor
 | 
						|
		info.style.color = foregroundColor
 | 
						|
	}
 | 
						|
 | 
						|
	ipcRenderer.on('title', (sender, title) => {
 | 
						|
		info.innerHTML = title
 | 
						|
	})
 | 
						|
 | 
						|
	ipcRenderer.on('favicons', (sender, urls) => {
 | 
						|
		console.log("favicons event", urls)
 | 
						|
		for (let url of urls) {
 | 
						|
			if (!favicons.has(url)) {
 | 
						|
				getColor(url, c => {
 | 
						|
					let cr = 'rgb(' + c[0] + ',' + c[1] + ',' + c[2] + ')'
 | 
						|
					let obj = {
 | 
						|
						r: c[0] / 255,
 | 
						|
						g: c[1] / 255,
 | 
						|
						b: c[2] / 255
 | 
						|
					}
 | 
						|
					let textclr = getTextColor(obj)
 | 
						|
					applyColors(cr, textclr)
 | 
						|
				})
 | 
						|
			}
 | 
						|
			favicons.add(url)
 | 
						|
		}
 | 
						|
	})
 | 
						|
 | 
						|
	ipcRenderer.on('progress', (sender, amount) => {
 | 
						|
		console.log("progress event", amount)
 | 
						|
		if (amount > progress) {
 | 
						|
			progress = Math.min(amount, 1)
 | 
						|
		}
 | 
						|
		progressBar.style.width = Math.round(progress * 100) + '%'
 | 
						|
	})
 | 
						|
 | 
						|
	ipcRenderer.on('did-start-loading', (sender, url) => {
 | 
						|
		console.log('did-start-loading', url)
 | 
						|
	})
 | 
						|
 | 
						|
	ipcRenderer.on('did-get-response-details', (sender, info) => {
 | 
						|
		let {
 | 
						|
		status, newURL, originalURL,
 | 
						|
			httpResponseCode,
 | 
						|
			requestMethod,
 | 
						|
			referrer,
 | 
						|
			headers,
 | 
						|
			resourceType
 | 
						|
		} = info
 | 
						|
		notify(newURL)
 | 
						|
		notify(originalURL)
 | 
						|
		//console.log('did-get-response-details', info)
 | 
						|
	})
 | 
						|
	ipcRenderer.on('did-get-redirect-request', (sender, info) => {
 | 
						|
		let { oldURL,
 | 
						|
			newURL,
 | 
						|
			isMainFrame,
 | 
						|
			httpResponseCode,
 | 
						|
			requestMethod,
 | 
						|
			referrer,
 | 
						|
			headers
 | 
						|
	} = info
 | 
						|
		notify(newURL)
 | 
						|
		notify(oldURL)
 | 
						|
		//console.log('did-get-response-details', info)
 | 
						|
	})
 | 
						|
	ipcRenderer.on('did-stop-loading', (sender, info) => {
 | 
						|
		//console.log('did-stop-loading', info)
 | 
						|
	})
 | 
						|
 | 
						|
	
 | 
						|
 | 
						|
</script>
 | 
						|
 | 
						|
</html>
 |