| Index: chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc
|
| diff --git a/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc b/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc
|
| index 81c6d33ecde7658db0f7d6185f01eaf19b59583b..4546d8f804241b2a5c75bad0b08bfee12e63d3bf 100644
|
| --- a/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc
|
| +++ b/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc
|
| @@ -25,6 +25,7 @@
|
| #include "ui/views/controls/button/blue_button.h"
|
| #include "ui/views/controls/button/label_button.h"
|
| #include "ui/views/controls/combobox/combobox.h"
|
| +#include "ui/views/layout/fill_layout.h"
|
| #include "ui/views/layout/grid_layout.h"
|
| #include "ui/views/layout/layout_constants.h"
|
|
|
| @@ -33,20 +34,6 @@
|
|
|
| namespace {
|
|
|
| -enum FieldType { USERNAME_FIELD, PASSWORD_FIELD };
|
| -
|
| -// Upper limit on the size of the username and password fields.
|
| -const int kUsernameFieldSize = 30;
|
| -const int kPasswordFieldSize = 22;
|
| -
|
| -// Returns the width of |type| field.
|
| -int GetFieldWidth(FieldType type) {
|
| - return ui::ResourceBundle::GetSharedInstance()
|
| - .GetFontList(ui::ResourceBundle::SmallFont)
|
| - .GetExpectedTextWidth(type == USERNAME_FIELD ? kUsernameFieldSize
|
| - : kPasswordFieldSize);
|
| -}
|
| -
|
| class SavePasswordRefusalComboboxModel : public ui::ComboboxModel {
|
| public:
|
| enum { INDEX_NOPE = 0, INDEX_NEVER_FOR_THIS_SITE = 1, };
|
| @@ -92,6 +79,147 @@ void ShowManagePasswordsBubble(content::WebContents* web_contents) {
|
|
|
| } // namespace chrome
|
|
|
| +// ManagePasswordsBubbleView::PendingView -------------------------------------
|
| +
|
| +ManagePasswordsBubbleView::PendingView::PendingView(
|
| + ManagePasswordsBubbleView* parent)
|
| + : parent_(parent) {
|
| + views::GridLayout* layout = new views::GridLayout(this);
|
| + SetLayoutManager(layout);
|
| +
|
| + // Create the pending credential item, save button and refusal combobox.
|
| + ManagePasswordItemView* item =
|
| + new ManagePasswordItemView(parent->model(),
|
| + parent->model()->pending_credentials(),
|
| + ManagePasswordItemView::FIRST_ITEM);
|
| + save_button_ = new views::BlueButton(
|
| + this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SAVE_BUTTON));
|
| + refuse_combobox_ =
|
| + new views::Combobox(new SavePasswordRefusalComboboxModel());
|
| + refuse_combobox_->set_listener(this);
|
| + refuse_combobox_->SetStyle(views::Combobox::STYLE_ACTION);
|
| +
|
| + // Title row.
|
| + parent->BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
|
| + parent->AddTitleRow(layout);
|
| +
|
| + // Credential row.
|
| + layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
|
| + layout->AddView(item);
|
| +
|
| + // Button row.
|
| + parent->BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET);
|
| + layout->StartRowWithPadding(
|
| + 0, DOUBLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
|
| + layout->AddView(save_button_);
|
| + layout->AddView(refuse_combobox_);
|
| +
|
| + // Extra padding for visual awesomeness.
|
| + layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
|
| +}
|
| +
|
| +ManagePasswordsBubbleView::PendingView::~PendingView() {
|
| +}
|
| +
|
| +void ManagePasswordsBubbleView::PendingView::ButtonPressed(
|
| + views::Button* sender,
|
| + const ui::Event& event) {
|
| + DCHECK(sender == save_button_);
|
| + parent_->model()->OnSaveClicked();
|
| + parent_->Close();
|
| +}
|
| +
|
| +void ManagePasswordsBubbleView::PendingView::OnPerformAction(
|
| + views::Combobox* source) {
|
| + DCHECK_EQ(source, refuse_combobox_);
|
| + switch (refuse_combobox_->selected_index()) {
|
| + case SavePasswordRefusalComboboxModel::INDEX_NOPE:
|
| + parent_->model()->OnNopeClicked();
|
| + break;
|
| + case SavePasswordRefusalComboboxModel::INDEX_NEVER_FOR_THIS_SITE:
|
| + parent_->model()->OnNeverForThisSiteClicked();
|
| + break;
|
| + }
|
| + parent_->Close();
|
| +}
|
| +
|
| +// ManagePasswordsBubbleView::ManageView --------------------------------------
|
| +
|
| +ManagePasswordsBubbleView::ManageView::ManageView(
|
| + ManagePasswordsBubbleView* parent)
|
| + : parent_(parent) {
|
| + views::GridLayout* layout = new views::GridLayout(this);
|
| + SetLayoutManager(layout);
|
| +
|
| + // Add the title.
|
| + parent->BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
|
| + parent->AddTitleRow(layout);
|
| +
|
| + // If we have a list of passwords to store for the current site, display
|
| + // them to the user for management. Otherwise, render a "No passwords for
|
| + // this site" message.
|
| + if (!parent_->model()->best_matches().empty()) {
|
| + for (autofill::PasswordFormMap::const_iterator i(
|
| + parent_->model()->best_matches().begin());
|
| + i != parent_->model()->best_matches().end();
|
| + ++i) {
|
| + ManagePasswordItemView* item = new ManagePasswordItemView(
|
| + parent_->model(),
|
| + *i->second,
|
| + i == parent_->model()->best_matches().begin()
|
| + ? ManagePasswordItemView::FIRST_ITEM
|
| + : ManagePasswordItemView::SUBSEQUENT_ITEM);
|
| +
|
| + layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
|
| + layout->AddView(item);
|
| + }
|
| + } else {
|
| + views::Label* empty_label = new views::Label(
|
| + l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_NO_PASSWORDS));
|
| + empty_label->SetMultiLine(true);
|
| +
|
| + layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
|
| + layout->AddView(empty_label);
|
| + }
|
| +
|
| + // Then add the "manage passwords" link and "Done" button.
|
| + manage_link_ = new views::Link(parent_->model()->manage_link());
|
| + manage_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| + manage_link_->SetUnderline(false);
|
| + manage_link_->set_listener(this);
|
| +
|
| + done_button_ =
|
| + new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_DONE));
|
| + done_button_->SetStyle(views::Button::STYLE_BUTTON);
|
| +
|
| + parent->BuildColumnSet(layout, LINK_BUTTON_COLUMN_SET);
|
| + layout->StartRowWithPadding(
|
| + 0, LINK_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
|
| + layout->AddView(manage_link_);
|
| + layout->AddView(done_button_);
|
| +
|
| + // Extra padding for visual awesomeness.
|
| + layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
|
| +}
|
| +
|
| +ManagePasswordsBubbleView::ManageView::~ManageView() {
|
| +}
|
| +
|
| +void ManagePasswordsBubbleView::ManageView::ButtonPressed(
|
| + views::Button* sender,
|
| + const ui::Event& event) {
|
| + DCHECK(sender == done_button_);
|
| + parent_->model()->OnDoneClicked();
|
| + parent_->Close();
|
| +}
|
| +
|
| +void ManagePasswordsBubbleView::ManageView::LinkClicked(views::Link* source,
|
| + int event_flags) {
|
| + DCHECK_EQ(source, manage_link_);
|
| + parent_->model()->OnManageLinkClicked();
|
| + parent_->Close();
|
| +}
|
| +
|
| // ManagePasswordsBubbleView --------------------------------------------------
|
|
|
| // static
|
| @@ -208,6 +336,22 @@ void ManagePasswordsBubbleView::BuildColumnSet(views::GridLayout* layout,
|
| column_set->AddPaddingColumn(0, views::kPanelHorizMargin);
|
| }
|
|
|
| +void ManagePasswordsBubbleView::AddTitleRow(views::GridLayout* layout) const {
|
| + // Build the title label, and populate it with whatever title our model feels
|
| + // is appropriate for the bubble's state.
|
| + views::Label* title_label = new views::Label(model()->title());
|
| + title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| + title_label->SetMultiLine(true);
|
| + title_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
|
| + ui::ResourceBundle::MediumFont));
|
| +
|
| + // Add the title to the layout with appropriate padding.
|
| + layout->StartRowWithPadding(
|
| + 0, SINGLE_VIEW_COLUMN_SET, 0, views::kRelatedControlSmallVerticalSpacing);
|
| + layout->AddView(title_label);
|
| + layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
|
| +}
|
| +
|
| void ManagePasswordsBubbleView::AdjustForFullscreen(
|
| const gfx::Rect& screen_bounds) {
|
| if (GetAnchorView())
|
| @@ -232,118 +376,14 @@ void ManagePasswordsBubbleView::CloseWithoutLogging() {
|
| }
|
|
|
| void ManagePasswordsBubbleView::Init() {
|
| - using views::GridLayout;
|
| -
|
| - GridLayout* layout = new GridLayout(this);
|
| - SetFocusable(true);
|
| + views::FillLayout* layout = new views::FillLayout();
|
| SetLayoutManager(layout);
|
| - BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
|
| - BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET);
|
| - BuildColumnSet(layout, LINK_BUTTON_COLUMN_SET);
|
| -
|
| - // This calculates the necessary widths for credential columns in the bubble.
|
| - const int first_field_width = std::max(
|
| - GetFieldWidth(USERNAME_FIELD),
|
| - views::Label(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_DELETED))
|
| - .GetPreferredSize()
|
| - .width());
|
| -
|
| - const int second_field_width = std::max(
|
| - GetFieldWidth(PASSWORD_FIELD),
|
| - views::Label(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_UNDO))
|
| - .GetPreferredSize()
|
| - .width());
|
| -
|
| - // Build and populate the header.
|
| - views::Label* title_label = new views::Label(model()->title());
|
| - title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| - title_label->SetMultiLine(true);
|
| - title_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
|
| - ui::ResourceBundle::MediumFont));
|
| -
|
| - layout->StartRowWithPadding(
|
| - 0, SINGLE_VIEW_COLUMN_SET, 0, views::kRelatedControlSmallVerticalSpacing);
|
| - layout->AddView(title_label);
|
| - layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
|
| -
|
| - if (model()->WaitingToSavePassword()) {
|
| - // If we've got a password that we're deciding whether or not to save,
|
| - // then we need to display a single-view columnset containing the
|
| - // ManagePasswordItemView, followed by double-view columnset containing
|
| - // a "Save" and "Reject" button.
|
| - ManagePasswordItemView* item =
|
| - new ManagePasswordItemView(model(),
|
| - model()->pending_credentials(),
|
| - first_field_width,
|
| - second_field_width,
|
| - ManagePasswordItemView::FIRST_ITEM);
|
| - layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
|
| - layout->AddView(item);
|
| -
|
| - refuse_combobox_ =
|
| - new views::Combobox(new SavePasswordRefusalComboboxModel());
|
| - refuse_combobox_->set_listener(this);
|
| - refuse_combobox_->SetStyle(views::Combobox::STYLE_ACTION);
|
| -
|
| - save_button_ = new views::BlueButton(
|
| - this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SAVE_BUTTON));
|
| -
|
| - layout->StartRowWithPadding(
|
| - 0, DOUBLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
|
| - layout->AddView(save_button_);
|
| - layout->AddView(refuse_combobox_);
|
| - layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
|
| - } else {
|
| - // If we have a list of passwords to store for the current site, display
|
| - // them to the user for management. Otherwise, render a "No passwords for
|
| - // this site" message.
|
| - //
|
| - // TODO(mkwst): Do we really want the "No passwords" case? It would probably
|
| - // be better to only clear the pending password upon navigation, rather than
|
| - // as soon as the bubble closes.
|
| - if (!model()->best_matches().empty()) {
|
| - for (autofill::PasswordFormMap::const_iterator i(
|
| - model()->best_matches().begin());
|
| - i != model()->best_matches().end();
|
| - ++i) {
|
| - ManagePasswordItemView* item = new ManagePasswordItemView(
|
| - model(),
|
| - *i->second,
|
| - first_field_width,
|
| - second_field_width,
|
| - i == model()->best_matches().begin()
|
| - ? ManagePasswordItemView::FIRST_ITEM
|
| - : ManagePasswordItemView::SUBSEQUENT_ITEM);
|
| -
|
| - layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
|
| - layout->AddView(item);
|
| - }
|
| - } else {
|
| - views::Label* empty_label = new views::Label(
|
| - l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_NO_PASSWORDS));
|
| - empty_label->SetMultiLine(true);
|
| -
|
| - layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
|
| - layout->AddView(empty_label);
|
| - }
|
| + SetFocusable(true);
|
|
|
| - // Build a "manage" link and "done" button, and throw them both into a new
|
| - // row
|
| - // containing a double-view columnset.
|
| - manage_link_ = new views::Link(model()->manage_link());
|
| - manage_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| - manage_link_->SetUnderline(false);
|
| - manage_link_->set_listener(this);
|
| -
|
| - done_button_ =
|
| - new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_DONE));
|
| - done_button_->SetStyle(views::Button::STYLE_BUTTON);
|
| -
|
| - layout->StartRowWithPadding(
|
| - 0, LINK_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
|
| - layout->AddView(manage_link_);
|
| - layout->AddView(done_button_);
|
| - }
|
| + if (model()->WaitingToSavePassword())
|
| + AddChildView(new PendingView(this));
|
| + else
|
| + AddChildView(new ManageView(this));
|
| }
|
|
|
| void ManagePasswordsBubbleView::WindowClosing() {
|
| @@ -352,37 +392,3 @@ void ManagePasswordsBubbleView::WindowClosing() {
|
| if (manage_passwords_bubble_ == this)
|
| manage_passwords_bubble_ = NULL;
|
| }
|
| -
|
| -void ManagePasswordsBubbleView::ButtonPressed(views::Button* sender,
|
| - const ui::Event& event) {
|
| - DCHECK(sender == save_button_ || sender == done_button_);
|
| -
|
| - if (sender == save_button_)
|
| - model()->OnSaveClicked();
|
| - else
|
| - model()->OnDoneClicked();
|
| - Close();
|
| -}
|
| -
|
| -void ManagePasswordsBubbleView::LinkClicked(views::Link* source,
|
| - int event_flags) {
|
| - DCHECK_EQ(source, manage_link_);
|
| - model()->OnManageLinkClicked();
|
| - Close();
|
| -}
|
| -
|
| -void ManagePasswordsBubbleView::OnPerformAction(views::Combobox* source) {
|
| - DCHECK_EQ(source, refuse_combobox_);
|
| - switch (refuse_combobox_->selected_index()) {
|
| - case SavePasswordRefusalComboboxModel::INDEX_NOPE:
|
| - model()->OnNopeClicked();
|
| - break;
|
| - case SavePasswordRefusalComboboxModel::INDEX_NEVER_FOR_THIS_SITE:
|
| - model()->OnNeverForThisSiteClicked();
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - Close();
|
| -}
|
|
|