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 8d73906446dfe8ce6595f2279f802854edc1e979..660cf2625940d060cd5d3a9efa0709ea0d4f3775 100644 |
--- a/chrome/browser/ui/autofill/password_generation_popup_controller_impl.cc |
+++ b/chrome/browser/ui/autofill/password_generation_popup_controller_impl.cc |
@@ -22,19 +22,22 @@ |
#include "content/public/browser/web_contents.h" |
#include "grit/generated_resources.h" |
#include "ui/base/l10n/l10n_util.h" |
+#include "ui/base/resource/resource_bundle.h" |
#include "ui/events/keycodes/keyboard_codes.h" |
#include "ui/gfx/rect_conversions.h" |
+#include "ui/gfx/text_utils.h" |
namespace autofill { |
-const int kMinimumWidth = 60; |
+// All measurements in pixels |
+const int kMinimumWidth = 300; |
const int kDividerHeight = 1; |
base::WeakPtr<PasswordGenerationPopupControllerImpl> |
PasswordGenerationPopupControllerImpl::GetOrCreate( |
base::WeakPtr<PasswordGenerationPopupControllerImpl> previous, |
const gfx::RectF& bounds, |
- const PasswordForm& form, |
+ PasswordForm* form, |
PasswordGenerator* generator, |
PasswordManager* password_manager, |
PasswordGenerationPopupObserver* observer, |
@@ -44,7 +47,9 @@ PasswordGenerationPopupControllerImpl::GetOrCreate( |
previous->element_bounds() == bounds && |
previous->web_contents() == web_contents && |
previous->container_view() == container_view) { |
- // TODO(gcasto): Should we clear state here? |
+ previous->set_form(form); |
+ previous->set_generator(generator); |
+ previous->set_password_manager(password_manager); |
return previous; |
} |
@@ -65,7 +70,7 @@ PasswordGenerationPopupControllerImpl::GetOrCreate( |
PasswordGenerationPopupControllerImpl::PasswordGenerationPopupControllerImpl( |
const gfx::RectF& bounds, |
- const PasswordForm& form, |
+ PasswordForm* form, |
PasswordGenerator* generator, |
PasswordManager* password_manager, |
PasswordGenerationPopupObserver* observer, |
@@ -77,8 +82,10 @@ PasswordGenerationPopupControllerImpl::PasswordGenerationPopupControllerImpl( |
observer_(observer), |
controller_common_(bounds, container_view, web_contents), |
view_(NULL), |
- current_password_(base::ASCIIToUTF16(generator->Generate())), |
+ font_list_(ResourceBundle::GetSharedInstance().GetFontList( |
+ ResourceBundle::SmallFont)), |
password_selected_(false), |
+ display_password_(false), |
weak_ptr_factory_(this) { |
controller_common_.SetKeyPressCallback( |
base::Bind(&PasswordGenerationPopupControllerImpl::HandleKeyPressEvent, |
@@ -114,6 +121,9 @@ bool PasswordGenerationPopupControllerImpl::HandleKeyPressEvent( |
} |
bool PasswordGenerationPopupControllerImpl::PossiblyAcceptPassword() { |
+ if (!display_password_) |
+ return false; |
+ |
if (password_selected_) |
PasswordAccepted(); |
@@ -121,27 +131,28 @@ bool PasswordGenerationPopupControllerImpl::PossiblyAcceptPassword() { |
} |
void PasswordGenerationPopupControllerImpl::PasswordSelected(bool selected) { |
+ if (!display_password_) |
+ return; |
+ |
password_selected_ = selected; |
view_->UpdateBoundsAndRedrawPopup(); |
} |
void PasswordGenerationPopupControllerImpl::PasswordAccepted() { |
+ if (!display_password_) |
+ return; |
+ |
web_contents()->GetRenderViewHost()->Send( |
new AutofillMsg_GeneratedPasswordAccepted( |
web_contents()->GetRenderViewHost()->GetRoutingID(), |
current_password_)); |
- password_manager_->SetFormHasGeneratedPassword(form_); |
+ password_manager_->SetFormHasGeneratedPassword(*form_); |
Hide(); |
} |
int PasswordGenerationPopupControllerImpl::GetDesiredWidth() { |
- // Minimum width we want to display the password. |
- int minimum_length_for_text = 2 * kHorizontalPadding + |
- font_.GetExpectedTextWidth(kMinimumWidth) + |
- 2 * kPopupBorderThickness; |
- |
// If the width of the field is longer than the minimum, use that instead. |
- return std::max(minimum_length_for_text, |
+ return std::max(kMinimumWidth, |
controller_common_.RoundedElementBounds().width()); |
} |
@@ -150,15 +161,19 @@ int PasswordGenerationPopupControllerImpl::GetDesiredHeight(int width) { |
// 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. |
- int total_length = font_.GetStringWidth(HelpText() + LearnMoreLink()); |
+ int total_length = |
+ gfx::GetStringWidth(HelpText() + SavedPasswordsLink(), font_list_); |
int usable_width = width - 2 * kHorizontalPadding; |
int text_height = |
static_cast<int>(ceil(static_cast<double>(total_length)/usable_width)) * |
- font_.GetHeight(); |
+ font_list_.GetFontSize(); |
int help_section_height = text_height + 2 * kHelpVerticalPadding; |
- int password_section_height = |
- font_.GetHeight() + 2 * kPasswordVerticalPadding; |
+ int password_section_height = 0; |
+ if (display_password_) { |
+ password_section_height = |
+ font_list_.GetFontSize() + 2 * kPasswordVerticalPadding; |
+ } |
return (2 * kPopupBorderThickness + |
help_section_height + |
@@ -170,41 +185,58 @@ void PasswordGenerationPopupControllerImpl::CalculateBounds() { |
int popup_height = GetDesiredHeight(popup_width); |
popup_bounds_ = controller_common_.GetPopupBounds(popup_height, popup_width); |
+ int sub_view_width = popup_bounds_.width() - 2 * kPopupBorderThickness; |
// Calculate the bounds for the rest of the elements given the bounds of |
// the popup. |
- password_bounds_ = gfx::Rect( |
- kPopupBorderThickness, |
- kPopupBorderThickness, |
- popup_bounds_.width() - 2 * kPopupBorderThickness, |
- font_.GetHeight() + 2 * kPasswordVerticalPadding); |
- |
- divider_bounds_ = gfx::Rect(kPopupBorderThickness, |
- password_bounds_.bottom(), |
- password_bounds_.width(), |
- kDividerHeight); |
+ if (display_password_) { |
+ password_bounds_ = gfx::Rect( |
+ kPopupBorderThickness, |
+ kPopupBorderThickness, |
+ sub_view_width, |
+ font_list_.GetFontSize() + 2 * kPasswordVerticalPadding); |
+ |
+ divider_bounds_ = gfx::Rect(kPopupBorderThickness, |
+ password_bounds_.bottom(), |
+ sub_view_width, |
+ kDividerHeight); |
+ } else { |
+ password_bounds_ = gfx::Rect(); |
+ divider_bounds_ = gfx::Rect(); |
+ } |
+ int help_y = std::max(kPopupBorderThickness, divider_bounds_.bottom()); |
int help_height = |
- popup_bounds_.height() - divider_bounds_.bottom() - kPopupBorderThickness; |
+ popup_bounds_.height() - help_y - kPopupBorderThickness; |
help_bounds_ = gfx::Rect( |
kPopupBorderThickness, |
- divider_bounds_.bottom(), |
- password_bounds_.width(), |
+ help_y, |
+ sub_view_width, |
help_height); |
} |
-void PasswordGenerationPopupControllerImpl::Show() { |
+void PasswordGenerationPopupControllerImpl::Show(bool display_password) { |
+ display_password_ = display_password; |
+ if (display_password_) |
+ current_password_ = base::ASCIIToUTF16(generator_->Generate()); |
+ |
CalculateBounds(); |
if (!view_) { |
view_ = PasswordGenerationPopupView::Create(this); |
view_->Show(); |
+ } else { |
+ view_->UpdateBoundsAndRedrawPopup(); |
} |
controller_common_.RegisterKeyPressCallback(); |
if (observer_) |
- observer_->OnPopupShown(); |
+ observer_->OnPopupShown(display_password_); |
+} |
+ |
+void PasswordGenerationPopupControllerImpl::HideAndDestroy() { |
+ Hide(); |
} |
void PasswordGenerationPopupControllerImpl::Hide() { |
@@ -225,7 +257,9 @@ void PasswordGenerationPopupControllerImpl::ViewDestroyed() { |
Hide(); |
} |
-void PasswordGenerationPopupControllerImpl::OnHelpLinkClicked() { |
+void PasswordGenerationPopupControllerImpl::OnSavedPasswordsLinkClicked() { |
+ // TODO(gcasto): Change this to navigate to account central once passwords |
+ // are visible there. |
Browser* browser = |
chrome::FindBrowserWithWebContents(controller_common_.web_contents()); |
content::OpenURLParams params( |
@@ -264,6 +298,10 @@ gfx::NativeView PasswordGenerationPopupControllerImpl::container_view() { |
return controller_common_.container_view(); |
} |
+const gfx::FontList& PasswordGenerationPopupControllerImpl::font_list() const { |
+ return font_list_; |
+} |
+ |
const gfx::Rect& PasswordGenerationPopupControllerImpl::popup_bounds() const { |
return popup_bounds_; |
} |
@@ -282,6 +320,10 @@ const gfx::Rect& PasswordGenerationPopupControllerImpl::help_bounds() const { |
return help_bounds_; |
} |
+bool PasswordGenerationPopupControllerImpl::display_password() const { |
+ return display_password_; |
+} |
+ |
bool PasswordGenerationPopupControllerImpl::password_selected() const { |
return password_selected_; |
} |
@@ -290,12 +332,17 @@ base::string16 PasswordGenerationPopupControllerImpl::password() const { |
return current_password_; |
} |
+base::string16 PasswordGenerationPopupControllerImpl::SuggestedText() { |
+ return l10n_util::GetStringUTF16(IDS_PASSWORD_GENERATION_SUGGESTION); |
+} |
+ |
base::string16 PasswordGenerationPopupControllerImpl::HelpText() { |
return l10n_util::GetStringUTF16(IDS_PASSWORD_GENERATION_PROMPT); |
} |
-base::string16 PasswordGenerationPopupControllerImpl::LearnMoreLink() { |
- return l10n_util::GetStringUTF16(IDS_PASSWORD_GENERATION_LEARN_MORE_LINK); |
+base::string16 PasswordGenerationPopupControllerImpl::SavedPasswordsLink() { |
+ return l10n_util::GetStringUTF16( |
+ IDS_PASSWORD_GENERATION_SAVED_PASSWORDS_LINK); |
} |
} // namespace autofill |