Home | History | Annotate | Download | only in browser
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "components/autofill/content/browser/content_autofill_driver.h"
      6 
      7 #include "base/command_line.h"
      8 #include "base/threading/sequenced_worker_pool.h"
      9 #include "components/autofill/content/common/autofill_messages.h"
     10 #include "components/autofill/core/browser/autofill_client.h"
     11 #include "components/autofill/core/browser/autofill_external_delegate.h"
     12 #include "components/autofill/core/browser/autofill_manager.h"
     13 #include "components/autofill/core/browser/form_structure.h"
     14 #include "components/autofill/core/common/autofill_switches.h"
     15 #include "content/public/browser/browser_context.h"
     16 #include "content/public/browser/browser_thread.h"
     17 #include "content/public/browser/navigation_controller.h"
     18 #include "content/public/browser/navigation_details.h"
     19 #include "content/public/browser/render_view_host.h"
     20 #include "content/public/browser/web_contents.h"
     21 #include "content/public/common/frame_navigate_params.h"
     22 #include "ipc/ipc_message_macros.h"
     23 
     24 namespace autofill {
     25 
     26 namespace {
     27 
     28 const char kContentAutofillDriverWebContentsUserDataKey[] =
     29     "web_contents_autofill_driver_impl";
     30 
     31 }  // namespace
     32 
     33 // static
     34 void ContentAutofillDriver::CreateForWebContentsAndDelegate(
     35     content::WebContents* contents,
     36     AutofillClient* client,
     37     const std::string& app_locale,
     38     AutofillManager::AutofillDownloadManagerState enable_download_manager) {
     39   if (FromWebContents(contents))
     40     return;
     41 
     42   contents->SetUserData(
     43       kContentAutofillDriverWebContentsUserDataKey,
     44       new ContentAutofillDriver(
     45           contents, client, app_locale, enable_download_manager));
     46 }
     47 
     48 // static
     49 ContentAutofillDriver* ContentAutofillDriver::FromWebContents(
     50     content::WebContents* contents) {
     51   return static_cast<ContentAutofillDriver*>(
     52       contents->GetUserData(kContentAutofillDriverWebContentsUserDataKey));
     53 }
     54 
     55 ContentAutofillDriver::ContentAutofillDriver(
     56     content::WebContents* web_contents,
     57     AutofillClient* client,
     58     const std::string& app_locale,
     59     AutofillManager::AutofillDownloadManagerState enable_download_manager)
     60     : content::WebContentsObserver(web_contents),
     61       autofill_manager_(new AutofillManager(this,
     62                                             client,
     63                                             app_locale,
     64                                             enable_download_manager)),
     65       autofill_external_delegate_(autofill_manager_.get(), this),
     66       request_autocomplete_manager_(this) {
     67   autofill_manager_->SetExternalDelegate(&autofill_external_delegate_);
     68 }
     69 
     70 ContentAutofillDriver::~ContentAutofillDriver() {}
     71 
     72 bool ContentAutofillDriver::IsOffTheRecord() const {
     73   return web_contents()->GetBrowserContext()->IsOffTheRecord();
     74 }
     75 
     76 net::URLRequestContextGetter* ContentAutofillDriver::GetURLRequestContext() {
     77   return web_contents()->GetBrowserContext()->GetRequestContext();
     78 }
     79 
     80 base::SequencedWorkerPool* ContentAutofillDriver::GetBlockingPool() {
     81   return content::BrowserThread::GetBlockingPool();
     82 }
     83 
     84 bool ContentAutofillDriver::RendererIsAvailable() {
     85   return (web_contents()->GetRenderViewHost() != NULL);
     86 }
     87 
     88 void ContentAutofillDriver::SendFormDataToRenderer(
     89     int query_id,
     90     RendererFormDataAction action,
     91     const FormData& data) {
     92   if (!RendererIsAvailable())
     93     return;
     94   content::RenderViewHost* host = web_contents()->GetRenderViewHost();
     95   switch (action) {
     96     case FORM_DATA_ACTION_FILL:
     97       host->Send(
     98           new AutofillMsg_FillForm(host->GetRoutingID(), query_id, data));
     99       break;
    100     case FORM_DATA_ACTION_PREVIEW:
    101       host->Send(
    102           new AutofillMsg_PreviewForm(host->GetRoutingID(), query_id, data));
    103       break;
    104   }
    105 }
    106 
    107 void ContentAutofillDriver::PingRenderer() {
    108   if (!RendererIsAvailable())
    109     return;
    110   content::RenderViewHost* host = web_contents()->GetRenderViewHost();
    111   host->Send(new AutofillMsg_Ping(host->GetRoutingID()));
    112 }
    113 
    114 void ContentAutofillDriver::SendAutofillTypePredictionsToRenderer(
    115     const std::vector<FormStructure*>& forms) {
    116   if (!CommandLine::ForCurrentProcess()->HasSwitch(
    117           switches::kShowAutofillTypePredictions))
    118     return;
    119 
    120   if (!RendererIsAvailable())
    121     return;
    122   content::RenderViewHost* host = web_contents()->GetRenderViewHost();
    123 
    124   std::vector<FormDataPredictions> type_predictions;
    125   FormStructure::GetFieldTypePredictions(forms, &type_predictions);
    126   host->Send(new AutofillMsg_FieldTypePredictionsAvailable(host->GetRoutingID(),
    127                                                            type_predictions));
    128 }
    129 
    130 void ContentAutofillDriver::RendererShouldAcceptDataListSuggestion(
    131     const base::string16& value) {
    132   if (!RendererIsAvailable())
    133     return;
    134   content::RenderViewHost* host = web_contents()->GetRenderViewHost();
    135   host->Send(
    136       new AutofillMsg_AcceptDataListSuggestion(host->GetRoutingID(), value));
    137 }
    138 
    139 void ContentAutofillDriver::RendererShouldClearFilledForm() {
    140   if (!RendererIsAvailable())
    141     return;
    142   content::RenderViewHost* host = web_contents()->GetRenderViewHost();
    143   host->Send(new AutofillMsg_ClearForm(host->GetRoutingID()));
    144 }
    145 
    146 void ContentAutofillDriver::RendererShouldClearPreviewedForm() {
    147   if (!RendererIsAvailable())
    148     return;
    149   content::RenderViewHost* host = web_contents()->GetRenderViewHost();
    150   host->Send(new AutofillMsg_ClearPreviewedForm(host->GetRoutingID()));
    151 }
    152 
    153 void ContentAutofillDriver::RendererShouldFillFieldWithValue(
    154     const base::string16& value) {
    155   if (!RendererIsAvailable())
    156     return;
    157   content::RenderViewHost* host = web_contents()->GetRenderViewHost();
    158   host->Send(new AutofillMsg_FillFieldWithValue(host->GetRoutingID(), value));
    159 }
    160 void ContentAutofillDriver::RendererShouldPreviewFieldWithValue(
    161     const base::string16& value) {
    162   if (!RendererIsAvailable())
    163     return;
    164   content::RenderViewHost* host = web_contents()->GetRenderViewHost();
    165   host->Send(new AutofillMsg_PreviewFieldWithValue(host->GetRoutingID(),
    166                                                    value));
    167 }
    168 
    169 bool ContentAutofillDriver::OnMessageReceived(const IPC::Message& message) {
    170   bool handled = true;
    171   IPC_BEGIN_MESSAGE_MAP(ContentAutofillDriver, message)
    172   IPC_MESSAGE_FORWARD(AutofillHostMsg_FormsSeen,
    173                       autofill_manager_.get(),
    174                       AutofillManager::OnFormsSeen)
    175   IPC_MESSAGE_FORWARD(AutofillHostMsg_FormSubmitted,
    176                       autofill_manager_.get(),
    177                       AutofillManager::OnFormSubmitted)
    178   IPC_MESSAGE_FORWARD(AutofillHostMsg_TextFieldDidChange,
    179                       autofill_manager_.get(),
    180                       AutofillManager::OnTextFieldDidChange)
    181   IPC_MESSAGE_FORWARD(AutofillHostMsg_QueryFormFieldAutofill,
    182                       autofill_manager_.get(),
    183                       AutofillManager::OnQueryFormFieldAutofill)
    184   IPC_MESSAGE_FORWARD(AutofillHostMsg_DidPreviewAutofillFormData,
    185                       autofill_manager_.get(),
    186                       AutofillManager::OnDidPreviewAutofillFormData)
    187   IPC_MESSAGE_FORWARD(AutofillHostMsg_PingAck,
    188                       &autofill_external_delegate_,
    189                       AutofillExternalDelegate::OnPingAck)
    190   IPC_MESSAGE_FORWARD(AutofillHostMsg_DidFillAutofillFormData,
    191                       autofill_manager_.get(),
    192                       AutofillManager::OnDidFillAutofillFormData)
    193   IPC_MESSAGE_FORWARD(AutofillHostMsg_DidEndTextFieldEditing,
    194                       autofill_manager_.get(),
    195                       AutofillManager::OnDidEndTextFieldEditing)
    196   IPC_MESSAGE_FORWARD(AutofillHostMsg_HidePopup,
    197                       autofill_manager_.get(),
    198                       AutofillManager::OnHidePopup)
    199   IPC_MESSAGE_FORWARD(AutofillHostMsg_SetDataList,
    200                       autofill_manager_.get(),
    201                       AutofillManager::OnSetDataList)
    202   IPC_MESSAGE_FORWARD(AutofillHostMsg_RequestAutocomplete,
    203                       &request_autocomplete_manager_,
    204                       RequestAutocompleteManager::OnRequestAutocomplete)
    205   IPC_MESSAGE_FORWARD(AutofillHostMsg_CancelRequestAutocomplete,
    206                       &request_autocomplete_manager_,
    207                       RequestAutocompleteManager::OnCancelRequestAutocomplete)
    208   IPC_MESSAGE_UNHANDLED(handled = false)
    209   IPC_END_MESSAGE_MAP()
    210   return handled;
    211 }
    212 
    213 void ContentAutofillDriver::DidNavigateMainFrame(
    214     const content::LoadCommittedDetails& details,
    215     const content::FrameNavigateParams& params) {
    216   if (details.is_navigation_to_different_page())
    217     autofill_manager_->Reset();
    218 }
    219 
    220 void ContentAutofillDriver::SetAutofillManager(
    221     scoped_ptr<AutofillManager> manager) {
    222   autofill_manager_ = manager.Pass();
    223   autofill_manager_->SetExternalDelegate(&autofill_external_delegate_);
    224 }
    225 
    226 void ContentAutofillDriver::NavigationEntryCommitted(
    227     const content::LoadCommittedDetails& load_details) {
    228   autofill_manager_->client()->HideAutofillPopup();
    229 }
    230 
    231 void ContentAutofillDriver::WasHidden() {
    232   autofill_manager_->client()->HideAutofillPopup();
    233 }
    234 
    235 }  // namespace autofill
    236