User:Fyan/Improving Tab Hierarchy: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
globals: | globals: | ||
tabs | tabs | ||
selectedTab | |||
newTabOffset := 0 | newTabOffset := 0 | ||
# opens a new tab with the provided url | |||
# default options: selected = true, position = END, opener = null | |||
openTab(url, options): | 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 | |||
# opens a blank tab | |||
openNewTab(): | |||
tab := openTab('about:blank', { opener: selectedTab }) | |||
tab.onLocationChangeOrDeselect := function() | |||
DELETE tab.onLocationChangeOrDeselect | |||
DELETE tab.opener | |||
# triggered when a new tab is opened from a tab, | |||
# including window.open, link cmd+click, and context menu | |||
openURLInNewTab(url, openerTab, selected): | openURLInNewTab(url, openerTab, selected): | ||
IF selected | IF selected | ||
newTabOffset := 0 | newTabOffset := 0 | ||
newTabOffset := newTabOffset + 1 | newTabOffset := newTabOffset + 1 | ||
position := openerTab.position + newTabOffset | position := openerTab.position + newTabOffset | ||
openTab(url, { selected : selected, position : position, opener : openerTab }) | openTab(url, { selected: selected, position: position, opener: openerTab }) | ||
# triggered when a tab is closed by any mechanism | |||
onTabClose(closedTab): | onTabClose(closedTab): | ||
prev := closedTab.previousSibling | prev := closedTab.previousSibling | ||
next := closedTab.nextSibling | next := closedTab.nextSibling | ||
IF | 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 | RETURN | ||
IF next | |||
selectedTab := next | |||
ELSE IF prev | ELSE IF prev | ||
selectedTab := prev | |||
ELSE IF getBoolPref('closeWindowWithLastTab') | ELSE IF getBoolPref('closeWindowWithLastTab') | ||
closeWindow() | closeWindow() | ||
ELSE | ELSE | ||
openNewTab() | |||
# triggered when the user explicitly switches tabs (not due to tab close, etc.) | |||
onTabUserSelect(fromTab, toTab): | |||
newTabOffset := 0 | newTabOffset := 0 | ||
IF fromTab.opener != toTab AND toTab.opener != fromTab AND | IF fromTab.opener != toTab AND toTab.opener != fromTab AND | ||
fromTab.opener != toTab.opener | fromTab.opener != toTab.opener | ||
| Line 55: | Line 66: | ||
tab.opener := NULL | tab.opener := NULL | ||
# triggered when the user explicitly moves tabs | |||
onTabUserMove(fromIndex, toIndex): | |||
FOR EACH tab IN tabs | FOR EACH tab IN tabs | ||
tab.opener := NULL | tab.opener := NULL | ||
Revision as of 01:30, 27 October 2010
globals:
tabs selectedTab newTabOffset := 0
- opens a new tab with the provided url
- 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
- opens a blank tab
openNewTab():
tab := openTab('about:blank', { opener: selectedTab })
tab.onLocationChangeOrDeselect := function()
DELETE tab.onLocationChangeOrDeselect
DELETE tab.opener
- triggered when a new tab is opened from a tab,
- 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 })
- 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()
- 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
- triggered when the user explicitly moves tabs
onTabUserMove(fromIndex, toIndex):
FOR EACH tab IN tabs tab.opener := NULL