Browse Source

feat: make win.setAspectRatio() work on Windows (#27203)

trop[bot] 4 years ago
parent
commit
a21ed83751

+ 4 - 1
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,

+ 1 - 0
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

+ 38 - 0
patches/chromium/enable_reset_aspect_ratio.patch

@@ -0,0 +1,38 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Cheng Zhao <[email protected]>
+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 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) {
+ }
+ 
+ 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 42eeb16a3d59de7e37eb858a982cc3534ab7cc51..ce3672e4d5cee51651bc6f8c294b27f0a9e01682 100644
+--- a/ui/views/win/hwnd_message_handler.cc
++++ b/ui/views/win/hwnd_message_handler.cc
+@@ -920,8 +920,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;
+ 

+ 0 - 2
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) {

+ 4 - 1
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 {

+ 4 - 1
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 {