@@ -647,9 +647,18 @@ export function getPanelForNewTab(tab: Tab): TabsPanel | undefined {
647647
648648 // Find panel for tab opened from another tab
649649 if ( parentTab && ! parentTab . pinned ) {
650- const panelOfParent = Sidebar . panelsById [ parentTab . panelId ] as TabsPanel
651- if ( ! Settings . state . moveNewTabParentActPanel || panelOfParent === activePanel ) {
652- return panelOfParent
650+ // For the 'default' opt (do not move it / keep original position)
651+ // find the panel by tab index (e.g. if `browser.tabs.insertRelatedAfterCurrent` is false
652+ // Firefox will open new child tabs at the end of list)
653+ if ( Settings . state . moveNewTabParent === 'default' ) {
654+ return findTabsPanelNearToTabIndex ( tab . index )
655+ }
656+ // For the other cases (except 'none') use the panel of the parent tab
657+ else if ( Settings . state . moveNewTabParent !== 'none' ) {
658+ const panelOfParent = Sidebar . panelsById [ parentTab . panelId ] as TabsPanel
659+ if ( ! Settings . state . moveNewTabParentActPanel || panelOfParent === activePanel ) {
660+ return panelOfParent
661+ }
653662 }
654663 }
655664
@@ -804,6 +813,7 @@ export function getIndexForNewTab(panel: TabsPanel, conf?: IndexForNewTabConf):
804813}
805814
806815interface ParentForNewTabConf {
816+ index ?: number
807817 openerTabId ?: ID
808818 fromNewTabButton ?: boolean
809819}
@@ -812,8 +822,6 @@ interface ParentForNewTabConf {
812822 * Find and return parent id
813823 */
814824export function getParentForNewTab ( panel : Panel , conf ?: ParentForNewTabConf ) : ID | undefined {
815- const activeTab = Tabs . byId [ Tabs . activeId ]
816-
817825 const openerTabId = conf ?. openerTabId
818826 const fromNewTabButton = conf ?. fromNewTabButton ?? false
819827
@@ -831,7 +839,33 @@ export function getParentForNewTab(panel: Panel, conf?: ParentForNewTabConf): ID
831839 if ( Settings . state . moveNewTabParent === 'last_child' ) return openerTabId
832840 if ( Settings . state . moveNewTabParent === 'start' ) return
833841 if ( Settings . state . moveNewTabParent === 'end' ) return
834- if ( Settings . state . moveNewTabParent === 'default' ) return parent . parentId
842+ // Find appropriate parent for the unknown (not controlled by Sidebery) index
843+ if ( Settings . state . moveNewTabParent === 'default' ) {
844+ const prevTab = conf ?. index ? Tabs . list [ conf . index - 1 ] : undefined
845+ const prevIsSiblingToParent = prevTab !== parent && prevTab ?. parentId === parent . parentId
846+ const nextTab = conf ?. index ? Tabs . list [ conf . index ] : undefined
847+ Logs . info ( 'next tab:' , nextTab ?. url )
848+
849+ // If the prev tab is the parent, the sibling of the parent or is inside the parent branch
850+ // and if the next tab is not in the branch
851+ if (
852+ // prettier-ignore
853+ ( prevTab &&
854+ ( prevTab === parent ||
855+ prevIsSiblingToParent ||
856+ Tabs . findAncestor ( prevTab , t => t === parent ) )
857+ ) &&
858+ ( ! nextTab || ( nextTab && ! Tabs . findAncestor ( nextTab , t => t === parent ) ) )
859+ ) {
860+ // Create branch or keep it flat
861+ if ( Settings . state . moveNewTabParentIndent && ! prevIsSiblingToParent ) return parent . id
862+ else return parent . parentId
863+ }
864+ // or integrate the new tab inside existed tree/list
865+ else {
866+ return nextTab ?. parentId
867+ }
868+ }
835869 }
836870
837871 // Place new tab (for the other cases)
@@ -841,6 +875,8 @@ export function getParentForNewTab(panel: Panel, conf?: ParentForNewTabConf): ID
841875
842876 if ( moveNewTabSetting === 'start' ) return
843877 if ( moveNewTabSetting === 'end' ) return
878+
879+ const activeTab = Tabs . byId [ Tabs . activeId ]
844880 if ( activeTab && activeTab . panelId === panel . id && ! activeTab . pinned ) {
845881 if ( moveNewTabSetting === 'before' ) return activeTab . parentId
846882 else if ( moveNewTabSetting === 'after' ) return activeTab . parentId
0 commit comments