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

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

Issue 399573002: [Password Generation] Trigger confirmation bubble when a password is saved (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comments Created 6 years, 5 months 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 | Annotate | Revision Log
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/chrome_notification_types.h" 9 #include "chrome/browser/chrome_notification_types.h"
10 #include "chrome/browser/password_manager/password_store_factory.h" 10 #include "chrome/browser/password_manager/password_store_factory.h"
(...skipping 12 matching lines...) Expand all
23 23
24 namespace { 24 namespace {
25 25
26 password_manager::PasswordStore* GetPasswordStore( 26 password_manager::PasswordStore* GetPasswordStore(
27 content::WebContents* web_contents) { 27 content::WebContents* web_contents) {
28 return PasswordStoreFactory::GetForProfile( 28 return PasswordStoreFactory::GetForProfile(
29 Profile::FromBrowserContext(web_contents->GetBrowserContext()), 29 Profile::FromBrowserContext(web_contents->GetBrowserContext()),
30 Profile::EXPLICIT_ACCESS).get(); 30 Profile::EXPLICIT_ACCESS).get();
31 } 31 }
32 32
33 autofill::ConstPasswordFormMap ConstifyMap(
34 const autofill::PasswordFormMap& map) {
35 autofill::ConstPasswordFormMap ret;
36 ret.insert(map.begin(), map.end());
37 return ret;
38 }
39
33 } // namespace 40 } // namespace
34 41
35 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ManagePasswordsUIController); 42 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ManagePasswordsUIController);
36 43
37 ManagePasswordsUIController::ManagePasswordsUIController( 44 ManagePasswordsUIController::ManagePasswordsUIController(
38 content::WebContents* web_contents) 45 content::WebContents* web_contents)
39 : content::WebContentsObserver(web_contents), 46 : content::WebContentsObserver(web_contents),
40 state_(password_manager::ui::INACTIVE_STATE) { 47 state_(password_manager::ui::INACTIVE_STATE) {
41 password_manager::PasswordStore* password_store = 48 password_manager::PasswordStore* password_store =
42 GetPasswordStore(web_contents); 49 GetPasswordStore(web_contents);
(...skipping 15 matching lines...) Expand all
58 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); 65 Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
59 if (!browser) 66 if (!browser)
60 return; 67 return;
61 LocationBar* location_bar = browser->window()->GetLocationBar(); 68 LocationBar* location_bar = browser->window()->GetLocationBar();
62 DCHECK(location_bar); 69 DCHECK(location_bar);
63 location_bar->UpdateManagePasswordsIconAndBubble(); 70 location_bar->UpdateManagePasswordsIconAndBubble();
64 #endif 71 #endif
65 } 72 }
66 73
67 void ManagePasswordsUIController::OnPasswordSubmitted( 74 void ManagePasswordsUIController::OnPasswordSubmitted(
68 PasswordFormManager* form_manager) { 75 scoped_ptr<PasswordFormManager> form_manager) {
69 form_manager_.reset(form_manager); 76 form_manager_ = form_manager.Pass();
70 password_form_map_ = form_manager_->best_matches(); 77 password_form_map_ = ConstifyMap(form_manager_->best_matches());
71 origin_ = PendingCredentials().origin; 78 origin_ = PendingCredentials().origin;
72 state_ = password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE; 79 state_ = password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE;
73 UpdateBubbleAndIconVisibility(); 80 UpdateBubbleAndIconVisibility();
74 } 81 }
75 82
83 void ManagePasswordsUIController::OnAutomaticPasswordSave(
84 scoped_ptr<PasswordFormManager> form_manager) {
85 form_manager_ = form_manager.Pass();
86 password_form_map_ = ConstifyMap(form_manager_->best_matches());
87 password_form_map_[form_manager_->associated_username()] =
88 &form_manager_->pending_credentials();
89 origin_ = form_manager_->pending_credentials().origin;
90 state_ = password_manager::ui::CONFIRMATION_STATE;
91 UpdateBubbleAndIconVisibility();
92 }
93
76 void ManagePasswordsUIController::OnPasswordAutofilled( 94 void ManagePasswordsUIController::OnPasswordAutofilled(
77 const PasswordFormMap& password_form_map) { 95 const PasswordFormMap& password_form_map) {
78 password_form_map_ = password_form_map; 96 password_form_map_ = ConstifyMap(password_form_map);
79 origin_ = password_form_map_.begin()->second->origin; 97 origin_ = password_form_map_.begin()->second->origin;
80 state_ = password_manager::ui::MANAGE_STATE; 98 state_ = password_manager::ui::MANAGE_STATE;
81 UpdateBubbleAndIconVisibility(); 99 UpdateBubbleAndIconVisibility();
82 } 100 }
83 101
84 void ManagePasswordsUIController::OnBlacklistBlockedAutofill( 102 void ManagePasswordsUIController::OnBlacklistBlockedAutofill(
85 const PasswordFormMap& password_form_map) { 103 const PasswordFormMap& password_form_map) {
86 password_form_map_ = password_form_map; 104 password_form_map_ = ConstifyMap(password_form_map);
87 origin_ = password_form_map_.begin()->second->origin; 105 origin_ = password_form_map_.begin()->second->origin;
88 state_ = password_manager::ui::BLACKLIST_STATE; 106 state_ = password_manager::ui::BLACKLIST_STATE;
89 UpdateBubbleAndIconVisibility(); 107 UpdateBubbleAndIconVisibility();
90 } 108 }
91 109
92 void ManagePasswordsUIController::WebContentsDestroyed() { 110 void ManagePasswordsUIController::WebContentsDestroyed() {
93 password_manager::PasswordStore* password_store = 111 password_manager::PasswordStore* password_store =
94 GetPasswordStore(web_contents()); 112 GetPasswordStore(web_contents());
95 if (password_store) 113 if (password_store)
96 password_store->RemoveObserver(this); 114 password_store->RemoveObserver(this);
(...skipping 30 matching lines...) Expand all
127 NavigateToPasswordManagerSettingsPage() { 145 NavigateToPasswordManagerSettingsPage() {
128 // TODO(mkwst): chrome_pages.h is compiled out of Android. Need to figure out 146 // TODO(mkwst): chrome_pages.h is compiled out of Android. Need to figure out
129 // how this navigation should work there. 147 // how this navigation should work there.
130 #if !defined(OS_ANDROID) 148 #if !defined(OS_ANDROID)
131 chrome::ShowSettingsSubPage( 149 chrome::ShowSettingsSubPage(
132 chrome::FindBrowserWithWebContents(web_contents()), 150 chrome::FindBrowserWithWebContents(web_contents()),
133 chrome::kPasswordManagerSubPage); 151 chrome::kPasswordManagerSubPage);
134 #endif 152 #endif
135 } 153 }
136 154
155 void ManagePasswordsUIController::NavigateToAccountCentralManagementPage() {
156 // TODO(gcasto): Change this to navigate to account central once passwords
Mike West 2014/07/17 13:43:17 I'd either change the name of this method to "Navg
Garrett Casto 2014/07/17 20:54:55 Moved. I should probably change this name of the p
157 // are visible there.
158 Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
159 content::OpenURLParams params(
160 GURL(chrome::kAutoPasswordGenerationLearnMoreURL), content::Referrer(),
161 NEW_FOREGROUND_TAB, content::PAGE_TRANSITION_LINK, false);
162 browser->OpenURL(params);
163 }
164
137 void ManagePasswordsUIController::SavePassword() { 165 void ManagePasswordsUIController::SavePassword() {
138 DCHECK(PasswordPendingUserDecision()); 166 DCHECK(PasswordPendingUserDecision());
139 SavePasswordInternal(); 167 SavePasswordInternal();
140 state_ = password_manager::ui::MANAGE_STATE; 168 state_ = password_manager::ui::MANAGE_STATE;
141 UpdateBubbleAndIconVisibility(); 169 UpdateBubbleAndIconVisibility();
142 } 170 }
143 171
144 void ManagePasswordsUIController::SavePasswordInternal() { 172 void ManagePasswordsUIController::SavePasswordInternal() {
145 DCHECK(form_manager_.get()); 173 DCHECK(form_manager_.get());
146 form_manager_->Save(); 174 form_manager_->Save();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 } 224 }
197 225
198 const autofill::PasswordForm& ManagePasswordsUIController:: 226 const autofill::PasswordForm& ManagePasswordsUIController::
199 PendingCredentials() const { 227 PendingCredentials() const {
200 DCHECK(form_manager_); 228 DCHECK(form_manager_);
201 return form_manager_->pending_credentials(); 229 return form_manager_->pending_credentials();
202 } 230 }
203 231
204 void ManagePasswordsUIController::UpdateIconAndBubbleState( 232 void ManagePasswordsUIController::UpdateIconAndBubbleState(
205 ManagePasswordsIcon* icon) { 233 ManagePasswordsIcon* icon) {
206 if (state_ == password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE) { 234 if (password_manager::ui::IsAutomaticDisplayState(state_)) {
207 // We must display the icon before showing the bubble, as the bubble would 235 // We must display the icon before showing the bubble, as the bubble would
208 // be otherwise unanchored. However, we can't change the controller's state 236 // be otherwise unanchored. However, we can't change the controller's state
209 // until _after_ the bubble is shown, as our metrics depend on the 237 // until _after_ the bubble is shown, as our metrics depend on the seeing
210 // distinction between PENDING_PASSWORD_AND_BUBBLE_STATE and 238 // the original state to determine if the bubble opened automagically or via
211 // PENDING_PASSWORD_STATE to determine if the bubble opened automagically 239 // user action.
212 // or via user action. 240 password_manager::ui::State end_state =
213 icon->SetState(password_manager::ui::PENDING_PASSWORD_STATE); 241 GetEndStateForAutomaticState(state_);
242 icon->SetState(end_state);
214 ShowBubbleWithoutUserInteraction(); 243 ShowBubbleWithoutUserInteraction();
215 state_ = password_manager::ui::PENDING_PASSWORD_STATE; 244 state_ = end_state;
216 } else { 245 } else {
217 icon->SetState(state_); 246 icon->SetState(state_);
218 } 247 }
219 } 248 }
220 249
221 void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() { 250 void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() {
222 DCHECK_EQ(state_, password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE); 251 DCHECK(password_manager::ui::IsAutomaticDisplayState(state_));
223 #if !defined(OS_ANDROID) 252 #if !defined(OS_ANDROID)
224 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); 253 Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
225 if (!browser || browser->toolbar_model()->input_in_progress()) 254 if (!browser || browser->toolbar_model()->input_in_progress())
226 return; 255 return;
227 CommandUpdater* updater = browser->command_controller()->command_updater(); 256 CommandUpdater* updater = browser->command_controller()->command_updater();
228 updater->ExecuteCommand(IDC_MANAGE_PASSWORDS_FOR_PAGE); 257 updater->ExecuteCommand(IDC_MANAGE_PASSWORDS_FOR_PAGE);
229 #endif 258 #endif
230 } 259 }
231 260
232 bool ManagePasswordsUIController::PasswordPendingUserDecision() const { 261 bool ManagePasswordsUIController::PasswordPendingUserDecision() const {
233 return state_ == password_manager::ui::PENDING_PASSWORD_STATE || 262 return state_ == password_manager::ui::PENDING_PASSWORD_STATE ||
234 state_ == password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE; 263 state_ == password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE;
235 } 264 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698