Index: chrome/browser/ui/autofill/password_generation_popup_controller_impl.cc |
diff --git a/chrome/browser/ui/autofill/password_generation_popup_controller_impl.cc b/chrome/browser/ui/autofill/password_generation_popup_controller_impl.cc |
index d946711d78758bd168cc69f858252c4d2900a8f5..b0acb02890a8a896db7ab53508e0796c73ce4295 100644 |
--- a/chrome/browser/ui/autofill/password_generation_popup_controller_impl.cc |
+++ b/chrome/browser/ui/autofill/password_generation_popup_controller_impl.cc |
@@ -33,6 +33,13 @@ |
namespace autofill { |
+namespace { |
+// The amount of additional space that a link takes up as it has a border if |
+// it's focused. TODO(gcasto): Does OSX do this as well? |
+const int kLinkBorderSize = 1; |
+const int kPasswordSectionHeight = 62; |
+} |
+ |
base::WeakPtr<PasswordGenerationPopupControllerImpl> |
PasswordGenerationPopupControllerImpl::GetOrCreate( |
base::WeakPtr<PasswordGenerationPopupControllerImpl> previous, |
@@ -159,7 +166,7 @@ void PasswordGenerationPopupControllerImpl::PasswordAccepted() { |
int PasswordGenerationPopupControllerImpl::GetDesiredWidth() { |
// Minimum width in pixels. |
- const int minimum_required_width = 300; |
+ const int minimum_required_width = 350; |
// If the width of the field is longer than the minimum, use that instead. |
int width = std::max(minimum_required_width, |
@@ -177,21 +184,56 @@ int PasswordGenerationPopupControllerImpl::GetDesiredWidth() { |
} |
int PasswordGenerationPopupControllerImpl::GetDesiredHeight(int width) { |
Evan Stade
2014/06/19 00:16:35
size calculations belong in view implementations.
Garrett Casto
2014/06/20 23:47:00
One problem with this is that you need to know the
Evan Stade
2014/06/23 18:20:40
what platform are you using for the study? cros? C
Garrett Casto
2014/06/24 01:15:11
I actually don't know if it's CrOS or Windows. I t
|
- // Note that this wrapping isn't exactly what the popup will do. It shouldn't |
- // line break in the middle of the link, but as long as the link isn't longer |
- // than given width this shouldn't affect the height calculated here. The |
- // default width should be wide enough to prevent this from being an issue. |
+ // Calculating the height of the help text is complicated by the fact that |
+ // we won't add a line break in the middle of a link. Note that this currently |
+ // doesn't appropriately wrap at word boundries either, but that is less of |
+ // a problem at the moment given the size of the link and it's placement on |
+ // the line. |
+ // TODO(gcasto): I really wish that there was a better cross platform way of |
+ // calculating this, but it's not clear that there is. |
+ // gfx::ElideRectangleText() is close, but it doesn't understand embedded |
+ // links. |
int total_length = gfx::GetStringWidth(HelpText(), font_list_); |
- int usable_width = width - 2 * kHorizontalPadding; |
+ int before_link_length = |
+ gfx::GetStringWidth(HelpText().substr(0, HelpTextLinkRange().start()), |
+ font_list_); |
+ int after_link_length = |
+ gfx::GetStringWidth(HelpText().substr(0, HelpTextLinkRange().end()), |
+ font_list_); |
+ // Even though the link will only be on one line, this is how the usable width |
+ // is calculated on StyledLabel. |
+ int usable_width = |
+ width - 2 * kHorizontalPadding - 2 * kLinkBorderSize; |
+ int num_lines; |
+ if (before_link_length / usable_width != after_link_length / usable_width) { |
+ // Link would be wrapped, line break before the link starts. |
+ int link_and_after_length = |
+ gfx::GetStringWidth(HelpText().substr(HelpTextLinkRange().start()), |
+ font_list_); |
+ num_lines = (before_link_length/usable_width + |
+ link_and_after_length/usable_width + |
+ 2); |
+ } else { |
+ // Link shouldn't cross a line break. |
+ num_lines = total_length/usable_width + 1; |
+ } |
+ |
int text_height = |
- static_cast<int>(ceil(static_cast<double>(total_length)/usable_width)) * |
- font_list_.GetFontSize(); |
- int help_section_height = text_height + 2 * kHelpVerticalPadding; |
+ ((num_lines-1) * |
Evan Stade
2014/06/19 00:16:35
spaces around binary operators
Garrett Casto
2014/06/20 23:47:00
Done.
|
+ (font_list_.GetHeight() + |
+ PasswordGenerationPopupView::kHelpSectionAdditionalSpacing)) + |
+ font_list_.GetBaseline(); |
+ // The vertical padding on the last line should be from the base of the |
+ // characters not the lowest level of a character, so subtract the descent. |
+ int font_descent = font_list_.GetHeight() - font_list_.GetBaseline(); |
+ int help_section_height = |
+ text_height + 2 * kHelpVerticalPadding - font_descent; |
int password_section_height = 0; |
if (display_password_) { |
- password_section_height = |
- font_list_.GetFontSize() + 2 * kPasswordVerticalPadding; |
+ // Minimum width is wide enought that we shouldn't have to do any text |
+ // wrapping in this section. |
+ password_section_height = kPasswordSectionHeight; |
} |
return (2 * kPopupBorderThickness + |
@@ -213,7 +255,7 @@ void PasswordGenerationPopupControllerImpl::CalculateBounds() { |
kPopupBorderThickness, |
kPopupBorderThickness, |
sub_view_width, |
- font_list_.GetFontSize() + 2 * kPasswordVerticalPadding); |
+ kPasswordSectionHeight); |
divider_bounds_ = gfx::Rect(kPopupBorderThickness, |
password_bounds_.bottom(), |