mirror of
https://github.com/electron/electron.git
synced 2026-01-06 22:24:03 -05:00
* chore: bump chromium in DEPS to 145.0.7588.0 * fix(patch-conflict): update scroll_bounce_flag for split overscroll methods Chromium split IsElasticOverscrollEnabled() into two methods: IsElasticOverscrollEnabledOnRoot() and IsElasticOverscrollSupported(). Updated patch to apply the scroll-bounce command-line switch to both methods. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7233733 * fix(patch-conflict): update exclusive_access patch context Upstream refactored the profile variable declaration. Updated patch to match new surrounding context with brace-style if statement. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7239252 * fix(patch-conflict): update screen capture kit non-shareable filter Upstream refactored PiP window exclusion to use GetWindowsToExclude() helper function. Updated patch to combine non-shareable window filtering with the new helper's output. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7274596 * fix(patch-conflict): update corner smoothing CSS property id position Upstream added new internal overscroll CSS properties. Updated patch to add kElectronCornerSmoothing after the new entries. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7234051 * fix(patch-conflict): update permission patches for new permission types Upstream added new permission types: LOCAL_NETWORK, LOOPBACK_NETWORK, and GEOLOCATION_APPROXIMATE. Updated Electron permission patches to include these new types and renumber Electron-specific permissions. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7231952 * fix(patch-conflict): update memory query fallback for new function signature Upstream added AmountOfTotalPhysicalMemory() with PCHECK. Updated patch to maintain fallback logic with correct ByteSize return type. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7254886 * chore: update patch hunk headers * fix(patch): update reclient-configs patch to use new file mode The fix_add_python_remote_wrapper patch was using 'copy from' mode which caused inconsistent behavior between local and CI git versions. Changed to 'new file' mode for consistent patch application. * fix(patch-conflict): remove duplicate GEOLOCATION_APPROXIMATE case Upstream moved GEOLOCATION_APPROXIMATE earlier in the switch statement in GetPermissionString(). The 3-way merge kept both the old and new positions, causing a duplicate case error. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/6397637 * chore: update libcxx filenames for new headers * chore: bump chromium in DEPS to 145.0.7590.0 * chore: update patch hunk headers * fix(patch): update memory fallback return type to ByteSize Upstream changed the return type from ByteCount to ByteSize. * fix: suppress nodiscard warning in node_file.cc libc++ added [[nodiscard]] to std::filesystem::copy_options operator|= which causes build failures with -Werror. * 7229082: update CopyFromSurface to use CopyFromSurfaceResult Upstream changed CopyFromSurface callback to return base::expected<viz::CopyOutputBitmapWithMetadata, std::string> instead of SkBitmap, enabling better error handling. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7229082 * 7254070: add ip_address_space param to OnLocalNetworkAccessPermissionRequired Upstream added IPAddressSpace parameter to check address space for proper permission handling in Local Network Access. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7254070 * 7136679: add spelling_markers param to RequestCheckingOfText Upstream added spelling_markers parameter to report misspelling ranges from Blink to Spellcheck to IME. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7136679 * 7240487: remove second param from RegisterWebSafeIsolatedScheme Upstream removed the schemes_okay_to_appear_as_origin_headers_ parameter. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7240487 * 7254577: use explicit WebElement constructor WebElement default constructor now requires explicit construction rather than brace initialization. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7254577 * 7256335: remove override from CreateGlobalFeaturesForTesting Upstream removed BrowserProcess::CreateGlobalFeaturesForTesting virtual method so the override specifier is no longer valid. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7256335 * chore: add missing SingleThreadTaskRunner include A transitive include of SingleThreadTaskRunner was removed upstream, requiring an explicit include. Ref: Unable to locate specific CL (transitive include change) * 7260483: add LOCAL_NETWORK, LOOPBACK_NETWORK permission type cases Upstream added new permission types for Local Network Access split permissions. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7260483 * chore: update patch hunk headers * 7264893: update postMessage tests for file: origin serialization change Chromium now serializes file: origins as 'null' in MessageEvent per spec. This is a security improvement aligning with the HTML spec behavior. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7264893 * fix: add paths to custom scheme URLs in protocol tests Custom scheme URLs without paths (e.g. test-scheme://foo) cause a DCHECK crash in ASAN builds when CorsURLLoader tries to log the request via GenerateRequestLine -> PathForRequest, which asserts that the path is non-empty. Adding trailing slashes ensures URLs have valid paths. * chore: bump chromium in DEPS to 145.0.7592.0 * chore: update patches (trivial only) * chore: bump chromium in DEPS to 145.0.7594.0 * chore: bump chromium in DEPS to 145.0.7596.0 * chore: update accelerator.patch no manual changes; patch applied with fuzz 2 (offset 1 line) * chore: update patches (trivial only) * chore: node ./script/gen-libc++-filenames.js --------- Co-authored-by: Alice Zhao <alicelovescake@anthropic.com> Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> Co-authored-by: Charles Kerr <charles@charleskerr.com>
286 lines
13 KiB
Diff
286 lines
13 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: John Kleinschmidt <jkleinsc@electronjs.org>
|
|
Date: Sat, 14 Jun 2025 16:21:07 -0400
|
|
Subject: Revert "[views] Remove DesktopWindowTreeHostWin::window_enlargement_"
|
|
|
|
This reverts commit 1771dbae6961e7bb7c22bbc6c77f84d90ef2be46.
|
|
|
|
Electron needs this patch to allow windows smaller than 64x64
|
|
on Windows. We should refactor our code so that this patch isn't
|
|
necessary.
|
|
|
|
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
|
|
index c60f7cddb98345b6e186a074b0fb290e610ad95c..fdb470bf6b335704c0dea15074ba6aa8967b15eb 100644
|
|
--- a/testing/variations/fieldtrial_testing_config.json
|
|
+++ b/testing/variations/fieldtrial_testing_config.json
|
|
@@ -25732,6 +25732,21 @@
|
|
]
|
|
}
|
|
],
|
|
+ "TransparentHwndEnlargement": [
|
|
+ {
|
|
+ "platforms": [
|
|
+ "windows"
|
|
+ ],
|
|
+ "experiments": [
|
|
+ {
|
|
+ "name": "DisableTransparentHwndEnlargement",
|
|
+ "disable_features": [
|
|
+ "EnableTransparentHwndEnlargement"
|
|
+ ]
|
|
+ }
|
|
+ ]
|
|
+ }
|
|
+ ],
|
|
"TransportSecurityFileWriterScheduleAndroid": [
|
|
{
|
|
"platforms": [
|
|
diff --git a/ui/views/views_features.cc b/ui/views/views_features.cc
|
|
index 9ecf5330bb9b3a5a7b12f3b9bb76192ea1694d07..202d3e3df60ec8d23b4cbd3e5814c3fce1b07871 100644
|
|
--- a/ui/views/views_features.cc
|
|
+++ b/ui/views/views_features.cc
|
|
@@ -22,6 +22,14 @@ BASE_FEATURE(kAnnounceTextAdditionalAttributes,
|
|
// crbug.com/370856871.
|
|
BASE_FEATURE(kEnableTouchDragCursorSync, base::FEATURE_ENABLED_BY_DEFAULT);
|
|
|
|
+// Enables enlargement of HWNDs to a minimum size of 64x64 to handle reported
|
|
+// graphical glitches on certain hardware.
|
|
+// TODO(crbug.com/401996981): Remove this once enlargement is confirmed to no
|
|
+// longer be needed.
|
|
+BASE_FEATURE(kEnableTransparentHwndEnlargement,
|
|
+ "EnableTransparentHwndEnlargement",
|
|
+ base::FEATURE_DISABLED_BY_DEFAULT);
|
|
+
|
|
// Used to enable keyboard-accessible tooltips in Views UI, as opposed
|
|
// to kKeyboardAccessibleTooltip in //ui/base/ui_base_features.cc.
|
|
BASE_FEATURE(kKeyboardAccessibleTooltipInViews,
|
|
diff --git a/ui/views/views_features.h b/ui/views/views_features.h
|
|
index 5f5ea15678bd76399fdbbb8904fe155657f49335..a67c124878fb710599fed5d9714bfa723d0d67a5 100644
|
|
--- a/ui/views/views_features.h
|
|
+++ b/ui/views/views_features.h
|
|
@@ -14,6 +14,7 @@ namespace views::features {
|
|
// Please keep alphabetized.
|
|
VIEWS_EXPORT BASE_DECLARE_FEATURE(kAnnounceTextAdditionalAttributes);
|
|
VIEWS_EXPORT BASE_DECLARE_FEATURE(kEnableTouchDragCursorSync);
|
|
+VIEWS_EXPORT BASE_DECLARE_FEATURE(kEnableTransparentHwndEnlargement);
|
|
VIEWS_EXPORT BASE_DECLARE_FEATURE(kKeyboardAccessibleTooltipInViews);
|
|
VIEWS_EXPORT BASE_DECLARE_FEATURE(kApplyInitialUrlToWebContents);
|
|
|
|
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
|
|
index b37df4100eac1263f874dc5bff9e29eea64c1c0a..724a094c1b9a3c1efaf65c5222e40433a374b76d 100644
|
|
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
|
|
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
|
|
@@ -84,6 +84,23 @@ namespace {
|
|
// This constant controls how many pixels wide that border is.
|
|
const int kMouseCaptureRegionBorder = 5;
|
|
|
|
+gfx::Size GetExpandedWindowSize(bool is_translucent, gfx::Size size) {
|
|
+ if (!base::FeatureList::IsEnabled(
|
|
+ features::kEnableTransparentHwndEnlargement) ||
|
|
+ !is_translucent) {
|
|
+ return size;
|
|
+ }
|
|
+
|
|
+ // Some AMD drivers can't display windows that are less than 64x64 pixels,
|
|
+ // so expand them to be at least that size. http://crbug.com/286609
|
|
+ gfx::Size expanded(std::max(size.width(), 64), std::max(size.height(), 64));
|
|
+ return expanded;
|
|
+}
|
|
+
|
|
+void InsetBottomRight(gfx::Rect* rect, const gfx::Vector2d& vector) {
|
|
+ rect->Inset(gfx::Insets::TLBR(0, 0, vector.y(), vector.x()));
|
|
+}
|
|
+
|
|
// Updates the cursor clip region. Used for mouse locking.
|
|
void UpdateMouseLockRegion(aura::Window* window, bool locked) {
|
|
if (!locked) {
|
|
@@ -332,9 +349,14 @@ bool DesktopWindowTreeHostWin::IsVisible() const {
|
|
}
|
|
|
|
void DesktopWindowTreeHostWin::SetSize(const gfx::Size& size) {
|
|
- const gfx::Size size_in_pixels =
|
|
+ gfx::Size size_in_pixels =
|
|
display::win::GetScreenWin()->DIPToScreenSize(GetHWND(), size);
|
|
- message_handler_->SetSize(size_in_pixels);
|
|
+ gfx::Size expanded =
|
|
+ GetExpandedWindowSize(message_handler_->is_translucent(), size_in_pixels);
|
|
+ window_enlargement_ =
|
|
+ gfx::Vector2d(expanded.width() - size_in_pixels.width(),
|
|
+ expanded.height() - size_in_pixels.height());
|
|
+ message_handler_->SetSize(expanded);
|
|
}
|
|
|
|
void DesktopWindowTreeHostWin::StackAbove(aura::Window* window) {
|
|
@@ -349,30 +371,40 @@ void DesktopWindowTreeHostWin::StackAtTop() {
|
|
}
|
|
|
|
void DesktopWindowTreeHostWin::CenterWindow(const gfx::Size& size) {
|
|
- const gfx::Size size_in_pixels =
|
|
+ gfx::Size size_in_pixels =
|
|
display::win::GetScreenWin()->DIPToScreenSize(GetHWND(), size);
|
|
- message_handler_->CenterWindow(size_in_pixels);
|
|
+ gfx::Size expanded_size;
|
|
+ expanded_size =
|
|
+ GetExpandedWindowSize(message_handler_->is_translucent(), size_in_pixels);
|
|
+ window_enlargement_ =
|
|
+ gfx::Vector2d(expanded_size.width() - size_in_pixels.width(),
|
|
+ expanded_size.height() - size_in_pixels.height());
|
|
+ message_handler_->CenterWindow(expanded_size);
|
|
}
|
|
|
|
void DesktopWindowTreeHostWin::GetWindowPlacement(
|
|
gfx::Rect* bounds,
|
|
ui::mojom::WindowShowState* show_state) const {
|
|
message_handler_->GetWindowPlacement(bounds, show_state);
|
|
+ InsetBottomRight(bounds, window_enlargement_);
|
|
*bounds = display::win::GetScreenWin()->ScreenToDIPRect(GetHWND(), *bounds);
|
|
}
|
|
|
|
gfx::Rect DesktopWindowTreeHostWin::GetWindowBoundsInScreen() const {
|
|
gfx::Rect pixel_bounds = message_handler_->GetWindowBoundsInScreen();
|
|
+ InsetBottomRight(&pixel_bounds, window_enlargement_);
|
|
return display::win::GetScreenWin()->ScreenToDIPRect(GetHWND(), pixel_bounds);
|
|
}
|
|
|
|
gfx::Rect DesktopWindowTreeHostWin::GetClientAreaBoundsInScreen() const {
|
|
gfx::Rect pixel_bounds = message_handler_->GetClientAreaBoundsInScreen();
|
|
+ InsetBottomRight(&pixel_bounds, window_enlargement_);
|
|
return display::win::GetScreenWin()->ScreenToDIPRect(GetHWND(), pixel_bounds);
|
|
}
|
|
|
|
gfx::Rect DesktopWindowTreeHostWin::GetRestoredBounds() const {
|
|
gfx::Rect pixel_bounds = message_handler_->GetRestoredBounds();
|
|
+ InsetBottomRight(&pixel_bounds, window_enlargement_);
|
|
return display::win::GetScreenWin()->ScreenToDIPRect(GetHWND(), pixel_bounds);
|
|
}
|
|
|
|
@@ -680,37 +712,44 @@ void DesktopWindowTreeHostWin::HideImpl() {
|
|
// other get/set methods work in DIP.
|
|
|
|
gfx::Rect DesktopWindowTreeHostWin::GetBoundsInPixels() const {
|
|
- const gfx::Rect bounds_px(message_handler_->GetClientAreaBounds());
|
|
+ gfx::Rect bounds(message_handler_->GetClientAreaBounds());
|
|
// If the window bounds were expanded we need to return the original bounds
|
|
// To achieve this we do the reverse of the expansion, i.e. add the
|
|
// window_expansion_top_left_delta_ to the origin and subtract the
|
|
// window_expansion_bottom_right_delta_ from the width and height.
|
|
- const gfx::Rect without_expansion_bounds_px(
|
|
- bounds_px.x() + window_expansion_top_left_delta_.x(),
|
|
- bounds_px.y() + window_expansion_top_left_delta_.y(),
|
|
- bounds_px.width() - window_expansion_bottom_right_delta_.x(),
|
|
- bounds_px.height() - window_expansion_bottom_right_delta_.y());
|
|
- return without_expansion_bounds_px;
|
|
+ gfx::Rect without_expansion(
|
|
+ bounds.x() + window_expansion_top_left_delta_.x(),
|
|
+ bounds.y() + window_expansion_top_left_delta_.y(),
|
|
+ bounds.width() - window_expansion_bottom_right_delta_.x() -
|
|
+ window_enlargement_.x(),
|
|
+ bounds.height() - window_expansion_bottom_right_delta_.y() -
|
|
+ window_enlargement_.y());
|
|
+ return without_expansion;
|
|
}
|
|
|
|
-void DesktopWindowTreeHostWin::SetBoundsInPixels(
|
|
- const gfx::Rect& bounds_in_pixels) {
|
|
+void DesktopWindowTreeHostWin::SetBoundsInPixels(const gfx::Rect& bounds) {
|
|
// If the window bounds have to be expanded we need to subtract the
|
|
// window_expansion_top_left_delta_ from the origin and add the
|
|
// window_expansion_bottom_right_delta_ to the width and height
|
|
- const gfx::Size old_content_size_px = GetBoundsInPixels().size();
|
|
-
|
|
- const gfx::Rect expanded_bounds_px(
|
|
- bounds_in_pixels.x() - window_expansion_top_left_delta_.x(),
|
|
- bounds_in_pixels.y() - window_expansion_top_left_delta_.y(),
|
|
- bounds_in_pixels.width() + window_expansion_bottom_right_delta_.x(),
|
|
- bounds_in_pixels.height() + window_expansion_bottom_right_delta_.y());
|
|
-
|
|
- // When `expanded_bounds_px` causes the window to be moved to a display with a
|
|
+ gfx::Size old_content_size = GetBoundsInPixels().size();
|
|
+
|
|
+ gfx::Rect expanded(
|
|
+ bounds.x() - window_expansion_top_left_delta_.x(),
|
|
+ bounds.y() - window_expansion_top_left_delta_.y(),
|
|
+ bounds.width() + window_expansion_bottom_right_delta_.x(),
|
|
+ bounds.height() + window_expansion_bottom_right_delta_.y());
|
|
+
|
|
+ gfx::Rect new_expanded(
|
|
+ expanded.origin(),
|
|
+ GetExpandedWindowSize(message_handler_->is_translucent(),
|
|
+ expanded.size()));
|
|
+ window_enlargement_ =
|
|
+ gfx::Vector2d(new_expanded.width() - expanded.width(),
|
|
+ new_expanded.height() - expanded.height());
|
|
+ // When |new_expanded| causes the window to be moved to a display with a
|
|
// different DSF, HWNDMessageHandler::OnDpiChanged() will be called and the
|
|
// window size will be scaled automatically.
|
|
- message_handler_->SetBounds(expanded_bounds_px,
|
|
- old_content_size_px != bounds_in_pixels.size());
|
|
+ message_handler_->SetBounds(new_expanded, old_content_size != bounds.size());
|
|
}
|
|
|
|
gfx::Rect
|
|
@@ -920,18 +959,26 @@ int DesktopWindowTreeHostWin::GetNonClientComponent(
|
|
|
|
void DesktopWindowTreeHostWin::GetWindowMask(const gfx::Size& size_px,
|
|
SkPath* path) {
|
|
- Widget* widget = GetWidget();
|
|
- if (!widget || !widget->non_client_view()) {
|
|
- return;
|
|
- }
|
|
+ // Request the window mask for hwnd of `size_px`. The hwnd size must be
|
|
+ // adjusted by `window_enlargement` to return to the client-expected window
|
|
+ // size (see crbug.com/41047830).
|
|
+ const gfx::Size adjusted_size_in_px =
|
|
+ size_px - gfx::Size(window_enlargement_.x(), window_enlargement_.y());
|
|
|
|
- widget->non_client_view()->GetWindowMask(
|
|
- display::win::GetScreenWin()->ScreenToDIPSize(GetHWND(), size_px), path);
|
|
- // Convert path in DIPs to pixels.
|
|
- if (!path->isEmpty()) {
|
|
- const float scale =
|
|
- display::win::GetScreenWin()->GetScaleFactorForHWND(GetHWND());
|
|
- *path = path->makeTransform(SkMatrix::Scale(scale, scale));
|
|
+ if (Widget* widget = GetWidget(); widget && widget->non_client_view()) {
|
|
+ widget->non_client_view()->GetWindowMask(
|
|
+ display::win::GetScreenWin()->ScreenToDIPSize(GetHWND(),
|
|
+ adjusted_size_in_px),
|
|
+ path);
|
|
+ // Convert path in DIPs to pixels.
|
|
+ if (!path->isEmpty()) {
|
|
+ const float scale =
|
|
+ display::win::GetScreenWin()->GetScaleFactorForHWND(GetHWND());
|
|
+ *path = path->makeTransform(SkMatrix::Scale(scale, scale));
|
|
+ }
|
|
+ } else if (!window_enlargement_.IsZero()) {
|
|
+ *path = SkPath::Rect(SkRect::MakeXYWH(0, 0, adjusted_size_in_px.width(),
|
|
+ adjusted_size_in_px.height()));
|
|
}
|
|
}
|
|
|
|
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
|
|
index e8acd2828ed05deefa335ce2bb461f0c3be8d7b7..0cd07fd5fb55dcc0d972de4c027fcb895d156592 100644
|
|
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
|
|
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
|
|
@@ -175,7 +175,7 @@ class VIEWS_EXPORT DesktopWindowTreeHostWin
|
|
void ShowImpl() override;
|
|
void HideImpl() override;
|
|
gfx::Rect GetBoundsInPixels() const override;
|
|
- void SetBoundsInPixels(const gfx::Rect& bounds_in_pixels) override;
|
|
+ void SetBoundsInPixels(const gfx::Rect& bounds) override;
|
|
gfx::Rect GetBoundsInAcceleratedWidgetPixelCoordinates() override;
|
|
gfx::Point GetLocationOnScreenInPixels() const override;
|
|
void SetCapture() override;
|
|
@@ -328,6 +328,12 @@ class VIEWS_EXPORT DesktopWindowTreeHostWin
|
|
gfx::Vector2d window_expansion_top_left_delta_;
|
|
gfx::Vector2d window_expansion_bottom_right_delta_;
|
|
|
|
+ // Windows are enlarged to be at least 64x64 pixels, so keep track of the
|
|
+ // extra added here.
|
|
+ // TODO(crbug.com/401996981): This is likely no longer necessary and should be
|
|
+ // removed.
|
|
+ gfx::Vector2d window_enlargement_;
|
|
+
|
|
// Whether the window close should be converted to a hide, and then actually
|
|
// closed on the completion of the hide animation. This is cached because
|
|
// the property is set on the contained window which has a shorter lifetime.
|