fix: ensure bounds stability in OnWidgetBoundsChanged (#43457)

* fix: ensure bounds stability in OnWidgetBoundsChanged

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* Update shell/browser/native_window_views.cc

Co-authored-by: Charles Kerr <charles@charleskerr.com>

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
This commit is contained in:
trop[bot] 2024-08-24 00:31:48 -05:00 committed by GitHub
parent d769f1ea71
commit 26d6f62c01
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -22,6 +22,7 @@
#include "base/containers/contains.h" #include "base/containers/contains.h"
#include "base/memory/raw_ref.h" #include "base/memory/raw_ref.h"
#include "base/numerics/ranges.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "content/public/browser/desktop_media_id.h" #include "content/public/browser/desktop_media_id.h"
#include "content/public/common/color_parser.h" #include "content/public/common/color_parser.h"
@ -1637,10 +1638,18 @@ void NativeWindowViews::OnWidgetBoundsChanged(views::Widget* changed_widget,
if (changed_widget != widget()) if (changed_widget != widget())
return; return;
// Note: We intentionally use `GetBounds()` instead of `bounds` to properly // |GetWindowBoundsInScreen| has a ~1 pixel margin of error, so if we check
// handle minimized windows on Windows. // existing bounds directly against the new bounds without accounting for that
// we'll have constant false positives when the window is moving but the user
// hasn't changed its size at all.
auto areWithinOnePixel = [](gfx::Size old_size, gfx::Size new_size) -> bool {
return base::IsApproximatelyEqual(old_size.width(), new_size.width(), 1) &&
base::IsApproximatelyEqual(old_size.height(), new_size.height(), 1);
};
// We use |GetBounds| to account for minimized windows on Windows.
const auto new_bounds = GetBounds(); const auto new_bounds = GetBounds();
if (widget_size_ != new_bounds.size()) { if (!areWithinOnePixel(widget_size_, new_bounds.size())) {
NotifyWindowResize(); NotifyWindowResize();
widget_size_ = new_bounds.size(); widget_size_ = new_bounds.size();
} }