1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/passwords/manage_passwords_bubble_view.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/passwords/save_password_refusal_combobox_model.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_bar_view.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/passwords/manage_password_item_view.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/passwords/manage_passwords_icon_view.h" 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/render_view_host.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/web_contents.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/aura/window.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "ui/base/resource/resource_bundle.h" 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/controls/button/blue_button.h" 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/controls/button/label_button.h" 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/views/controls/combobox/combobox.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/combobox/combobox_listener.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/link.h" 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/link_listener.h" 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/views/controls/styled_label.h" 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/styled_label_listener.h" 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/views/layout/fill_layout.h" 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/layout/grid_layout.h" 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/layout/layout_constants.h" 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Helpers -------------------------------------------------------------------- 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace { 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int kDesiredBubbleWidth = 370; 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)enum ColumnSetType { 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // | | (FILL, FILL) | | 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Used for the bubble's header, the credentials list, and for simple 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // messages like "No passwords". 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SINGLE_VIEW_COLUMN_SET = 0, 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // | | (TRAILING, CENTER) | | (TRAILING, CENTER) | | 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Used for buttons at the bottom of the bubble which should nest at the 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // bottom-right corner. 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DOUBLE_BUTTON_COLUMN_SET = 1, 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // | | (LEADING, CENTER) | | (TRAILING, CENTER) | | 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Used for buttons at the bottom of the bubble which should occupy 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // the corners. 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LINK_BUTTON_COLUMN_SET = 2, 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // | | (TRAILING, CENTER) | | 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Used when there is only one button which should next at the bottom-right 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // corner. 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SINGLE_BUTTON_COLUMN_SET = 3, 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Construct an appropriate ColumnSet for the given |type|, and add it 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// to |layout|. 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BuildColumnSet(views::GridLayout* layout, ColumnSetType type) { 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::ColumnSet* column_set = layout->AddColumnSet(type); 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) column_set->AddPaddingColumn(0, views::kPanelHorizMargin); 686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int full_width = kDesiredBubbleWidth - (2 * views::kPanelHorizMargin); 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) switch (type) { 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case SINGLE_VIEW_COLUMN_SET: 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) column_set->AddColumn(views::GridLayout::FILL, 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout::FILL, 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) views::GridLayout::FIXED, 756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) full_width, 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0); 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) break; 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case DOUBLE_BUTTON_COLUMN_SET: 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) column_set->AddColumn(views::GridLayout::TRAILING, 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout::CENTER, 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1, 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout::USE_PREF, 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0); 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) column_set->AddPaddingColumn(0, views::kRelatedButtonHSpacing); 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) column_set->AddColumn(views::GridLayout::TRAILING, 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout::CENTER, 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout::USE_PREF, 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0); 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) break; 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case LINK_BUTTON_COLUMN_SET: 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) column_set->AddColumn(views::GridLayout::LEADING, 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout::CENTER, 97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1, 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout::USE_PREF, 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0); 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) column_set->AddPaddingColumn(0, views::kRelatedButtonHSpacing); 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) column_set->AddColumn(views::GridLayout::TRAILING, 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout::CENTER, 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout::USE_PREF, 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0); 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) break; 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case SINGLE_BUTTON_COLUMN_SET: 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) column_set->AddColumn(views::GridLayout::TRAILING, 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) views::GridLayout::CENTER, 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1, 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) views::GridLayout::USE_PREF, 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0, 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0); 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) column_set->AddPaddingColumn(0, views::kPanelHorizMargin); 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Given a layout and a model, add an appropriate title using a 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// SINGLE_VIEW_COLUMN_SET, followed by a spacer row. 122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void AddTitleRow(views::GridLayout* layout, ManagePasswordsBubbleModel* model) { 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::Label* title_label = new views::Label(model->title()); 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_label->SetMultiLine(true); 126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::ResourceBundle::MediumFont)); 128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Add the title to the layout with appropriate padding. 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->StartRowWithPadding( 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, SINGLE_VIEW_COLUMN_SET, 0, views::kRelatedControlSmallVerticalSpacing); 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(title_label); 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Globals -------------------------------------------------------------------- 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace chrome { 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ShowManagePasswordsBubble(content::WebContents* web_contents) { 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (ManagePasswordsBubbleView::IsShowing()) { 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The bubble is currently shown for some other tab. We should close it now 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // and open for |web_contents|. 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ManagePasswordsBubbleView::CloseBubble(); 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ManagePasswordsUIController* controller = 150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ManagePasswordsUIController::FromWebContents(web_contents); 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ManagePasswordsBubbleView::ShowBubble( 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_contents, 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) password_manager::ui::IsAutomaticDisplayState(controller->state()) 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ? ManagePasswordsBubbleView::AUTOMATIC 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : ManagePasswordsBubbleView::USER_ACTION); 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CloseManagePasswordsBubble(content::WebContents* web_contents) { 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ManagePasswordsBubbleView::IsShowing()) 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::WebContents* bubble_web_contents = 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagePasswordsBubbleView::manage_password_bubble()->web_contents(); 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (web_contents == bubble_web_contents) 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagePasswordsBubbleView::CloseBubble(); 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace chrome 168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ManagePasswordsBubbleView::PendingView ------------------------------------- 171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A view offering the user the ability to save credentials. Contains a 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// single ManagePasswordItemView, along with a "Save Passwords" button 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// and a rejection combobox. 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordsBubbleView::PendingView : public views::View, 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public views::ButtonListener, 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public views::ComboboxListener { 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit PendingView(ManagePasswordsBubbleView* parent); 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~PendingView(); 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // views::ButtonListener: 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void ButtonPressed(views::Button* sender, 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ui::Event& event) OVERRIDE; 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Handles the event when the user changes an index of a combobox. 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnPerformAction(views::Combobox* source) OVERRIDE; 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagePasswordsBubbleView* parent_; 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::BlueButton* save_button_; 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The combobox doesn't take ownership of its model. If we created a 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // combobox we need to ensure that we delete the model here, and because the 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // combobox uses the model in it's destructor, we need to make sure we 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // delete the model _after_ the combobox itself is deleted. 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<SavePasswordRefusalComboboxModel> combobox_model_; 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<views::Combobox> refuse_combobox_; 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordsBubbleView::PendingView::PendingView( 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ManagePasswordsBubbleView* parent) 204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : parent_(parent) { 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout* layout = new views::GridLayout(this); 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0)); 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetLayoutManager(layout); 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Create the pending credential item, save button and refusal combobox. 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ManagePasswordItemView* item = 2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new ManagePasswordItemView(parent->model(), 2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) parent->model()->pending_credentials(), 2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) password_manager::ui::FIRST_ITEM); 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) save_button_ = new views::BlueButton( 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SAVE_BUTTON)); 216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) save_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::ResourceBundle::SmallFont)); 218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) combobox_model_.reset(new SavePasswordRefusalComboboxModel()); 220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) refuse_combobox_.reset(new views::Combobox(combobox_model_.get())); 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) refuse_combobox_->set_listener(this); 222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) refuse_combobox_->SetStyle(views::Combobox::STYLE_ACTION); 223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TODO(mkwst): Need a mechanism to pipe a font list down into a combobox. 224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Title row. 226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET); 227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AddTitleRow(layout, parent_->model()); 228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Credential row. 230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->StartRow(0, SINGLE_VIEW_COLUMN_SET); 231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(item); 232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Button row. 234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET); 235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->StartRowWithPadding( 236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, DOUBLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing); 237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(save_button_); 238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(refuse_combobox_.get()); 239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Extra padding for visual awesomeness. 241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_->set_initially_focused_view(save_button_); 244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordsBubbleView::PendingView::~PendingView() { 247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ManagePasswordsBubbleView::PendingView::ButtonPressed( 250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::Button* sender, 251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const ui::Event& event) { 252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(sender == save_button_); 253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parent_->model()->OnSaveClicked(); 254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parent_->Close(); 255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ManagePasswordsBubbleView::PendingView::OnPerformAction( 258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::Combobox* source) { 259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_EQ(source, refuse_combobox_); 260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) switch (refuse_combobox_->selected_index()) { 261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case SavePasswordRefusalComboboxModel::INDEX_NOPE: 262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parent_->model()->OnNopeClicked(); 2636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) parent_->Close(); 264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) break; 265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case SavePasswordRefusalComboboxModel::INDEX_NEVER_FOR_THIS_SITE: 2666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) parent_->NotifyNeverForThisSiteClicked(); 267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) break; 268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 2696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// ManagePasswordsBubbleView::ConfirmNeverView --------------------------------- 2726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A view offering the user the ability to undo her decision to never save 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// passwords for a particular site. 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordsBubbleView::ConfirmNeverView 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : public views::View, 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public views::ButtonListener { 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit ConfirmNeverView(ManagePasswordsBubbleView* parent); 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~ConfirmNeverView(); 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // views::ButtonListener: 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void ButtonPressed(views::Button* sender, 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ui::Event& event) OVERRIDE; 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagePasswordsBubbleView* parent_; 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::LabelButton* confirm_button_; 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::LabelButton* undo_button_; 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ManagePasswordsBubbleView::ConfirmNeverView::ConfirmNeverView( 2946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ManagePasswordsBubbleView* parent) 2956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) : parent_(parent) { 2966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) views::GridLayout* layout = new views::GridLayout(this); 2976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0)); 2986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SetLayoutManager(layout); 2996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Title row. 3016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET); 3026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) views::Label* title_label = new views::Label(l10n_util::GetStringUTF16( 3036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) IDS_MANAGE_PASSWORDS_BLACKLIST_CONFIRMATION_TITLE)); 3046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 3056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) title_label->SetMultiLine(true); 3066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) title_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 3076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ui::ResourceBundle::MediumFont)); 3086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) layout->StartRowWithPadding( 3096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 0, SINGLE_VIEW_COLUMN_SET, 0, views::kRelatedControlSmallVerticalSpacing); 3106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) layout->AddView(title_label); 3116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); 3126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Confirmation text. 3146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) views::Label* confirmation = new views::Label(l10n_util::GetStringUTF16( 3156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) IDS_MANAGE_PASSWORDS_BLACKLIST_CONFIRMATION_TEXT)); 3166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) confirmation->SetHorizontalAlignment(gfx::ALIGN_LEFT); 3176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) confirmation->SetMultiLine(true); 3186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) confirmation->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 3196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ui::ResourceBundle::SmallFont)); 3206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) layout->StartRow(0, SINGLE_VIEW_COLUMN_SET); 3216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) layout->AddView(confirmation); 3226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); 3236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Confirm and undo buttons. 3256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET); 3266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) layout->StartRowWithPadding( 3276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 0, DOUBLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing); 3286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) confirm_button_ = new views::LabelButton( 3306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) this, 3316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) l10n_util::GetStringUTF16( 3326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) IDS_MANAGE_PASSWORDS_BLACKLIST_CONFIRMATION_BUTTON)); 3336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) confirm_button_->SetStyle(views::Button::STYLE_BUTTON); 3346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) confirm_button_->SetFontList( 3356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ui::ResourceBundle::GetSharedInstance().GetFontList( 3366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ui::ResourceBundle::SmallFont)); 3376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) layout->AddView(confirm_button_); 3386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) undo_button_ = 3406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_CANCEL)); 3416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) undo_button_->SetStyle(views::Button::STYLE_BUTTON); 3426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) undo_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 3436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ui::ResourceBundle::SmallFont)); 3446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) layout->AddView(undo_button_); 3456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Extra padding for visual awesomeness. 3476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_->set_initially_focused_view(confirm_button_); 3506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 3516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ManagePasswordsBubbleView::ConfirmNeverView::~ConfirmNeverView() { 3536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 3546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ManagePasswordsBubbleView::ConfirmNeverView::ButtonPressed( 3566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) views::Button* sender, 3576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const ui::Event& event) { 3586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK(sender == confirm_button_ || sender == undo_button_); 3596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (sender == confirm_button_) 3606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) parent_->NotifyConfirmedNeverForThisSite(); 3616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) else 3626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) parent_->NotifyUndoNeverForThisSite(); 363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ManagePasswordsBubbleView::ManageView -------------------------------------- 366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A view offering the user a list of her currently saved credentials 3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// for the current page, along with a "Manage passwords" link and a 3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// "Done" button. 3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordsBubbleView::ManageView : public views::View, 3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public views::ButtonListener, 3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public views::LinkListener { 3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit ManageView(ManagePasswordsBubbleView* parent); 3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~ManageView(); 3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // views::ButtonListener: 3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void ButtonPressed(views::Button* sender, 3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ui::Event& event) OVERRIDE; 3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // views::LinkListener: 3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagePasswordsBubbleView* parent_; 3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::Link* manage_link_; 3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::LabelButton* done_button_; 3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordsBubbleView::ManageView::ManageView( 392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ManagePasswordsBubbleView* parent) 393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : parent_(parent) { 394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout* layout = new views::GridLayout(this); 395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0)); 396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetLayoutManager(layout); 397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Add the title. 399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET); 400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AddTitleRow(layout, parent_->model()); 401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // If we have a list of passwords to store for the current site, display 403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // them to the user for management. Otherwise, render a "No passwords for 404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // this site" message. 405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!parent_->model()->best_matches().empty()) { 4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (autofill::ConstPasswordFormMap::const_iterator i( 407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parent_->model()->best_matches().begin()); 408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) i != parent_->model()->best_matches().end(); 409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ++i) { 410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ManagePasswordItemView* item = new ManagePasswordItemView( 411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parent_->model(), 412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *i->second, 413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) i == parent_->model()->best_matches().begin() 4146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ? password_manager::ui::FIRST_ITEM 4156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : password_manager::ui::SUBSEQUENT_ITEM); 416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->StartRow(0, SINGLE_VIEW_COLUMN_SET); 418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(item); 419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::Label* empty_label = new views::Label( 422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_NO_PASSWORDS)); 423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) empty_label->SetMultiLine(true); 424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) empty_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) empty_label->SetFontList( 426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::ResourceBundle::GetSharedInstance().GetFontList( 427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::ResourceBundle::SmallFont)); 428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->StartRow(0, SINGLE_VIEW_COLUMN_SET); 430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(empty_label); 431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); 432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Then add the "manage passwords" link and "Done" button. 435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) manage_link_ = new views::Link(parent_->model()->manage_link()); 436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) manage_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) manage_link_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::ResourceBundle::SmallFont)); 439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) manage_link_->SetUnderline(false); 440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) manage_link_->set_listener(this); 441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) done_button_ = 443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_DONE)); 444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) done_button_->SetStyle(views::Button::STYLE_BUTTON); 445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) done_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::ResourceBundle::SmallFont)); 447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BuildColumnSet(layout, LINK_BUTTON_COLUMN_SET); 449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->StartRowWithPadding( 450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, LINK_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing); 451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(manage_link_); 452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(done_button_); 453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Extra padding for visual awesomeness. 455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_->set_initially_focused_view(done_button_); 458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordsBubbleView::ManageView::~ManageView() { 461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ManagePasswordsBubbleView::ManageView::ButtonPressed( 464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::Button* sender, 465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const ui::Event& event) { 466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(sender == done_button_); 467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parent_->model()->OnDoneClicked(); 468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parent_->Close(); 469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ManagePasswordsBubbleView::ManageView::LinkClicked(views::Link* source, 472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int event_flags) { 473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_EQ(source, manage_link_); 474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parent_->model()->OnManageLinkClicked(); 475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parent_->Close(); 476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ManagePasswordsBubbleView::BlacklistedView --------------------------------- 479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A view offering the user the ability to re-enable the password manager for 4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// a specific site after she's decided to "never save passwords". 4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordsBubbleView::BlacklistedView 4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : public views::View, 4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public views::ButtonListener { 4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit BlacklistedView(ManagePasswordsBubbleView* parent); 4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~BlacklistedView(); 4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // views::ButtonListener: 4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void ButtonPressed(views::Button* sender, 4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ui::Event& event) OVERRIDE; 4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagePasswordsBubbleView* parent_; 4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::BlueButton* unblacklist_button_; 4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::LabelButton* done_button_; 4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordsBubbleView::BlacklistedView::BlacklistedView( 501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ManagePasswordsBubbleView* parent) 502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : parent_(parent) { 503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout* layout = new views::GridLayout(this); 504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0)); 505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetLayoutManager(layout); 506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Add the title. 508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET); 509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AddTitleRow(layout, parent_->model()); 510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Add the "Hey! You blacklisted this site!" text. 512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::Label* blacklisted = new views::Label( 513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_BLACKLISTED)); 514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) blacklisted->SetMultiLine(true); 515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) blacklisted->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::ResourceBundle::SmallFont)); 517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->StartRow(0, SINGLE_VIEW_COLUMN_SET); 518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(blacklisted); 519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); 520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Then add the "enable password manager" and "Done" buttons. 522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) unblacklist_button_ = new views::BlueButton( 523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_UNBLACKLIST_BUTTON)); 524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) unblacklist_button_->SetFontList( 525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::ResourceBundle::GetSharedInstance().GetFontList( 526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::ResourceBundle::SmallFont)); 527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) done_button_ = 528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_DONE)); 529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) done_button_->SetStyle(views::Button::STYLE_BUTTON); 530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) done_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::ResourceBundle::SmallFont)); 532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET); 534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->StartRowWithPadding( 535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, DOUBLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing); 536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(unblacklist_button_); 537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(done_button_); 538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Extra padding for visual awesomeness. 540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 5415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_->set_initially_focused_view(unblacklist_button_); 543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordsBubbleView::BlacklistedView::~BlacklistedView() { 546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ManagePasswordsBubbleView::BlacklistedView::ButtonPressed( 549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::Button* sender, 550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const ui::Event& event) { 551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (sender == done_button_) 552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parent_->model()->OnDoneClicked(); 553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) else if (sender == unblacklist_button_) 554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parent_->model()->OnUnblacklistClicked(); 555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) else 556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NOTREACHED(); 557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parent_->Close(); 558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// ManagePasswordsBubbleView::SaveConfirmationView ---------------------------- 5615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A view confirming to the user that a password was saved and offering a link 5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// to the Google account manager. 5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordsBubbleView::SaveConfirmationView 5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : public views::View, 5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public views::ButtonListener, 5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public views::StyledLabelListener { 5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit SaveConfirmationView(ManagePasswordsBubbleView* parent); 5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~SaveConfirmationView(); 5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // views::ButtonListener: 5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void ButtonPressed(views::Button* sender, 5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ui::Event& event) OVERRIDE; 5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // views::StyledLabelListener implementation 5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void StyledLabelLinkClicked(const gfx::Range& range, 5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int event_flags) OVERRIDE; 5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagePasswordsBubbleView* parent_; 5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::LabelButton* ok_button_; 5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ManagePasswordsBubbleView::SaveConfirmationView::SaveConfirmationView( 5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ManagePasswordsBubbleView* parent) 5885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : parent_(parent) { 5895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) views::GridLayout* layout = new views::GridLayout(this); 5905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0)); 5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SetLayoutManager(layout); 5925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET); 5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddTitleRow(layout, parent_->model()); 5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) views::StyledLabel* confirmation = 5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new views::StyledLabel(parent_->model()->save_confirmation_text(), this); 5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) confirmation->SetBaseFontList( 5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::ResourceBundle::GetSharedInstance().GetFontList( 6005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::ResourceBundle::SmallFont)); 6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) confirmation->AddStyleRange( 6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_->model()->save_confirmation_link_range(), 6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) views::StyledLabel::RangeStyleInfo::CreateForLink()); 6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layout->StartRow(0, SINGLE_VIEW_COLUMN_SET); 6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layout->AddView(confirmation); 6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ok_button_ = new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_OK)); 6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ok_button_->SetStyle(views::Button::STYLE_BUTTON); 6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ok_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 6115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::ResourceBundle::SmallFont)); 6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) BuildColumnSet(layout, SINGLE_BUTTON_COLUMN_SET); 6145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layout->StartRowWithPadding( 6155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0, SINGLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing); 6165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layout->AddView(ok_button_); 6175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Extra padding for visual awesomeness. 6195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_->set_initially_focused_view(ok_button_); 6225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 6235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ManagePasswordsBubbleView::SaveConfirmationView::~SaveConfirmationView() { 6255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 6265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ManagePasswordsBubbleView::SaveConfirmationView::StyledLabelLinkClicked( 6285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const gfx::Range& range, int event_flags) { 6295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK_EQ(range, parent_->model()->save_confirmation_link_range()); 6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parent_->model()->OnManageLinkClicked(); 6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_->Close(); 6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 6335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ManagePasswordsBubbleView::SaveConfirmationView::ButtonPressed( 6355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) views::Button* sender, const ui::Event& event) { 6365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK_EQ(sender, ok_button_); 6375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_->model()->OnOKClicked(); 6385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_->Close(); 6395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 6405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// ManagePasswordsBubbleView::WebContentMouseHandler -------------------------- 6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The class listens for WebContentsView events and notifies the bubble if the 6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// view was clicked on or received keystrokes. 6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordsBubbleView::WebContentMouseHandler 6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : public ui::EventHandler { 6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit WebContentMouseHandler(ManagePasswordsBubbleView* bubble); 6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~WebContentMouseHandler(); 6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; 6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE; 6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::Window* GetWebContentsWindow(); 6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagePasswordsBubbleView* bubble_; 6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(WebContentMouseHandler); 6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciManagePasswordsBubbleView::WebContentMouseHandler::WebContentMouseHandler( 6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagePasswordsBubbleView* bubble) 6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : bubble_(bubble) { 6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetWebContentsWindow()->AddPreTargetHandler(this); 6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciManagePasswordsBubbleView::WebContentMouseHandler::~WebContentMouseHandler() { 6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (aura::Window* window = GetWebContentsWindow()) 6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window->RemovePreTargetHandler(this); 6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ManagePasswordsBubbleView::WebContentMouseHandler::OnKeyEvent( 6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::KeyEvent* event) { 6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::WebContents* web_contents = bubble_->model()->web_contents(); 6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RenderViewHost* rvh = web_contents->GetRenderViewHost(); 6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (rvh->IsFocusedElementEditable() && 6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event->type() == ui::ET_KEY_PRESSED) 6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bubble_->Close(); 6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ManagePasswordsBubbleView::WebContentMouseHandler::OnMouseEvent( 6831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::MouseEvent* event) { 6841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event->type() == ui::ET_MOUSE_PRESSED) 6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bubble_->Close(); 6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciaura::Window* 6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciManagePasswordsBubbleView::WebContentMouseHandler::GetWebContentsWindow() { 6901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::WebContents* web_contents = bubble_->model()->web_contents(); 6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return web_contents ? web_contents->GetNativeView() : NULL; 6921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 694a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// ManagePasswordsBubbleView -------------------------------------------------- 695a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static 697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ManagePasswordsBubbleView* ManagePasswordsBubbleView::manage_passwords_bubble_ = 698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NULL; 699f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 700f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static 701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ManagePasswordsBubbleView::ShowBubble(content::WebContents* web_contents, 7020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DisplayReason reason) { 703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Browser* browser = chrome::FindBrowserWithWebContents(web_contents); 704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(browser); 705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(browser->window()); 706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(browser->fullscreen_controller()); 7075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 7085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (IsShowing()) 7095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser); 712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool is_fullscreen = browser_view->IsFullscreen(); 713f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ManagePasswordsIconView* anchor_view = 714f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) is_fullscreen 715f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ? NULL 716f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : browser_view->GetLocationBarView()->manage_passwords_icon_view(); 717c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch manage_passwords_bubble_ = new ManagePasswordsBubbleView( 7180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch web_contents, anchor_view, reason); 719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (is_fullscreen) { 721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) manage_passwords_bubble_->set_parent_window( 722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_contents->GetTopLevelNativeWindow()); 723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) views::BubbleDelegateView::CreateBubble(manage_passwords_bubble_); 726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Adjust for fullscreen after creation as it relies on the content size. 728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (is_fullscreen) { 729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) manage_passwords_bubble_->AdjustForFullscreen( 730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser_view->GetBoundsInScreen()); 731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 7325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (reason == AUTOMATIC) 7335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) manage_passwords_bubble_->GetWidget()->ShowInactive(); 7345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else 7355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) manage_passwords_bubble_->GetWidget()->Show(); 736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 738f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static 7390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ManagePasswordsBubbleView::CloseBubble() { 740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (manage_passwords_bubble_) 741010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) manage_passwords_bubble_->Close(); 742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static 7455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ManagePasswordsBubbleView::ActivateBubble() { 7465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!IsShowing()) 7475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 7485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) manage_passwords_bubble_->GetWidget()->Activate(); 7495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 7505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static 752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ManagePasswordsBubbleView::IsShowing() { 753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The bubble may be in the process of closing. 754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return (manage_passwords_bubble_ != NULL) && 755f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) manage_passwords_bubble_->GetWidget()->IsVisible(); 756f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicontent::WebContents* ManagePasswordsBubbleView::web_contents() const { 7591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return model()->web_contents(); 7601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 7611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 762f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ManagePasswordsBubbleView::ManagePasswordsBubbleView( 763f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WebContents* web_contents, 764f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ManagePasswordsIconView* anchor_view, 7650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DisplayReason reason) 7660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch : ManagePasswordsBubble(web_contents, reason), 7670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BubbleDelegateView(anchor_view, 768c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch anchor_view ? views::BubbleBorder::TOP_RIGHT 769f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : views::BubbleBorder::NONE), 7706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) anchor_view_(anchor_view), 7715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) never_save_passwords_(false), 7725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) initially_focused_view_(NULL) { 773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Compensate for built-in vertical padding in the anchor view's image. 7745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) set_anchor_view_insets(gfx::Insets(5, 0, 5, 0)); 775f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (anchor_view) 776f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) anchor_view->SetActive(true); 7771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mouse_handler_.reset(new WebContentMouseHandler(this)); 778c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 779c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 780f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ManagePasswordsBubbleView::~ManagePasswordsBubbleView() { 781f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (anchor_view_) 782f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) anchor_view_->SetActive(false); 783f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 784c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 785f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ManagePasswordsBubbleView::AdjustForFullscreen( 786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Rect& screen_bounds) { 787f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetAnchorView()) 788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 789f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The bubble's padding from the screen edge, used in fullscreen. 791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kFullscreenPaddingEnd = 20; 792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const size_t bubble_half_width = width() / 2; 793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int x_pos = base::i18n::IsRTL() ? 794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) screen_bounds.x() + bubble_half_width + kFullscreenPaddingEnd : 795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) screen_bounds.right() - bubble_half_width - kFullscreenPaddingEnd; 796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetAnchorRect(gfx::Rect(x_pos, screen_bounds.y(), 0, 0)); 797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ManagePasswordsBubbleView::Close() { 8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mouse_handler_.reset(); 8010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetWidget()->Close(); 8020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 8030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 8046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ManagePasswordsBubbleView::Refresh() { 8056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) RemoveAllChildViews(true); 8065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) initially_focused_view_ = NULL; 8076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (password_manager::ui::IsPendingState(model()->state())) { 8086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (never_save_passwords_) 8096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AddChildView(new ConfirmNeverView(this)); 8106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) else 8116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AddChildView(new PendingView(this)); 8126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } else if (model()->state() == password_manager::ui::BLACKLIST_STATE) { 8136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AddChildView(new BlacklistedView(this)); 8145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else if (model()->state() == password_manager::ui::CONFIRMATION_STATE) { 8155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddChildView(new SaveConfirmationView(this)); 8166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } else { 8176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AddChildView(new ManageView(this)); 8186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 8196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GetLayoutManager()->Layout(this); 8206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 8216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 8226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ManagePasswordsBubbleView::NotifyNeverForThisSiteClicked() { 8236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (model()->best_matches().empty()) { 8246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Skip confirmation if there are no existing passwords for this site. 8256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) NotifyConfirmedNeverForThisSite(); 8266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } else { 8276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) never_save_passwords_ = true; 8286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Refresh(); 8296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 8306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 8316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 8326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ManagePasswordsBubbleView::NotifyConfirmedNeverForThisSite() { 8336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) model()->OnNeverForThisSiteClicked(); 8346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Close(); 8356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 8366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 8376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ManagePasswordsBubbleView::NotifyUndoNeverForThisSite() { 8386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) never_save_passwords_ = false; 8396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Refresh(); 8406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 8415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ManagePasswordsBubbleView::Init() { 8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::FillLayout* layout = new views::FillLayout(); 8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetLayoutManager(layout); 8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Refresh(); 8471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ManagePasswordsBubbleView::WindowClosing() { 8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Close() closes the window asynchronously, so by the time we reach here, 8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |manage_passwords_bubble_| may have already been reset. 8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (manage_passwords_bubble_ == this) 8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci manage_passwords_bubble_ = NULL; 8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 8551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciviews::View* ManagePasswordsBubbleView::GetInitiallyFocusedView() { 8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return initially_focused_view_; 8585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 859