Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(91)

Side by Side Diff: chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc

Issue 765073004: Adding skeleton code for showing Bubble, asking user to submit URL when Password Manager fails (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/views/passwords/manage_passwords_bubble_view.h" 5 #include "chrome/browser/ui/views/passwords/manage_passwords_bubble_view.h"
6 6
7 #include "chrome/browser/chrome_notification_types.h" 7 #include "chrome/browser/chrome_notification_types.h"
8 #include "chrome/browser/ui/browser.h" 8 #include "chrome/browser/ui/browser.h"
9 #include "chrome/browser/ui/browser_finder.h" 9 #include "chrome/browser/ui/browser_finder.h"
10 #include "chrome/browser/ui/fullscreen/fullscreen_controller.h" 10 #include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
(...skipping 11 matching lines...) Expand all
22 #include "content/public/browser/web_contents.h" 22 #include "content/public/browser/web_contents.h"
23 #include "ui/aura/window.h" 23 #include "ui/aura/window.h"
24 #include "ui/base/l10n/l10n_util.h" 24 #include "ui/base/l10n/l10n_util.h"
25 #include "ui/base/resource/resource_bundle.h" 25 #include "ui/base/resource/resource_bundle.h"
26 #include "ui/views/controls/button/blue_button.h" 26 #include "ui/views/controls/button/blue_button.h"
27 #include "ui/views/controls/button/label_button.h" 27 #include "ui/views/controls/button/label_button.h"
28 #include "ui/views/controls/combobox/combobox.h" 28 #include "ui/views/controls/combobox/combobox.h"
29 #include "ui/views/controls/combobox/combobox_listener.h" 29 #include "ui/views/controls/combobox/combobox_listener.h"
30 #include "ui/views/controls/link.h" 30 #include "ui/views/controls/link.h"
31 #include "ui/views/controls/link_listener.h" 31 #include "ui/views/controls/link_listener.h"
32 #include "ui/views/controls/separator.h"
32 #include "ui/views/controls/styled_label.h" 33 #include "ui/views/controls/styled_label.h"
33 #include "ui/views/controls/styled_label_listener.h" 34 #include "ui/views/controls/styled_label_listener.h"
34 #include "ui/views/layout/fill_layout.h" 35 #include "ui/views/layout/fill_layout.h"
35 #include "ui/views/layout/grid_layout.h" 36 #include "ui/views/layout/grid_layout.h"
36 #include "ui/views/layout/layout_constants.h" 37 #include "ui/views/layout/layout_constants.h"
37 #include "ui/views/widget/widget.h" 38 #include "ui/views/widget/widget.h"
38 39
39
vabr (Chromium) 2014/12/03 14:08:06 nit: As a general rule, formatting changes not rel
melandory 2014/12/04 10:33:47 Done.
40 // Helpers -------------------------------------------------------------------- 40 // Helpers --------------------------------------------------------------------
41 41
42 namespace { 42 namespace {
43 43
44 const int kDesiredBubbleWidth = 370; 44 const int kDesiredBubbleWidth = 370;
45 45
46 enum ColumnSetType { 46 enum ColumnSetType {
47 // | | (FILL, FILL) | | 47 // | | (FILL, FILL) | |
48 // Used for the bubble's header, the credentials list, and for simple 48 // Used for the bubble's header, the credentials list, and for simple
49 // messages like "No passwords". 49 // messages like "No passwords".
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 column_set->AddColumn(views::GridLayout::TRAILING, 115 column_set->AddColumn(views::GridLayout::TRAILING,
116 views::GridLayout::CENTER, 116 views::GridLayout::CENTER,
117 1, 117 1,
118 views::GridLayout::USE_PREF, 118 views::GridLayout::USE_PREF,
119 0, 119 0,
120 0); 120 0);
121 } 121 }
122 column_set->AddPaddingColumn(0, views::kPanelHorizMargin); 122 column_set->AddPaddingColumn(0, views::kPanelHorizMargin);
123 } 123 }
124 124
125 // Given |layout| and |color| adds border with |color| using
126 // SINGLE_VIEW_COLUMN_SET.
127 void AddBorderRow(views::GridLayout* layout, SkColor color) {
128 layout->StartRowWithPadding(0, SINGLE_VIEW_COLUMN_SET, 0,
129 views::kRelatedControlVerticalSpacing);
130 views::Separator* border = new views::Separator(views::Separator::HORIZONTAL);
131 border->SetColor(color);
132 layout->AddView(border);
133 }
134
125 // Given a layout and a model, add an appropriate title using a 135 // Given a layout and a model, add an appropriate title using a
126 // SINGLE_VIEW_COLUMN_SET, followed by a spacer row. 136 // SINGLE_VIEW_COLUMN_SET, followed by a spacer row.
127 void AddTitleRow(views::GridLayout* layout, ManagePasswordsBubbleModel* model) { 137 void AddTitleRow(views::GridLayout* layout, ManagePasswordsBubbleModel* model) {
128 views::Label* title_label = new views::Label(model->title()); 138 views::Label* title_label = new views::Label(model->title());
129 title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 139 title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
130 title_label->SetMultiLine(true); 140 title_label->SetMultiLine(true);
131 title_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 141 title_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
132 ui::ResourceBundle::MediumFont)); 142 ui::ResourceBundle::MediumFont));
133 143
134 // Add the title to the layout with appropriate padding. 144 // Add the title to the layout with appropriate padding.
135 layout->StartRowWithPadding( 145 layout->StartRowWithPadding(
136 0, SINGLE_VIEW_COLUMN_SET, 0, views::kRelatedControlSmallVerticalSpacing); 146 0, SINGLE_VIEW_COLUMN_SET, 0, views::kRelatedControlSmallVerticalSpacing);
137 layout->AddView(title_label); 147 layout->AddView(title_label);
138 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); 148 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
139 } 149 }
140 150
151 // Given a |layout| and |text|, adds a text row with small font using a
152 // SINGLE_VIEW_COLUMN_SET.
153 void AddTextRow(views::GridLayout* layout, const base::string16& text) {
154 views::Label* text_label = new views::Label(text);
155 text_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
156 text_label->SetMultiLine(true);
157 text_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
158 ui::ResourceBundle::SmallFont));
159 layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
160 layout->AddView(text_label);
161 }
162
141 } // namespace 163 } // namespace
142 164
143 165
144 // Globals -------------------------------------------------------------------- 166 // Globals --------------------------------------------------------------------
145 167
146 namespace chrome { 168 namespace chrome {
147 169
148 void ShowManagePasswordsBubble(content::WebContents* web_contents) { 170 void ShowManagePasswordsBubble(content::WebContents* web_contents) {
149 if (ManagePasswordsBubbleView::IsShowing()) { 171 if (ManagePasswordsBubbleView::IsShowing()) {
150 // The bubble is currently shown for some other tab. We should close it now 172 // The bubble is currently shown for some other tab. We should close it now
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 // ManagePasswordsBubbleModel should care about calling a callback in case 260 // ManagePasswordsBubbleModel should care about calling a callback in case
239 // the bubble is dismissed by any other means. 261 // the bubble is dismissed by any other means.
240 CredentialsItemView* view = static_cast<CredentialsItemView*>(sender); 262 CredentialsItemView* view = static_cast<CredentialsItemView*>(sender);
241 parent_->model()->OnChooseCredentials(view->form()); 263 parent_->model()->OnChooseCredentials(view->form());
242 } else { 264 } else {
243 parent_->model()->OnNopeClicked(); 265 parent_->model()->OnNopeClicked();
244 } 266 }
245 parent_->Close(); 267 parent_->Close();
246 } 268 }
247 269
270 // ManagePasswordsBubbleView::AskUserToSubmitURLView -------------------------
271
272 // Asks users if they want to report the URL when the password manager failed
273 // to detect the form. View has following structure:
274 // We detected that Chrome password manager failed to handle this URL.
275 // Do you want to send this URL to Google to improve Chrome?
276 // -------------------------------------------------------------
277 // https://strangesite.com/
278 // -------------------------------------------------------------
279 // [Send URL] [Nope]
280 class ManagePasswordsBubbleView::AskUserToSubmitURLView
281 : public views::View,
282 public views::ButtonListener {
283 public:
284 explicit AskUserToSubmitURLView(ManagePasswordsBubbleView* parent);
285 ~AskUserToSubmitURLView() override;
286
287 private:
288 // views::ButtonListener:
289 void ButtonPressed(views::Button* sender, const ui::Event& event) override;
290
291 ManagePasswordsBubbleView* parent_;
292
293 views::BlueButton* send_button_;
294 views::BlueButton* no_button_;
295 };
296
297 ManagePasswordsBubbleView::AskUserToSubmitURLView::AskUserToSubmitURLView(
298 ManagePasswordsBubbleView* parent)
299 : parent_(parent) {
300 views::GridLayout* layout = new views::GridLayout(this);
301 layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0));
302 SetLayoutManager(layout);
303
304 send_button_ = new views::BlueButton(
305 this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_CANCEL_BUTTON));
306 send_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
307 ui::ResourceBundle::SmallFont));
308
309 no_button_ = new views::BlueButton(
310 this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SEND_URL_BUTTON));
311 no_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
312 ui::ResourceBundle::SmallFont));
313
314 // Title row.
315 BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
316 AddTitleRow(layout, parent_->model());
317 // Confirmation text.
318 AddTextRow(layout, l10n_util::GetStringUTF16(
319 IDS_MANAGE_PASSWORDS_ASK_TO_SUBMIT_URL_TEXT));
320 GURL origin = parent->model()->origin();
321 // Better to omit url if it's incorrect or empty.
vabr (Chromium) 2014/12/03 14:08:07 But what is the purpose of asking the user, if the
melandory 2014/12/04 10:33:47 Moved this check to PasswordManager::RecordFailur
322 if (origin.is_valid() && !origin.is_empty() && origin.has_host()) {
323 // Border row.
324 SkColor color = GetNativeTheme()->GetSystemColor(
325 ui::NativeTheme::kColorId_EnabledMenuButtonBorderColor);
326 AddBorderRow(layout, color);
327 layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
328 // URL row.
329 AddTextRow(layout, base::UTF8ToUTF16(parent->model()->origin().host()));
330 layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
331 // Border row.
332 AddBorderRow(layout, color);
333 }
334 // Button row.
335 BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET);
336 layout->StartRowWithPadding(0, DOUBLE_BUTTON_COLUMN_SET, 0,
337 views::kRelatedControlVerticalSpacing);
338 layout->AddView(no_button_);
339 layout->AddView(send_button_);
340
341 // Extra padding for visual awesomeness.
342 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
343
344 parent_->set_initially_focused_view(send_button_);
vabr (Chromium) 2014/12/03 14:08:06 Please make sure that the choice of the default wa
melandory 2014/12/04 10:33:47 sabineb@ said that nope as default is better. Done
345 }
346
347 ManagePasswordsBubbleView::AskUserToSubmitURLView::~AskUserToSubmitURLView() {
348 }
349
350 void ManagePasswordsBubbleView::AskUserToSubmitURLView::ButtonPressed(
351 views::Button* sender,
352 const ui::Event& event) {
353 DCHECK(sender == send_button_ || sender == no_button_);
354 // TODO(melandory): Add actions on button clicks: url reporting, pref saving.
355 parent_->Close();
356 }
357
248 // ManagePasswordsBubbleView::PendingView ------------------------------------- 358 // ManagePasswordsBubbleView::PendingView -------------------------------------
249 359
250 // A view offering the user the ability to save credentials. Contains a 360 // A view offering the user the ability to save credentials. Contains a
251 // single ManagePasswordItemsView, along with a "Save Passwords" button 361 // single ManagePasswordItemsView, along with a "Save Passwords" button
252 // and a rejection combobox. 362 // and a rejection combobox.
253 class ManagePasswordsBubbleView::PendingView : public views::View, 363 class ManagePasswordsBubbleView::PendingView : public views::View,
254 public views::ButtonListener, 364 public views::ButtonListener,
255 public views::ComboboxListener { 365 public views::ComboboxListener {
256 public: 366 public:
257 explicit PendingView(ManagePasswordsBubbleView* parent); 367 explicit PendingView(ManagePasswordsBubbleView* parent);
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 ManagePasswordsBubbleView* ManagePasswordsBubbleView::manage_passwords_bubble_ = 874 ManagePasswordsBubbleView* ManagePasswordsBubbleView::manage_passwords_bubble_ =
765 NULL; 875 NULL;
766 876
767 // static 877 // static
768 void ManagePasswordsBubbleView::ShowBubble(content::WebContents* web_contents, 878 void ManagePasswordsBubbleView::ShowBubble(content::WebContents* web_contents,
769 DisplayReason reason) { 879 DisplayReason reason) {
770 Browser* browser = chrome::FindBrowserWithWebContents(web_contents); 880 Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
771 DCHECK(browser); 881 DCHECK(browser);
772 DCHECK(browser->window()); 882 DCHECK(browser->window());
773 DCHECK(browser->fullscreen_controller()); 883 DCHECK(browser->fullscreen_controller());
774
775 if (IsShowing()) 884 if (IsShowing())
776 return; 885 return;
777
778 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser); 886 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
779 bool is_fullscreen = browser_view->IsFullscreen(); 887 bool is_fullscreen = browser_view->IsFullscreen();
780 ManagePasswordsIconView* anchor_view = 888 ManagePasswordsIconView* anchor_view =
781 is_fullscreen 889 is_fullscreen
782 ? NULL 890 ? NULL
783 : browser_view->GetLocationBarView()->manage_passwords_icon_view(); 891 : browser_view->GetLocationBarView()->manage_passwords_icon_view();
784 manage_passwords_bubble_ = new ManagePasswordsBubbleView( 892 manage_passwords_bubble_ = new ManagePasswordsBubbleView(
785 web_contents, anchor_view, reason); 893 web_contents, anchor_view, reason);
786 894
787 if (is_fullscreen) { 895 if (is_fullscreen) {
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 } 984 }
877 985
878 void ManagePasswordsBubbleView::Refresh() { 986 void ManagePasswordsBubbleView::Refresh() {
879 RemoveAllChildViews(true); 987 RemoveAllChildViews(true);
880 initially_focused_view_ = NULL; 988 initially_focused_view_ = NULL;
881 if (password_manager::ui::IsPendingState(model()->state())) { 989 if (password_manager::ui::IsPendingState(model()->state())) {
882 if (never_save_passwords_) 990 if (never_save_passwords_)
883 AddChildView(new ConfirmNeverView(this)); 991 AddChildView(new ConfirmNeverView(this));
884 else 992 else
885 AddChildView(new PendingView(this)); 993 AddChildView(new PendingView(this));
994 } else if (IsAskSubmitURLState(model()->state())) {
995 AddChildView(new AskUserToSubmitURLView(this));
886 } else if (model()->state() == password_manager::ui::BLACKLIST_STATE) { 996 } else if (model()->state() == password_manager::ui::BLACKLIST_STATE) {
887 AddChildView(new BlacklistedView(this)); 997 AddChildView(new BlacklistedView(this));
888 } else if (model()->state() == password_manager::ui::CONFIRMATION_STATE) { 998 } else if (model()->state() == password_manager::ui::CONFIRMATION_STATE) {
889 AddChildView(new SaveConfirmationView(this)); 999 AddChildView(new SaveConfirmationView(this));
890 } else if (password_manager::ui::IsCredentialsState(model()->state())) { 1000 } else if (password_manager::ui::IsCredentialsState(model()->state())) {
891 AddChildView(new AccountChooserView(this)); 1001 AddChildView(new AccountChooserView(this));
892 } else { 1002 } else {
893 AddChildView(new ManageView(this)); 1003 AddChildView(new ManageView(this));
894 } 1004 }
895 GetLayoutManager()->Layout(this); 1005 GetLayoutManager()->Layout(this);
(...skipping 15 matching lines...) Expand all
911 } 1021 }
912 1022
913 void ManagePasswordsBubbleView::NotifyUndoNeverForThisSite() { 1023 void ManagePasswordsBubbleView::NotifyUndoNeverForThisSite() {
914 never_save_passwords_ = false; 1024 never_save_passwords_ = false;
915 Refresh(); 1025 Refresh();
916 } 1026 }
917 1027
918 void ManagePasswordsBubbleView::Init() { 1028 void ManagePasswordsBubbleView::Init() {
919 views::FillLayout* layout = new views::FillLayout(); 1029 views::FillLayout* layout = new views::FillLayout();
920 SetLayoutManager(layout); 1030 SetLayoutManager(layout);
921
922 Refresh(); 1031 Refresh();
923 } 1032 }
924 1033
925 void ManagePasswordsBubbleView::WindowClosing() { 1034 void ManagePasswordsBubbleView::WindowClosing() {
926 // Close() closes the window asynchronously, so by the time we reach here, 1035 // Close() closes the window asynchronously, so by the time we reach here,
927 // |manage_passwords_bubble_| may have already been reset. 1036 // |manage_passwords_bubble_| may have already been reset.
928 if (manage_passwords_bubble_ == this) 1037 if (manage_passwords_bubble_ == this)
929 manage_passwords_bubble_ = NULL; 1038 manage_passwords_bubble_ = NULL;
930 } 1039 }
931 1040
932 views::View* ManagePasswordsBubbleView::GetInitiallyFocusedView() { 1041 views::View* ManagePasswordsBubbleView::GetInitiallyFocusedView() {
933 return initially_focused_view_; 1042 return initially_focused_view_;
934 } 1043 }
935 1044
936 void ManagePasswordsBubbleView::Observe( 1045 void ManagePasswordsBubbleView::Observe(
937 int type, 1046 int type,
938 const content::NotificationSource& source, 1047 const content::NotificationSource& source,
939 const content::NotificationDetails& details) { 1048 const content::NotificationDetails& details) {
940 DCHECK_EQ(type, chrome::NOTIFICATION_FULLSCREEN_CHANGED); 1049 DCHECK_EQ(type, chrome::NOTIFICATION_FULLSCREEN_CHANGED);
941 GetWidget()->SetVisibilityAnimationTransition(views::Widget::ANIMATE_NONE); 1050 GetWidget()->SetVisibilityAnimationTransition(views::Widget::ANIMATE_NONE);
942 CloseBubble(); 1051 CloseBubble();
943 } 1052 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698