diff --git a/background.js b/background.js index 889c715f..161b4221 100644 --- a/background.js +++ b/background.js @@ -1,3 +1,11 @@ +var frameIdMessageable; +try { + chrome.tabs.sendMessage(0, {}, {frameId: 0}, function() { + var clearError = chrome.runtime.lastError; + frameIdMessageable = true; + }); +} catch(e) {} + // This happens right away, sometimes so fast that the content script isn't even ready. That's // why the content script also asks for this stuff. chrome.webNavigation.onCommitted.addListener(webNavigationListener.bind(this, "styleApply")); @@ -7,15 +15,18 @@ function webNavigationListener(method, data) { // Until Chrome 41, we can't target a frame with a message // (https://developer.chrome.com/extensions/tabs#method-sendMessage) // so a style affecting a page with an iframe will affect the main page as well. - // Skip doing this for frames for now, which can result in flicker. - if (data.frameId != 0) { + // Skip doing this for frames in pre-41 to prevent page flicker. + if (data.frameId != 0 && !frameIdMessageable) { return; } getStyles({matchUrl: data.url, enabled: true, asHash: true}, function(styleHash) { if (method) { - chrome.tabs.sendMessage(data.tabId, {method: method, styles: styleHash}); + chrome.tabs.sendMessage(data.tabId, {method: method, styles: styleHash}, + frameIdMessageable ? {frameId: data.frameId} : undefined); + } + if (data.frameId == 0) { + updateIcon({id: data.tabId, url: data.url}, styleHash); } - updateIcon({id: data.tabId, url: data.url}, styleHash); }); }