Home | History | Annotate | Download | only in autofill
      1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_UI_AUTOFILL_DATA_MODEL_WRAPPER_H_
      6 #define CHROME_BROWSER_UI_AUTOFILL_DATA_MODEL_WRAPPER_H_
      7 
      8 #include "base/compiler_specific.h"
      9 #include "base/strings/string16.h"
     10 #include "chrome/browser/ui/autofill/autofill_dialog_types.h"
     11 #include "components/autofill/content/browser/wallet/wallet_items.h"
     12 #include "components/autofill/core/browser/field_types.h"
     13 
     14 namespace gfx {
     15 class Image;
     16 }
     17 
     18 namespace autofill {
     19 
     20 class AutofillDataModel;
     21 class AutofillProfile;
     22 class AutofillType;
     23 class CreditCard;
     24 class FormStructure;
     25 
     26 namespace wallet {
     27 class Address;
     28 class FullWallet;
     29 }
     30 
     31 // A glue class that allows uniform interactions with autocomplete data sources,
     32 // regardless of their type. Implementations are intended to be lightweight and
     33 // copyable, only holding weak references to their backing model.
     34 class DataModelWrapper {
     35  public:
     36   virtual ~DataModelWrapper();
     37 
     38   // Fills in |inputs| with the data that this model contains (|inputs| is an
     39   // out-param).
     40   void FillInputs(DetailInputs* inputs);
     41 
     42   // Returns the data for a specific autocomplete type in a format for filling
     43   // into a web form.
     44   virtual base::string16 GetInfo(const AutofillType& type) const = 0;
     45 
     46   // Returns the data for a specified type in a format optimized for displaying
     47   // to the user.
     48   virtual base::string16 GetInfoForDisplay(const AutofillType& type) const;
     49 
     50   // Returns the icon, if any, that represents this model.
     51   virtual gfx::Image GetIcon();
     52 
     53   // Gets text to display to the user to summarize this data source. The
     54   // default implementation assumes this is an address. Both params are required
     55   // to be non-NULL and will be filled in with text that is vertically compact
     56   // (but may take up a lot of horizontal space) and horizontally compact (but
     57   // may take up a lot of vertical space) respectively. The return value will
     58   // be true and the outparams will be filled in only if the data represented is
     59   // complete and valid.
     60   virtual bool GetDisplayText(base::string16* vertically_compact,
     61                               base::string16* horizontally_compact);
     62 
     63   // Fills in |form_structure| with the data that this model contains. |inputs|
     64   // and |comparator| are used to determine whether each field in the
     65   // FormStructure should be filled in or left alone. Returns whether any fields
     66   // in |form_structure| were found to be matching.
     67   bool FillFormStructure(
     68       const DetailInputs& inputs,
     69       const InputFieldComparator& compare,
     70       FormStructure* form_structure) const;
     71 
     72  protected:
     73   DataModelWrapper();
     74 
     75  private:
     76   // Formats address data into a single string using |separator| between
     77   // fields.
     78   base::string16 GetAddressDisplayText(const base::string16& separator);
     79 
     80   DISALLOW_COPY_AND_ASSIGN(DataModelWrapper);
     81 };
     82 
     83 // A DataModelWrapper that does not hold data and does nothing when told to
     84 // fill in a form.
     85 class EmptyDataModelWrapper : public DataModelWrapper {
     86  public:
     87   EmptyDataModelWrapper();
     88   virtual ~EmptyDataModelWrapper();
     89 
     90   virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
     91 
     92  protected:
     93   DISALLOW_COPY_AND_ASSIGN(EmptyDataModelWrapper);
     94 };
     95 
     96 // A DataModelWrapper for Autofill profiles.
     97 class AutofillProfileWrapper : public DataModelWrapper {
     98  public:
     99   explicit AutofillProfileWrapper(const AutofillProfile* profile);
    100   AutofillProfileWrapper(const AutofillProfile* profile,
    101                          const AutofillType& variant_type,
    102                          size_t variant);
    103   virtual ~AutofillProfileWrapper();
    104 
    105   virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
    106   virtual base::string16 GetInfoForDisplay(const AutofillType& type) const
    107       OVERRIDE;
    108 
    109  protected:
    110   // Returns the variant that should be used when dealing with an element that
    111   // has the given |type|.
    112   size_t GetVariantForType(const AutofillType& type) const;
    113 
    114  private:
    115   const AutofillProfile* profile_;
    116 
    117   // The profile variant. |variant_| describes which variant of |variant_group_|
    118   // to use in the profile.
    119   FieldTypeGroup variant_group_;
    120   size_t variant_;
    121 
    122   DISALLOW_COPY_AND_ASSIGN(AutofillProfileWrapper);
    123 };
    124 
    125 // A DataModelWrapper specifically for shipping address profiles.
    126 class AutofillShippingAddressWrapper : public AutofillProfileWrapper {
    127  public:
    128   explicit AutofillShippingAddressWrapper(const AutofillProfile* profile);
    129   virtual ~AutofillShippingAddressWrapper();
    130 
    131   virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
    132 
    133  private:
    134   DISALLOW_COPY_AND_ASSIGN(AutofillShippingAddressWrapper);
    135 };
    136 
    137 // A DataModelWrapper specifically for Autofill CreditCard data.
    138 class AutofillCreditCardWrapper : public DataModelWrapper {
    139  public:
    140   explicit AutofillCreditCardWrapper(const CreditCard* card);
    141   virtual ~AutofillCreditCardWrapper();
    142 
    143   virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
    144   virtual gfx::Image GetIcon() OVERRIDE;
    145   virtual bool GetDisplayText(base::string16* vertically_compact,
    146                               base::string16* horizontally_compact) OVERRIDE;
    147 
    148  private:
    149   const CreditCard* card_;
    150 
    151   DISALLOW_COPY_AND_ASSIGN(AutofillCreditCardWrapper);
    152 };
    153 
    154 // A DataModelWrapper for Wallet addresses.
    155 class WalletAddressWrapper : public DataModelWrapper {
    156  public:
    157   explicit WalletAddressWrapper(const wallet::Address* address);
    158   virtual ~WalletAddressWrapper();
    159 
    160   virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
    161   virtual base::string16 GetInfoForDisplay(const AutofillType& type) const
    162       OVERRIDE;
    163   virtual bool GetDisplayText(base::string16* vertically_compact,
    164                               base::string16* horizontally_compact) OVERRIDE;
    165 
    166  private:
    167   const wallet::Address* address_;
    168 
    169   DISALLOW_COPY_AND_ASSIGN(WalletAddressWrapper);
    170 };
    171 
    172 // A DataModelWrapper for Wallet instruments.
    173 class WalletInstrumentWrapper : public DataModelWrapper {
    174  public:
    175   explicit WalletInstrumentWrapper(
    176       const wallet::WalletItems::MaskedInstrument* instrument);
    177   virtual ~WalletInstrumentWrapper();
    178 
    179   virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
    180   virtual base::string16 GetInfoForDisplay(const AutofillType& type) const
    181       OVERRIDE;
    182   virtual gfx::Image GetIcon() OVERRIDE;
    183   virtual bool GetDisplayText(base::string16* vertically_compact,
    184                               base::string16* horizontally_compact) OVERRIDE;
    185 
    186  private:
    187   const wallet::WalletItems::MaskedInstrument* instrument_;
    188 
    189   DISALLOW_COPY_AND_ASSIGN(WalletInstrumentWrapper);
    190 };
    191 
    192 // A DataModelWrapper for FullWallet billing data.
    193 class FullWalletBillingWrapper : public DataModelWrapper {
    194  public:
    195   explicit FullWalletBillingWrapper(wallet::FullWallet* full_wallet);
    196   virtual ~FullWalletBillingWrapper();
    197 
    198   virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
    199   virtual bool GetDisplayText(base::string16* vertically_compact,
    200                               base::string16* horizontally_compact) OVERRIDE;
    201 
    202  private:
    203   wallet::FullWallet* full_wallet_;
    204 
    205   DISALLOW_COPY_AND_ASSIGN(FullWalletBillingWrapper);
    206 };
    207 
    208 // A DataModelWrapper for FullWallet shipping data.
    209 class FullWalletShippingWrapper : public DataModelWrapper {
    210  public:
    211   explicit FullWalletShippingWrapper(wallet::FullWallet* full_wallet);
    212   virtual ~FullWalletShippingWrapper();
    213 
    214   virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
    215 
    216  private:
    217   wallet::FullWallet* full_wallet_;
    218 
    219   DISALLOW_COPY_AND_ASSIGN(FullWalletShippingWrapper);
    220 };
    221 
    222 // A DataModelWrapper to copy the output of one section to the input of another.
    223 class FieldMapWrapper : public DataModelWrapper {
    224  public:
    225   explicit FieldMapWrapper(const FieldValueMap& field_map);
    226   virtual ~FieldMapWrapper();
    227 
    228   virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
    229 
    230  private:
    231   const FieldValueMap& field_map_;
    232 
    233   DISALLOW_COPY_AND_ASSIGN(FieldMapWrapper);
    234 };
    235 
    236 }  // namespace autofill
    237 
    238 #endif  // CHROME_BROWSER_UI_AUTOFILL_DATA_MODEL_WRAPPER_H_
    239