User:Fyan/Improving Tab Hierarchy

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

Phase I

globals:

 tabs
 newTabButton
 newTabOffset := 0

openTab(url, options):

 // opens a new tab with the provided url
 // default options: selected = true, position = end, opener = null

openURLInNewTab(url, openerTab, selected):

 // triggered whenever a new tab is opened from a tab,
 // including window.open, link cmd+click, and context menu
 IF selected
   newTabOffset := 0
 newTabOffset := newTabOffset + 1
 position := openerTab.position + newTabOffset
 openTab(url, { selected : selected, position : position, opener : openerTab })

onTabClose(closedTab):

 FOR EACH tab IN tabs
   IF tab.opener = closedTab:
     tab.opener := closedTab.opener
 prev := closedTab.previousSibling
 next := closedTab.nextSibling
 IF !closedTab.opener
   selectTab(next)
   RETURN
 ELSE IF next AND next.opener = closedTab.opener
   selectTab(next)
   RETURN
 FOR tab := prev; tab; tab := tab.previousSibling
   IF tab.opener = closedTab.opener
     selectTab(tab)
     RETURN
 IF prev AND prev = closedTab.opener
   selectTab(prev)
 ELSE IF next
   selectTab(next)
 ELSE IF prev
   selectTab(prev)
 ELSE IF getBoolPref('closeWindowWithLastTab')
   closeWindow()
 ELSE
   openTab('about:blank')

onTabSelect(fromTab, toTab):

 newTabOffset := 0
 IF !fromTab // triggered by tab close
   RETURN
 IF fromTab.opener != toTab AND toTab.opener != fromTab AND
    fromTab.opener != toTab.opener
   FOR EACH tab IN tabs:
     tab.opener := NULL

onTabMove(fromIndex, toIndex):

 FOR EACH tab IN tabs
   tab.opener := NULL

Phase II

openBlankTab(trigger):

 // this method applies only to new blank tabs
 IF trigger = newTabButton
   openTab('about:blank')
 ELSE
   tab := contextTab OR selectedTab
   openTab('about:blank', { position : tab.position + 1, opener : tab })