@@ -200,7 +200,8 @@ const Logic = {
200200 icon : "default-tab" ,
201201 color : "default-tab" ,
202202 numberOfHiddenTabs : 0 ,
203- numberOfOpenTabs : 0
203+ numberOfOpenTabs : 0 ,
204+ numberOfOpenTabsCurrWin : 0
204205 } ;
205206 // Handle old style rejection with null and also Promise.reject new style
206207 try {
@@ -215,14 +216,14 @@ const Logic = {
215216 return activeTabs . length ;
216217 } ,
217218
218- _disableMenuItem ( message , elementToDisable = document . querySelector ( "#move-to-new-window" ) ) {
219+ _disableMenuItem ( message , elementToDisable ) {
219220 elementToDisable . setAttribute ( "title" , message ) ;
220221 elementToDisable . removeAttribute ( "tabindex" ) ;
221222 elementToDisable . classList . remove ( "hover-highlight" ) ;
222223 elementToDisable . classList . add ( "disabled-menu-item" ) ;
223224 } ,
224225
225- _enableMenuItems ( elementToEnable = document . querySelector ( "#move-to-new-window" ) ) {
226+ _enableMenuItems ( elementToEnable ) {
226227 elementToEnable . removeAttribute ( "title" ) ;
227228 elementToEnable . setAttribute ( "tabindex" , "0" ) ;
228229 elementToEnable . classList . add ( "hover-highlight" ) ;
@@ -264,6 +265,7 @@ const Logic = {
264265 identity . hasHiddenTabs = stateObject . hasHiddenTabs ;
265266 identity . numberOfHiddenTabs = stateObject . numberOfHiddenTabs ;
266267 identity . numberOfOpenTabs = stateObject . numberOfOpenTabs ;
268+ identity . numberOfOpenTabsCurrWin = stateObject . numberOfOpenTabsCurrWin ;
267269 identity . isIsolated = stateObject . isIsolated ;
268270 }
269271 if ( containerOrder ) {
@@ -924,15 +926,20 @@ Logic.registerPanel(P_CONTAINER_INFO, {
924926 }
925927
926928 const moveTabsEl = document . querySelector ( "#move-to-new-window" ) ;
927- const numTabs = await Logic . numTabs ( ) ;
929+ const moveAllTabsEl = document . querySelector ( "#move-all-to-new-window" ) ;
928930 if ( incompatible ) {
929- Logic . _disableMenuItem ( "Moving container tabs is incompatible with Pulse, PageShot, and SnoozeTabs." ) ;
930- return ;
931- } else if ( numTabs === 1 ) {
932- Logic . _disableMenuItem ( "Cannot move a tab from a single-tab window." ) ;
931+ Logic . _disableMenuItem ( "Moving container tabs is incompatible with Pulse, PageShot, and SnoozeTabs." , moveTabsEl ) ;
932+ Logic . _disableMenuItem ( "Moving container tabs is incompatible with Pulse, PageShot, and SnoozeTabs." , moveAllTabsEl ) ;
933933 return ;
934934 }
935935
936+ Utils . addEnterHandler ( moveAllTabsEl , async ( ) => {
937+ await browser . runtime . sendMessage ( {
938+ method : "moveTabsToWindow" ,
939+ cookieStoreId : Logic . currentIdentity ( ) . cookieStoreId ,
940+ } ) ;
941+ window . close ( ) ;
942+ } ) ;
936943 Utils . addEnterHandler ( moveTabsEl , async ( ) => {
937944 await browser . runtime . sendMessage ( {
938945 method : "moveTabsToWindow" ,
@@ -972,20 +979,23 @@ Logic.registerPanel(P_CONTAINER_INFO, {
972979 trHasTabs . style . display = ! identity . hasHiddenTabs && ! identity . hasOpenTabs ? "none" : "" ;
973980 }
974981
982+ const moveTabs = document . querySelector ( "#move-to-new-window" ) ;
983+ const moveTabsAll = document . querySelector ( "#move-all-to-new-window" ) ;
984+ if ( identity . numberOfOpenTabsCurrWin === 0 ) {
985+ Logic . _disableMenuItem ( "No tabs available for this container in this window" , moveTabs ) ;
986+ }
975987 if ( identity . numberOfOpenTabs === 0 ) {
976- Logic . _disableMenuItem ( "No tabs available for this container" ) ;
977- } else {
978- Logic . _enableMenuItems ( ) ;
988+ Logic . _disableMenuItem ( "No tabs available for this container" , moveTabsAll ) ;
979989 }
980990
981991 this . intializeShowHide ( identity ) ;
982992
983993 // Let's retrieve the list of tabs.
984994 const tabs = await browser . runtime . sendMessage ( {
985995 method : "getTabs" ,
986- windowId : browser . windows . WINDOW_ID_CURRENT ,
987996 cookieStoreId : Logic . currentIdentity ( ) . cookieStoreId
988997 } ) ;
998+ const currentWindowId = ( await browser . windows . getCurrent ( ) ) . id ;
989999 const manageContainer = document . querySelector ( "#manage-container-link" ) ;
9901000 Utils . addEnterHandler ( manageContainer , async ( ) => {
9911001 Logic . showPanel ( P_CONTAINER_EDIT , identity ) ;
@@ -997,7 +1007,7 @@ Logic.registerPanel(P_CONTAINER_INFO, {
9971007 Logic . showPanel ( P_CLEAR_CONTAINER_STORAGE , identity ) ;
9981008 }
9991009 } ) ;
1000- return this . buildOpenTabTable ( tabs ) ;
1010+ return this . buildOpenTabTable ( tabs , currentWindowId ) ;
10011011 } ,
10021012
10031013 intializeShowHide ( identity ) {
@@ -1029,13 +1039,24 @@ Logic.registerPanel(P_CONTAINER_INFO, {
10291039 return ;
10301040 } ,
10311041
1032- buildOpenTabTable ( tabs ) {
1042+ buildOpenTabTable ( tabs , currentWindowId ) {
10331043 // Let's remove all the previous tabs.
1034- const table = document . getElementById ( "container-info-table" ) ;
1035- while ( table . firstChild ) {
1036- table . firstChild . remove ( ) ;
1044+ const tableCurrWin = document . getElementById ( "container-info-table-curr-windows" ) ;
1045+ while ( tableCurrWin . firstChild ) {
1046+ tableCurrWin . firstChild . remove ( ) ;
1047+ }
1048+
1049+ const tableOtherWin = document . getElementById ( "container-info-table-other-windows" ) ;
1050+ while ( tableOtherWin . firstChild ) {
1051+ tableOtherWin . firstChild . remove ( ) ;
10371052 }
10381053
1054+ // Sort tabs by window id so that we'll be able to display horizontal rules between tabs in different windows below
1055+ tabs . sort ( ( a , b ) => a . windowId - b . windowId ) ;
1056+ // For making horizontal rules between tabs of different windows
1057+ let prevWindowId = undefined ;
1058+ const makeHorizontalRule = ( ) => document . createElement ( "hr" ) ;
1059+
10391060 // For each one, let's create a new line.
10401061 const fragment = document . createDocumentFragment ( ) ;
10411062 for ( let tab of tabs ) { // eslint-disable-line prefer-const
@@ -1051,12 +1072,21 @@ Logic.registerPanel(P_CONTAINER_INFO, {
10511072 </td>` ;
10521073 tr . querySelector ( ".favicon" ) . appendChild ( Utils . createFavIconElement ( tab . favIconUrl ) ) ;
10531074 tr . setAttribute ( "tabindex" , "0" ) ;
1054- table . appendChild ( fragment ) ;
1075+ if ( tab . windowId === currentWindowId ) {
1076+ tableCurrWin . appendChild ( fragment ) ;
1077+ } else {
1078+ if ( prevWindowId !== undefined && tab . windowId !== prevWindowId ) {
1079+ tableOtherWin . appendChild ( makeHorizontalRule ( ) ) ;
1080+ }
1081+ prevWindowId = tab . windowId ;
1082+ tableOtherWin . appendChild ( fragment ) ;
1083+ }
10551084
10561085 // On click, we activate this tab. But only if this tab is active.
10571086 if ( ! tab . hiddenState ) {
10581087 Utils . addEnterHandler ( tr , async ( ) => {
10591088 await browser . tabs . update ( tab . id , { active : true } ) ;
1089+ await browser . windows . update ( tab . windowId , { focused : true } ) ;
10601090 window . close ( ) ;
10611091 } ) ;
10621092
0 commit comments