diff --git a/Homely/manifest.chrome.json b/Homely/manifest.chrome.json index f34a53a..b4b440e 100644 --- a/Homely/manifest.chrome.json +++ b/Homely/manifest.chrome.json @@ -19,29 +19,14 @@ "fontSettings", "storage" ], + "optional_host_permissions": [ + "*://*/*" + ], "optional_permissions": [ "bookmarks", "history", "management" ], - "optional_host_permissions": [ - "https://www.amazon.co.uk/", - "https://www.amazon.com/", - "http://cart.payments.ebay.co.uk/", - "https://www.facebook.com/", "https://m.facebook.com/", - "https://github.com/", - "https://accounts.google.com/", "https://mail.google.com/", - "https://www.linkedin.com/", - "https://login.live.com/", "https://*.mail.live.com/", - "https://www.reddit.com/", - "https://steamcommunity.com/", - "https://store.steampowered.com/", - "https://ticktick.com/", - "https://trello.com/", - "https://twitter.com/", - "http://api.openweathermap.org/", - "http://www.whatismyproxy.com/" - ], "icons": { "16": "res/img/icon-16.png", "48": "res/img/logo-48.png", diff --git a/Homely/manifest.firefox.json b/Homely/manifest.firefox.json index caea7d7..16b8d9f 100644 --- a/Homely/manifest.firefox.json +++ b/Homely/manifest.firefox.json @@ -17,26 +17,13 @@ "permissions": [ "storage" ], + "optional_host_permissions": [ + "*://*/*" + ], "optional_permissions": [ "bookmarks", "history", - "management", - "https://www.amazon.co.uk/", - "https://www.amazon.com/", - "http://cart.payments.ebay.co.uk/", - "https://www.facebook.com/", "https://m.facebook.com/", - "https://github.com/", - "https://accounts.google.com/", "https://mail.google.com/", - "https://www.linkedin.com/", - "https://login.live.com/", "https://*.mail.live.com/", - "https://www.reddit.com/", - "https://steamcommunity.com/", - "https://store.steampowered.com/", - "https://ticktick.com/", - "https://trello.com/", - "https://twitter.com/", - "http://api.openweathermap.org/", - "http://www.whatismyproxy.com/" + "management" ], "icons": { "16": "res/img/icon-16.png", diff --git a/Homely/res/css/homely.css b/Homely/res/css/homely.css index 2128246..0bbfebe 100644 --- a/Homely/res/css/homely.css +++ b/Homely/res/css/homely.css @@ -68,6 +68,31 @@ body.topbar-fix { border-color: #222; color: #fff; } +.btn-accent { + background-color: #ddd; + border-color: #d4d4d4; + color: #333; +} +.btn-accent:hover, +.btn-accent:focus, +.btn-accent:active, +.btn-accent.active { + background-color: #cfcfcf; + border-color: #c3c3c3; +} +.panel-dark .btn-accent { + background-color: #444; + border-color: #404040; + color: #fff; +} +.panel-dark .btn-accent:hover, +.panel-dark .btn-accent:focus, +.panel-dark .btn-accent:active, +.panel-dark .btn-accent.active { + background-color: #333; + border-color: #222; + color: #fff; +} .panel.panel-dark { background-color: #222; border-color: #080808; @@ -99,6 +124,17 @@ a { #links .panel-body .btn { white-space: normal; } +#links .btn-label { + position: relative; +} +#links .btn-icon { + height: 24px; + width: 24px; + position: absolute; + right: calc(100% + 6px); + top: 50%; + transform: translateY(-50%); +} #links-editor .alert { margin-bottom: 0; } diff --git a/Homely/res/js/background.js b/Homely/res/js/background.js index 20f3b1a..8433aab 100644 --- a/Homely/res/js/background.js +++ b/Homely/res/js/background.js @@ -1,3 +1,20 @@ +// Proxy image fetches through the background script to bypass cross-origin canvas tainting +chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { + if (msg.type === "fetchImage" && msg.url) { + fetch(msg.url).then(function(resp) { + return resp.blob(); + }).then(function(blob) { + var reader = new FileReader(); + reader.onloadend = function() { + sendResponse({dataUrl: reader.result}); + }; + reader.readAsDataURL(blob); + }).catch(function() { + sendResponse({dataUrl: null}); + }); + return true; + } +}); var links; chrome.omnibox.onInputStarted.addListener(function() { chrome.storage.local.get("links", function(store) { diff --git a/Homely/res/js/homely.js b/Homely/res/js/homely.js index ec5a100..8d82987 100644 --- a/Homely/res/js/homely.js +++ b/Homely/res/js/homely.js @@ -15,6 +15,45 @@ $(document).ready(function() { var label = function label(text, settings) { return [" ", $("").addClass("menu-label").html(text)]; } + // Average the non-transparent, non-white, non-black pixels of an image to produce a representative color for accent buttons + var extractColor = function extractColor(img, callback) { + try { + var canvas = document.createElement("canvas"); + canvas.width = 16; + canvas.height = 16; + var ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0, 16, 16); + var data = ctx.getImageData(0, 0, 16, 16).data; + var r = 0, g = 0, b = 0, count = 0; + for (var i = 0; i < data.length; i += 4) { + var pr = data[i], pg = data[i + 1], pb = data[i + 2], pa = data[i + 3]; + if (pa < 128) continue; + if (pr > 240 && pg > 240 && pb > 240) continue; + if (pr < 15 && pg < 15 && pb < 15) continue; + r += pr; + g += pg; + b += pb; + count++; + } + if (count > 0) { + callback("rgb(" + Math.round(r / count) + "," + Math.round(g / count) + "," + Math.round(b / count) + ")"); + return true; + } + } catch(e) {} + return false; + } + // Try to extract the dominant color directly; fall back to re-fetching via the background script if the canvas is tainted by cross-origin data + var getDominantColor = function getDominantColor(img, callback) { + if (extractColor(img, callback)) return; + chrome.runtime.sendMessage({type: "fetchImage", url: img.src}, function(resp) { + if (chrome.runtime.lastError) return; + if (resp && resp.dataUrl) { + var fetchedImg = new Image(); + fetchedImg.onload = function() { extractColor(fetchedImg, callback); }; + fetchedImg.src = resp.dataUrl; + } + }); + } var manif = chrome.runtime.getManifest(); // default settings var settings = { @@ -744,8 +783,9 @@ $(document).ready(function() { var btn; if (linkBtn.menu) { btn = $("
").addClass("btn-group btn-block"); - btn.append($("