diff --git a/128.png b/128.png index 1961df30..d3579ad6 100644 Binary files a/128.png and b/128.png differ diff --git a/16.png b/16.png index 8a9a639e..e8838956 100644 Binary files a/16.png and b/16.png differ diff --git a/19.png b/19.png index 9ea02343..69babc93 100644 Binary files a/19.png and b/19.png differ diff --git a/19w.png b/19w.png new file mode 100644 index 00000000..9114915e Binary files /dev/null and b/19w.png differ diff --git a/38.png b/38.png new file mode 100644 index 00000000..7bfe1329 Binary files /dev/null and b/38.png differ diff --git a/38w.png b/38w.png new file mode 100644 index 00000000..32f216a7 Binary files /dev/null and b/38w.png differ diff --git a/48.png b/48.png index 746b53fb..4f5dd29d 100644 Binary files a/48.png and b/48.png differ diff --git a/apply.js b/apply.js index 179a0817..7c141c8d 100644 --- a/apply.js +++ b/apply.js @@ -14,8 +14,8 @@ function requestStyles() { if (location.href.indexOf(chrome.extension.getURL("")) == 0) { var bg = chrome.extension.getBackgroundPage(); if (bg && bg.getStyles) { + // apply styles immediately, then proceed with a normal request that will update the icon bg.getStyles(request, applyStyles); - return; } } chrome.extension.sendMessage(request, applyStyles); diff --git a/background.js b/background.js index 8ad9d131..9c011585 100644 --- a/background.js +++ b/background.js @@ -2,6 +2,7 @@ // why the content script also asks for this stuff. chrome.webNavigation.onCommitted.addListener(webNavigationListener.bind(this, "styleApply")); chrome.webNavigation.onHistoryStateUpdated.addListener(webNavigationListener.bind(this, "styleReplaceAll")); +chrome.webNavigation.onBeforeNavigate.addListener(webNavigationListener.bind(this, null)); function webNavigationListener(method, data) { // Until Chrome 41, we can't target a frame with a message // (https://developer.chrome.com/extensions/tabs#method-sendMessage) @@ -11,19 +12,21 @@ function webNavigationListener(method, data) { return; } getStyles({matchUrl: data.url, enabled: true, asHash: true}, function(styleHash) { - chrome.tabs.sendMessage(data.tabId, {method: method, styles: styleHash}); - // Don't show the badge for frames - if (data.frameId == 0 && prefs.getPref("show-badge")) { - delete styleHash.disableAll; - chrome.browserAction.setBadgeText({text: getBadgeText(Object.keys(styleHash)), tabId: data.tabId}); + if (method) { + chrome.tabs.sendMessage(data.tabId, {method: method, styles: styleHash}); } + updateIcon({id: data.tabId}, styleHash) }); } chrome.extension.onMessage.addListener(function(request, sender, sendResponse) { switch (request.method) { case "getStyles": - getStyles(request, sendResponse); + var styles = getStyles(request, sendResponse); + if (request.matchUrl && sender && sender.tab && sender.frameId == 0) { + // this is a main content frame, so update the icon + updateIcon(sender.tab, styles); + } return true; case "saveStyle": saveStyle(request, sendResponse); @@ -123,11 +126,11 @@ function getStyles(options, callback) { } }); callback(styles); + return styles; } if (cachedStyles) { - callCallback(); - return; + return callCallback(); } getDatabase(function(db) { diff --git a/manifest.json b/manifest.json index 98f13be6..e2c2ba5e 100644 --- a/manifest.json +++ b/manifest.json @@ -5,7 +5,7 @@ "homepage_url": "https://userstyles.org", "manifest_version": 2, "icons": { - "16": "16.png", + "16": "16.png", "48": "48.png", "128": "128.png" }, @@ -43,7 +43,10 @@ ], "options_page": "manage.html", "browser_action": { - "default_icon": "19.png", + "default_icon": { + "19": "19w.png", + "38": "38w.png" + }, "default_title": "Stylish", "default_popup": "popup.html" }, diff --git a/messaging.js b/messaging.js index 6921f1f0..0f6032a0 100644 --- a/messaging.js +++ b/messaging.js @@ -3,7 +3,7 @@ function notifyAllTabs(request) { windows.forEach(function(win) { win.tabs.forEach(function(tab) { chrome.tabs.sendMessage(tab.id, request); - updateBadgeText(tab); + updateIcon(tab); }); }); }); @@ -16,24 +16,45 @@ function notifyAllTabs(request) { chrome.extension.sendMessage(reqPopup); } -function updateBadgeText(tab) { - if (prefs.getPref("show-badge")) { - function stylesReceived(styles) { - var t = getBadgeText(styles); - console.log("Tab " + tab.id + " (" + tab.url + ") badge text set to '" + t + "'."); - chrome.browserAction.setBadgeText({text: t, tabId: tab.id}); - } - // if we have access to this, call directly. a page sending a message to itself doesn't seem to work right. - if (typeof getStyles != "undefined") { - getStyles({matchUrl: tab.url, enabled: true}, stylesReceived); - } else { - chrome.extension.sendMessage({method: "getStyles", matchUrl: tab.url, enabled: true}, stylesReceived); - } +var defaultBadgeColor = "red"; +chrome.browserAction.getBadgeBackgroundColor({}, function(color) { + defaultBadgeColor = color; +}); + +function updateIcon(tab, styles) { + if (styles) { + // check for not-yet-existing tabs e.g. omnibox instant search + chrome.tabs.get(tab.id, function() { + if (!chrome.runtime.lastError) { + // for 'styles' asHash:true fake the length by counting numeric ids manually + if (styles.length === undefined) { + styles.length = 0; + for (var id in styles) { + styles.length += id.match(/^\d+$/) ? 1 : 0; + } + } + stylesReceived(styles); + } + }); + return; + } + // if we have access to this, call directly. a page sending a message to itself doesn't seem to work right. + if (typeof getStyles != "undefined") { + getStyles({matchUrl: tab.url, enabled: true}, stylesReceived); } else { - chrome.browserAction.setBadgeText({text: "", tabId: tab.id}); + chrome.extension.sendMessage({method: "getStyles", matchUrl: tab.url, enabled: true}, stylesReceived); + } + + function stylesReceived(styles) { + var disableAll = prefs.getPref("disableAll"); + var postfix = styles.length == 0 || disableAll ? "w" : ""; + chrome.browserAction.setIcon({ + path: {19: "19" + postfix + ".png", 38: "38" + postfix + ".png"}, + tabId: tab.id + }); + var t = prefs.getPref("show-badge") && styles.length ? ("" + styles.length) : ""; + chrome.browserAction.setBadgeText({text: t, tabId: tab.id}); + chrome.browserAction.setBadgeBackgroundColor({color: disableAll ? "#aaa" : defaultBadgeColor}); + //console.log("Tab " + tab.id + " (" + tab.url + ") badge text set to '" + t + "'."); } } - -function getBadgeText(styles) { - return styles.length == 0 ? "" : ("" + styles.length); -}