// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/password_manager_delegate_impl.h" #include "app/l10n_util.h" #include "app/resource_bundle.h" #include "base/metrics/histogram.h" #include "base/singleton.h" #include "chrome/browser/password_manager/password_form_manager.h" #include "chrome/browser/password_manager/password_manager.h" #include "chrome/browser/renderer_host/render_view_host.h" #include "chrome/browser/tab_contents/infobar_delegate.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" #include "webkit/glue/password_form.h" // After a successful *new* login attempt, we take the PasswordFormManager in // provisional_save_manager_ and move it to a SavePasswordInfoBarDelegate while // the user makes up their mind with the "save password" infobar. Note if the // login is one we already know about, the end of the line is // provisional_save_manager_ because we just update it on success and so such // forms never end up in an infobar. class SavePasswordInfoBarDelegate : public ConfirmInfoBarDelegate { public: SavePasswordInfoBarDelegate(TabContents* tab_contents, PasswordFormManager* form_to_save) : ConfirmInfoBarDelegate(tab_contents), form_to_save_(form_to_save), infobar_response_(NO_RESPONSE) {} virtual ~SavePasswordInfoBarDelegate() {} // Begin ConfirmInfoBarDelegate implementation. virtual void InfoBarClosed() { UMA_HISTOGRAM_ENUMERATION("PasswordManager.InfoBarResponse", infobar_response_, NUM_RESPONSE_TYPES); delete this; } virtual Type GetInfoBarType() { return PAGE_ACTION_TYPE; } virtual string16 GetMessageText() const { return l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SAVE_PASSWORD_PROMPT); } virtual SkBitmap* GetIcon() const { return ResourceBundle::GetSharedInstance().GetBitmapNamed( IDR_INFOBAR_SAVE_PASSWORD); } virtual int GetButtons() const { return BUTTON_OK | BUTTON_CANCEL; } virtual string16 GetButtonLabel(InfoBarButton button) const { if (button == BUTTON_OK) return l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SAVE_BUTTON); if (button == BUTTON_CANCEL) return l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_BLACKLIST_BUTTON); NOTREACHED(); return string16(); } virtual bool Accept() { DCHECK(form_to_save_.get()); form_to_save_->Save(); infobar_response_ = REMEMBER_PASSWORD; return true; } virtual bool Cancel() { DCHECK(form_to_save_.get()); form_to_save_->PermanentlyBlacklist(); infobar_response_ = DONT_REMEMBER_PASSWORD; return true; } // End ConfirmInfoBarDelegate implementation. private: // The PasswordFormManager managing the form we're asking the user about, // and should update as per her decision. scoped_ptr form_to_save_; // Used to track the results we get from the info bar. enum ResponseType { NO_RESPONSE = 0, REMEMBER_PASSWORD, DONT_REMEMBER_PASSWORD, NUM_RESPONSE_TYPES, }; ResponseType infobar_response_; DISALLOW_COPY_AND_ASSIGN(SavePasswordInfoBarDelegate); }; //---------------------------------------------------------------------------- void PasswordManagerDelegateImpl::FillPasswordForm( const webkit_glue::PasswordFormFillData& form_data) { tab_contents_->render_view_host()->FillPasswordForm(form_data); } void PasswordManagerDelegateImpl::AddSavePasswordInfoBar( PasswordFormManager* form_to_save) { tab_contents_->AddInfoBar( new SavePasswordInfoBarDelegate(tab_contents_, form_to_save)); } Profile* PasswordManagerDelegateImpl::GetProfileForPasswordManager() { return tab_contents_->profile(); } bool PasswordManagerDelegateImpl::DidLastPageLoadEncounterSSLErrors() { return tab_contents_->controller().ssl_manager()-> ProcessedSSLErrorFromRequest(); }