blob: 5af846a9cff5ae5d2078eda5c0b779aebe108406 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_COMPOSE_CORE_BROWSER_CONFIG_H_
#define COMPONENTS_COMPOSE_CORE_BROWSER_CONFIG_H_
#include <string>
#include <vector>
#include "base/containers/flat_set.h"
#include "base/time/time.h"
namespace compose {
// How Compose should position its dialog if there isn't enough space above or
// below the underlying form field (the `anchor`) on the screen.
enum class DialogFallbackPositioningStrategy : int {
// This adjusts the position so that the dialog's top border will never have
// to move to keep the bottom border onscreen, regardless of the actual size
// of the dialog. This may result in the dialog being rendered higher on
// screen that expected, obscuring the underlying element more than absolutely
// necessary. It has the advantage that the dialog is not repositioned when it
// grows, resulting in less jarring resizes.
kShiftUpUntilMaxSizeIsOnscreen = 0,
// This adjusts the dialog to be centered over its underlying form element,
// which has the advantage of always being close to the relevant page content,
// but will obscure more of the form field than other strategies.
kCenterOnAnchorRect = 1,
// This adjusts the dialog to be onscreen, but no further. This has the
// advantage of not obscuring the underlying element more than necesasary, but
// the downside that the dialog will move in position as it resizes. In
// practice this is more visually jarring than just making the dialog bigger.
kShiftUpUntilOnscreen = 2
};
// The Compose configuration. Default values appear below. Always use
// |GetComposeConfig()| to get the current configuration.
struct Config {
// The minimum number of words needed for a valid user input.
unsigned int input_min_words = 3;
// The maximum number of words allowed for a valid user input.
unsigned int input_max_words = 500;
// The maximum number of characters allowed for a valid user input.
unsigned int input_max_chars = 2500;
// The maximum number of bytes allowed in the inner text.
unsigned int inner_text_max_bytes = 1024 * 1024;
// The maximum number of bytes allowed in the inner text.
unsigned int trimmed_inner_text_max_chars = 12000;
// The maximum number of bytes allowed in the inner text.
unsigned int trimmed_inner_text_header_length = 4000;
// The maximum number of AX nodes to gather for page context.
unsigned int max_ax_node_count_for_page_context = 5000;
// Whether to send a compose when the dialog is first opened,
// if there is an acceptable input text selected.
bool auto_submit_with_selection = false;
// Whether to enable the nudge on focus when there is saved state.
bool saved_state_nudge_enabled = true;
// Whether to enable the proactive nudge with no saved state.
bool proactive_nudge_enabled = true;
// Use the compact UI for proactive nudge.
bool proactive_nudge_compact_ui = true;
// Whether or not the proactive nudge is shown at the cursor.
bool is_nudge_shown_at_cursor = true;
// Used to randomly hide the nudge in order to reduce exposure, experimental
// flag for triggering research experiments only. If param is greater than
// `1`, always shows. If param is negative, never shows.
double proactive_nudge_show_probability = 0.02;
// When segmentation is enabled and working, this parameter controls how often
// we randomly decide to show the proactive nudge regardless of the
// segmentation platform's response. Nudges shown in this way contribute to
// training data for the segmentation platform.
double proactive_nudge_force_show_probability = 0.004;
// Whether to collect training data for the segmentation platform any time the
// nudge is shown. If false, training data is only collected when the nudge is
// randomly force-shown, see `proactive_nudge_force_show_probability`.
bool proactive_nudge_always_collect_training_data = false;
// Ignores OptGuide decision to disable the nudge. Does not bypass other
// hint decisions.
bool proactive_nudge_bypass_optimization_guide = false;
// Uses segmentation platform to predict nudge utility.
bool proactive_nudge_segmentation = true;
// How long to wait to show the proactive nudge after focus. A non-positive
// value disables the focus nudge.
base::TimeDelta proactive_nudge_focus_delay = base::Seconds(0);
// How long to wait to show the proactive nudge after valid text input. A
// non-positive value disables the after input nudge.
base::TimeDelta proactive_nudge_text_settled_delay = base::Seconds(1);
// How many text change events to wait for before showing the after text input
// nudge.
int proactive_nudge_text_change_count = 10;
// List of countries where the proactive nudge is enabled. The default value
// is set in the constructor.
base::flat_set<std::string> proactive_nudge_countries;
// Whether the nudge on selection should be enabled.
bool selection_nudge_enabled = false;
// Minimum selection length needed before showing the selection nudge.
unsigned int selection_nudge_length = 30;
// How long to wait to show the selection nudge.
base::TimeDelta selection_nudge_delay = base::Milliseconds(500);
// Whether the selection nudge can be shown more than once per focus.
bool selection_nudge_once_per_focus = false;
// If true, nudge at most once per field per navigation. If false, at most
// once per field per focus.
bool proactive_nudge_field_per_navigation = true;
// How many text change events to wait for before dismissing the nudge.
unsigned int nudge_field_change_event_max = 3;
// The duration that the saved state notification is shown before
// auto-dismissal.
base::TimeDelta saved_state_timeout = base::Milliseconds(2000);
// The delay to wait to show the saved state notification after the compose
// dialog loses focus.
base::TimeDelta focus_lost_delay = base::Milliseconds(100);
// Whether the dialog should prioritize staying within bounds of the browser
// window above visibility of the anchor rect.
bool stay_in_window_bounds = true;
// The dialog positioning strategy to use if there isn't enough space above or
// below the anchor element.
DialogFallbackPositioningStrategy positioning_strategy =
DialogFallbackPositioningStrategy::kShiftUpUntilMaxSizeIsOnscreen;
// The threshold for Compose request latency before showing a client-side
// error message.
base::TimeDelta request_latency_timeout = base::Seconds(20);
// Finch-controllable list of countries where Compose should be enabled. The
// default value is set in the constructor.
base::flat_set<std::string> enabled_countries;
// The threshold for the lifetime of a Compose session. A session whose
// lifetime has exceeded this threshold will be replaced with a new session
// the next time there is an attempt to resume it.
base::TimeDelta session_max_allowed_lifetime = base::Minutes(30);
Config();
Config(const Config& other);
~Config();
};
// Gets the current configuration.
const Config& GetComposeConfig();
Config& GetMutableConfigForTesting();
void ResetConfigForTesting();
} // namespace compose
#endif // COMPONENTS_COMPOSE_CORE_BROWSER_CONFIG_H_