         # This is a different Vimium instantiation, so markInfo.tabId is definitely out of date.
         @focusOrLaunch markInfo
       else
-        # Check whether markInfo.tabId still exists.
+        # Check whether markInfo.tabId still exists.  According to here (https://developer.chrome.com/extensions/tabs),
+        # tab Ids are unqiue within a Chrome session.  So, if we find a match, we can use.
         chrome.tabs.get markInfo.tabId, (tab) =>
-          if chrome.runtime.lastError or not tab
+          if not chrome.runtime.lastError and tab?.url and markInfo.url == @getBaseUrl tab.url
+            # The original tab still exists.
+            @gotoPositionInTab markInfo
+          else
             # The original tab no longer exists.
             @focusOrLaunch markInfo
-          else
-            # The original tab still exists.
-            @gotoPositionInTab markInfo
 
   gotoPositionInTab: ({ tabId, scrollX, scrollY, markName }) ->
     chrome.tabs.update tabId, { selected: true }, ->


Marks =
  marks: {}

  # This returns the key which is used for storing mark locations in chrome.storage.local.
  getLocationKey: (markName) -> "vimiumGlobalMark|#{markName}"

  create: (req, sender) ->
    chrome.storage.local.get "vimiumSecret", (items) =>
      item = {}
      item[@getLocationKey req.markName] =
        vimiumSecret: items.vimiumSecret
        tabId: sender.tab.id
        url: sender.tab.url
        scrollX: req.scrollX
        scrollY: req.scrollY
        markName: req.markName

            text: "Jumped to global mark '#{markName}'."
            duration: 1000

  # The tab we're trying to find no longer exists.  We either find another tab with a matching URL and use it,
  # or we create a new tab.
  focusOrLaunch: (markInfo) ->
    chrome.windows.getAll { populate: true }, (windows) =>
      for window in windows
        for tab in window.tabs
          if markInfo.url == @getBaseUrl tab.url
            # We have a matching tab: use it.
            @gotoPositionInTab extend markInfo, tabId: tab.id
            return
      # There is no existing matching tab, we'll have to create one.
      chrome.tabs.create { url: @getBaseUrl(markInfo.url) }, (tab) =>
        # Note. tabLoadedHandlers is defined in "main.coffee".  The handler below will be called when the tab
        # is loaded, its DOM is ready and it registers with the background page.
        tabLoadedHandlers[tab.id] = => @gotoPositionInTab extend markInfo, tabId: tab.id

root = exports ? window
root.Marks = Marks
