From c60a21cf12e4b9400a2f711fd103d08d7b6844a5 Mon Sep 17 00:00:00 2001 From: tophf Date: Thu, 21 May 2015 12:34:44 +0300 Subject: [PATCH] New Tab Page: fixup for icon, badge, popup style list --- apply.js | 3 --- background.js | 21 ++++++++------------- messaging.js | 48 +++++++++++++++++++++++++++++++++++++++++------- popup.js | 16 +++------------- 4 files changed, 52 insertions(+), 36 deletions(-) diff --git a/apply.js b/apply.js index 7c141c8d..79b9981f 100644 --- a/apply.js +++ b/apply.js @@ -41,9 +41,6 @@ chrome.extension.onMessage.addListener(function(request, sender, sendResponse) { case "styleReplaceAll": replaceAll(request.styles, document); break; - case "realURL": - sendResponse(location.href); - break; case "styleDisableAll": disableAll(request.disableAll); break; diff --git a/background.js b/background.js index 9c011585..889c715f 100644 --- a/background.js +++ b/background.js @@ -15,7 +15,7 @@ function webNavigationListener(method, data) { if (method) { chrome.tabs.sendMessage(data.tabId, {method: method, styles: styleHash}); } - updateIcon({id: data.tabId}, styleHash) + updateIcon({id: data.tabId, url: data.url}, styleHash); }); } @@ -23,8 +23,8 @@ chrome.extension.onMessage.addListener(function(request, sender, sendResponse) { switch (request.method) { case "getStyles": var styles = getStyles(request, sendResponse); - if (request.matchUrl && sender && sender.tab && sender.frameId == 0) { - // this is a main content frame, so update the icon + // check if this is a main content frame style enumeration + if (request.matchUrl && !request.id && sender && sender.tab && sender.frameId == 0) { updateIcon(sender.tab, styles); } return true; @@ -65,15 +65,15 @@ chrome.commands.onCommand.addListener(function(command) { // contextMenus API is present in ancient Chrome but it throws an exception // upon encountering the unsupported parameter value "browser_action", so we have to catch it. -try { + chrome.contextMenus.create({ id: "show-badge", title: chrome.i18n.getMessage("menuShowBadge"), type: "checkbox", contexts: ["browser_action"], checked: prefs.getPref("show-badge") -}); +}, function() { var clearError = chrome.runtime.lastError; }); chrome.contextMenus.create({ id: "disableAll", title: chrome.i18n.getMessage("disableAllStyles"), type: "checkbox", contexts: ["browser_action"], checked: prefs.getPref("disableAll") -}); +}, function() { var clearError = chrome.runtime.lastError; }); chrome.contextMenus.onClicked.addListener(function(info, tab) { if (info.menuItemId == "disableAll") { disableAllStylesToggle(info.checked); @@ -81,7 +81,6 @@ chrome.contextMenus.onClicked.addListener(function(info, tab) { prefs.setPref(info.menuItemId, info.checked); } }); -} catch(e) {console.error(e)} function disableAllStylesToggle(newState) { if (newState === undefined || newState === null) { @@ -384,13 +383,9 @@ function openURL(options) { chrome.tabs.highlight({windowId: tabs[0].windowId, tabs: tabs[0].index}, function (window) {}); } else { delete options.method; - chrome.tabs.query({currentWindow: true, active: true}, function(tabs) { + getActiveTab(function(tab) { // re-use an active new tab page - if (tabs.length && tabs[0].url.match(/^chrome:\/\/newtab\/?$/)) { - chrome.tabs.update(options); - } else { - chrome.tabs.create(options); - } + chrome.tabs[tab.url == "chrome://newtab/" ? "update" : "create"](options); }); } }); diff --git a/messaging.js b/messaging.js index 0f6032a0..874b7542 100644 --- a/messaging.js +++ b/messaging.js @@ -22,6 +22,11 @@ chrome.browserAction.getBadgeBackgroundColor({}, function(color) { }); function updateIcon(tab, styles) { + // while NTP is still loading only process the request for its main frame with a real url + // (but when it's loaded we should process style toggle requests from popups, for example) + if (tab.url == "chrome://newtab/" && tab.status != "complete") { + return; + } if (styles) { // check for not-yet-existing tabs e.g. omnibox instant search chrome.tabs.get(tab.id, function() { @@ -38,15 +43,17 @@ function updateIcon(tab, 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.extension.sendMessage({method: "getStyles", matchUrl: tab.url, enabled: true}, stylesReceived); - } + getTabRealURL(tab, function(url) { + // 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: url, enabled: true}, stylesReceived); + } else { + chrome.extension.sendMessage({method: "getStyles", matchUrl: url, enabled: true}, stylesReceived); + } + }); function stylesReceived(styles) { - var disableAll = prefs.getPref("disableAll"); + var disableAll = "disableAll" in styles ? styles.disableAll : prefs.getPref("disableAll"); var postfix = styles.length == 0 || disableAll ? "w" : ""; chrome.browserAction.setIcon({ path: {19: "19" + postfix + ".png", 38: "38" + postfix + ".png"}, @@ -58,3 +65,30 @@ function updateIcon(tab, styles) { //console.log("Tab " + tab.id + " (" + tab.url + ") badge text set to '" + t + "'."); } } + +function getActiveTab(callback) { + chrome.tabs.query({currentWindow: true, active: true}, function(tabs) { + callback(tabs[0]); + }); +} + +function getActiveTabRealURL(callback) { + getActiveTab(function(tab) { + getTabRealURL(tab, callback); + }); +} + +function getTabRealURL(tab, callback) { + if (tab.url != "chrome://newtab/") { + callback(tab.url); + return; + } + chrome.webNavigation.getAllFrames({tabId: tab.id}, function(frames) { + frames.some(function(frame) { + if (frame.parentFrameId == -1) { // parentless frame is the main frame + callback(frame.url); + return true; + } + }); + }); +} diff --git a/popup.js b/popup.js index 39969c69..761b25ec 100644 --- a/popup.js +++ b/popup.js @@ -24,17 +24,7 @@ if (!prefs.getPref("popup.stylesFirst")) { document.body.insertBefore(document.querySelector("body > .actions"), installed); } -chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { - // Only one is active, I hope - var tab = tabs[0]; - - // The new tab lies about what it is. - if (tab.url == "chrome://newtab/") { - chrome.tabs.sendMessage(tab.id, {method: "realURL"}, null, updatePopUp); - } else { - updatePopUp(tab.url); - } -}); +getActiveTabRealURL(updatePopUp); function updatePopUp(url) { var urlWillWork = /^(file|http|https|chrome\-extension):/.exec(url); @@ -195,8 +185,8 @@ function handleUpdate(style) { if (styleElement) { installed.replaceChild(createStyleElement(style), styleElement); } else { - chrome.tabs.query({currentWindow: true, active: true}, function(tabs) { - if (tabs.length && chrome.extension.getBackgroundPage().getApplicableSections(style, tabs[0].url).length) { + getActiveTabRealURL(function(url) { + if (chrome.extension.getBackgroundPage().getApplicableSections(style, url).length) { // a new style for the current url is installed document.getElementById("unavailable").style.display = "none"; installed.appendChild(createStyleElement(style));