fix(tabpage): correct check for failure to close window

Avoid closing window 999 times.
This commit is contained in:
zeertzjq 2022-03-27 09:19:56 +08:00
parent f4f18a9833
commit ae0a43ec23
2 changed files with 18 additions and 1 deletions

View File

@ -6839,7 +6839,7 @@ void tabpage_close_other(tabpage_T *tp, int forceit)
// Autocommands may delete the tab page under our fingers and we may
// fail to close a window with a modified buffer.
if (!valid_tabpage(tp) || tp->tp_firstwin == wp) {
if (!valid_tabpage(tp) || tp->tp_lastwin == wp) {
break;
}
}

View File

@ -3,8 +3,10 @@ local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
local command = helpers.command
local eq = helpers.eq
local neq = helpers.neq
local feed = helpers.feed
local eval = helpers.eval
local exec = helpers.exec
describe('tabpage', function()
before_each(clear)
@ -34,5 +36,20 @@ describe('tabpage', function()
eq(3, eval('tabpagenr()'))
end)
it('does not crash or loop 999 times if BufWipeout autocommand switches window #17868', function()
exec([[
tabedit
let s:window_id = win_getid()
botright new
setlocal bufhidden=wipe
let g:win_closed = 0
autocmd WinClosed * let g:win_closed += 1
autocmd BufWipeout <buffer> call win_gotoid(s:window_id)
tabprevious
+tabclose
]])
neq(999, eval('g:win_closed'))
end)
end)