OLD | NEW |
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 #ifndef CHROME_BROWSER_UI_VIEWS_PASSWORDS_MANAGE_PASSWORDS_BUBBLE_VIEW_H_ | 5 #ifndef CHROME_BROWSER_UI_VIEWS_PASSWORDS_MANAGE_PASSWORDS_BUBBLE_VIEW_H_ |
6 #define CHROME_BROWSER_UI_VIEWS_PASSWORDS_MANAGE_PASSWORDS_BUBBLE_VIEW_H_ | 6 #define CHROME_BROWSER_UI_VIEWS_PASSWORDS_MANAGE_PASSWORDS_BUBBLE_VIEW_H_ |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "chrome/browser/ui/passwords/manage_passwords_bubble.h" | 9 #include "chrome/browser/ui/passwords/manage_passwords_bubble.h" |
10 #include "chrome/browser/ui/views/passwords/save_password_refusal_combobox_model
.h" | 10 #include "chrome/browser/ui/views/passwords/save_password_refusal_combobox_model
.h" |
11 #include "ui/views/bubble/bubble_delegate.h" | 11 #include "ui/views/bubble/bubble_delegate.h" |
12 #include "ui/views/controls/button/button.h" | 12 #include "ui/views/controls/button/button.h" |
13 #include "ui/views/controls/combobox/combobox.h" | 13 #include "ui/views/controls/combobox/combobox.h" |
14 #include "ui/views/controls/combobox/combobox_listener.h" | 14 #include "ui/views/controls/combobox/combobox_listener.h" |
15 #include "ui/views/controls/link.h" | 15 #include "ui/views/controls/link.h" |
16 #include "ui/views/controls/link_listener.h" | 16 #include "ui/views/controls/link_listener.h" |
17 | 17 |
18 class ManagePasswordsIconView; | 18 class ManagePasswordsIconView; |
19 | 19 |
20 namespace content { | 20 namespace content { |
21 class WebContents; | 21 class WebContents; |
22 } | 22 } |
23 | 23 |
24 namespace views { | 24 namespace views { |
25 class BlueButton; | 25 class BlueButton; |
26 class LabelButton; | 26 class LabelButton; |
27 class GridLayout; | 27 class GridLayout; |
28 } | 28 } |
29 | 29 |
| 30 // The ManagePasswordsBubbleView controls the contents of the bubble which |
| 31 // pops up when Chrome offers to save a user's password, or when the user |
| 32 // interacts with the Omnibox icon. It has two distinct states: |
| 33 // |
| 34 // 1. PendingView: Offers the user the possibility of saving credentials. |
| 35 // 2. ManageView: Displays the current page's saved credentials. |
| 36 // |
| 37 // TODO(mkwst): Add a third state: "Informing the user that the current page |
| 38 // is blacklisted." |
30 class ManagePasswordsBubbleView : public ManagePasswordsBubble, | 39 class ManagePasswordsBubbleView : public ManagePasswordsBubble, |
31 public views::BubbleDelegateView, | 40 public views::BubbleDelegateView { |
32 public views::ButtonListener, | |
33 public views::ComboboxListener, | |
34 public views::LinkListener { | |
35 public: | 41 public: |
| 42 // A view offering the user the ability to save credentials. Contains a |
| 43 // single ManagePasswordItemView, along with a "Save Passwords" button |
| 44 // and a rejection combobox. |
| 45 class PendingView : public views::View, |
| 46 public views::ButtonListener, |
| 47 public views::ComboboxListener { |
| 48 public: |
| 49 explicit PendingView(ManagePasswordsBubbleView* parent); |
| 50 virtual ~PendingView(); |
| 51 |
| 52 private: |
| 53 // views::ButtonListener: |
| 54 virtual void ButtonPressed(views::Button* sender, |
| 55 const ui::Event& event) OVERRIDE; |
| 56 |
| 57 // Handles the event when the user changes an index of a combobox. |
| 58 virtual void OnPerformAction(views::Combobox* source) OVERRIDE; |
| 59 |
| 60 ManagePasswordsBubbleView* parent_; |
| 61 |
| 62 views::BlueButton* save_button_; |
| 63 |
| 64 // The combobox doesn't take ownership of its model. If we created a |
| 65 // combobox we need to ensure that we delete the model here, and because the |
| 66 // combobox uses the model in it's destructor, we need to make sure we |
| 67 // delete the model _after_ the combobox itself is deleted. |
| 68 scoped_ptr<SavePasswordRefusalComboboxModel> combobox_model_; |
| 69 scoped_ptr<views::Combobox> refuse_combobox_; |
| 70 }; |
| 71 |
| 72 // A view offering the user a list of her currently saved credentials |
| 73 // for the current page, along with a "Manage passwords" link and a |
| 74 // "Done" button. |
| 75 class ManageView : public views::View, |
| 76 public views::ButtonListener, |
| 77 public views::LinkListener { |
| 78 public: |
| 79 explicit ManageView(ManagePasswordsBubbleView* parent); |
| 80 virtual ~ManageView(); |
| 81 |
| 82 private: |
| 83 // views::ButtonListener: |
| 84 virtual void ButtonPressed(views::Button* sender, |
| 85 const ui::Event& event) OVERRIDE; |
| 86 |
| 87 // views::LinkListener: |
| 88 virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; |
| 89 |
| 90 ManagePasswordsBubbleView* parent_; |
| 91 |
| 92 views::Link* manage_link_; |
| 93 views::LabelButton* done_button_; |
| 94 }; |
| 95 |
36 // Shows the bubble. | 96 // Shows the bubble. |
37 static void ShowBubble(content::WebContents* web_contents, | 97 static void ShowBubble(content::WebContents* web_contents, |
38 DisplayReason reason); | 98 DisplayReason reason); |
39 | 99 |
40 // Closes any existing bubble. | 100 // Closes any existing bubble. |
41 static void CloseBubble(); | 101 static void CloseBubble(); |
42 | 102 |
43 // Whether the bubble is currently showing. | 103 // Whether the bubble is currently showing. |
44 static bool IsShowing(); | 104 static bool IsShowing(); |
45 | 105 |
46 private: | 106 private: |
47 enum ColumnSetType { | |
48 // | | (FILL, FILL) | | | |
49 // Used for the bubble's header, the credentials list, and for simple | |
50 // messages like "No passwords". | |
51 SINGLE_VIEW_COLUMN_SET = 0, | |
52 | |
53 // | | (TRAILING, CENTER) | | (TRAILING, CENTER) | | | |
54 // Used for buttons at the bottom of the bubble which should nest at the | |
55 // bottom-right corner. | |
56 DOUBLE_BUTTON_COLUMN_SET = 1, | |
57 | |
58 // | | (LEADING, CENTER) | | (TRAILING, CENTER) | | | |
59 // Used for buttons at the bottom of the bubble which should occupy | |
60 // the corners. | |
61 LINK_BUTTON_COLUMN_SET = 2, | |
62 }; | |
63 | |
64 ManagePasswordsBubbleView(content::WebContents* web_contents, | 107 ManagePasswordsBubbleView(content::WebContents* web_contents, |
65 views::View* anchor_view, | 108 views::View* anchor_view, |
66 DisplayReason reason); | 109 DisplayReason reason); |
67 virtual ~ManagePasswordsBubbleView(); | 110 virtual ~ManagePasswordsBubbleView(); |
68 | 111 |
69 // Construct an appropriate ColumnSet for the given |type|, and add it | |
70 // to |layout|. | |
71 void BuildColumnSet(views::GridLayout* layout, ColumnSetType type); | |
72 | |
73 // If the bubble is not anchored to a view, places the bubble in the top | 112 // If the bubble is not anchored to a view, places the bubble in the top |
74 // right (left in RTL) of the |screen_bounds| that contain |web_contents_|'s | 113 // right (left in RTL) of the |screen_bounds| that contain |web_contents_|'s |
75 // browser window. Because the positioning is based on the size of the | 114 // browser window. Because the positioning is based on the size of the |
76 // bubble, this must be called after the bubble is created. | 115 // bubble, this must be called after the bubble is created. |
77 void AdjustForFullscreen(const gfx::Rect& screen_bounds); | 116 void AdjustForFullscreen(const gfx::Rect& screen_bounds); |
78 | 117 |
79 // Close the bubble. | 118 // Close the bubble. |
80 void Close(); | 119 void Close(); |
81 | 120 |
82 // Close the bubble without triggering UMA logging. We need this for the | 121 // Close the bubble without triggering UMA logging. We need this for the |
83 // moment, as the current implementation can close the bubble without user | 122 // moment, as the current implementation can close the bubble without user |
84 // interaction; we want to ensure that doesn't show up as a user action in | 123 // interaction; we want to ensure that doesn't show up as a user action in |
85 // our counts. | 124 // our counts. |
86 // | 125 // |
87 // TODO(mkwst): Throw this away once the icon is no longer responsible for | 126 // TODO(mkwst): Throw this away once the icon is no longer responsible for |
88 // creating the bubble. | 127 // creating the bubble. |
89 void CloseWithoutLogging(); | 128 void CloseWithoutLogging(); |
90 | 129 |
91 // views::BubbleDelegateView: | 130 // views::BubbleDelegateView: |
92 virtual void Init() OVERRIDE; | 131 virtual void Init() OVERRIDE; |
93 virtual void WindowClosing() OVERRIDE; | 132 virtual void WindowClosing() OVERRIDE; |
94 | 133 |
95 // views::ButtonListener: | |
96 virtual void ButtonPressed(views::Button* sender, | |
97 const ui::Event& event) OVERRIDE; | |
98 | |
99 // views::LinkListener: | |
100 virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; | |
101 | |
102 // Handles the event when the user changes an index of a combobox. | |
103 virtual void OnPerformAction(views::Combobox* source) OVERRIDE; | |
104 | |
105 // Singleton instance of the Password bubble. The Password bubble can only be | 134 // Singleton instance of the Password bubble. The Password bubble can only be |
106 // shown on the active browser window, so there is no case in which it will be | 135 // shown on the active browser window, so there is no case in which it will be |
107 // shown twice at the same time. | 136 // shown twice at the same time. |
108 static ManagePasswordsBubbleView* manage_passwords_bubble_; | 137 static ManagePasswordsBubbleView* manage_passwords_bubble_; |
109 | 138 |
110 // The views that are shown in the bubble. | |
111 views::BlueButton* save_button_; | |
112 views::Link* manage_link_; | |
113 views::LabelButton* done_button_; | |
114 | |
115 // The combobox doesn't take ownership of it's model. If we created a combobox | |
116 // we need to ensure that we delete the model here, and because the combobox | |
117 // uses the model in it's destructor, we need to make sure we delete the model | |
118 // _after_ the combobox itself is deleted. | |
119 scoped_ptr<SavePasswordRefusalComboboxModel> combobox_model_; | |
120 scoped_ptr<views::Combobox> refuse_combobox_; | |
121 | |
122 DISALLOW_COPY_AND_ASSIGN(ManagePasswordsBubbleView); | 139 DISALLOW_COPY_AND_ASSIGN(ManagePasswordsBubbleView); |
123 }; | 140 }; |
124 | 141 |
125 #endif // CHROME_BROWSER_UI_VIEWS_PASSWORDS_MANAGE_PASSWORDS_BUBBLE_VIEW_H_ | 142 #endif // CHROME_BROWSER_UI_VIEWS_PASSWORDS_MANAGE_PASSWORDS_BUBBLE_VIEW_H_ |
OLD | NEW |