| Index: chrome/ext/background.js | 
| =================================================================== | 
| --- a/chrome/ext/background.js | 
| +++ b/chrome/ext/background.js | 
| @@ -108,18 +108,39 @@ | 
| ext.pages.onLoading._dispatch(new Page(tab)); | 
| }); | 
|  | 
| +  chrome.webNavigation.onBeforeNavigate.addListener(function(details) | 
| +  { | 
| +    if (details.frameId == 0) | 
| +    { | 
| +      ext._removeFromAllPageMaps(details.tabId); | 
| + | 
| +      chrome.tabs.get(details.tabId, function() | 
| +      { | 
| +        // If the tab is prerendered, chrome.tabs.get() sets | 
| +        // chrome.runtime.lastError and we have to dispatch the onLoading event, | 
| +        // since the onUpdated event isn't dispatched for prerendered tabs. | 
| +        // However, we have to keep relying on the unUpdated event for tabs that | 
| +        // are already visible. Otherwise browser action changes get overridden | 
| +        // when Chrome automatically resets them on navigation. | 
| +        if (chrome.runtime.lastError) | 
| +        { | 
| +          ext.pages.onLoading._dispatch( | 
| +            new Page({ | 
| +              id: details.tabId, | 
| +              url: details.url | 
| +            }) | 
| +          ); | 
| +        } | 
| +      }); | 
| +    } | 
| +  }); | 
| + | 
| function forgetTab(tabId) | 
| { | 
| ext._removeFromAllPageMaps(tabId); | 
| delete framesOfTabs[tabId]; | 
| } | 
|  | 
| -  chrome.webNavigation.onBeforeNavigate.addListener(function(details) | 
| -  { | 
| -    if (details.frameId == 0) | 
| -      forgetTab(details.tabId); | 
| -  }); | 
| - | 
| chrome.tabs.onReplaced.addListener(function(addedTabId, removedTabId) | 
| { | 
| forgetTab(removedTabId); | 
|  |