From 5f99569b6c5196d9648ce426f587d249e01ff1ca Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 5 Jan 2021 17:17:33 +0900 Subject: [PATCH] feat: make win.setAspectRatio() work on Windows (#26941) * feat: make win.setAspectRatio() work on Windows * update patches Co-authored-by: Electron Bot --- docs/api/browser-window.md | 5 ++- patches/chromium/.patches | 1 + .../chromium/enable_reset_aspect_ratio.patch | 38 +++++++++++++++++++ shell/browser/native_window_views.cc | 2 - shell/browser/ui/views/frameless_view.cc | 5 ++- shell/browser/ui/views/native_frame_view.cc | 5 ++- 6 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 patches/chromium/enable_reset_aspect_ratio.patch diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index 7131d590e3a8..cb525986ce8d 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -965,7 +965,7 @@ Returns `Boolean` - Whether the window is in simple (pre-Lion) fullscreen mode. Returns `Boolean` - Whether the window is in normal state (not maximized, not minimized, not in fullscreen mode). -#### `win.setAspectRatio(aspectRatio[, extraSize])` _macOS_ _Linux_ +#### `win.setAspectRatio(aspectRatio[, extraSize])` * `aspectRatio` Float - The aspect ratio to maintain for some portion of the content view. @@ -986,6 +986,9 @@ the player itself we would call this function with arguments of 16/9 and are within the content view--only that they exist. Sum any extra width and height areas you have within the overall content view. +The aspect ratio is not respected when window is resized programmingly with +APIs like `win.setSize`. + #### `win.setBackgroundColor(backgroundColor)` * `backgroundColor` String - Window's background color as a hexadecimal value, diff --git a/patches/chromium/.patches b/patches/chromium/.patches index 6ce5e5f8a596..913224ba1ba6 100644 --- a/patches/chromium/.patches +++ b/patches/chromium/.patches @@ -15,6 +15,7 @@ webview_cross_drag.patch gin_enable_disable_v8_platform.patch blink-worker-enable-csp-in-file-scheme.patch disable-redraw-lock.patch +enable_reset_aspect_ratio.patch v8_context_snapshot_generator.patch boringssl_build_gn.patch pepper_plugin_support.patch diff --git a/patches/chromium/enable_reset_aspect_ratio.patch b/patches/chromium/enable_reset_aspect_ratio.patch new file mode 100644 index 000000000000..65b8286133e6 --- /dev/null +++ b/patches/chromium/enable_reset_aspect_ratio.patch @@ -0,0 +1,38 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cheng Zhao +Date: Thu, 4 Oct 2018 14:57:02 -0700 +Subject: feat: enable setting aspect ratio to 0 + +Make SetAspectRatio accept 0 as valid input, which would reset to null. + +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 a409755330351e7e1684c31f7c7cc6882a2dc7af..3349f38e1df8ff7e5c70f1c177b11914e4fa3e30 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 +@@ -484,7 +484,7 @@ void DesktopWindowTreeHostWin::SetOpacity(float opacity) { + } + + void DesktopWindowTreeHostWin::SetAspectRatio(const gfx::SizeF& aspect_ratio) { +- DCHECK(!aspect_ratio.IsEmpty()); ++ DCHECK_NE(aspect_ratio.height(), 0); + message_handler_->SetAspectRatio(aspect_ratio.width() / + aspect_ratio.height()); + } +diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc +index dc2cdf7467912d36261583c91c8f46fbe041c5e0..a23108d0a38af3388b35bd5a0ae3cc3d5e565d93 100644 +--- a/ui/views/win/hwnd_message_handler.cc ++++ b/ui/views/win/hwnd_message_handler.cc +@@ -919,8 +919,11 @@ void HWNDMessageHandler::SetFullscreen(bool fullscreen) { + } + + void HWNDMessageHandler::SetAspectRatio(float aspect_ratio) { +- // If the aspect ratio is not in the valid range, do nothing. +- DCHECK_GT(aspect_ratio, 0.0f); ++ // If the aspect ratio is 0, reset it to null. ++ if (aspect_ratio == 0.0f) { ++ aspect_ratio_.reset(); ++ return; ++ } + + aspect_ratio_ = aspect_ratio; + diff --git a/shell/browser/native_window_views.cc b/shell/browser/native_window_views.cc index 3c2d65697b5a..5b2d5b7a481c 100644 --- a/shell/browser/native_window_views.cc +++ b/shell/browser/native_window_views.cc @@ -755,13 +755,11 @@ bool NativeWindowViews::IsResizable() { void NativeWindowViews::SetAspectRatio(double aspect_ratio, const gfx::Size& extra_size) { NativeWindow::SetAspectRatio(aspect_ratio, extra_size); -#if defined(OS_LINUX) gfx::SizeF aspect(aspect_ratio, 1.0); // Scale up because SetAspectRatio() truncates aspect value to int aspect.Scale(100); widget()->SetAspectRatio(aspect); -#endif } void NativeWindowViews::SetMovable(bool movable) { diff --git a/shell/browser/ui/views/frameless_view.cc b/shell/browser/ui/views/frameless_view.cc index 685a875b7859..6c5ae23ec2f3 100644 --- a/shell/browser/ui/views/frameless_view.cc +++ b/shell/browser/ui/views/frameless_view.cc @@ -114,7 +114,10 @@ gfx::Size FramelessView::GetMinimumSize() const { } gfx::Size FramelessView::GetMaximumSize() const { - return window_->GetContentMaximumSize(); + gfx::Size size = window_->GetContentMaximumSize(); + // Electron public APIs returns (0, 0) when maximum size is not set, but it + // would break internal window APIs like HWNDMessageHandler::SetAspectRatio. + return size.IsEmpty() ? gfx::Size(INT_MAX, INT_MAX) : size; } const char* FramelessView::GetClassName() const { diff --git a/shell/browser/ui/views/native_frame_view.cc b/shell/browser/ui/views/native_frame_view.cc index 48fa68f61d8c..228aecdae368 100644 --- a/shell/browser/ui/views/native_frame_view.cc +++ b/shell/browser/ui/views/native_frame_view.cc @@ -18,7 +18,10 @@ gfx::Size NativeFrameView::GetMinimumSize() const { } gfx::Size NativeFrameView::GetMaximumSize() const { - return window_->GetMaximumSize(); + gfx::Size size = window_->GetMaximumSize(); + // Electron public APIs returns (0, 0) when maximum size is not set, but it + // would break internal window APIs like HWNDMessageHandler::SetAspectRatio. + return size.IsEmpty() ? gfx::Size(INT_MAX, INT_MAX) : size; } const char* NativeFrameView::GetClassName() const {