Browse Source

fix datalist element popup position when menu is hidden

Heilig Benedek 7 years ago
parent
commit
193beb57c9

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

+ 18 - 15
atom/browser/ui/autofill_popup.cc

@@ -155,7 +155,6 @@ void AutofillPopup::SetItems(const std::vector<base::string16>& values,
                             const std::vector<base::string16>& 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<int, int> 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<int, int> 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() {

+ 2 - 1
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<base::string16>& values,
                 const std::vector<base::string16>& 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);