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

Side by Side Diff: chrome/browser/ui/passwords/manage_passwords_ui_controller.cc

Issue 733463003: Show user credentials chooser bubble. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: merge with trunk 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/passwords/manage_passwords_ui_controller.h" 5 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h"
6 6
7 #include "chrome/app/chrome_command_ids.h" 7 #include "chrome/app/chrome_command_ids.h"
8 #include "chrome/browser/browsing_data/browsing_data_helper.h" 8 #include "chrome/browser/browsing_data/browsing_data_helper.h"
9 #include "chrome/browser/password_manager/password_store_factory.h" 9 #include "chrome/browser/password_manager/password_store_factory.h"
10 #include "chrome/browser/ui/browser_command_controller.h" 10 #include "chrome/browser/ui/browser_command_controller.h"
11 #include "chrome/browser/ui/browser_dialogs.h" 11 #include "chrome/browser/ui/browser_dialogs.h"
12 #include "chrome/browser/ui/browser_finder.h" 12 #include "chrome/browser/ui/browser_finder.h"
13 #include "chrome/browser/ui/chrome_pages.h" 13 #include "chrome/browser/ui/chrome_pages.h"
14 #include "chrome/browser/ui/location_bar/location_bar.h" 14 #include "chrome/browser/ui/location_bar/location_bar.h"
15 #include "chrome/browser/ui/passwords/manage_passwords_icon.h" 15 #include "chrome/browser/ui/passwords/manage_passwords_icon.h"
16 #include "chrome/browser/ui/passwords/password_bubble_experiment.h" 16 #include "chrome/browser/ui/passwords/password_bubble_experiment.h"
17 #include "chrome/common/url_constants.h" 17 #include "chrome/common/url_constants.h"
18 #include "components/password_manager/content/common/credential_manager_types.h"
18 #include "components/password_manager/core/browser/password_form_manager.h" 19 #include "components/password_manager/core/browser/password_form_manager.h"
19 #include "content/public/browser/navigation_details.h" 20 #include "content/public/browser/navigation_details.h"
20 21
21 #if defined(OS_ANDROID) 22 #if defined(OS_ANDROID)
22 #include "chrome/browser/android/chromium_application.h" 23 #include "chrome/browser/android/chromium_application.h"
23 #endif 24 #endif
24 25
25 using autofill::PasswordFormMap; 26 using autofill::PasswordFormMap;
26 using password_manager::PasswordFormManager; 27 using password_manager::PasswordFormManager;
27 28
(...skipping 27 matching lines...) Expand all
55 } 56 }
56 } 57 }
57 58
58 } // namespace 59 } // namespace
59 60
60 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ManagePasswordsUIController); 61 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ManagePasswordsUIController);
61 62
62 ManagePasswordsUIController::ManagePasswordsUIController( 63 ManagePasswordsUIController::ManagePasswordsUIController(
63 content::WebContents* web_contents) 64 content::WebContents* web_contents)
64 : content::WebContentsObserver(web_contents), 65 : content::WebContentsObserver(web_contents),
65 state_(password_manager::ui::INACTIVE_STATE) { 66 state_(password_manager::ui::INACTIVE_STATE),
67 bubble_shown_(false) {
66 password_manager::PasswordStore* password_store = 68 password_manager::PasswordStore* password_store =
67 GetPasswordStore(web_contents); 69 GetPasswordStore(web_contents);
68 if (password_store) 70 if (password_store)
69 password_store->AddObserver(this); 71 password_store->AddObserver(this);
70 } 72 }
71 73
72 ManagePasswordsUIController::~ManagePasswordsUIController() {} 74 ManagePasswordsUIController::~ManagePasswordsUIController() {}
73 75
74 void ManagePasswordsUIController::UpdateBubbleAndIconVisibility() { 76 void ManagePasswordsUIController::UpdateBubbleAndIconVisibility() {
77 bubble_shown_ = false;
75 // If we're not on a "webby" URL (e.g. "chrome://sign-in"), we shouldn't 78 // If we're not on a "webby" URL (e.g. "chrome://sign-in"), we shouldn't
76 // display either the bubble or the icon. 79 // display either the bubble or the icon.
77 if (!BrowsingDataHelper::IsWebScheme( 80 if (!BrowsingDataHelper::IsWebScheme(
78 web_contents()->GetLastCommittedURL().scheme())) { 81 web_contents()->GetLastCommittedURL().scheme())) {
79 state_ = password_manager::ui::INACTIVE_STATE; 82 state_ = password_manager::ui::INACTIVE_STATE;
80 } 83 }
81 84
82 #if !defined(OS_ANDROID) 85 #if !defined(OS_ANDROID)
83 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); 86 Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
84 if (!browser) 87 if (!browser)
85 return; 88 return;
86 LocationBar* location_bar = browser->window()->GetLocationBar(); 89 LocationBar* location_bar = browser->window()->GetLocationBar();
87 DCHECK(location_bar); 90 DCHECK(location_bar);
88 location_bar->UpdateManagePasswordsIconAndBubble(); 91 location_bar->UpdateManagePasswordsIconAndBubble();
89 #endif 92 #endif
90 } 93 }
91 94
92 void ManagePasswordsUIController::OnPasswordSubmitted( 95 void ManagePasswordsUIController::OnPasswordSubmitted(
93 scoped_ptr<PasswordFormManager> form_manager) { 96 scoped_ptr<PasswordFormManager> form_manager) {
94 form_manager_ = form_manager.Pass(); 97 form_manager_ = form_manager.Pass();
95 password_form_map_ = ConstifyMap(form_manager_->best_matches()); 98 password_form_map_ = ConstifyMap(form_manager_->best_matches());
96 origin_ = PendingCredentials().origin; 99 origin_ = PendingPassword().origin;
97 state_ = password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE; 100 state_ = password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE;
98 UpdateBubbleAndIconVisibility(); 101 UpdateBubbleAndIconVisibility();
99 } 102 }
100 103
104 bool ManagePasswordsUIController::OnChooseCredentials(
105 ScopedVector<autofill::PasswordForm> credentials,
106 base::Callback<void(const password_manager::CredentialInfo&)> callback){
107 DCHECK(!credentials.empty());
108 form_manager_.reset();
109 origin_ = credentials[0]->origin;
110 new_password_forms_.swap(credentials);
111 // The map is useless because usernames may overlap.
112 password_form_map_.clear();
113 state_ = password_manager::ui::CREDENTIAL_REQUEST_AND_BUBBLE_STATE;
114 UpdateBubbleAndIconVisibility();
115 if (bubble_shown_)
116 credentials_callback_ = callback;
117 return bubble_shown_;
118 }
119
101 void ManagePasswordsUIController::OnAutomaticPasswordSave( 120 void ManagePasswordsUIController::OnAutomaticPasswordSave(
102 scoped_ptr<PasswordFormManager> form_manager) { 121 scoped_ptr<PasswordFormManager> form_manager) {
103 form_manager_ = form_manager.Pass(); 122 form_manager_ = form_manager.Pass();
104 password_form_map_ = ConstifyMap(form_manager_->best_matches()); 123 password_form_map_ = ConstifyMap(form_manager_->best_matches());
105 password_form_map_[form_manager_->associated_username()] = 124 password_form_map_[form_manager_->associated_username()] =
106 &form_manager_->pending_credentials(); 125 &form_manager_->pending_credentials();
107 origin_ = form_manager_->pending_credentials().origin; 126 origin_ = form_manager_->pending_credentials().origin;
108 state_ = password_manager::ui::CONFIRMATION_STATE; 127 state_ = password_manager::ui::CONFIRMATION_STATE;
109 UpdateBubbleAndIconVisibility(); 128 UpdateBubbleAndIconVisibility();
110 } 129 }
(...skipping 30 matching lines...) Expand all
141 if (changed_form.blacklisted_by_user) 160 if (changed_form.blacklisted_by_user)
142 state_ = password_manager::ui::MANAGE_STATE; 161 state_ = password_manager::ui::MANAGE_STATE;
143 } else { 162 } else {
144 new_password_forms_.push_back(new autofill::PasswordForm(changed_form)); 163 new_password_forms_.push_back(new autofill::PasswordForm(changed_form));
145 password_form_map_[changed_form.username_value] = 164 password_form_map_[changed_form.username_value] =
146 new_password_forms_.back(); 165 new_password_forms_.back();
147 if (changed_form.blacklisted_by_user) 166 if (changed_form.blacklisted_by_user)
148 state_ = password_manager::ui::BLACKLIST_STATE; 167 state_ = password_manager::ui::BLACKLIST_STATE;
149 } 168 }
150 } 169 }
170 // TODO(vasilii): handle CREDENTIAL_REQUEST_STATE.
151 if (current_state != state_) 171 if (current_state != state_)
152 UpdateBubbleAndIconVisibility(); 172 UpdateBubbleAndIconVisibility();
153 } 173 }
154 174
155 void ManagePasswordsUIController:: 175 void ManagePasswordsUIController::
156 NavigateToPasswordManagerSettingsPage() { 176 NavigateToPasswordManagerSettingsPage() {
157 #if defined(OS_ANDROID) 177 #if defined(OS_ANDROID)
158 chrome::android::ChromiumApplication::ShowPasswordSettings(); 178 chrome::android::ChromiumApplication::ShowPasswordSettings();
159 #else 179 #else
160 chrome::ShowSettingsSubPage( 180 chrome::ShowSettingsSubPage(
161 chrome::FindBrowserWithWebContents(web_contents()), 181 chrome::FindBrowserWithWebContents(web_contents()),
162 chrome::kPasswordManagerSubPage); 182 chrome::kPasswordManagerSubPage);
163 #endif 183 #endif
164 } 184 }
165 185
166 void ManagePasswordsUIController::SavePassword() { 186 void ManagePasswordsUIController::SavePassword() {
167 DCHECK(PasswordPendingUserDecision()); 187 DCHECK(PasswordPendingUserDecision());
168 SavePasswordInternal(); 188 SavePasswordInternal();
169 state_ = password_manager::ui::MANAGE_STATE; 189 state_ = password_manager::ui::MANAGE_STATE;
170 UpdateBubbleAndIconVisibility(); 190 UpdateBubbleAndIconVisibility();
171 } 191 }
172 192
193 void ManagePasswordsUIController::ChooseCredential(
194 bool was_chosen,
195 const autofill::PasswordForm& form) {
196 DCHECK(password_manager::ui::IsCredentialsState(state_));
197 DCHECK(!credentials_callback_.is_null());
198 password_manager::CredentialInfo info = was_chosen ?
199 password_manager::CredentialInfo(form) :
200 password_manager::CredentialInfo();
201 credentials_callback_.Run(info);
202 state_ = password_manager::ui::INACTIVE_STATE;
203 UpdateBubbleAndIconVisibility();
204 }
205
173 void ManagePasswordsUIController::SavePasswordInternal() { 206 void ManagePasswordsUIController::SavePasswordInternal() {
174 DCHECK(form_manager_.get()); 207 DCHECK(form_manager_.get());
175 form_manager_->Save(); 208 form_manager_->Save();
176 } 209 }
177 210
178 void ManagePasswordsUIController::NeverSavePassword() { 211 void ManagePasswordsUIController::NeverSavePassword() {
179 DCHECK(PasswordPendingUserDecision()); 212 DCHECK(PasswordPendingUserDecision());
180 NeverSavePasswordInternal(); 213 NeverSavePasswordInternal();
181 state_ = password_manager::ui::BLACKLIST_STATE; 214 state_ = password_manager::ui::BLACKLIST_STATE;
182 UpdateBubbleAndIconVisibility(); 215 UpdateBubbleAndIconVisibility();
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 timer_.reset(new base::ElapsedTimer()); 257 timer_.reset(new base::ElapsedTimer());
225 } 258 }
226 259
227 void ManagePasswordsUIController::WasHidden() { 260 void ManagePasswordsUIController::WasHidden() {
228 #if !defined(OS_ANDROID) 261 #if !defined(OS_ANDROID)
229 chrome::CloseManagePasswordsBubble(web_contents()); 262 chrome::CloseManagePasswordsBubble(web_contents());
230 #endif 263 #endif
231 } 264 }
232 265
233 const autofill::PasswordForm& ManagePasswordsUIController:: 266 const autofill::PasswordForm& ManagePasswordsUIController::
234 PendingCredentials() const { 267 PendingPassword() const {
235 DCHECK(form_manager_); 268 DCHECK(form_manager_);
236 return form_manager_->pending_credentials(); 269 return form_manager_->pending_credentials();
237 } 270 }
238 271
239 void ManagePasswordsUIController::UpdateIconAndBubbleState( 272 void ManagePasswordsUIController::UpdateIconAndBubbleState(
240 ManagePasswordsIcon* icon) { 273 ManagePasswordsIcon* icon) {
241 if (password_manager::ui::IsAutomaticDisplayState(state_)) { 274 if (password_manager::ui::IsAutomaticDisplayState(state_)) {
242 // We must display the icon before showing the bubble, as the bubble would 275 // We must display the icon before showing the bubble, as the bubble would
243 // be otherwise unanchored. However, we can't change the controller's state 276 // be otherwise unanchored. However, we can't change the controller's state
244 // until _after_ the bubble is shown, as our metrics depend on the seeing 277 // until _after_ the bubble is shown, as our metrics depend on the seeing
245 // the original state to determine if the bubble opened automagically or via 278 // the original state to determine if the bubble opened automagically or via
246 // user action. 279 // user action.
247 password_manager::ui::State end_state = 280 password_manager::ui::State end_state =
248 GetEndStateForAutomaticState(state_); 281 GetEndStateForAutomaticState(state_);
249 icon->SetState(end_state); 282 icon->SetState(end_state);
250 ShowBubbleWithoutUserInteraction(); 283 ShowBubbleWithoutUserInteraction();
251 state_ = end_state; 284 state_ = end_state;
252 } else { 285 } else {
253 icon->SetState(state_); 286 icon->SetState(state_);
254 } 287 }
255 } 288 }
256 289
290 void ManagePasswordsUIController::OnBubbleShown() {
291 bubble_shown_ = true;
292 }
293
257 void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() { 294 void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() {
258 DCHECK(password_manager::ui::IsAutomaticDisplayState(state_)); 295 DCHECK(password_manager::ui::IsAutomaticDisplayState(state_));
259 #if !defined(OS_ANDROID) 296 #if !defined(OS_ANDROID)
260 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); 297 Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
261 if (!browser || browser->toolbar_model()->input_in_progress()) 298 if (!browser || browser->toolbar_model()->input_in_progress())
262 return; 299 return;
263 if (state_ == password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE && 300 if (state_ == password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE &&
264 !password_bubble_experiment::ShouldShowBubble( 301 !password_bubble_experiment::ShouldShowBubble(
265 browser->profile()->GetPrefs())) 302 browser->profile()->GetPrefs()))
266 return; 303 return;
267 CommandUpdater* updater = browser->command_controller()->command_updater(); 304 CommandUpdater* updater = browser->command_controller()->command_updater();
268 updater->ExecuteCommand(IDC_MANAGE_PASSWORDS_FOR_PAGE); 305 updater->ExecuteCommand(IDC_MANAGE_PASSWORDS_FOR_PAGE);
269 #endif 306 #endif
270 } 307 }
271 308
272 bool ManagePasswordsUIController::PasswordPendingUserDecision() const { 309 bool ManagePasswordsUIController::PasswordPendingUserDecision() const {
273 return state_ == password_manager::ui::PENDING_PASSWORD_STATE || 310 return password_manager::ui::IsPendingState(state_);
274 state_ == password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE;
275 } 311 }
276 312
277 void ManagePasswordsUIController::WebContentsDestroyed() { 313 void ManagePasswordsUIController::WebContentsDestroyed() {
278 password_manager::PasswordStore* password_store = 314 password_manager::PasswordStore* password_store =
279 GetPasswordStore(web_contents()); 315 GetPasswordStore(web_contents());
280 if (password_store) 316 if (password_store)
281 password_store->RemoveObserver(this); 317 password_store->RemoveObserver(this);
282 } 318 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698