// Copyright 2016 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 chrome.mojom;

import "mojo/public/mojom/base/string16.mojom";
import "mojo/public/mojom/base/time.mojom";
import "url/mojom/url.mojom";

[Native]
enum NTPLoggingEventType;

[Native]
enum OmniboxFocusState;

[Native]
struct NTPTileImpression;

// Interface used to connect to the embedded search interface. This is a
// separate interface such that a reverse connection (|client| below) can be
// passed when connecting.
interface EmbeddedSearchConnector {
  // Connect to the interface. |embedded_search| is the connection which the
  // client will use to query the embedded search interface. |client| is the
  // connection used by the embedded search interface implementation to push
  // browser state updates to the client.
  Connect(associated EmbeddedSearch & embedded_search,
          associated EmbeddedSearchClient client);
};

// Browser interface to support embedded search. Render frames connect to this
// interface to query browser data, such as the most visited pages.
// See http://dev.chromium.org/embeddedsearch
interface EmbeddedSearch {
  // Tells InstantExtended to set the omnibox focus state.
  FocusOmnibox(int32 page_seq_no, bool focus);

  // Tells InstantExtended to delete a most visited item.
  DeleteMostVisitedItem(int32 page_seq_no, url.mojom.Url url);

  // Tells InstantExtended to undo all most visited item deletions.
  UndoAllMostVisitedDeletions(int32 page_seq_no);

  // Tells InstantExtended to undo one most visited item deletion.
  UndoMostVisitedDeletion(int32 page_seq_no, url.mojom.Url url);

  // Tells InstantExtended to add a custom link. Returns true if successful.
  AddCustomLink(int32 page_seq_no, url.mojom.Url url, string title)
      => (bool success);

  // Tells InstantExtended to update a custom link. Returns true if successful.
  UpdateCustomLink(int32 page_seq_no,
                   url.mojom.Url url,
                   url.mojom.Url new_url,
                   string new_title) => (bool success);

  // Tells InstantExtended to reorder a custom link.
  ReorderCustomLink(int32 page_seq_no, url.mojom.Url url, int32 new_pos);

  // Tells InstantExtended to delete a custom link. Returns true if successful.
  DeleteCustomLink(int32 page_seq_no, url.mojom.Url url) => (bool success);

  // Tells InstantExtended to undo the previous custom link action (add, edit,
  // delete, etc.).
  UndoCustomLinkAction(int32 page_seq_no);

  // Tells InstantExtended to delete all custom links and use most visited sites
  // instead.
  ResetCustomLinks(int32 page_seq_no);

  // Logs events from InstantExtended New Tab Pages.
  LogEvent(int32 page_seq_no,
           NTPLoggingEventType event,
           mojo_base.mojom.TimeDelta time);

  // Logs an impression on one of the Most Visited tile on the InstantExtended
  // New Tab Page.
  LogMostVisitedImpression(int32 page_seq_no, NTPTileImpression impression);

  // Logs a navigation on one of the Most Visited tile on the InstantExtended
  // New Tab Page.
  LogMostVisitedNavigation(int32 page_seq_no, NTPTileImpression impression);

  // Tells InstantExtended to paste text into the omnibox.  If text is empty,
  // the clipboard contents will be pasted. This causes the omnibox dropdown to
  // open.
  PasteAndOpenDropdown(int32 page_seq_no,
                       mojo_base.mojom.String16 text_to_be_pasted);

  // The Instant page asks whether the user syncs its history.
  HistorySyncCheck(int32 page_seq_no) => (bool sync_history);

  // The Instant page asks for Chrome identity check against |identity|.
  ChromeIdentityCheck(int32 page_seq_no, mojo_base.mojom.String16 identity)
      => (bool identity_match);

  // Updates the NTP custom background preferences.
  SetCustomBackgroundURL(url.mojom.Url url);
  SetCustomBackgroundURLWithAttributions(url.mojom.Url background_url,
                                         string attribution_line_1,
                                         string attribution_line_2,
                                         url.mojom.Url action_url);

  // Let the user select a local file for the NTP background.
  SelectLocalBackgroundImage();

  // Add a search suggestion task id to the blocklist.
  BlocklistSearchSuggestion(int32 task_version, int64 task_id);

  // Add a search suggestion task id and hash to the blocklist.
  BlocklistSearchSuggestionWithHash(int32 task_version, int64 task_id,
                                    array<uint8, 4> hash);

  // A search suggestion was selected, issue a new request with the suggestion
  // temporarily added to the blocklist.
  SearchSuggestionSelected(int32 task_version, int64 task_id,
                                    array<uint8, 4> hash);

  // Opts the user out of receiving search suggestions.
  OptOutOfSearchSuggestions();
};

[Native]
enum OmniboxFocusChangeReason;

[Native]
struct InstantMostVisitedItem;

[Native]
struct ThemeBackgroundInfo;

// Renderer interface used by the browser to push updates to the client. For
// example, the browser will tell the frame if the omnibox got focus.
interface EmbeddedSearchClient {
  SetPageSequenceNumber(int32 page_seq_no);

  FocusChanged(OmniboxFocusState new_focus_state,
               OmniboxFocusChangeReason reason);

  MostVisitedChanged(array<InstantMostVisitedItem> items, bool is_custom_links);

  SetInputInProgress(bool input_in_progress);

  ThemeChanged(ThemeBackgroundInfo value);
};

// SearchBouncer tracks the NTP URL specified by the default search provider,
// which should be transferred back to the browser process for potential
// reassignment to an Instant renderer process.
interface SearchBouncer {
  SetNewTabPageURL(url.mojom.Url new_tab_page_url);
};
