| Index: components/password_manager/core/browser/password_manager.cc
|
| diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc
|
| index 4008a3f0605cff2ab82e14bca89c6d8e7be99b5e..59cbf9603897a425650a11f73be7f0c0464a75f8 100644
|
| --- a/components/password_manager/core/browser/password_manager.cc
|
| +++ b/components/password_manager/core/browser/password_manager.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "components/password_manager/core/browser/password_manager.h"
|
|
|
| +#include <map>
|
| +
|
| #include "base/command_line.h"
|
| #include "base/metrics/field_trial.h"
|
| #include "base/metrics/histogram_macros.h"
|
| @@ -395,8 +397,16 @@ void PasswordManager::AddSubmissionCallback(
|
| submission_callbacks_.push_back(callback);
|
| }
|
|
|
| -void PasswordManager::AddObserver(LoginModelObserver* observer) {
|
| +void PasswordManager::AddObserverAndDeliverCredentials(
|
| + LoginModelObserver* observer,
|
| + const PasswordForm& observed_form) {
|
| observers_.AddObserver(observer);
|
| +
|
| + observer->set_signon_realm(observed_form.signon_realm);
|
| +
|
| + std::vector<PasswordForm> observed_forms;
|
| + observed_forms.push_back(observed_form);
|
| + OnPasswordFormsParsed(nullptr, observed_forms);
|
| }
|
|
|
| void PasswordManager::RemoveObserver(LoginModelObserver* observer) {
|
| @@ -470,7 +480,8 @@ void PasswordManager::CreatePendingLoginManagers(
|
| continue;
|
| }
|
| old_manager_found = true;
|
| - old_manager->ProcessFrame(driver->AsWeakPtr());
|
| + if (driver)
|
| + old_manager->ProcessFrame(driver->AsWeakPtr());
|
| break;
|
| }
|
| if (old_manager_found)
|
| @@ -492,7 +503,9 @@ void PasswordManager::CreatePendingLoginManagers(
|
| logger->LogFormSignatures(Logger::STRING_ADDING_SIGNATURE, *iter);
|
| bool ssl_valid = iter->origin.SchemeIsCryptographic();
|
| PasswordFormManager* manager = new PasswordFormManager(
|
| - this, client_, driver->AsWeakPtr(), *iter, ssl_valid);
|
| + this, client_,
|
| + (driver ? driver->AsWeakPtr() : base::WeakPtr<PasswordManagerDriver>()),
|
| + *iter, ssl_valid);
|
| pending_login_managers_.push_back(manager);
|
|
|
| PasswordStore::AuthorizationPromptPolicy prompt_policy =
|
| @@ -703,48 +716,51 @@ void PasswordManager::Autofill(password_manager::PasswordManagerDriver* driver,
|
| const PasswordFormMap& best_matches,
|
| const PasswordForm& preferred_match,
|
| bool wait_for_username) const {
|
| + DCHECK_EQ(PasswordForm::SCHEME_HTML, preferred_match.scheme);
|
| +
|
| scoped_ptr<BrowserSavePasswordProgressLogger> logger;
|
| if (client_->IsLoggingActive()) {
|
| logger.reset(new BrowserSavePasswordProgressLogger(client_));
|
| logger->LogMessage(Logger::STRING_PASSWORDMANAGER_AUTOFILL);
|
| }
|
| - switch (form_for_autofill.scheme) {
|
| - case PasswordForm::SCHEME_HTML: {
|
| - // Note the check above is required because the observers_ for a non-HTML
|
| - // schemed password form may have been freed, so we need to distinguish.
|
| - autofill::PasswordFormFillData fill_data;
|
| - InitPasswordFormFillData(form_for_autofill,
|
| - best_matches,
|
| - &preferred_match,
|
| - wait_for_username,
|
| - OtherPossibleUsernamesEnabled(),
|
| - &fill_data);
|
| - if (logger)
|
| - logger->LogBoolean(Logger::STRING_WAIT_FOR_USERNAME, wait_for_username);
|
| - UMA_HISTOGRAM_BOOLEAN(
|
| - "PasswordManager.FillSuggestionsIncludeAndroidAppCredentials",
|
| - ContainsAndroidCredentials(fill_data));
|
| - metrics_util::LogFilledCredentialIsFromAndroidApp(
|
| - PreferredRealmIsFromAndroid(fill_data));
|
| - driver->FillPasswordForm(fill_data);
|
| - break;
|
| - }
|
| - default:
|
| - if (logger) {
|
| - logger->LogBoolean(Logger::STRING_LOGINMODELOBSERVER_PRESENT,
|
| - observers_.might_have_observers());
|
| - }
|
| - FOR_EACH_OBSERVER(
|
| - LoginModelObserver,
|
| - observers_,
|
| - OnAutofillDataAvailable(preferred_match.username_value,
|
| - preferred_match.password_value));
|
| - break;
|
| - }
|
| +
|
| + autofill::PasswordFormFillData fill_data;
|
| + InitPasswordFormFillData(form_for_autofill, best_matches, &preferred_match,
|
| + wait_for_username, OtherPossibleUsernamesEnabled(),
|
| + &fill_data);
|
| + if (logger)
|
| + logger->LogBoolean(Logger::STRING_WAIT_FOR_USERNAME, wait_for_username);
|
| + UMA_HISTOGRAM_BOOLEAN(
|
| + "PasswordManager.FillSuggestionsIncludeAndroidAppCredentials",
|
| + ContainsAndroidCredentials(fill_data));
|
| + metrics_util::LogFilledCredentialIsFromAndroidApp(
|
| + PreferredRealmIsFromAndroid(fill_data));
|
| + driver->FillPasswordForm(fill_data);
|
|
|
| client_->PasswordWasAutofilled(best_matches, form_for_autofill.origin);
|
| }
|
|
|
| +void PasswordManager::AutofillHttpAuth(
|
| + const PasswordFormMap& best_matches,
|
| + const PasswordForm& preferred_match) const {
|
| + DCHECK_NE(PasswordForm::SCHEME_HTML, preferred_match.scheme);
|
| +
|
| + scoped_ptr<BrowserSavePasswordProgressLogger> logger;
|
| + if (client_->IsLoggingActive()) {
|
| + logger.reset(new BrowserSavePasswordProgressLogger(client_));
|
| + logger->LogMessage(Logger::STRING_PASSWORDMANAGER_AUTOFILLHTTPAUTH);
|
| + logger->LogBoolean(Logger::STRING_LOGINMODELOBSERVER_PRESENT,
|
| + observers_.might_have_observers());
|
| + }
|
| +
|
| + FOR_EACH_OBSERVER(LoginModelObserver, observers_,
|
| + OnAutofillDataAvailable(preferred_match));
|
| +
|
| + DCHECK(!best_matches.empty());
|
| + client_->PasswordWasAutofilled(best_matches,
|
| + best_matches.begin()->second->origin);
|
| +}
|
| +
|
| void PasswordManager::ProcessAutofillPredictions(
|
| password_manager::PasswordManagerDriver* driver,
|
| const std::vector<autofill::FormStructure*>& forms) {
|
|
|