mirror of
https://github.com/neovim/neovim.git
synced 2025-12-15 19:05:40 +00:00
fix(api): patch some cmdwin/textlock holes
Problem: there are new ways to escape textlock or break the cmdwin in nvim_win_set_config and nvim_tabpage_set_win. Solution: fix them. Use win_goto to check it in nvim_tabpage_set_win and use the try_start/end pattern like with similar functions such as nvim_set_current_win (which uses the existing msg_list, if set). Careful not to use `wp->handle` when printing the window ID in the error message for nvim_tabpage_set_win, as win_goto autocommands may have freed the window. On a related note, I have a feeling some API functions ought to be checking curbuf_locked...
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
local helpers = require('test.functional.helpers')(after_each)
|
||||
local clear, eq, ok = helpers.clear, helpers.eq, helpers.ok
|
||||
local exec = helpers.exec
|
||||
local feed = helpers.feed
|
||||
local api = helpers.api
|
||||
local fn = helpers.fn
|
||||
local request = helpers.request
|
||||
@@ -86,6 +88,30 @@ describe('api/tabpage', function()
|
||||
pcall_err(api.nvim_tabpage_set_win, tab1, win3)
|
||||
)
|
||||
end)
|
||||
|
||||
it('does not switch window when textlocked or in the cmdwin', function()
|
||||
local target_win = api.nvim_get_current_win()
|
||||
feed('q:')
|
||||
local cur_win = api.nvim_get_current_win()
|
||||
eq(
|
||||
'Vim:E11: Invalid in command-line window; <CR> executes, CTRL-C quits',
|
||||
pcall_err(api.nvim_tabpage_set_win, 0, target_win)
|
||||
)
|
||||
eq(cur_win, api.nvim_get_current_win())
|
||||
command('quit!')
|
||||
|
||||
exec(([[
|
||||
new
|
||||
call setline(1, 'foo')
|
||||
setlocal debug=throw indentexpr=nvim_tabpage_set_win(0,%d)
|
||||
]]):format(target_win))
|
||||
cur_win = api.nvim_get_current_win()
|
||||
eq(
|
||||
'Vim(normal):E5555: API call: Vim:E565: Not allowed to change text or change window',
|
||||
pcall_err(command, 'normal! ==')
|
||||
)
|
||||
eq(cur_win, api.nvim_get_current_win())
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('{get,set,del}_var', function()
|
||||
|
||||
Reference in New Issue
Block a user