// Copyright 2014 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 mojom;

// The structures here roughly mirror those from autocomplete.

struct AutocompleteAdditionalInfo {
  string key;
  string value;
};

struct AutocompleteMatch {
  string? provider_name;
  // Only meaningful if |provider_name| is valid.
  bool provider_done;
  int32 relevance;
  bool deletable;
  string fill_into_edit;
  string inline_autocompletion;
  string destination_url;
  string stripped_destination_url;
  string image;
  string contents;
  string description;
  string answer;
  string transition;
  bool allowed_to_be_default_match;
  string type;
  bool is_search_type;
  bool has_tab_match;
  string? associated_keyword;
  string keyword;
  bool starred;
  int32 duplicates;
  bool from_previous;
  array<AutocompleteAdditionalInfo> additional_info;
};

struct AutocompleteResultsForProvider {
  string provider_name;
  array<AutocompleteMatch> results;
};

struct OmniboxResponse {
  bool done;
  // Time delta since the request was started, in milliseconds.
  int32 time_since_omnibox_started_ms;
  // The inferred metrics::OmniboxInputType of the request represented as a
  // string.
  string type;
  string host;
  bool is_typed_host;
  array<AutocompleteMatch> combined_results;
  array<AutocompleteResultsForProvider> results_by_provider;
};

interface OmniboxPageHandler {
  SetClientPage(OmniboxPage page);
  StartOmniboxQuery(string input_string,
                    bool reset_autocomplete_controller,
                    int32 cursor_position,
                    bool zero_suggest,
                    bool prevent_inline_autocomplete,
                    bool prefer_keyword,
                    string current_url,
                    int32 page_classification);
};

interface OmniboxPage {
  handleNewAutocompleteResponse(OmniboxResponse response,
                                bool isPageController);
  HandleNewAutocompleteQuery(bool isPageController);
  HandleAnswerImageData(string image_url, string image_data);
};
