12e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// Copyright 2014 The Chromium Authors. All rights reserved. 22e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// Use of this source code is governed by a BSD-style license that can be 32e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// found in the LICENSE file. 42e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 52e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "components/password_manager/content/browser/content_password_manager_driver.h" 62e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 72e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "components/autofill/content/browser/content_autofill_driver.h" 82e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "components/autofill/content/common/autofill_messages.h" 92e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "components/autofill/core/common/form_data.h" 102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "components/autofill/core/common/password_form.h" 112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "components/password_manager/core/browser/password_manager_client.h" 122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "content/public/browser/browser_context.h" 132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "content/public/browser/navigation_details.h" 142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "content/public/browser/navigation_entry.h" 152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "content/public/browser/render_view_host.h" 162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "content/public/browser/web_contents.h" 172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "content/public/common/ssl_status.h" 1850d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor#include "ipc/ipc_message_macros.h" 19d7a3e2c5f61cd4893f95b69a424fe4def3aa0f69Benjamin Kramer#include "net/cert/cert_status_flags.h" 20aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar 212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace password_manager { 222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorContentPasswordManagerDriver::ContentPasswordManagerDriver( 242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor content::WebContents* web_contents, 252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor PasswordManagerClient* client, 262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor autofill::AutofillClient* autofill_client) 27011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner : WebContentsObserver(web_contents), 28011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner password_manager_(client), 293e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt password_generation_manager_(client), 30011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner password_autofill_manager_(client, autofill_client) { 312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DCHECK(web_contents); 32011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner} 332a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 342577743c5650c646fb705df01403707e94f2df04Abramo BagnaraContentPasswordManagerDriver::~ContentPasswordManagerDriver() {} 352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorvoid ContentPasswordManagerDriver::FillPasswordForm( 372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor const autofill::PasswordFormFillData& form_data) { 382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DCHECK(web_contents()); 392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor web_contents()->GetRenderViewHost()->Send(new AutofillMsg_FillPasswordForm( 402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor web_contents()->GetRenderViewHost()->GetRoutingID(), form_data)); 412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorvoid ContentPasswordManagerDriver::AllowPasswordGenerationForForm( 442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor const autofill::PasswordForm& form) { 452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor content::RenderViewHost* host = web_contents()->GetRenderViewHost(); 462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor host->Send(new AutofillMsg_FormNotBlacklisted(host->GetRoutingID(), form)); 472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorvoid ContentPasswordManagerDriver::AccountCreationFormsFound( 502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor const std::vector<autofill::FormData>& forms) { 512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor content::RenderViewHost* host = web_contents()->GetRenderViewHost(); 52e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor host->Send(new AutofillMsg_AccountCreationFormsDetected(host->GetRoutingID(), 532a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor forms)); 543e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt} 552a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorvoid ContentPasswordManagerDriver::FillSuggestion( 572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor const base::string16& username, 582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor const base::string16& password) { 592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor content::RenderViewHost* host = web_contents()->GetRenderViewHost(); 602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor host->Send( 6151603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor new AutofillMsg_FillPasswordSuggestion(host->GetRoutingID(), 6251603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor username, 6351603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor password)); 642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 6651603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregorvoid ContentPasswordManagerDriver::PreviewSuggestion( 6751603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor const base::string16& username, 6851603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor const base::string16& password) { 692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor content::RenderViewHost* host = web_contents()->GetRenderViewHost(); 702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor host->Send( 712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor new AutofillMsg_PreviewPasswordSuggestion(host->GetRoutingID(), 722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor username, 732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor password)); 742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorvoid ContentPasswordManagerDriver::ClearPreviewedForm() { 77e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor content::RenderViewHost* host = web_contents()->GetRenderViewHost(); 78e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor host->Send( 792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor new AutofillMsg_ClearPreviewedForm(host->GetRoutingID())); 80e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 81e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 82e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorbool ContentPasswordManagerDriver::DidLastPageLoadEncounterSSLErrors() { 832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DCHECK(web_contents()); 84e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // TODO(vabr): This is a wrong entry to look at for HTTP basic auth, 85e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // http://crbug.com/388246. 86e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor content::NavigationEntry* entry = 872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor web_contents()->GetController().GetLastCommittedEntry(); 88e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (!entry) { 89e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return false; 90e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 91e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return net::IsCertStatusError(entry->GetSSL().cert_status); 932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorbool ContentPasswordManagerDriver::IsOffTheRecord() { 962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DCHECK(web_contents()); 972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return web_contents()->GetBrowserContext()->IsOffTheRecord(); 982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorPasswordGenerationManager* 1012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorContentPasswordManagerDriver::GetPasswordGenerationManager() { 1022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return &password_generation_manager_; 103e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 1042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorPasswordManager* ContentPasswordManagerDriver::GetPasswordManager() { 1062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return &password_manager_; 1072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorPasswordAutofillManager* 1102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorContentPasswordManagerDriver::GetPasswordAutofillManager() { 1112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return &password_autofill_manager_; 1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 1132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorvoid ContentPasswordManagerDriver::DidNavigateMainFrame( 115ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner const content::LoadCommittedDetails& details, 1162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor const content::FrameNavigateParams& params) { 1172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor password_manager_.DidNavigateMainFrame(details.is_in_page); 118e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 119e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 120e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorbool ContentPasswordManagerDriver::OnMessageReceived( 121e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor const IPC::Message& message) { 122ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner bool handled = true; 123e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor IPC_BEGIN_MESSAGE_MAP(PasswordManager, message) 124e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor IPC_MESSAGE_FORWARD(AutofillHostMsg_PasswordFormsParsed, 1253e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt &password_manager_, 1263e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt PasswordManager::OnPasswordFormsParsed) 1273e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt IPC_MESSAGE_FORWARD(AutofillHostMsg_PasswordFormsRendered, 1283e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt &password_manager_, 1293e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt PasswordManager::OnPasswordFormsRendered) 1303e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt IPC_MESSAGE_FORWARD(AutofillHostMsg_PasswordFormSubmitted, 1312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor &password_manager_, 1322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor PasswordManager::OnPasswordFormSubmitted) 1331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump IPC_MESSAGE_FORWARD(AutofillHostMsg_ShowPasswordSuggestions, 1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump &password_autofill_manager_, 1352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor PasswordAutofillManager::OnShowPasswordSuggestions) 136e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor IPC_MESSAGE_FORWARD(AutofillHostMsg_AddPasswordFormMapping, 137e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor &password_autofill_manager_, 138e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor PasswordAutofillManager::OnAddPasswordFormMapping) 139e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor IPC_MESSAGE_FORWARD(AutofillHostMsg_RecordSavePasswordProgress, 140e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor password_manager_.client(), 1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PasswordManagerClient::LogSavePasswordProgress) 1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump IPC_MESSAGE_UNHANDLED(handled = false) 143e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor IPC_END_MESSAGE_MAP() 144e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 1452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return handled; 1462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1473e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 1483e518bda00d710754ca077cf9be8dd821e16a854Sean Huntautofill::AutofillManager* ContentPasswordManagerDriver::GetAutofillManager() { 1493e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt autofill::ContentAutofillDriver* driver = 1503e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt autofill::ContentAutofillDriver::FromWebContents(web_contents()); 1513e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return driver ? driver->autofill_manager() : NULL; 1523e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt} 1532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // namespace password_manager 1552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor