From 193beb57c9ebc62d5b77d68532c7198dcea17be9 Mon Sep 17 00:00:00 2001 From: Heilig Benedek Date: Fri, 3 Nov 2017 00:25:59 +0100 Subject: [PATCH] fix datalist element popup position when menu is hidden --- atom/browser/native_window_views.cc | 6 +++++- atom/browser/ui/autofill_popup.cc | 33 ++++++++++++++++------------- atom/browser/ui/autofill_popup.h | 3 ++- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index db873893bf8..5caa8380b00 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -1367,13 +1367,14 @@ void NativeWindowViews::ShowAutofillPopup( bool isOffsceen = web_preferences->IsOffScreen(web_contents()); bool isEmbedderOffscreen = web_preferences->IsGuest(web_contents()) && web_preferences->IsOffScreen(web_preferences->Embedder(web_contents())); - + autofill_popup_->CreateView( frame_host, isOffsceen || isEmbedderOffscreen, widget(), bounds); autofill_popup_->SetItems(values, labels); + autofill_popup_->UpdatePopupBounds(menu_bar_visible_ ? 0 : kMenuBarHeight); } void NativeWindowViews::HideAutofillPopup( @@ -1395,6 +1396,9 @@ void NativeWindowViews::Layout() { gfx::Rect(0, menu_bar_bounds.height(), size.width(), size.height() - menu_bar_bounds.height())); } + + if (autofill_popup_.get()) + autofill_popup_->UpdatePopupBounds(menu_bar_visible_ ? 0 : kMenuBarHeight); } gfx::Size NativeWindowViews::GetMinimumSize() const { diff --git a/atom/browser/ui/autofill_popup.cc b/atom/browser/ui/autofill_popup.cc index e38fdb523e8..74c9d9d5699 100644 --- a/atom/browser/ui/autofill_popup.cc +++ b/atom/browser/ui/autofill_popup.cc @@ -155,7 +155,6 @@ void AutofillPopup::SetItems(const std::vector& values, const std::vector& labels) { values_ = values; labels_ = labels; - UpdatePopupBounds(); if (view_) { view_->OnSuggestionsChanged(); } @@ -166,37 +165,41 @@ void AutofillPopup::AcceptSuggestion(int index) { frame_host_->GetRoutingID(), GetValueAt(index))); } -void AutofillPopup::UpdatePopupBounds() { +void AutofillPopup::UpdatePopupBounds(int height_compensation) { int desired_width = GetDesiredPopupWidth(); int desired_height = GetDesiredPopupHeight(); bool is_rtl = false; - gfx::Point top_left_corner_of_popup = - element_bounds_.origin() + - gfx::Vector2d(element_bounds_.width() - desired_width, -desired_height); + gfx::Point origin(element_bounds_.origin().x(), + element_bounds_.origin().y() - height_compensation); + gfx::Rect bounds(origin, element_bounds_.size()); + + gfx::Point top_left_corner_of_popup = origin + + gfx::Vector2d(bounds.width() - desired_width, -desired_height); // This is the bottom right point of the popup if the popup is below the // element and grows to the right (since the is the lowest and furthest right // the popup could go). - gfx::Point bottom_right_corner_of_popup = - element_bounds_.origin() + - gfx::Vector2d(desired_width, element_bounds_.height() + desired_height); + gfx::Point bottom_right_corner_of_popup = origin + + gfx::Vector2d(desired_width, bounds.height() + desired_height); display::Display top_left_display = - GetDisplayNearestPoint(top_left_corner_of_popup, container_view_); + GetDisplayNearestPoint(top_left_corner_of_popup, container_view_); display::Display bottom_right_display = - GetDisplayNearestPoint(bottom_right_corner_of_popup, container_view_); + GetDisplayNearestPoint(bottom_right_corner_of_popup, container_view_); std::pair popup_x_and_width = - CalculatePopupXAndWidth(top_left_display, bottom_right_display, - desired_width, element_bounds_, is_rtl); + CalculatePopupXAndWidth(top_left_display, bottom_right_display, + desired_width, bounds, is_rtl); std::pair popup_y_and_height = CalculatePopupYAndHeight( - top_left_display, bottom_right_display, desired_height, element_bounds_); + top_left_display, bottom_right_display, desired_height, bounds); popup_bounds_ = gfx::Rect(popup_x_and_width.first, popup_y_and_height.first, - popup_x_and_width.second, popup_y_and_height.second); + popup_x_and_width.second, popup_y_and_height.second); popup_bounds_in_view_ = gfx::Rect(popup_bounds_in_view_.origin(), - gfx::Size(popup_x_and_width.second, popup_y_and_height.second)); + gfx::Size(popup_x_and_width.second, popup_y_and_height.second)); + if (view_) + view_->DoUpdateBoundsAndRedrawPopup(); } int AutofillPopup::GetDesiredPopupHeight() { diff --git a/atom/browser/ui/autofill_popup.h b/atom/browser/ui/autofill_popup.h index 2dc6b68c248..7064c3fd786 100644 --- a/atom/browser/ui/autofill_popup.h +++ b/atom/browser/ui/autofill_popup.h @@ -12,6 +12,7 @@ #include "ui/gfx/font_list.h" #include "ui/native_theme/native_theme.h" #include "ui/views/widget/widget.h" +#include "ui/views/view.h" namespace atom { @@ -28,13 +29,13 @@ class AutofillPopup { void SetItems(const std::vector& values, const std::vector& labels); + void UpdatePopupBounds(int height_compensation); private: friend class AutofillPopupView; void AcceptSuggestion(int index); - void UpdatePopupBounds(); int GetDesiredPopupHeight(); int GetDesiredPopupWidth(); gfx::Rect GetRowBounds(int i);