fix: crash when calling BrowserWindow.moveTop() on modal children (#39499)

fix: crash when calling moveTop() on modal children
This commit is contained in:
Shelley Vohr 2023-08-16 13:28:29 +02:00 committed by GitHub
parent f7a7085019
commit 1eb398b328
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 3 deletions

View file

@ -812,7 +812,7 @@ bool NativeWindowMac::MoveAbove(const std::string& sourceId) {
if (!webrtc::GetWindowOwnerPid(window_id)) if (!webrtc::GetWindowOwnerPid(window_id))
return false; return false;
if (!parent()) { if (!parent() || is_modal()) {
[window_ orderWindow:NSWindowAbove relativeTo:window_id]; [window_ orderWindow:NSWindowAbove relativeTo:window_id];
} else { } else {
NSWindow* other_window = [NSApp windowWithWindowNumber:window_id]; NSWindow* other_window = [NSApp windowWithWindowNumber:window_id];
@ -823,10 +823,11 @@ bool NativeWindowMac::MoveAbove(const std::string& sourceId) {
} }
void NativeWindowMac::MoveTop() { void NativeWindowMac::MoveTop() {
if (!parent()) if (!parent() || is_modal()) {
[window_ orderWindow:NSWindowAbove relativeTo:0]; [window_ orderWindow:NSWindowAbove relativeTo:0];
else } else {
ReorderChildWindowAbove(window_, nullptr); ReorderChildWindowAbove(window_, nullptr);
}
} }
void NativeWindowMac::SetResizable(bool resizable) { void NativeWindowMac::SetResizable(bool resizable) {

View file

@ -1283,6 +1283,8 @@ describe('BrowserWindow module', () => {
}); });
describe('BrowserWindow.moveTop()', () => { describe('BrowserWindow.moveTop()', () => {
afterEach(closeAllWindows);
it('should not steal focus', async () => { it('should not steal focus', async () => {
const posDelta = 50; const posDelta = 50;
const wShownInactive = once(w, 'show'); const wShownInactive = once(w, 'show');
@ -1324,6 +1326,15 @@ describe('BrowserWindow module', () => {
await closeWindow(otherWindow, { assertNotWindows: false }); await closeWindow(otherWindow, { assertNotWindows: false });
expect(BrowserWindow.getAllWindows()).to.have.lengthOf(1); expect(BrowserWindow.getAllWindows()).to.have.lengthOf(1);
}); });
it('should not crash when called on a modal child window', async () => {
const shown = once(w, 'show');
w.show();
await shown;
const child = new BrowserWindow({ modal: true, parent: w });
expect(() => { child.moveTop(); }).to.not.throw();
});
}); });
describe('BrowserWindow.moveAbove(mediaSourceId)', () => { describe('BrowserWindow.moveAbove(mediaSourceId)', () => {