| Index: chrome/ext/background.js | 
| =================================================================== | 
| --- a/chrome/ext/background.js | 
| +++ b/chrome/ext/background.js | 
| @@ -105,18 +105,38 @@ | 
| }; | 
|  | 
| chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) | 
| { | 
| if (changeInfo.status == "loading") | 
| ext.pages.onLoading._dispatch(new Page(tab)); | 
| }); | 
|  | 
| +  function createFrame(tabId, frameId) | 
| +  { | 
| +    var frames = framesOfTabs[tabId]; | 
| +    if (!frames) | 
| +      frames = framesOfTabs[tabId] = Object.create(null); | 
| + | 
| +    var frame = frames[frameId]; | 
| +    if (!frame) | 
| +      frame = frames[frameId] = {}; | 
| + | 
| +    return frame; | 
| +  } | 
| + | 
| chrome.webNavigation.onBeforeNavigate.addListener(function(details) | 
| { | 
| +    // Capture parent frame here because onCommitted doesn't get this info. | 
| +    var frame = createFrame(details.tabId, details.frameId); | 
| +    frame.parent = frames[details.parentFrameId] || null; | 
| +  }); | 
| + | 
| +  chrome.webNavigation.onCommitted.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, | 
| @@ -131,25 +151,19 @@ | 
| id: details.tabId, | 
| url: details.url | 
| }) | 
| ); | 
| } | 
| }); | 
| } | 
|  | 
| -    // Add or update frame in frame structure | 
| -    var frames = framesOfTabs[details.tabId]; | 
| -    if (!frames) | 
| -      frames = framesOfTabs[details.tabId] = Object.create(null); | 
| - | 
| -    frames[details.frameId] = { | 
| -      parent: frames[details.parentFrameId] || null, | 
| -      url: new URL(details.url) | 
| -    }; | 
| +    // Update frame URL in frame structure | 
| +    var frame = createFrame(details.tabId, details.frameId); | 
| +    frame.url = new URL(details.url); | 
| }); | 
|  | 
| function forgetTab(tabId) | 
| { | 
| ext.pages.onRemoved._dispatch(tabId); | 
|  | 
| ext._removeFromAllPageMaps(tabId); | 
| delete framesOfTabs[tabId]; | 
|  |