| Index: components/password_manager/content/browser/content_password_manager_driver.cc
 | 
| diff --git a/components/password_manager/content/browser/content_password_manager_driver.cc b/components/password_manager/content/browser/content_password_manager_driver.cc
 | 
| index 62c20e6eed31e3ac72466c800c421635e0b00d3d..31a9917ab85cdbd7faee5a7f30683cd521cd82ee 100644
 | 
| --- a/components/password_manager/content/browser/content_password_manager_driver.cc
 | 
| +++ b/components/password_manager/content/browser/content_password_manager_driver.cc
 | 
| @@ -5,14 +5,18 @@
 | 
|  #include "components/password_manager/content/browser/content_password_manager_driver.h"
 | 
|  
 | 
|  #include "components/autofill/content/browser/content_autofill_driver.h"
 | 
| +#include "components/autofill/content/browser/content_autofill_driver_factory.h"
 | 
|  #include "components/autofill/content/common/autofill_messages.h"
 | 
|  #include "components/autofill/core/common/form_data.h"
 | 
|  #include "components/autofill/core/common/password_form.h"
 | 
| +#include "components/password_manager/content/browser/content_password_manager_driver_factory.h"
 | 
|  #include "components/password_manager/core/browser/password_manager_client.h"
 | 
|  #include "content/public/browser/browser_context.h"
 | 
|  #include "content/public/browser/navigation_details.h"
 | 
|  #include "content/public/browser/navigation_entry.h"
 | 
| +#include "content/public/browser/render_frame_host.h"
 | 
|  #include "content/public/browser/render_view_host.h"
 | 
| +#include "content/public/browser/site_instance.h"
 | 
|  #include "content/public/browser/web_contents.h"
 | 
|  #include "content/public/common/ssl_status.h"
 | 
|  #include "ipc/ipc_message_macros.h"
 | 
| @@ -21,37 +25,44 @@
 | 
