fix: update normal bounds prior to minimizing (#34473)
This commit is contained in:
parent
2fd0194e94
commit
37d93b0482
4 changed files with 186 additions and 5 deletions
|
@ -165,6 +165,8 @@ class NativeWindowMac : public NativeWindow,
|
||||||
|
|
||||||
void UpdateVibrancyRadii(bool fullscreen);
|
void UpdateVibrancyRadii(bool fullscreen);
|
||||||
|
|
||||||
|
void UpdateWindowOriginalFrame();
|
||||||
|
|
||||||
// Set the attribute of NSWindow while work around a bug of zoom button.
|
// Set the attribute of NSWindow while work around a bug of zoom button.
|
||||||
bool HasStyleMask(NSUInteger flag) const;
|
bool HasStyleMask(NSUInteger flag) const;
|
||||||
void SetStyleMask(bool on, NSUInteger flag);
|
void SetStyleMask(bool on, NSUInteger flag);
|
||||||
|
|
|
@ -447,7 +447,7 @@ NativeWindowMac::NativeWindowMac(const gin_helper::Dictionary& options,
|
||||||
SetContentView(new views::View());
|
SetContentView(new views::View());
|
||||||
AddContentViewLayers();
|
AddContentViewLayers();
|
||||||
|
|
||||||
original_frame_ = [window_ frame];
|
UpdateWindowOriginalFrame();
|
||||||
original_level_ = [window_ level];
|
original_level_ = [window_ level];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -609,7 +609,7 @@ void NativeWindowMac::Maximize() {
|
||||||
|
|
||||||
// Take note of the current window size
|
// Take note of the current window size
|
||||||
if (IsNormal())
|
if (IsNormal())
|
||||||
original_frame_ = [window_ frame];
|
UpdateWindowOriginalFrame();
|
||||||
[window_ zoom:nil];
|
[window_ zoom:nil];
|
||||||
|
|
||||||
if (!is_visible) {
|
if (!is_visible) {
|
||||||
|
@ -653,7 +653,7 @@ void NativeWindowMac::Minimize() {
|
||||||
|
|
||||||
// Take note of the current window size
|
// Take note of the current window size
|
||||||
if (IsNormal())
|
if (IsNormal())
|
||||||
original_frame_ = [window_ frame];
|
UpdateWindowOriginalFrame();
|
||||||
[window_ miniaturize:nil];
|
[window_ miniaturize:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -697,7 +697,7 @@ void NativeWindowMac::SetFullScreen(bool fullscreen) {
|
||||||
|
|
||||||
// Take note of the current window size
|
// Take note of the current window size
|
||||||
if (IsNormal())
|
if (IsNormal())
|
||||||
original_frame_ = [window_ frame];
|
UpdateWindowOriginalFrame();
|
||||||
|
|
||||||
// This needs to be set here because it can be the case that
|
// This needs to be set here because it can be the case that
|
||||||
// SetFullScreen is called by a user before windowWillEnterFullScreen
|
// SetFullScreen is called by a user before windowWillEnterFullScreen
|
||||||
|
@ -733,6 +733,7 @@ void NativeWindowMac::SetBounds(const gfx::Rect& bounds, bool animate) {
|
||||||
|
|
||||||
[window_ setFrame:cocoa_bounds display:YES animate:animate];
|
[window_ setFrame:cocoa_bounds display:YES animate:animate];
|
||||||
user_set_bounds_maximized_ = IsMaximized() ? true : false;
|
user_set_bounds_maximized_ = IsMaximized() ? true : false;
|
||||||
|
UpdateWindowOriginalFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
gfx::Rect NativeWindowMac::GetBounds() {
|
gfx::Rect NativeWindowMac::GetBounds() {
|
||||||
|
@ -1005,7 +1006,7 @@ void NativeWindowMac::SetSimpleFullScreen(bool simple_fullscreen) {
|
||||||
|
|
||||||
// Take note of the current window size and level
|
// Take note of the current window size and level
|
||||||
if (IsNormal()) {
|
if (IsNormal()) {
|
||||||
original_frame_ = [window_ frame];
|
UpdateWindowOriginalFrame();
|
||||||
original_level_ = [window_ level];
|
original_level_ = [window_ level];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1402,6 +1403,10 @@ void NativeWindowMac::UpdateVibrancyRadii(bool fullscreen) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NativeWindowMac::UpdateWindowOriginalFrame() {
|
||||||
|
original_frame_ = [window_ frame];
|
||||||
|
}
|
||||||
|
|
||||||
void NativeWindowMac::SetVibrancy(const std::string& type) {
|
void NativeWindowMac::SetVibrancy(const std::string& type) {
|
||||||
NSVisualEffectView* vibrantView = [window_ vibrantView];
|
NSVisualEffectView* vibrantView = [window_ vibrantView];
|
||||||
|
|
||||||
|
|
|
@ -203,6 +203,7 @@ using FullScreenTransitionState =
|
||||||
// windowDidDeminiaturize
|
// windowDidDeminiaturize
|
||||||
level_ = [window level];
|
level_ = [window level];
|
||||||
shell_->SetWindowLevel(NSNormalWindowLevel);
|
shell_->SetWindowLevel(NSNormalWindowLevel);
|
||||||
|
shell_->UpdateWindowOriginalFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)windowDidMiniaturize:(NSNotification*)notification {
|
- (void)windowDidMiniaturize:(NSNotification*)notification {
|
||||||
|
|
|
@ -1228,6 +1228,7 @@ describe('BrowserWindow module', () => {
|
||||||
await resize;
|
await resize;
|
||||||
expectBoundsEqual(w.getNormalBounds(), w.getBounds());
|
expectBoundsEqual(w.getNormalBounds(), w.getBounds());
|
||||||
});
|
});
|
||||||
|
|
||||||
it('checks normal bounds after move', async () => {
|
it('checks normal bounds after move', async () => {
|
||||||
const pos = [10, 10];
|
const pos = [10, 10];
|
||||||
const move = emittedOnce(w, 'move');
|
const move = emittedOnce(w, 'move');
|
||||||
|
@ -1246,6 +1247,51 @@ describe('BrowserWindow module', () => {
|
||||||
await maximize;
|
await maximize;
|
||||||
expectBoundsEqual(w.getNormalBounds(), bounds);
|
expectBoundsEqual(w.getNormalBounds(), bounds);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('updates normal bounds after resize and maximize', async () => {
|
||||||
|
const size = [300, 400];
|
||||||
|
const resize = emittedOnce(w, 'resize');
|
||||||
|
w.setSize(size[0], size[1]);
|
||||||
|
await resize;
|
||||||
|
const original = w.getBounds();
|
||||||
|
|
||||||
|
const maximize = emittedOnce(w, 'maximize');
|
||||||
|
w.maximize();
|
||||||
|
await maximize;
|
||||||
|
|
||||||
|
const normal = w.getNormalBounds();
|
||||||
|
const bounds = w.getBounds();
|
||||||
|
|
||||||
|
expect(normal).to.deep.equal(original);
|
||||||
|
expect(normal).to.not.deep.equal(bounds);
|
||||||
|
|
||||||
|
const close = emittedOnce(w, 'close');
|
||||||
|
w.close();
|
||||||
|
await close;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('updates normal bounds after move and maximize', async () => {
|
||||||
|
const pos = [10, 10];
|
||||||
|
const move = emittedOnce(w, 'move');
|
||||||
|
w.setPosition(pos[0], pos[1]);
|
||||||
|
await move;
|
||||||
|
const original = w.getBounds();
|
||||||
|
|
||||||
|
const maximize = emittedOnce(w, 'maximize');
|
||||||
|
w.maximize();
|
||||||
|
await maximize;
|
||||||
|
|
||||||
|
const normal = w.getNormalBounds();
|
||||||
|
const bounds = w.getBounds();
|
||||||
|
|
||||||
|
expect(normal).to.deep.equal(original);
|
||||||
|
expect(normal).to.not.deep.equal(bounds);
|
||||||
|
|
||||||
|
const close = emittedOnce(w, 'close');
|
||||||
|
w.close();
|
||||||
|
await close;
|
||||||
|
});
|
||||||
|
|
||||||
it('checks normal bounds when unmaximized', async () => {
|
it('checks normal bounds when unmaximized', async () => {
|
||||||
const bounds = w.getBounds();
|
const bounds = w.getBounds();
|
||||||
w.once('maximize', () => {
|
w.once('maximize', () => {
|
||||||
|
@ -1257,6 +1303,7 @@ describe('BrowserWindow module', () => {
|
||||||
await unmaximize;
|
await unmaximize;
|
||||||
expectBoundsEqual(w.getNormalBounds(), bounds);
|
expectBoundsEqual(w.getNormalBounds(), bounds);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not change size for a frameless window with min size', async () => {
|
it('does not change size for a frameless window with min size', async () => {
|
||||||
w.destroy();
|
w.destroy();
|
||||||
w = new BrowserWindow({
|
w = new BrowserWindow({
|
||||||
|
@ -1277,6 +1324,7 @@ describe('BrowserWindow module', () => {
|
||||||
await unmaximize;
|
await unmaximize;
|
||||||
expectBoundsEqual(w.getNormalBounds(), bounds);
|
expectBoundsEqual(w.getNormalBounds(), bounds);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('correctly checks transparent window maximization state', async () => {
|
it('correctly checks transparent window maximization state', async () => {
|
||||||
w.destroy();
|
w.destroy();
|
||||||
w = new BrowserWindow({
|
w = new BrowserWindow({
|
||||||
|
@ -1296,6 +1344,7 @@ describe('BrowserWindow module', () => {
|
||||||
await unmaximize;
|
await unmaximize;
|
||||||
expect(w.isMaximized()).to.equal(false);
|
expect(w.isMaximized()).to.equal(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns the correct value for windows with an aspect ratio', async () => {
|
it('returns the correct value for windows with an aspect ratio', async () => {
|
||||||
w.destroy();
|
w.destroy();
|
||||||
w = new BrowserWindow({
|
w = new BrowserWindow({
|
||||||
|
@ -1325,6 +1374,41 @@ describe('BrowserWindow module', () => {
|
||||||
await minimize;
|
await minimize;
|
||||||
expectBoundsEqual(w.getNormalBounds(), bounds);
|
expectBoundsEqual(w.getNormalBounds(), bounds);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('updates normal bounds after move and minimize', async () => {
|
||||||
|
const pos = [10, 10];
|
||||||
|
const move = emittedOnce(w, 'move');
|
||||||
|
w.setPosition(pos[0], pos[1]);
|
||||||
|
await move;
|
||||||
|
const original = w.getBounds();
|
||||||
|
|
||||||
|
const minimize = emittedOnce(w, 'minimize');
|
||||||
|
w.minimize();
|
||||||
|
await minimize;
|
||||||
|
|
||||||
|
const normal = w.getNormalBounds();
|
||||||
|
|
||||||
|
expect(original).to.deep.equal(normal);
|
||||||
|
expectBoundsEqual(normal, w.getBounds());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('updates normal bounds after resize and minimize', async () => {
|
||||||
|
const size = [300, 400];
|
||||||
|
const resize = emittedOnce(w, 'resize');
|
||||||
|
w.setSize(size[0], size[1]);
|
||||||
|
await resize;
|
||||||
|
const original = w.getBounds();
|
||||||
|
|
||||||
|
const minimize = emittedOnce(w, 'minimize');
|
||||||
|
w.minimize();
|
||||||
|
await minimize;
|
||||||
|
|
||||||
|
const normal = w.getNormalBounds();
|
||||||
|
|
||||||
|
expect(original).to.deep.equal(normal);
|
||||||
|
expectBoundsEqual(normal, w.getBounds());
|
||||||
|
});
|
||||||
|
|
||||||
it('checks normal bounds when restored', async () => {
|
it('checks normal bounds when restored', async () => {
|
||||||
const bounds = w.getBounds();
|
const bounds = w.getBounds();
|
||||||
w.once('minimize', () => {
|
w.once('minimize', () => {
|
||||||
|
@ -1336,6 +1420,7 @@ describe('BrowserWindow module', () => {
|
||||||
await restore;
|
await restore;
|
||||||
expectBoundsEqual(w.getNormalBounds(), bounds);
|
expectBoundsEqual(w.getNormalBounds(), bounds);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not change size for a frameless window with min size', async () => {
|
it('does not change size for a frameless window with min size', async () => {
|
||||||
w.destroy();
|
w.destroy();
|
||||||
w = new BrowserWindow({
|
w = new BrowserWindow({
|
||||||
|
@ -1381,6 +1466,50 @@ describe('BrowserWindow module', () => {
|
||||||
expectBoundsEqual(w.getNormalBounds(), bounds);
|
expectBoundsEqual(w.getNormalBounds(), bounds);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('updates normal bounds after resize and fullscreen', async () => {
|
||||||
|
const size = [300, 400];
|
||||||
|
const resize = emittedOnce(w, 'resize');
|
||||||
|
w.setSize(size[0], size[1]);
|
||||||
|
await resize;
|
||||||
|
const original = w.getBounds();
|
||||||
|
|
||||||
|
const fsc = emittedOnce(w, 'enter-full-screen');
|
||||||
|
w.fullScreen = true;
|
||||||
|
await fsc;
|
||||||
|
|
||||||
|
const normal = w.getNormalBounds();
|
||||||
|
const bounds = w.getBounds();
|
||||||
|
|
||||||
|
expect(normal).to.deep.equal(original);
|
||||||
|
expect(normal).to.not.deep.equal(bounds);
|
||||||
|
|
||||||
|
const close = emittedOnce(w, 'close');
|
||||||
|
w.close();
|
||||||
|
await close;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('updates normal bounds after move and fullscreen', async () => {
|
||||||
|
const pos = [10, 10];
|
||||||
|
const move = emittedOnce(w, 'move');
|
||||||
|
w.setPosition(pos[0], pos[1]);
|
||||||
|
await move;
|
||||||
|
const original = w.getBounds();
|
||||||
|
|
||||||
|
const fsc = emittedOnce(w, 'enter-full-screen');
|
||||||
|
w.fullScreen = true;
|
||||||
|
await fsc;
|
||||||
|
|
||||||
|
const normal = w.getNormalBounds();
|
||||||
|
const bounds = w.getBounds();
|
||||||
|
|
||||||
|
expect(normal).to.deep.equal(original);
|
||||||
|
expect(normal).to.not.deep.equal(bounds);
|
||||||
|
|
||||||
|
const close = emittedOnce(w, 'close');
|
||||||
|
w.close();
|
||||||
|
await close;
|
||||||
|
});
|
||||||
|
|
||||||
it('checks normal bounds when unfullscreen\'ed', async () => {
|
it('checks normal bounds when unfullscreen\'ed', async () => {
|
||||||
const bounds = w.getBounds();
|
const bounds = w.getBounds();
|
||||||
w.once('enter-full-screen', () => {
|
w.once('enter-full-screen', () => {
|
||||||
|
@ -1418,6 +1547,50 @@ describe('BrowserWindow module', () => {
|
||||||
expectBoundsEqual(w.getNormalBounds(), bounds);
|
expectBoundsEqual(w.getNormalBounds(), bounds);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('updates normal bounds after resize and fullscreen', async () => {
|
||||||
|
const size = [300, 400];
|
||||||
|
const resize = emittedOnce(w, 'resize');
|
||||||
|
w.setSize(size[0], size[1]);
|
||||||
|
await resize;
|
||||||
|
const original = w.getBounds();
|
||||||
|
|
||||||
|
const fsc = emittedOnce(w, 'enter-full-screen');
|
||||||
|
w.setFullScreen(true);
|
||||||
|
await fsc;
|
||||||
|
|
||||||
|
const normal = w.getNormalBounds();
|
||||||
|
const bounds = w.getBounds();
|
||||||
|
|
||||||
|
expect(normal).to.deep.equal(original);
|
||||||
|
expect(normal).to.not.deep.equal(bounds);
|
||||||
|
|
||||||
|
const close = emittedOnce(w, 'close');
|
||||||
|
w.close();
|
||||||
|
await close;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('updates normal bounds after move and fullscreen', async () => {
|
||||||
|
const pos = [10, 10];
|
||||||
|
const move = emittedOnce(w, 'move');
|
||||||
|
w.setPosition(pos[0], pos[1]);
|
||||||
|
await move;
|
||||||
|
const original = w.getBounds();
|
||||||
|
|
||||||
|
const fsc = emittedOnce(w, 'enter-full-screen');
|
||||||
|
w.setFullScreen(true);
|
||||||
|
await fsc;
|
||||||
|
|
||||||
|
const normal = w.getNormalBounds();
|
||||||
|
const bounds = w.getBounds();
|
||||||
|
|
||||||
|
expect(normal).to.deep.equal(original);
|
||||||
|
expect(normal).to.not.deep.equal(bounds);
|
||||||
|
|
||||||
|
const close = emittedOnce(w, 'close');
|
||||||
|
w.close();
|
||||||
|
await close;
|
||||||
|
});
|
||||||
|
|
||||||
it('checks normal bounds when unfullscreen\'ed', async () => {
|
it('checks normal bounds when unfullscreen\'ed', async () => {
|
||||||
const bounds = w.getBounds();
|
const bounds = w.getBounds();
|
||||||
w.show();
|
w.show();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue