diff options
Diffstat (limited to 'background_scripts/bg_utils.coffee')
| -rw-r--r-- | background_scripts/bg_utils.coffee | 45 | 
1 files changed, 45 insertions, 0 deletions
| diff --git a/background_scripts/bg_utils.coffee b/background_scripts/bg_utils.coffee new file mode 100644 index 00000000..9c1674bf --- /dev/null +++ b/background_scripts/bg_utils.coffee @@ -0,0 +1,45 @@ +root = exports ? window + +# TabRecency associates a logical timestamp with each tab id.  These are used to provide an initial +# recency-based ordering in the tabs vomnibar (which allows jumping quickly between recently-visited tabs). +class TabRecency +  timestamp: 1 +  current: -1 +  cache: {} +  lastVisited: null +  lastVisitedTime: null +  timeDelta: 500 # Milliseconds. + +  constructor: -> +    chrome.tabs.onActivated.addListener (activeInfo) => @register activeInfo.tabId +    chrome.tabs.onRemoved.addListener (tabId) => @deregister tabId + +    chrome.tabs.onReplaced.addListener (addedTabId, removedTabId) => +      @deregister removedTabId +      @register addedTabId + +  register: (tabId) -> +    currentTime = new Date() +    # Register tabId if it has been visited for at least @timeDelta ms.  Tabs which are visited only for a +    # very-short time (e.g. those passed through with `5J`) aren't registered as visited at all. +    if @lastVisitedTime? and @timeDelta <= currentTime - @lastVisitedTime +      @cache[@lastVisited] = ++@timestamp + +    @current = @lastVisited = tabId +    @lastVisitedTime = currentTime + +  deregister: (tabId) -> +    if tabId == @lastVisited +      # Ensure we don't register this tab, since it's going away. +      @lastVisited = @lastVisitedTime = null +    delete @cache[tabId] + +  # Recently-visited tabs get a higher score (except the current tab, which gets a low score). +  recencyScore: (tabId) -> +    @cache[tabId] ||= 1 +    if tabId == @current then 0.0 else @cache[tabId] / @timestamp + +BgUtils = +  tabRecency: new TabRecency() + +root.BgUtils = BgUtils | 