|  namespace password_manager {
 | 
|  
 | 
|  ContentPasswordManagerDriver::ContentPasswordManagerDriver(
 | 
| -    content::WebContents* web_contents,
 | 
| +    content::RenderFrameHost* render_frame_host,
 | 
|      PasswordManagerClient* client,
 | 
|      autofill::AutofillClient* autofill_client)
 | 
| -    : WebContentsObserver(web_contents),
 | 
| -      password_manager_(client),
 | 
| -      password_generation_manager_(client),
 | 
| -      password_autofill_manager_(client, autofill_client),
 | 
| +    : render_frame_host_(render_frame_host),
 | 
| +      client_(client),
 | 
| +      password_generation_manager_(client, this),
 | 
| +      password_autofill_manager_(client, this, autofill_client),
 | 
|        next_free_key_(0) {
 | 
| -  DCHECK(web_contents);
 | 
|  }
 | 
|  
 | 
|  ContentPasswordManagerDriver::~ContentPasswordManagerDriver() {}
 | 
|  
 | 
| +// static
 | 
| +ContentPasswordManagerDriver*
 | 
| +ContentPasswordManagerDriver::GetForRenderFrameHost(
 | 
| +    content::RenderFrameHost* render_frame_host) {
 | 
| +  return ContentPasswordManagerDriverFactory::FromWebContents(
 | 
| +             content::WebContents::FromRenderFrameHost(render_frame_host))
 | 
| +      ->GetDriverForFrame(render_frame_host);
 | 
| +}
 | 
| +
 | 
|  void ContentPasswordManagerDriver::FillPasswordForm(
 | 
|      const autofill::PasswordFormFillData& form_data) {
 | 
|    const int key = next_free_key_++;
 | 
|    password_autofill_manager_.OnAddPasswordFormMapping(key, form_data);
 | 
| -  DCHECK(web_contents());
 | 
| -  web_contents()->GetRenderViewHost()->Send(new AutofillMsg_FillPasswordForm(
 | 
| -      web_contents()->GetRenderViewHost()->GetRoutingID(), key, form_data));
 | 
| +  render_frame_host_->Send(new AutofillMsg_FillPasswordForm(
 | 
| +      render_frame_host_->GetRoutingID(), key, form_data));
 | 
|  }
 | 
|  
 | 
|  void ContentPasswordManagerDriver::AllowPasswordGenerationForForm(
 | 
|      const autofill::PasswordForm& form) {
 | 
| -  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
 | 
| +  content::RenderFrameHost* host = render_frame_host_;
 | 
|    host->Send(new AutofillMsg_FormNotBlacklisted(host->GetRoutingID(), form));
 | 
|  }
 | 
|  
 | 
|  void ContentPasswordManagerDriver::AccountCreationFormsFound(
 | 
|      const std::vector<autofill::FormData>& forms) {
 | 
| -  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
 | 
| +  content::RenderFrameHost* host = render_frame_host_;
 | 
|    host->Send(new AutofillMsg_AccountCreationFormsDetected(host->GetRoutingID(),
 | 
|                                                            forms));
 | 
|  }
 | 
| @@ -59,7 +70,7 @@ void ContentPasswordManagerDriver::AccountCreationFormsFound(
 | 
|  void ContentPasswordManagerDriver::FillSuggestion(
 | 
|      const base::string16& username,
 | 
|      const base::string16& password) {
 | 
| -  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
 | 
| +  content::RenderFrameHost* host = render_frame_host_;
 | 
|    host->Send(
 | 
|        new AutofillMsg_FillPasswordSuggestion(host->GetRoutingID(),
 | 
|                                               username,
 | 
| @@ -69,7 +80,7 @@ void ContentPasswordManagerDriver::FillSuggestion(
 | 
|  void ContentPasswordManagerDriver::PreviewSuggestion(
 | 
|      const base::string16& username,
 | 
|      const base::string16& password) {
 | 
| -  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
 | 
| +  content::RenderFrameHost* host = render_frame_host_;
 | 
|    host->Send(
 | 
|        new AutofillMsg_PreviewPasswordSuggestion(host->GetRoutingID(),
 | 
|                                                  username,
 | 
| @@ -77,36 +88,18 @@ void ContentPasswordManagerDriver::PreviewSuggestion(
 | 
|  }
 | 
|  
 | 
|  void ContentPasswordManagerDriver::ClearPreviewedForm() {
 | 
| -  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
 | 
| +  content::RenderFrameHost* host = render_frame_host_;
 | 
|    host->Send(
 | 
|        new AutofillMsg_ClearPreviewedForm(host->GetRoutingID()));
 | 
|  }
 | 
|  
 | 
| -bool ContentPasswordManagerDriver::DidLastPageLoadEncounterSSLErrors() {
 | 
| -  DCHECK(web_contents());
 | 
| -  // TODO(vabr): This is a wrong entry to look at for HTTP basic auth,
 | 
| -  // http://crbug.com/388246.
 | 
| -  content::NavigationEntry* entry =
 | 
| -      web_contents()->GetController().GetLastCommittedEntry();
 | 
| -  if (!entry) {
 | 
| -    return false;
 | 
| -  }
 | 
| -
 | 
| -  return net::IsCertStatusError(entry->GetSSL().cert_status);
 | 
| -}
 | 
| -
 | 
| -bool ContentPasswordManagerDriver::IsOffTheRecord() {
 | 
| -  DCHECK(web_contents());
 | 
| -  return web_contents()->GetBrowserContext()->IsOffTheRecord();
 | 
| -}
 | 
| -
 | 
|  PasswordGenerationManager*
 | 
|  ContentPasswordManagerDriver::GetPasswordGenerationManager() {
 | 
|    return &password_generation_manager_;
 | 
|  }
 | 
|  
 | 
|  PasswordManager* ContentPasswordManagerDriver::GetPasswordManager() {
 | 
| -  return &password_manager_;
 | 
| +  return client_->GetPasswordManager();
 | 
|  }
 | 
|  
 | 
|  PasswordAutofillManager*
 | 
| @@ -114,30 +107,19 @@ ContentPasswordManagerDriver::GetPasswordAutofillManager() {
 | 
|    return &password_autofill_manager_;
 | 
|  }
 | 
|  
 | 
| -void ContentPasswordManagerDriver::DidNavigateMainFrame(
 | 
| -    const content::LoadCommittedDetails& details,
 | 
| -    const content::FrameNavigateParams& params) {
 | 
| -  password_manager_.DidNavigateMainFrame(details.is_in_page);
 | 
| -}
 | 
| -
 | 
| -bool ContentPasswordManagerDriver::OnMessageReceived(
 | 
| -    const IPC::Message& message) {
 | 
| +bool ContentPasswordManagerDriver::HandleMessage(const IPC::Message& message) {
 | 
|    bool handled = true;
 | 
| -  IPC_BEGIN_MESSAGE_MAP(PasswordManager, message)
 | 
| -  IPC_MESSAGE_FORWARD(AutofillHostMsg_PasswordFormsParsed,
 | 
| -                      &password_manager_,
 | 
| -                      PasswordManager::OnPasswordFormsParsed)
 | 
| -  IPC_MESSAGE_FORWARD(AutofillHostMsg_PasswordFormsRendered,
 | 
| -                      &password_manager_,
 | 
| -                      PasswordManager::OnPasswordFormsRendered)
 | 
| -  IPC_MESSAGE_FORWARD(AutofillHostMsg_PasswordFormSubmitted,
 | 
| -                      &password_manager_,
 | 
| -                      PasswordManager::OnPasswordFormSubmitted)
 | 
| +  IPC_BEGIN_MESSAGE_MAP(ContentPasswordManagerDriver, message)
 | 
| +  IPC_MESSAGE_HANDLER(AutofillHostMsg_PasswordFormsParsed,
 | 
| +                      OnPasswordFormsParsed)
 | 
| +  IPC_MESSAGE_HANDLER(AutofillHostMsg_PasswordFormsRendered,
 | 
| +                      OnPasswordFormsRendered)
 | 
| +  IPC_MESSAGE_HANDLER(AutofillHostMsg_PasswordFormSubmitted,
 | 
| +                      OnPasswordFormSubmitted)
 | 
|    IPC_MESSAGE_FORWARD(AutofillHostMsg_ShowPasswordSuggestions,
 | 
|                        &password_autofill_manager_,
 | 
|                        PasswordAutofillManager::OnShowPasswordSuggestions)
 | 
| -  IPC_MESSAGE_FORWARD(AutofillHostMsg_RecordSavePasswordProgress,
 | 
| -                      password_manager_.client(),
 | 
| +  IPC_MESSAGE_FORWARD(AutofillHostMsg_RecordSavePasswordProgress, client_,
 | 
|                        PasswordManagerClient::LogSavePasswordProgress)
 | 
|    IPC_MESSAGE_UNHANDLED(handled = false)
 | 
|    IPC_END_MESSAGE_MAP()
 | 
| @@ -145,10 +127,38 @@ bool ContentPasswordManagerDriver::OnMessageReceived(
 | 
|    return handled;
 | 
|  }
 | 
|  
 | 
| +void ContentPasswordManagerDriver::OnPasswordFormsParsed(
 | 
| +    const std::vector<autofill::PasswordForm>& forms) {
 | 
| +  GetPasswordManager()->OnPasswordFormsParsed(this, forms);
 | 
| +}
 | 
| +
 | 
| +void ContentPasswordManagerDriver::OnPasswordFormsRendered(
 | 
| +    const std::vector<autofill::PasswordForm>& visible_forms,
 | 
| +    bool did_stop_loading) {
 | 
| +  GetPasswordManager()->OnPasswordFormsRendered(this, visible_forms,
 | 
| +                                                did_stop_loading);
 | 
| +}
 | 
| +
 | 
| +void ContentPasswordManagerDriver::OnPasswordFormSubmitted(
 | 
| +    const autofill::PasswordForm& password_form) {
 | 
| +  GetPasswordManager()->OnPasswordFormSubmitted(this, password_form);
 | 
| +}
 | 
| +
 | 
| +void ContentPasswordManagerDriver::DidNavigateFrame(
 | 
| +    const content::LoadCommittedDetails& details,
 | 
| +    const content::FrameNavigateParams& params) {
 | 
| +  GetPasswordAutofillManager()->Reset();
 | 
| +  if (!render_frame_host_->GetParent())
 | 
| +    GetPasswordManager()->DidNavigateMainFrame(details.is_in_page);
 | 
| +}
 | 
| +
 | 
|  autofill::AutofillManager* ContentPasswordManagerDriver::GetAutofillManager() {
 | 
| -  autofill::ContentAutofillDriver* driver =
 | 
| -      autofill::ContentAutofillDriver::FromWebContents(web_contents());
 | 
| -  return driver ? driver->autofill_manager() : NULL;
 | 
| +  autofill::ContentAutofillDriverFactory* factory =
 | 
| +      autofill::ContentAutofillDriverFactory::FromWebContents(
 | 
| +          content::WebContents::FromRenderFrameHost(render_frame_host_));
 | 
| +  return factory
 | 
| +             ? factory->DriverForFrame(render_frame_host_)->autofill_manager()
 | 
| +             : nullptr;
 | 
|  }
 | 
|  
 | 
|  }  // namespace password_manager
 | 
| 
 |