text: // Copyright 2019 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_ASSISTANT_BROWSER_CLIENT_SETTINGS_H_
  #define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_CLIENT_SETTINGS_H_
  
  #include "base/macros.h"
  #include "base/time/time.h"
  #include "components/autofill_assistant/browser/service.pb.h"
  #include "components/strings/grit/components_strings.h"
  #include "third_party/abseil-cpp/absl/types/optional.h"
  
  namespace autofill_assistant {
  
  // Global settings for the Autofill Assistant client.
  //
  // These settings can be updated by the server, from
  // SupportsScriptResponseProto.
  //
  // Note that since settings can change, all classes using settings should keep a
  // pointer to the single ClientSettings instance instead of making a copy.
  struct ClientSettings {
    ClientSettings();
  
    ClientSettings(const ClientSettings&) = delete;
    ClientSettings& operator=(const ClientSettings&) = delete;
  
    ~ClientSettings();
  
    void UpdateFromProto(const ClientSettingsProto& proto);
  
    // Map of current display strings, if sent by the backend.
    std::map<ClientSettingsProto::DisplayStringId, std::string> display_strings;
  
    // The locale of |display_strings|. If not specified, the client will display
    // strings in the current client locale. The locale follows the BCP 47 format,
    // e.g. "en-US".
    std::string display_strings_locale;
  
    // Time between two periodic script precondition checks.
    base::TimeDelta periodic_script_check_interval = base::Seconds(1);
  
    // Time between two element checks in the script executor.
    base::TimeDelta periodic_element_check_interval = base::Seconds(1);
  
    // Run that many periodic checks before giving up unless something happens to
    // wake it up, such as the user touching the screen.
    int periodic_script_check_count = 10;
  
    // Time between two element position refreshes, when displaying highlighted
    // areas in prompt state.
    base::TimeDelta element_position_update_interval = base::Milliseconds(100);
  
    // Maximum amount of time normal actions should implicitly wait for a selector
    // to show up.
    base::TimeDelta short_wait_for_element_deadline = base::Seconds(2);
  
    // Time to wait between two checks of the box model, when waiting for an
    // element to become stable, such as before clicking.
    base::TimeDelta box_model_check_interval = base::Milliseconds(200);
  
    // Maximum number of checks to run while waiting for the element position to
    // become stable.
    int box_model_check_count = 50;
  
    // Time to wait while checking the document state, when waiting for the
    // document to become ready.
    base::TimeDelta document_ready_check_timeout = base::Seconds(10);
  
    // How much time to give users to tap undo when they tap a cancel button.
    base::TimeDelta cancel_delay = base::Seconds(5);
  
    // If the user taps the overlay that many time within |tap_duration| turn the
    // UI off and give them |tap_shutdown_delay| to undo. If 0, unexpected taps
    // are ignored.
    int tap_count = 3;
  
    // Reset the unexpected tap counter after that time.
    base::TimeDelta tap_tracking_duration = base::Seconds(5);
  
    // How much time to give users to tap undo when after |tap_count| unexpected
    // taps where
    base::TimeDelta tap_shutdown_delay = base::Seconds(5);
  
    // Optional image drawn on top of overlays.
    absl::optional<OverlayImageProto> overlay_image;
  
    // Optional settings intended for integration tests.
    absl::optional<ClientSettingsProto::IntegrationTestSettings>
        integration_test_settings;
  
    float talkback_sheet_size_fraction = 0.5f;
  
    // Optional settings to enable back button error in BottomSheet instead of
    // Snackbar.
    absl::optional<ClientSettingsProto::BackButtonSettings> back_button_settings;
  
    // Whether to show warnings related to a slow connection to the user.
    bool enable_slow_connection_warnings = false;
  
    // Whether to show warnings related to a slow website to the user.
    bool enable_slow_website_warnings = false;
  
    // If true, only one warning will be shown to the user, i.e. either the slow
    // connection or website, depending on which one triggers first.
    bool only_show_warning_once = true;
  
    // If true, the slow connection warning will be shown only once.
    bool only_show_connection_warning_once = true;
  
    // If true, the website warning will be shown only once.
    bool only_show_website_warning_once = true;
  
    // Defines the maximum wait on a dom find element operation before showing
    // the slow website warning.
    base::TimeDelta warning_delay = base::Milliseconds(1500);
  
    // Defines the number of consecutive slow roundtrips allowed before showing
    // the slow connection warning.
    int max_consecutive_slow_roundtrips = 3;
  
    // Defines the threshold above which a roundtrip is considered too slow.
    base::TimeDelta slow_roundtrip_threshold = base::Milliseconds(1500);
  
    // The message to show as a warning to inform the user of a slow connection.
    // If this is not set, no warning will be shown in case of slow connection.
    std::string slow_connection_message = "";
  
    // The message to show as a warning to inform the user of a slow website.
    // If this is not set, no warning will be shown in case of a slow website.
    std::string slow_website_message = "";
  
    // The minimum duration that the message will be shown for (only applies to
    // the slow connection messages).
    base::TimeDelta minimum_warning_duration = base::Milliseconds(1500);
  
    // Whether the warning message should replace the current status message or
    // should be concatenated.
    ClientSettingsProto::SlowWarningSettings::MessageMode message_mode =
        ClientSettingsProto::SlowWarningSettings::REPLACE;
  };
  
  }  // namespace autofill_assistant
  
  #endif  // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_CLIENT_SETTINGS_H_
  