| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_SUBKEY_REQUESTER_H_ |
| #define COMPONENTS_AUTOFILL_CORE_BROWSER_SUBKEY_REQUESTER_H_ |
| |
| #include "base/macros.h" |
| #include "third_party/libaddressinput/chromium/chrome_address_validator.h" |
| |
| namespace autofill { |
| |
| // This receives a region code and the device's language. |
| using SubKeyReceiverCallback = |
| base::OnceCallback<void(const std::vector<std::string>&, |
| const std::vector<std::string>&)>; |
| |
| // SubKeyRequester Loads Rules from the server and extracts the subkeys. |
| // For a given key (region code for a country, such as US), the list of its |
| // corresponding subkeys is the list of that countries admin areas (states, |
| // provinces, ..). |
| class SubKeyRequester : public LoadRulesListener { |
| public: |
| // The interface for the subkey request. |
| class Request { |
| public: |
| virtual void OnRulesLoaded() = 0; |
| virtual ~Request() {} |
| }; |
| |
| SubKeyRequester(std::unique_ptr<::i18n::addressinput::Source> source, |
| std::unique_ptr<::i18n::addressinput::Storage> storage); |
| ~SubKeyRequester() override; |
| |
| // If the rules for |region_code| are loaded, this gets the subkeys for the |
| // |region_code|, synchronously. If they are not loaded yet, it sets up a |
| // task to get the subkeys when the rules are loaded (asynchronous). If the |
| // loading has not yet started, it will also start loading the rules for the |
| // |region_code|. The received subkeys will be returned to the |requester|. If |
| // the subkeys are not received in |timeout_seconds|, then the requester will |
| // be informed and the request will be canceled. |requester| should never be |
| // null. The requesting device language is set to |language|, ex:"fr". |
| void StartRegionSubKeysRequest(const std::string& region_code, |
| const std::string& language, |
| int timeout_seconds, |
| SubKeyReceiverCallback cb); |
| |
| // Returns whether the rules for the specified |region_code| have finished |
| // loading. |
| bool AreRulesLoadedForRegion(const std::string& region_code); |
| |
| // Start loading the rules for the specified |region_code|. |
| virtual void LoadRulesForRegion(const std::string& region_code); |
| |
| // Cancels the pending subkey request task. |
| void CancelPendingGetSubKeys(); |
| |
| private: |
| // Called when the address rules for the |region_code| have finished |
| // loading. Implementation of the LoadRulesListener interface. |
| void OnAddressValidationRulesLoaded(const std::string& region_code, |
| bool success) override; |
| |
| // The region code and the request for the pending subkey request. |
| std::unique_ptr<Request> pending_subkey_request_; |
| std::string pending_subkey_region_code_; |
| |
| // The address validator used to load subkeys. |
| AddressValidator address_validator_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SubKeyRequester); |
| }; |
| |
| } // namespace autofill |
| |
| #endif // COMPONENTS_AUTOFILL_CORE_BROWSER_SUBKEY_REQUESTER_H_ |