fix: CHECK when adding view as its own child (#42067)

This commit is contained in:
Shelley Vohr 2024-05-09 15:47:47 +02:00 коммит произвёл GitHub
Родитель 731bc7a334
Коммит 6675f3ae65
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
2 изменённых файлов: 19 добавлений и 1 удалений

Просмотреть файл

@ -189,6 +189,14 @@ void View::AddChildViewAt(gin::Handle<View> child,
// has a View, possibly a wrapper view around the underlying platform View.
if (!view_)
return;
// This will CHECK and crash in View::AddChildViewAtImpl if not handled here.
if (view_ == child->view()) {
gin_helper::ErrorThrower(isolate()).ThrowError(
"A view cannot be added as its own child");
return;
}
size_t index =
std::min(child_views_.size(), maybe_index.value_or(child_views_.size()));
child_views_.emplace(child_views_.begin() + index, // index

Просмотреть файл

@ -1,3 +1,4 @@
import { expect } from 'chai';
import { closeWindow } from './lib/window-helpers';
import { BaseWindow, View } from 'electron/main';
@ -10,6 +11,15 @@ describe('View', () => {
it('can be used as content view', () => {
w = new BaseWindow({ show: false });
w.setContentView(new View());
const v = new View();
w.setContentView(v);
expect(w.contentView).to.equal(v);
});
it('will throw when added as a child to itself', () => {
w = new BaseWindow({ show: false });
expect(() => {
w.contentView.addChildView(w.contentView);
}).to.throw('A view cannot be added as its own child');
});
});