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..4e226a5e0ffff --- /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 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; + 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 {