<!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>