From e6f7cb95188e452edae249b69d8697d92b6b44a7 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 11 Dec 2020 11:40:19 +0900 Subject: [PATCH 1/3] feat: make win.setAspectRatio() work on Windows --- 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 c06bc1319ae2b..b78962308195c 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -1049,7 +1049,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. @@ -1070,6 +1070,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 f94345b8985f7..5ded3172f9b6e 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 0000000000000..0fdd48f5cb1a9 --- /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 34b58eb81f42e70a17250b99dfaa58891dc076c1..10c584016c427b1969bf707f79e74fa9f7e3e882 100644 +--- a/ui/views/win/hwnd_message_handler.cc ++++ b/ui/views/win/hwnd_message_handler.cc +@@ -924,8 +924,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 42437a64bbc27..b2662f08edfea 100644 --- a/shell/browser/native_window_views.cc +++ b/shell/browser/native_window_views.cc @@ -725,13 +725,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 685a875b78596..6c5ae23ec2f34 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 48fa68f61d8c6..228aecdae368d 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 { From d2a98d8e0a0f3ec0197a21d71bc64119d98e1e93 Mon Sep 17 00:00:00 2001 From: Electron Bot Date: Tue, 5 Jan 2021 02:21:39 +0000 Subject: [PATCH 2/3] update patches --- patches/chromium/enable_reset_aspect_ratio.patch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/patches/chromium/enable_reset_aspect_ratio.patch b/patches/chromium/enable_reset_aspect_ratio.patch index 0fdd48f5cb1a9..65b8286133e6d 100644 --- a/patches/chromium/enable_reset_aspect_ratio.patch +++ b/patches/chromium/enable_reset_aspect_ratio.patch @@ -19,10 +19,10 @@ index a409755330351e7e1684c31f7c7cc6882a2dc7af..3349f38e1df8ff7e5c70f1c177b11914 aspect_ratio.height()); } diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc -index 34b58eb81f42e70a17250b99dfaa58891dc076c1..10c584016c427b1969bf707f79e74fa9f7e3e882 100644 +index dc2cdf7467912d36261583c91c8f46fbe041c5e0..a23108d0a38af3388b35bd5a0ae3cc3d5e565d93 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc -@@ -924,8 +924,11 @@ void HWNDMessageHandler::SetFullscreen(bool fullscreen) { +@@ -919,8 +919,11 @@ void HWNDMessageHandler::SetFullscreen(bool fullscreen) { } void HWNDMessageHandler::SetAspectRatio(float aspect_ratio) { From 335c33c270a255bb1b50045d1c3455088c93c030 Mon Sep 17 00:00:00 2001 From: Electron Bot Date: Wed, 6 Jan 2021 02:44:39 +0000 Subject: [PATCH 3/3] update patches --- patches/chromium/enable_reset_aspect_ratio.patch | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/patches/chromium/enable_reset_aspect_ratio.patch b/patches/chromium/enable_reset_aspect_ratio.patch index 65b8286133e6d..4e226a5e0ffff 100644 --- a/patches/chromium/enable_reset_aspect_ratio.patch +++ b/patches/chromium/enable_reset_aspect_ratio.patch @@ -6,7 +6,7 @@ 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 +index 3b132d4d7618e11b851b315e82fa67442c852fb3..af2c2f2bbc1f52f4455fb973ab2fc0d0dd013ca5 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) { @@ -19,10 +19,10 @@ index a409755330351e7e1684c31f7c7cc6882a2dc7af..3349f38e1df8ff7e5c70f1c177b11914 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 +index 42eeb16a3d59de7e37eb858a982cc3534ab7cc51..ce3672e4d5cee51651bc6f8c294b27f0a9e01682 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) { +@@ -920,8 +920,11 @@ void HWNDMessageHandler::SetFullscreen(bool fullscreen) { } void HWNDMessageHandler::SetAspectRatio(float aspect_ratio) {