User:Fyan/Improving Tab Hierarchy

From MozillaWiki
Revision as of 12:42, 21 July 2010 by Fyan (talk | contribs) (→‎Phase I)
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
   newTab := 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.prevSibling
   next := closedTab.nextSibling
   IF next AND next.opener AND next.opener = closedTab.opener:
       selectTab(next)
   ELSE IF prev AND prev.opener AND prev.opener = closedTab.opener:
       selectTab(prev)
   ELSE 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

openNewTab(newTab, 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 })