| 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
|
|
|