| Index: chrome/browser/ui/login/login_prompt.cc
|
| diff --git a/chrome/browser/ui/login/login_prompt.cc b/chrome/browser/ui/login/login_prompt.cc
|
| index 8051d83138dad0e8f008a3f5163e32310c236cce..6ee6149a5426eee6081416010753ca53800e7154 100644
|
| --- a/chrome/browser/ui/login/login_prompt.cc
|
| +++ b/chrome/browser/ui/login/login_prompt.cc
|
| @@ -21,7 +21,6 @@
|
| #include "chrome/browser/ui/login/login_interstitial_delegate.h"
|
| #include "chrome/common/pref_names.h"
|
| #include "chrome/grit/generated_resources.h"
|
| -#include "components/password_manager/content/browser/content_password_manager_driver.h"
|
| #include "components/password_manager/core/browser/browser_save_password_progress_logger.h"
|
| #include "components/password_manager/core/browser/password_manager.h"
|
| #include "components/url_formatter/elide_url.h"
|
| @@ -90,6 +89,13 @@ std::string GetSignonRealm(const GURL& url,
|
| // ----------------------------------------------------------------------------
|
| // LoginHandler
|
|
|
| +LoginHandler::LoginModelData::LoginModelData(
|
| + password_manager::LoginModel* login_model,
|
| + const autofill::PasswordForm& observed_form)
|
| + : model(login_model), form(observed_form) {
|
| + DCHECK(model);
|
| +}
|
| +
|
| LoginHandler::LoginHandler(net::AuthChallengeInfo* auth_info,
|
| net::URLRequest* request)
|
| : handled_auth_(false),
|
| @@ -100,8 +106,8 @@ LoginHandler::LoginHandler(net::AuthChallengeInfo* auth_info,
|
| password_manager_(NULL),
|
| login_model_(NULL) {
|
| // This constructor is called on the I/O thread, so we cannot load the nib
|
| - // here. BuildViewForPasswordManager() will be invoked on the UI thread
|
| - // later, so wait with loading the nib until then.
|
| + // here. BuildView() will be invoked on the UI thread later, so wait with
|
| + // loading the nib until then.
|
| DCHECK(request_) << "LoginHandler constructed with NULL request";
|
| DCHECK(auth_info_.get()) << "LoginHandler constructed with NULL auth info";
|
|
|
| @@ -145,12 +151,10 @@ WebContents* LoginHandler::GetWebContentsForLogin() const {
|
| return WebContents::FromRenderFrameHost(rfh);
|
| }
|
|
|
| -password_manager::ContentPasswordManagerDriver*
|
| -LoginHandler::GetPasswordManagerDriverForLogin() {
|
| - content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(
|
| - render_process_host_id_, render_frame_id_);
|
| - return password_manager::ContentPasswordManagerDriver::GetForRenderFrameHost(
|
| - rfh);
|
| +password_manager::PasswordManager* LoginHandler::GetPasswordManagerForLogin() {
|
| + ChromePasswordManagerClient* client =
|
| + ChromePasswordManagerClient::FromWebContents(GetWebContentsForLogin());
|
| + return client ? client->GetPasswordManager() : nullptr;
|
| }
|
|
|
| void LoginHandler::SetAuth(const base::string16& username,
|
| @@ -274,15 +278,20 @@ bool LoginHandler::WasAuthHandled() const {
|
| }
|
|
|
| LoginHandler::~LoginHandler() {
|
| - SetModel(NULL);
|
| + ResetModel();
|
| }
|
|
|
| -void LoginHandler::SetModel(password_manager::LoginModel* model) {
|
| +void LoginHandler::SetModel(LoginModelData model_data) {
|
| if (login_model_)
|
| login_model_->RemoveObserver(this);
|
| - login_model_ = model;
|
| + login_model_ = model_data.model;
|
| + login_model_->AddObserverAndDeliverCredentials(this, model_data.form);
|
| +}
|
| +
|
| +void LoginHandler::ResetModel() {
|
| if (login_model_)
|
| - login_model_->AddObserver(this);
|
| + login_model_->RemoveObserver(this);
|
| + login_model_ = nullptr;
|
| }
|
|
|
| void LoginHandler::NotifyAuthNeeded() {
|
| @@ -429,13 +438,11 @@ void LoginHandler::CloseContentsDeferred() {
|
| interstitial_page->Proceed();
|
| }
|
|
|
| -// Helper to create a PasswordForm and stuff it into a vector as input
|
| -// for PasswordManager::PasswordFormsParsed, the hook into PasswordManager.
|
| -void MakeInputForPasswordManager(
|
| - const GURL& request_url,
|
| - net::AuthChallengeInfo* auth_info,
|
| - LoginHandler* handler,
|
| - std::vector<PasswordForm>* password_manager_input) {
|
| +// Helper to create a PasswordForm for PasswordManager to start looking for
|
| +// saved credentials.
|
| +PasswordForm MakeInputForPasswordManager(const GURL& request_url,
|
| + net::AuthChallengeInfo* auth_info,
|
| + LoginHandler* handler) {
|
| PasswordForm dialog_form;
|
| if (base::LowerCaseEqualsASCII(auth_info->scheme, "basic")) {
|
| dialog_form.scheme = PasswordForm::SCHEME_BASIC;
|
| @@ -459,9 +466,9 @@ void MakeInputForPasswordManager(
|
| dialog_form.origin = GURL(request_url.scheme() + "://" + host_and_port);
|
| }
|
| dialog_form.signon_realm = GetSignonRealm(dialog_form.origin, *auth_info);
|
| - password_manager_input->push_back(dialog_form);
|
| // Set the password form for the handler (by copy).
|
| handler->SetPasswordForm(dialog_form);
|
| + return dialog_form;
|
| }
|
|
|
| void ShowLoginPrompt(const GURL& request_url,
|
| @@ -478,9 +485,6 @@ void ShowLoginPrompt(const GURL& request_url,
|
| return;
|
| }
|
|
|
| - password_manager::ContentPasswordManagerDriver* driver =
|
| - handler->GetPasswordManagerDriverForLogin();
|
| -
|
| // The realm is controlled by the remote server, so there is no reason
|
| // to believe it is of a reasonable length.
|
| base::string16 elided_realm;
|
| @@ -504,12 +508,15 @@ void ShowLoginPrompt(const GURL& request_url,
|
| : l10n_util::GetStringFUTF16(IDS_LOGIN_DIALOG_DESCRIPTION, authority,
|
| elided_realm);
|
|
|
| - if (!driver) {
|
| + password_manager::PasswordManager* password_manager =
|
| + handler->GetPasswordManagerForLogin();
|
| +
|
| + if (!password_manager) {
|
| #if defined(ENABLE_EXTENSIONS)
|
| // A WebContents in a <webview> (a GuestView type) does not have a password
|
| // manager, but still needs to be able to show login prompts.
|
| if (guest_view::GuestViewBase::FromWebContents(parent_contents)) {
|
| - handler->BuildViewForPasswordManager(nullptr, explanation);
|
| + handler->BuildView(explanation, nullptr);
|
| return;
|
| }
|
| #endif
|
| @@ -517,8 +524,6 @@ void ShowLoginPrompt(const GURL& request_url,
|
| return;
|
| }
|
|
|
| - password_manager::PasswordManager* password_manager =
|
| - driver->GetPasswordManager();
|
| if (password_manager && password_manager->client()->IsLoggingActive()) {
|
| password_manager::BrowserSavePasswordProgressLogger logger(
|
| password_manager->client());
|
| @@ -526,14 +531,12 @@ void ShowLoginPrompt(const GURL& request_url,
|
| autofill::SavePasswordProgressLogger::STRING_SHOW_LOGIN_PROMPT_METHOD);
|
| }
|
|
|
| - // Tell the password manager to look for saved passwords.
|
| - std::vector<PasswordForm> v;
|
| - MakeInputForPasswordManager(request_url, auth_info, handler, &v);
|
| - driver->OnPasswordFormsParsedNoRenderCheck(v);
|
| - handler->SetPasswordManager(driver->GetPasswordManager());
|
| + handler->SetPasswordManager(password_manager);
|
|
|
| - handler->BuildViewForPasswordManager(driver->GetPasswordManager(),
|
| - explanation);
|
| + PasswordForm observed_form(
|
| + MakeInputForPasswordManager(request_url, auth_info, handler));
|
| + LoginHandler::LoginModelData model_data(password_manager, observed_form);
|
| + handler->BuildView(explanation, &model_data);
|
| }
|
|
|
| // This callback is run on the UI thread and creates a constrained window with
|
|
|