Home | History | Annotate | Download | only in autofill
      1 // Copyright 2013 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 "chrome/browser/ui/autofill/autofill_dialog_common.h"
      6 
      7 #include "base/strings/utf_string_conversions.h"
      8 #include "chrome/browser/browser_process.h"
      9 #include "components/autofill/core/browser/autofill_country.h"
     10 #include "components/autofill/core/browser/autofill_field.h"
     11 #include "components/autofill/core/browser/autofill_type.h"
     12 
     13 namespace autofill {
     14 namespace common {
     15 
     16 bool ServerTypeEncompassesFieldType(ServerFieldType type,
     17                                     const AutofillType& field_type) {
     18   // If any credit card expiration info is asked for, show both month and year
     19   // inputs.
     20   ServerFieldType server_type = field_type.GetStorableType();
     21   if (server_type == CREDIT_CARD_EXP_4_DIGIT_YEAR ||
     22       server_type == CREDIT_CARD_EXP_2_DIGIT_YEAR ||
     23       server_type == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR ||
     24       server_type == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR ||
     25       server_type == CREDIT_CARD_EXP_MONTH) {
     26     return type == CREDIT_CARD_EXP_4_DIGIT_YEAR ||
     27            type == CREDIT_CARD_EXP_MONTH;
     28   }
     29 
     30   if (server_type == CREDIT_CARD_TYPE)
     31     return type == CREDIT_CARD_NUMBER;
     32 
     33   // Check the groups to distinguish billing types from shipping ones.
     34   AutofillType autofill_type = AutofillType(type);
     35   if (autofill_type.group() != field_type.group())
     36     return false;
     37 
     38   // The page may ask for individual address lines; this roughly matches the
     39   // street address blob.
     40   if (server_type == ADDRESS_HOME_LINE1 ||
     41           server_type == ADDRESS_HOME_LINE2 ||
     42           server_type == ADDRESS_HOME_LINE3) {
     43     return autofill_type.GetStorableType() == ADDRESS_HOME_STREET_ADDRESS;
     44   }
     45 
     46   // First, middle and last name are parsed from full name.
     47   if (field_type.group() == NAME || field_type.group() == NAME_BILLING)
     48     return autofill_type.GetStorableType() == NAME_FULL;
     49 
     50   return autofill_type.GetStorableType() == server_type;
     51 }
     52 
     53 bool ServerTypeMatchesField(DialogSection section,
     54                             ServerFieldType type,
     55                             const AutofillField& field) {
     56   AutofillType field_type = field.Type();
     57 
     58   // The credit card name is filled from the billing section's data.
     59   if (field_type.GetStorableType() == CREDIT_CARD_NAME &&
     60       (section == SECTION_BILLING || section == SECTION_CC_BILLING)) {
     61     return type == NAME_BILLING_FULL;
     62   }
     63 
     64   return ServerTypeEncompassesFieldType(type, field_type);
     65 }
     66 
     67 bool IsCreditCardType(ServerFieldType type) {
     68   return AutofillType(type).group() == CREDIT_CARD;
     69 }
     70 
     71 void BuildInputs(const DetailInput* input_template,
     72                  size_t template_size,
     73                  DetailInputs* inputs) {
     74   for (size_t i = 0; i < template_size; ++i) {
     75     const DetailInput* input = &input_template[i];
     76     inputs->push_back(*input);
     77   }
     78 }
     79 
     80 AutofillMetrics::DialogUiEvent DialogSectionToUiItemAddedEvent(
     81     DialogSection section) {
     82   switch (section) {
     83     case SECTION_BILLING:
     84       return AutofillMetrics::DIALOG_UI_BILLING_ITEM_ADDED;
     85 
     86     case SECTION_CC_BILLING:
     87       return AutofillMetrics::DIALOG_UI_CC_BILLING_ITEM_ADDED;
     88 
     89     case SECTION_SHIPPING:
     90       return AutofillMetrics::DIALOG_UI_SHIPPING_ITEM_ADDED;
     91 
     92     case SECTION_CC:
     93       return AutofillMetrics::DIALOG_UI_CC_ITEM_ADDED;
     94   }
     95 
     96   NOTREACHED();
     97   return AutofillMetrics::NUM_DIALOG_UI_EVENTS;
     98 }
     99 
    100 AutofillMetrics::DialogUiEvent DialogSectionToUiSelectionChangedEvent(
    101     DialogSection section) {
    102   switch (section) {
    103     case SECTION_BILLING:
    104       return AutofillMetrics::DIALOG_UI_BILLING_SELECTED_SUGGESTION_CHANGED;
    105 
    106     case SECTION_CC_BILLING:
    107       return AutofillMetrics::DIALOG_UI_CC_BILLING_SELECTED_SUGGESTION_CHANGED;
    108 
    109     case SECTION_SHIPPING:
    110       return AutofillMetrics::DIALOG_UI_SHIPPING_SELECTED_SUGGESTION_CHANGED;
    111 
    112     case SECTION_CC:
    113       return AutofillMetrics::DIALOG_UI_CC_SELECTED_SUGGESTION_CHANGED;
    114   }
    115 
    116   NOTREACHED();
    117   return AutofillMetrics::NUM_DIALOG_UI_EVENTS;
    118 }
    119 
    120 std::vector<ServerFieldType> TypesFromInputs(const DetailInputs& inputs) {
    121   std::vector<ServerFieldType> types;
    122   for (size_t i = 0; i < inputs.size(); ++i) {
    123     types.push_back(inputs[i].type);
    124   }
    125   return types;
    126 }
    127 
    128 }  // namespace common
    129 }  // namespace autofill
    130