// Copyright 2015 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.

module mojo;

// Text input type which is based on blink::WebTextInputType.
enum TextInputType {
  NONE,
  TEXT,
  PASSWORD,
  SEARCH,
  EMAIL,
  NUMBER,
  TELEPHONE,
  URL,
  DATE,
  DATE_TIME,
  DATE_TIME_LOCAL,
  MONTH,
  TIME,
  WEEK,
  TEXT_AREA,
  LAST = TEXT_AREA,
};

// Text input flag which is based on blink::WebTextInputFlags.
enum TextInputFlag {
  NONE,
  AUTOCOMPLETE_ON = 0x001,
  AUTOCOMPLETE_OFF = 0x002,
  AUTOCORRECT_ON = 0x004,
  AUTOCORRECT_OFF = 0x008,
  SPELLCHECK_ON = 0x010,
  SPELLCHECK_OFF = 0x020,
  AUTOCAPITALIZE_NONE = 0x040,
  AUTOCAPITALIZE_CHARACTERS = 0x080,
  AUTOCAPITALIZE_WORDS = 0x100,
  AUTOCAPITALIZE_SENTENCES = 0x200,
  ALL = 0x3FF,
};

// Text input info which is based on blink::WebTextInputInfo.
struct TextInputState {
  // The type of input field.
  TextInputType type;

  // The flags of the input field (autocorrect, autocomplete, etc.).
  int32 flags;

  // The value of the input field.
  string? text;

  // The cursor position of the current selection start, or the caret position
  // if nothing is selected.
  int32 selection_start;

  // The cursor position of the current selection end, or the caret position
  // if nothing is selected.
  int32 selection_end;

  // The start position of the current composition, or -1 if there is none.
  int32 composition_start;

  // The end position of the current composition, or -1 if there is none.
  int32 composition_end;

  // Whether or not inline composition can be performed for the current input.
  bool can_compose_inline;
};
