|
@ -481,6 +481,8 @@ vAPI.tabs.registerListeners(); |
|
|
if ( context === 'updated' && pageStore.pageHostname === tabContext.rootHostname ) { |
|
|
if ( context === 'updated' && pageStore.pageHostname === tabContext.rootHostname ) { |
|
|
pageStore.rawURL = tabContext.rawURL; |
|
|
pageStore.rawURL = tabContext.rawURL; |
|
|
pageStore.normalURL = normalURL; |
|
|
pageStore.normalURL = normalURL; |
|
|
|
|
|
this.updateTitle(tabId); |
|
|
|
|
|
this.pageStoresToken = Date.now(); |
|
|
return pageStore; |
|
|
return pageStore; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -494,6 +496,8 @@ vAPI.tabs.registerListeners(); |
|
|
pageStore = this.PageStore.factory(tabContext); |
|
|
pageStore = this.PageStore.factory(tabContext); |
|
|
} |
|
|
} |
|
|
this.pageStores[tabId] = pageStore; |
|
|
this.pageStores[tabId] = pageStore; |
|
|
|
|
|
this.updateTitle(tabId); |
|
|
|
|
|
this.pageStoresToken = Date.now(); |
|
|
|
|
|
|
|
|
// console.debug('tab.js > bindTabToPageStats(): dispatching traffic in tab id %d to page store "%s"', tabId, pageUrl);
|
|
|
// console.debug('tab.js > bindTabToPageStats(): dispatching traffic in tab id %d to page store "%s"', tabId, pageUrl);
|
|
|
|
|
|
|
|
@ -513,6 +517,7 @@ vAPI.tabs.registerListeners(); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
delete this.pageStores[tabId]; |
|
|
delete this.pageStores[tabId]; |
|
|
|
|
|
this.pageStoresToken = Date.now(); |
|
|
|
|
|
|
|
|
if ( pageStore.incinerationTimer ) { |
|
|
if ( pageStore.incinerationTimer ) { |
|
|
clearTimeout(pageStore.incinerationTimer); |
|
|
clearTimeout(pageStore.incinerationTimer); |
|
@ -618,6 +623,64 @@ vAPI.tabs.registerListeners(); |
|
|
|
|
|
|
|
|
/******************************************************************************/ |
|
|
/******************************************************************************/ |
|
|
|
|
|
|
|
|
|
|
|
µm.updateTitle = (function() { |
|
|
|
|
|
var tabIdToTimer = Object.create(null); |
|
|
|
|
|
var tabIdToTryCount = Object.create(null); |
|
|
|
|
|
var delay = 499; |
|
|
|
|
|
|
|
|
|
|
|
var tryNoMore = function(tabId) { |
|
|
|
|
|
delete tabIdToTryCount[tabId]; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
var tryAgain = function(tabId) { |
|
|
|
|
|
var count = tabIdToTryCount[tabId]; |
|
|
|
|
|
if ( count === undefined ) { |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
if ( count === 1 ) { |
|
|
|
|
|
delete tabIdToTryCount[tabId]; |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
tabIdToTryCount[tabId] = count - 1; |
|
|
|
|
|
tabIdToTimer[tabId] = vAPI.setTimeout(updateTitle.bind(µb, tabId), delay); |
|
|
|
|
|
return true; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
var onTabReady = function(tabId, tab) { |
|
|
|
|
|
if ( !tab ) { |
|
|
|
|
|
return tryNoMore(tabId); |
|
|
|
|
|
} |
|
|
|
|
|
var pageStore = this.pageStoreFromTabId(tabId); |
|
|
|
|
|
if ( pageStore === null ) { |
|
|
|
|
|
return tryNoMore(tabId); |
|
|
|
|
|
} |
|
|
|
|
|
if ( !tab.title && tryAgain(tabId) ) { |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
tryNoMore(tabId); |
|
|
|
|
|
pageStore.title = tab.title || tab.url || ''; |
|
|
|
|
|
this.pageStoresToken = Date.now(); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
var updateTitle = function(tabId) { |
|
|
|
|
|
delete tabIdToTimer[tabId]; |
|
|
|
|
|
vAPI.tabs.get(tabId, onTabReady.bind(this, tabId)); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
return function(tabId) { |
|
|
|
|
|
if ( vAPI.isBehindTheSceneTabId(tabId) ) { |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
if ( tabIdToTimer[tabId] ) { |
|
|
|
|
|
clearTimeout(tabIdToTimer[tabId]); |
|
|
|
|
|
} |
|
|
|
|
|
tabIdToTimer[tabId] = vAPI.setTimeout(updateTitle.bind(this, tabId), delay); |
|
|
|
|
|
tabIdToTryCount[tabId] = 5; |
|
|
|
|
|
}; |
|
|
|
|
|
})(); |
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/ |
|
|
|
|
|
|
|
|
// Stale page store entries janitor
|
|
|
// Stale page store entries janitor
|
|
|
// https://github.com/chrisaljoudi/uBlock/issues/455
|
|
|
// https://github.com/chrisaljoudi/uBlock/issues/455
|
|
|
|
|
|
|
|
|