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

Side by Side Diff: chrome/browser/password_manager/chrome_password_manager_client.cc

Issue 1415533013: Fix password manager internals renderer reporting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix failing test Created 5 years, 1 month 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/password_manager/chrome_password_manager_client.h" 5 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 15 matching lines...) Expand all
26 #include "components/autofill/content/browser/content_autofill_driver.h" 26 #include "components/autofill/content/browser/content_autofill_driver.h"
27 #include "components/autofill/content/browser/content_autofill_driver_factory.h" 27 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
28 #include "components/autofill/content/common/autofill_messages.h" 28 #include "components/autofill/content/common/autofill_messages.h"
29 #include "components/autofill/core/browser/password_generator.h" 29 #include "components/autofill/core/browser/password_generator.h"
30 #include "components/autofill/core/common/password_form.h" 30 #include "components/autofill/core/common/password_form.h"
31 #include "components/browser_sync/browser/profile_sync_service.h" 31 #include "components/browser_sync/browser/profile_sync_service.h"
32 #include "components/password_manager/content/browser/content_password_manager_d river.h" 32 #include "components/password_manager/content/browser/content_password_manager_d river.h"
33 #include "components/password_manager/content/browser/password_manager_internals _service_factory.h" 33 #include "components/password_manager/content/browser/password_manager_internals _service_factory.h"
34 #include "components/password_manager/content/common/credential_manager_messages .h" 34 #include "components/password_manager/content/common/credential_manager_messages .h"
35 #include "components/password_manager/core/browser/browser_save_password_progres s_logger.h" 35 #include "components/password_manager/core/browser/browser_save_password_progres s_logger.h"
36 #include "components/password_manager/core/browser/log_manager.h"
36 #include "components/password_manager/core/browser/log_receiver.h" 37 #include "components/password_manager/core/browser/log_receiver.h"
37 #include "components/password_manager/core/browser/password_form_manager.h" 38 #include "components/password_manager/core/browser/password_form_manager.h"
38 #include "components/password_manager/core/browser/password_manager_internals_se rvice.h" 39 #include "components/password_manager/core/browser/password_manager_internals_se rvice.h"
39 #include "components/password_manager/core/browser/password_manager_metrics_util .h" 40 #include "components/password_manager/core/browser/password_manager_metrics_util .h"
40 #include "components/password_manager/core/browser/password_manager_settings_mig ration_experiment.h" 41 #include "components/password_manager/core/browser/password_manager_settings_mig ration_experiment.h"
41 #include "components/password_manager/core/browser/password_manager_util.h" 42 #include "components/password_manager/core/browser/password_manager_util.h"
42 #include "components/password_manager/core/common/credential_manager_types.h" 43 #include "components/password_manager/core/common/credential_manager_types.h"
43 #include "components/password_manager/core/common/password_manager_pref_names.h" 44 #include "components/password_manager/core/common/password_manager_pref_names.h"
44 #include "components/password_manager/core/common/password_manager_switches.h" 45 #include "components/password_manager/core/common/password_manager_switches.h"
45 #include "components/password_manager/sync/browser/password_sync_util.h" 46 #include "components/password_manager/sync/browser/password_sync_util.h"
(...skipping 11 matching lines...) Expand all
57 #endif 58 #endif
58 59
59 #if defined(OS_ANDROID) 60 #if defined(OS_ANDROID)
60 #include "chrome/browser/android/tab_android.h" 61 #include "chrome/browser/android/tab_android.h"
61 #include "chrome/browser/password_manager/generated_password_saved_infobar_deleg ate_android.h" 62 #include "chrome/browser/password_manager/generated_password_saved_infobar_deleg ate_android.h"
62 #include "chrome/browser/ui/android/snackbars/auto_signin_prompt_controller.h" 63 #include "chrome/browser/ui/android/snackbars/auto_signin_prompt_controller.h"
63 #endif 64 #endif
64 65
65 using password_manager::ContentPasswordManagerDriverFactory; 66 using password_manager::ContentPasswordManagerDriverFactory;
66 using password_manager::PasswordManagerInternalsService; 67 using password_manager::PasswordManagerInternalsService;
67 using password_manager::PasswordManagerInternalsServiceFactory;
68 68
69 // Shorten the name to spare line breaks. The code provides enough context 69 // Shorten the name to spare line breaks. The code provides enough context
70 // already. 70 // already.
71 typedef autofill::SavePasswordProgressLogger Logger; 71 typedef autofill::SavePasswordProgressLogger Logger;
72 72
73 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ChromePasswordManagerClient); 73 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ChromePasswordManagerClient);
74 74
75 namespace { 75 namespace {
76 76
77 const sync_driver::SyncService* GetSyncService(Profile* profile) { 77 const sync_driver::SyncService* GetSyncService(Profile* profile) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 129
130 ChromePasswordManagerClient::ChromePasswordManagerClient( 130 ChromePasswordManagerClient::ChromePasswordManagerClient(
131 content::WebContents* web_contents, 131 content::WebContents* web_contents,
132 autofill::AutofillClient* autofill_client) 132 autofill::AutofillClient* autofill_client)
133 : content::WebContentsObserver(web_contents), 133 : content::WebContentsObserver(web_contents),
134 profile_(Profile::FromBrowserContext(web_contents->GetBrowserContext())), 134 profile_(Profile::FromBrowserContext(web_contents->GetBrowserContext())),
135 password_manager_(this), 135 password_manager_(this),
136 driver_factory_(nullptr), 136 driver_factory_(nullptr),
137 credential_manager_dispatcher_(web_contents, this), 137 credential_manager_dispatcher_(web_contents, this),
138 observer_(nullptr), 138 observer_(nullptr),
139 can_use_log_router_(false),
140 credentials_filter_(this, 139 credentials_filter_(this,
141 base::Bind(&GetSyncService, profile_), 140 base::Bind(&GetSyncService, profile_),
142 base::Bind(&GetSigninManager, profile_)) { 141 base::Bind(&GetSigninManager, profile_)) {
143 ContentPasswordManagerDriverFactory::CreateForWebContents(web_contents, this, 142 ContentPasswordManagerDriverFactory::CreateForWebContents(web_contents, this,
144 autofill_client); 143 autofill_client);
145 driver_factory_ = 144 driver_factory_ =
146 ContentPasswordManagerDriverFactory::FromWebContents(web_contents); 145 ContentPasswordManagerDriverFactory::FromWebContents(web_contents);
146 log_manager_ = password_manager::LogManager::Create(
147 password_manager::PasswordManagerInternalsServiceFactory::
148 GetForBrowserContext(profile_),
149 base::Bind(
150 &ContentPasswordManagerDriverFactory::RequestSendLoggingAvailability,
151 base::Unretained(driver_factory_)));
147 152
148 PasswordManagerInternalsService* service =
149 PasswordManagerInternalsServiceFactory::GetForBrowserContext(profile_);
150 if (service)
151 can_use_log_router_ = service->RegisterClient(this);
152 saving_and_filling_passwords_enabled_.Init( 153 saving_and_filling_passwords_enabled_.Init(
153 password_manager::prefs::kPasswordManagerSavingEnabled, GetPrefs()); 154 password_manager::prefs::kPasswordManagerSavingEnabled, GetPrefs());
154 ReportMetrics(*saving_and_filling_passwords_enabled_, this, profile_); 155 ReportMetrics(*saving_and_filling_passwords_enabled_, this, profile_);
156 driver_factory_->RequestSendLoggingAvailability();
155 } 157 }
156 158
157 ChromePasswordManagerClient::~ChromePasswordManagerClient() { 159 ChromePasswordManagerClient::~ChromePasswordManagerClient() {}
158 PasswordManagerInternalsService* service =
159 PasswordManagerInternalsServiceFactory::GetForBrowserContext(profile_);
160 if (service)
161 service->UnregisterClient(this);
162 }
163 160
164 bool ChromePasswordManagerClient::IsAutomaticPasswordSavingEnabled() const { 161 bool ChromePasswordManagerClient::IsAutomaticPasswordSavingEnabled() const {
165 return base::CommandLine::ForCurrentProcess()->HasSwitch( 162 return base::CommandLine::ForCurrentProcess()->HasSwitch(
166 password_manager::switches::kEnableAutomaticPasswordSaving) && 163 password_manager::switches::kEnableAutomaticPasswordSaving) &&
167 chrome::GetChannel() == version_info::Channel::UNKNOWN; 164 chrome::GetChannel() == version_info::Channel::UNKNOWN;
168 } 165 }
169 166
170 bool ChromePasswordManagerClient::IsPasswordManagementEnabledForCurrentPage() 167 bool ChromePasswordManagerClient::IsPasswordManagementEnabledForCurrentPage()
171 const { 168 const {
172 DCHECK(web_contents()); 169 DCHECK(web_contents());
173 content::NavigationEntry* entry = 170 content::NavigationEntry* entry =
174 web_contents()->GetController().GetLastCommittedEntry(); 171 web_contents()->GetController().GetLastCommittedEntry();
175 bool is_enabled = false; 172 bool is_enabled = false;
176 if (!entry) { 173 if (!entry) {
177 // TODO(gcasto): Determine if fix for crbug.com/388246 is relevant here. 174 // TODO(gcasto): Determine if fix for crbug.com/388246 is relevant here.
178 is_enabled = true; 175 is_enabled = true;
179 } else if (EnabledForSyncSignin()) { 176 } else if (EnabledForSyncSignin()) {
180 is_enabled = true; 177 is_enabled = true;
181 } else { 178 } else {
182 // Do not fill nor save password when a user is signing in for sync. This 179 // Do not fill nor save password when a user is signing in for sync. This
183 // is because users need to remember their password if they are syncing as 180 // is because users need to remember their password if they are syncing as
184 // this is effectively their master password. 181 // this is effectively their master password.
185 is_enabled = entry->GetURL().host() != chrome::kChromeUIChromeSigninHost; 182 is_enabled = entry->GetURL().host() != chrome::kChromeUIChromeSigninHost;
186 } 183 }
187 if (IsLoggingActive()) { 184 if (log_manager_->IsLoggingActive()) {
188 password_manager::BrowserSavePasswordProgressLogger logger(this); 185 password_manager::BrowserSavePasswordProgressLogger logger(
186 log_manager_.get());
189 logger.LogBoolean( 187 logger.LogBoolean(
190 Logger::STRING_PASSWORD_MANAGEMENT_ENABLED_FOR_CURRENT_PAGE, 188 Logger::STRING_PASSWORD_MANAGEMENT_ENABLED_FOR_CURRENT_PAGE,
191 is_enabled); 189 is_enabled);
192 } 190 }
193 return is_enabled; 191 return is_enabled;
194 } 192 }
195 193
196 bool ChromePasswordManagerClient::IsSavingAndFillingEnabledForCurrentPage() 194 bool ChromePasswordManagerClient::IsSavingAndFillingEnabledForCurrentPage()
197 const { 195 const {
198 // TODO(melandory): remove saving_and_filling_passwords_enabled_ check from 196 // TODO(melandory): remove saving_and_filling_passwords_enabled_ check from
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 profile_, ServiceAccessType::EXPLICIT_ACCESS).get(); 313 profile_, ServiceAccessType::EXPLICIT_ACCESS).get();
316 } 314 }
317 315
318 password_manager::PasswordSyncState 316 password_manager::PasswordSyncState
319 ChromePasswordManagerClient::GetPasswordSyncState() const { 317 ChromePasswordManagerClient::GetPasswordSyncState() const {
320 const ProfileSyncService* sync_service = 318 const ProfileSyncService* sync_service =
321 ProfileSyncServiceFactory::GetForProfile(profile_); 319 ProfileSyncServiceFactory::GetForProfile(profile_);
322 return password_manager_util::GetPasswordSyncState(sync_service); 320 return password_manager_util::GetPasswordSyncState(sync_service);
323 } 321 }
324 322
325 void ChromePasswordManagerClient::OnLogRouterAvailabilityChanged(
326 bool router_can_be_used) {
327 if (can_use_log_router_ == router_can_be_used)
328 return;
329 can_use_log_router_ = router_can_be_used;
330
331 NotifyRendererOfLoggingAvailability();
332 }
333
334 void ChromePasswordManagerClient::LogSavePasswordProgress(
335 const std::string& text) const {
336 if (!IsLoggingActive())
337 return;
338 PasswordManagerInternalsService* service =
339 PasswordManagerInternalsServiceFactory::GetForBrowserContext(profile_);
340 if (service)
341 service->ProcessLog(text);
342 }
343
344 bool ChromePasswordManagerClient::IsLoggingActive() const {
345 // WebUI tabs do not need to log password saving progress. In particular, the
346 // internals page itself should not send any logs.
347 return can_use_log_router_ && !web_contents()->GetWebUI();
348 }
349
350 bool ChromePasswordManagerClient::WasLastNavigationHTTPError() const { 323 bool ChromePasswordManagerClient::WasLastNavigationHTTPError() const {
351 DCHECK(web_contents()); 324 DCHECK(web_contents());
352 325
353 scoped_ptr<password_manager::BrowserSavePasswordProgressLogger> logger; 326 scoped_ptr<password_manager::BrowserSavePasswordProgressLogger> logger;
354 if (IsLoggingActive()) { 327 if (log_manager_->IsLoggingActive()) {
355 logger.reset(new password_manager::BrowserSavePasswordProgressLogger(this)); 328 logger.reset(new password_manager::BrowserSavePasswordProgressLogger(
329 log_manager_.get()));
356 logger->LogMessage( 330 logger->LogMessage(
357 Logger::STRING_WAS_LAST_NAVIGATION_HTTP_ERROR_METHOD); 331 Logger::STRING_WAS_LAST_NAVIGATION_HTTP_ERROR_METHOD);
358 } 332 }
359 333
360 content::NavigationEntry* entry = 334 content::NavigationEntry* entry =
361 web_contents()->GetController().GetVisibleEntry(); 335 web_contents()->GetController().GetVisibleEntry();
362 if (!entry) 336 if (!entry)
363 return false; 337 return false;
364 int http_status_code = entry->GetHttpStatusCode(); 338 int http_status_code = entry->GetHttpStatusCode();
365 339
366 if (logger) 340 if (logger)
367 logger->LogNumber(Logger::STRING_HTTP_STATUS_CODE, http_status_code); 341 logger->LogNumber(Logger::STRING_HTTP_STATUS_CODE, http_status_code);
368 342
369 if (http_status_code >= 400 && http_status_code < 600) 343 if (http_status_code >= 400 && http_status_code < 600)
370 return true; 344 return true;
371 return false; 345 return false;
372 } 346 }
373 347
374 bool ChromePasswordManagerClient::DidLastPageLoadEncounterSSLErrors() const { 348 bool ChromePasswordManagerClient::DidLastPageLoadEncounterSSLErrors() const {
375 content::NavigationEntry* entry = 349 content::NavigationEntry* entry =
376 web_contents()->GetController().GetLastCommittedEntry(); 350 web_contents()->GetController().GetLastCommittedEntry();
377 bool ssl_errors = true; 351 bool ssl_errors = true;
378 if (!entry) { 352 if (!entry) {
379 ssl_errors = false; 353 ssl_errors = false;
380 } else { 354 } else {
381 ssl_errors = net::IsCertStatusError(entry->GetSSL().cert_status); 355 ssl_errors = net::IsCertStatusError(entry->GetSSL().cert_status);
382 } 356 }
383 if (IsLoggingActive()) { 357 if (log_manager_->IsLoggingActive()) {
384 password_manager::BrowserSavePasswordProgressLogger logger(this); 358 password_manager::BrowserSavePasswordProgressLogger logger(
359 log_manager_.get());
385 logger.LogBoolean(Logger::STRING_SSL_ERRORS_PRESENT, ssl_errors); 360 logger.LogBoolean(Logger::STRING_SSL_ERRORS_PRESENT, ssl_errors);
386 } 361 }
387 return ssl_errors; 362 return ssl_errors;
388 } 363 }
389 364
390 bool ChromePasswordManagerClient::IsOffTheRecord() const { 365 bool ChromePasswordManagerClient::IsOffTheRecord() const {
391 return web_contents()->GetBrowserContext()->IsOffTheRecord(); 366 return web_contents()->GetBrowserContext()->IsOffTheRecord();
392 } 367 }
393 368
394 const password_manager::PasswordManager* 369 const password_manager::PasswordManager*
(...skipping 27 matching lines...) Expand all
422 ShowPasswordGenerationPopup) 397 ShowPasswordGenerationPopup)
423 IPC_MESSAGE_HANDLER(AutofillHostMsg_ShowPasswordEditingPopup, 398 IPC_MESSAGE_HANDLER(AutofillHostMsg_ShowPasswordEditingPopup,
424 ShowPasswordEditingPopup) 399 ShowPasswordEditingPopup)
425 IPC_END_MESSAGE_MAP() 400 IPC_END_MESSAGE_MAP()
426 401
427 IPC_BEGIN_MESSAGE_MAP(ChromePasswordManagerClient, message) 402 IPC_BEGIN_MESSAGE_MAP(ChromePasswordManagerClient, message)
428 IPC_MESSAGE_HANDLER(AutofillHostMsg_HidePasswordGenerationPopup, 403 IPC_MESSAGE_HANDLER(AutofillHostMsg_HidePasswordGenerationPopup,
429 HidePasswordGenerationPopup) 404 HidePasswordGenerationPopup)
430 IPC_MESSAGE_HANDLER(AutofillHostMsg_GenerationAvailableForForm, 405 IPC_MESSAGE_HANDLER(AutofillHostMsg_GenerationAvailableForForm,
431 GenerationAvailableForForm) 406 GenerationAvailableForForm)
432 IPC_MESSAGE_HANDLER(AutofillHostMsg_PasswordAutofillAgentConstructed,
433 NotifyRendererOfLoggingAvailability)
434 // Default: 407 // Default:
435 IPC_MESSAGE_UNHANDLED(handled = false) 408 IPC_MESSAGE_UNHANDLED(handled = false)
436 IPC_END_MESSAGE_MAP() 409 IPC_END_MESSAGE_MAP()
437 410
438 return handled; 411 return handled;
439 } 412 }
440 413
414 void ChromePasswordManagerClient::DidStartNavigation(
415 content::NavigationHandle* navigation_handle) {
416 // Logging has no sense on WebUI sites.
417 log_manager_->SetSuspended(web_contents()->GetWebUI() != nullptr);
vasilii 2015/11/16 14:12:25 Why is this a special case? Do people often share
vabr (Chromium) 2015/11/16 16:08:48 Well, because this protection has been there since
418 }
419
441 gfx::RectF ChromePasswordManagerClient::GetBoundsInScreenSpace( 420 gfx::RectF ChromePasswordManagerClient::GetBoundsInScreenSpace(
442 const gfx::RectF& bounds) { 421 const gfx::RectF& bounds) {
443 gfx::Rect client_area = web_contents()->GetContainerBounds(); 422 gfx::Rect client_area = web_contents()->GetContainerBounds();
444 return bounds + client_area.OffsetFromOrigin(); 423 return bounds + client_area.OffsetFromOrigin();
445 } 424 }
446 425
447 void ChromePasswordManagerClient::ShowPasswordGenerationPopup( 426 void ChromePasswordManagerClient::ShowPasswordGenerationPopup(
448 content::RenderFrameHost* render_frame_host, 427 content::RenderFrameHost* render_frame_host,
449 const gfx::RectF& bounds, 428 const gfx::RectF& bounds,
450 int max_length, 429 int max_length,
(...skipping 24 matching lines...) Expand all
475 driver_factory_->GetDriverForFrame(render_frame_host), observer_, 454 driver_factory_->GetDriverForFrame(render_frame_host), observer_,
476 web_contents(), web_contents()->GetNativeView()); 455 web_contents(), web_contents()->GetNativeView());
477 popup_controller_->Show(false /* display_password */); 456 popup_controller_->Show(false /* display_password */);
478 } 457 }
479 458
480 void ChromePasswordManagerClient::GenerationAvailableForForm( 459 void ChromePasswordManagerClient::GenerationAvailableForForm(
481 const autofill::PasswordForm& form) { 460 const autofill::PasswordForm& form) {
482 password_manager_.GenerationAvailableForForm(form); 461 password_manager_.GenerationAvailableForForm(form);
483 } 462 }
484 463
485 void ChromePasswordManagerClient::NotifyRendererOfLoggingAvailability() {
486 if (!web_contents())
487 return;
488
489 web_contents()->GetRenderViewHost()->Send(new AutofillMsg_SetLoggingState(
490 web_contents()->GetRenderViewHost()->GetRoutingID(),
491 can_use_log_router_));
492 }
493
494 bool ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled() { 464 bool ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled() {
495 #if defined(OS_ANDROID) 465 #if defined(OS_ANDROID)
496 return false; 466 return false;
497 #elif defined(OS_MACOSX) 467 #elif defined(OS_MACOSX)
498 // Query the group first for correct UMA reporting. 468 // Query the group first for correct UMA reporting.
499 std::string group_name = 469 std::string group_name =
500 base::FieldTrialList::FindFullName("PasswordManagerUI"); 470 base::FieldTrialList::FindFullName("PasswordManagerUI");
501 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); 471 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
502 if (command_line->HasSwitch(switches::kDisableSavePasswordBubble)) 472 if (command_line->HasSwitch(switches::kDisableSavePasswordBubble))
503 return false; 473 return false;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 if (!entry) 518 if (!entry)
549 return GURL::EmptyGURL(); 519 return GURL::EmptyGURL();
550 520
551 return entry->GetURL(); 521 return entry->GetURL();
552 } 522 }
553 523
554 const password_manager::CredentialsFilter* 524 const password_manager::CredentialsFilter*
555 ChromePasswordManagerClient::GetStoreResultFilter() const { 525 ChromePasswordManagerClient::GetStoreResultFilter() const {
556 return &credentials_filter_; 526 return &credentials_filter_;
557 } 527 }
528
529 const password_manager::LogManager* ChromePasswordManagerClient::GetLogManager()
530 const {
531 return log_manager_.get();
532 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698