1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef COMPONENTS_AUTOFILL_CONTENT_BROWSER_WALLET_WALLET_ITEMS_H_
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define COMPONENTS_AUTOFILL_CONTENT_BROWSER_WALLET_WALLET_ITEMS_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <set>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/gtest_prod_util.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/required_action.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_address.h"
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DictionaryValue;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gfx {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Image;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass AutofillType;
333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FORWARD_DECLARE_TEST(WalletInstrumentWrapperTest, GetInfoCreditCardExpMonth);
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)FORWARD_DECLARE_TEST(WalletInstrumentWrapperTest,
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     GetDisplayTextEmptyWhenExpired);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace wallet {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class GaiaAccount;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WalletItemsTest;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)enum AmexPermission {
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AMEX_ALLOWED,
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AMEX_DISALLOWED,
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WalletItems is a collection of cards and addresses that a user picks from to
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// construct a full wallet. However, it also provides a transaction ID which
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// must be used throughout all API calls being made using this data.
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Additionally, user actions may be required before a purchase can be completed
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// using Online Wallet and those actions are present in the object as well.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WalletItems {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Container for all information about a credit card except for it's card
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // verfication number (CVN) and it's complete primary account number (PAN).
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class MaskedInstrument {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    enum Type {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AMEX,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DISCOVER,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MAESTRO,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MASTER_CARD,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SOLO,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SWITCH,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UNKNOWN,  // Catch all type.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      VISA,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    enum Status {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AMEX_NOT_SUPPORTED,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BILLING_INCOMPLETE,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DECLINED,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DISABLED_FOR_THIS_MERCHANT,  // Deprecated.
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPIRED,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      INAPPLICABLE,  // Catch all status.
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PENDING,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UNSUPPORTED_COUNTRY,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      VALID,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~MaskedInstrument();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Returns an empty scoped_ptr if input is invalid or a valid masked
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // instrument.
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static scoped_ptr<MaskedInstrument>
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateMaskedInstrument(const base::DictionaryValue& dictionary);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool operator==(const MaskedInstrument& other) const;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool operator!=(const MaskedInstrument& other) const;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Gets an image to display for this instrument.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Image& CardIcon() const;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Returns a pair of strings that summarizes this CC,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // suitable for display to the user.
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 DisplayName() const;
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 DisplayNameDetail() const;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Gets info that corresponds with |type|.
1003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    base::string16 GetInfo(const AutofillType& type,
1013240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                           const std::string& app_locale) const;
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Returns the display type of the and last four digits (e.g. Visa - 4444).
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 TypeAndLastFourDigits() const;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16& descriptive_name() const { return descriptive_name_; }
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Type& type() const { return type_; }
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16& last_four_digits() const { return last_four_digits_; }
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int expiration_month() const { return expiration_month_; }
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int expiration_year() const { return expiration_year_; }
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Address& address() const { return *address_; }
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Status& status() const { return status_; }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& object_id() const { return object_id_; }
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    friend class WalletItemsTest;
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    friend scoped_ptr<MaskedInstrument> GetTestMaskedInstrumentWithDetails(
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        const std::string& id,
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        scoped_ptr<Address> address,
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        Type type,
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        Status status);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FRIEND_TEST_ALL_PREFIXES(::autofill::WalletInstrumentWrapperTest,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             GetInfoCreditCardExpMonth);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FRIEND_TEST_ALL_PREFIXES(::autofill::WalletInstrumentWrapperTest,
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             GetDisplayTextEmptyWhenExpired);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FRIEND_TEST_ALL_PREFIXES(WalletItemsTest, CreateMaskedInstrument);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FRIEND_TEST_ALL_PREFIXES(WalletItemsTest, CreateWalletItems);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    MaskedInstrument(const base::string16& descriptive_name,
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const Type& type,
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     const base::string16& last_four_digits,
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     int expiration_month,
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     int expiration_year,
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     scoped_ptr<Address> address,
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const Status& status,
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const std::string& object_id);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // A user-provided description of the instrument. For example, "Google Visa
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Card".
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 descriptive_name_;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The payment network of the instrument. For example, Visa.
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Type type_;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The last four digits of the primary account number of the instrument.
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 last_four_digits_;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // |expiration month_| should be 1-12.
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int expiration_month_;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // |expiration_year_| should be a 4-digit year.
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int expiration_year_;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The billing address for the instrument.
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<Address> address_;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The current status of the instrument. For example, expired or declined.
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Status status_;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Externalized Online Wallet id for this instrument.
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string object_id_;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(MaskedInstrument);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Class representing a legal document that the user must accept before they
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // can use Online Wallet.
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class LegalDocument {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~LegalDocument();
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Returns null if input is invalid or a valid legal document.
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static scoped_ptr<LegalDocument>
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateLegalDocument(const base::DictionaryValue& dictionary);
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Returns a document for the privacy policy (acceptance of which is not
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // tracked by the server).
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    static scoped_ptr<LegalDocument> CreatePrivacyPolicyDocument();
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool operator==(const LegalDocument& other) const;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool operator!=(const LegalDocument& other) const;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& id() { return id_; }
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GURL& url() const { return url_; }
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16& display_name() const { return display_name_; }
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    friend class WalletItemsTest;
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FRIEND_TEST_ALL_PREFIXES(WalletItemsTest, CreateLegalDocument);
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FRIEND_TEST_ALL_PREFIXES(WalletItemsTest, CreateWalletItems);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FRIEND_TEST_ALL_PREFIXES(WalletItemsTest, LegalDocumentUrl);
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FRIEND_TEST_ALL_PREFIXES(WalletItemsTest, LegalDocumentEmptyId);
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LegalDocument(const std::string& id,
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  const base::string16& display_name);
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LegalDocument(const GURL& url,
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  const base::string16& display_name);
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Externalized Online Wallet id for the document, or an empty string for
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // documents not tracked by the server (such as the privacy policy).
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string id_;
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The human-visitable URL that displays the document.
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GURL url_;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // User displayable name for the document.
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 display_name_;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(LegalDocument);
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~WalletItems();
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns null on invalid input, an empty wallet items with required
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // actions if any are present, and a populated wallet items otherwise. Caller
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // owns returned pointer.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<WalletItems>
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateWalletItems(const base::DictionaryValue& dictionary);
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool operator==(const WalletItems& other) const;
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool operator!=(const WalletItems& other) const;
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void AddAccount(scoped_ptr<GaiaAccount> account);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddInstrument(scoped_ptr<MaskedInstrument> instrument) {
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DCHECK(instrument);
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    instruments_.push_back(instrument.release());
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddAddress(scoped_ptr<Address> address) {
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DCHECK(address);
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    addresses_.push_back(address.release());
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddLegalDocument(scoped_ptr<LegalDocument> legal_document) {
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DCHECK(legal_document);
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    legal_documents_.push_back(legal_document.release());
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void AddAllowedShippingCountry(const std::string& country_code) {
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    allowed_shipping_countries_.insert(country_code);
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Return the corresponding instrument for |id| or NULL if it doesn't exist.
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const WalletItems::MaskedInstrument* GetInstrumentById(
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& object_id) const;
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether or not |action| is in |required_actions_|.
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool HasRequiredAction(RequiredAction action) const;
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Checks whether |card_number| is supported by Wallet for this merchant and
2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // if not, fills in |message| with a user-visible explanation.
2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool SupportsCard(const base::string16& card_number,
2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                    base::string16* message) const;
2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const std::vector<GaiaAccount*>& gaia_accounts() const {
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return gaia_accounts_.get();
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::vector<RequiredAction>& required_actions() const {
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return required_actions_;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& google_transaction_id() const {
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return google_transaction_id_;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::vector<MaskedInstrument*>& instruments() const {
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return instruments_.get();
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& default_instrument_id() const {
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return default_instrument_id_;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::vector<Address*>& addresses() const { return addresses_.get(); }
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& default_address_id() const { return default_address_id_; }
265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns the GAIA id of the active account, or an empty string if no account
266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // is active.
267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string ObfuscatedGaiaId() const;
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t active_account_index() const { return active_account_index_; }
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::vector<LegalDocument*>& legal_documents() const {
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return legal_documents_.get();
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const std::set<std::string>& allowed_shipping_countries() const {
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return allowed_shipping_countries_;
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class WalletItemsTest;
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend scoped_ptr<WalletItems> GetTestWalletItemsWithDetails(
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::vector<RequiredAction>& required_actions,
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::string& default_instrument_id,
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::string& default_address_id,
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AmexPermission amex_permission);
2830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  friend scoped_ptr<WalletItems> GetTestWalletItemsWithDefaultIds(
2840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      RequiredAction action);
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(WalletItemsTest, CreateWalletItems);
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(WalletItemsTest,
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           CreateWalletItemsWithRequiredActions);
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WalletItems(const std::vector<RequiredAction>& required_actions,
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              const std::string& google_transaction_id,
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              const std::string& default_instrument_id,
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              const std::string& default_address_id,
293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              AmexPermission amex_permission);
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Actions that must be completed by the user before a FullWallet can be
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // issued to them by the Online Wallet service.
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<RequiredAction> required_actions_;
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The id for this transaction issued by Google.
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string google_transaction_id_;
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The id of the user's default instrument.
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string default_instrument_id_;
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The id of the user's default address.
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string default_address_id_;
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The index into |gaia_accounts_| of the account for which this object
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // holds data.
310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t active_account_index_;
311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // The complete set of logged in GAIA accounts.
313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ScopedVector<GaiaAccount> gaia_accounts_;
314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The user's backing instruments.
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<MaskedInstrument> instruments_;
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The user's shipping addresses.
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<Address> addresses_;
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Legal documents the user must accept before using Online Wallet.
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<LegalDocument> legal_documents_;
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Country codes for allowed Wallet shipping destinations.
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::set<std::string> allowed_shipping_countries_;
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
32768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Whether Google Wallet allows American Express card for this merchant.
32868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AmexPermission amex_permission_;
32968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WalletItems);
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace wallet
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace autofill
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif  // COMPONENTS_AUTOFILL_CONTENT_BROWSER_WALLET_WALLET_ITEMS_H_
337