User:Fyan/Improving Tab Hierarchy

From MozillaWiki
Revision as of 01:30, 27 October 2010 by Fyan (talk | contribs)
Jump to navigation Jump to search

globals:

 tabs
 selectedTab
 newTabOffset := 0
  1. opens a new tab with the provided url
  2. default options: selected = true, position = END, opener = null

openTab(url, options):

 tab := new Tab(url)
 IF 'position' IN options
   tabs.splice(position, 0, tab)
 ELSE
   tabs.push(tab)
 IF options.opener
   tab.opener = options.opener
 IF options.selected
   selectedTab := tab
 RETURN tab
  1. opens a blank tab

openNewTab():

 tab := openTab('about:blank', { opener: selectedTab })
 tab.onLocationChangeOrDeselect := function()
   DELETE tab.onLocationChangeOrDeselect
   DELETE tab.opener
  1. triggered when a new tab is opened from a tab,
  2. including window.open, link cmd+click, and context menu

openURLInNewTab(url, openerTab, selected):

 IF selected
   newTabOffset := 0
 newTabOffset := newTabOffset + 1
 position := openerTab.position + newTabOffset
 openTab(url, { selected: selected, position: position, opener: openerTab })
  1. triggered when a tab is closed by any mechanism

onTabClose(closedTab):

 prev := closedTab.previousSibling
 next := closedTab.nextSibling
 IF closedTab.opener
   IF next AND next.opener = closedTab.opener
     selectedTab := next
     RETURN
   FOR tab := prev; tab; tab := tab.previousSibling
     IF tab.opener = closedTab.opener
       selectedTab := tab
       RETURN
   IF prev AND prev = closedTab.opener
     selectedTab := prev
     RETURN
 IF next
   selectedTab := next
 ELSE IF prev
   selectedTab := prev
 ELSE IF getBoolPref('closeWindowWithLastTab')
   closeWindow()
 ELSE
   openNewTab()
  1. triggered when the user explicitly switches tabs (not due to tab close, etc.)

onTabUserSelect(fromTab, toTab):

 newTabOffset := 0
 IF fromTab.opener != toTab AND toTab.opener != fromTab AND
    fromTab.opener != toTab.opener
   FOR EACH tab IN tabs:
     tab.opener := NULL
  1. triggered when the user explicitly moves tabs

onTabUserMove(fromIndex, toIndex):

 FOR EACH tab IN tabs
   tab.opener := NULL