// 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 content.mojom;

import "content/common/native_types.mojom";
import "content/common/service_worker/embedded_worker.mojom";
import "content/public/common/renderer_preferences.mojom";
import "ipc/constants.mojom";
import "mojo/public/mojom/base/time.mojom";
import "mojo/public/mojom/base/unguessable_token.mojom";
import "services/network/public/mojom/network_types.mojom";
import "services/service_manager/public/mojom/interface_provider.mojom";
import "services/service_manager/public/mojom/service.mojom";
import "ui/gfx/geometry/mojo/geometry.mojom";

struct CreateViewParams {
  // Renderer-wide preferences.
  RendererPreferences renderer_preferences;

  // Preferences for this view.
  WebPreferences web_preferences;

  // The ID of the view to be created.
  int32 view_id = IPC.mojom.kRoutingIdNone;

  // The ID of the main frame hosted in the view, or None if creating a view to
  // host a main frame proxy. If this is None, then |proxy_routing_id| should be
  // set to something other than None.
  int32 main_frame_routing_id = IPC.mojom.kRoutingIdNone;

  // The InterfaceProvider through which the main RenderFrame can access
  // services exposed by its RenderFrameHost.
  //
  // This is null precisely when |main_frame_routing_id| is MSG_ROUTING_NONE,
  // that is, when creating a RenderView for a remote main frame.
  service_manager.mojom.InterfaceProvider? main_frame_interface_provider;

  // The ID of the widget for the main frame.
  int32 main_frame_widget_routing_id = IPC.mojom.kRoutingIdNone;

  // The session storage namespace ID this view should use.
  string session_storage_namespace_id;

  // The route ID of the opener RenderFrame or RenderFrameProxy, if we need to
  // set one (MSG_ROUTING_NONE otherwise).
  int32 opener_frame_route_id = IPC.mojom.kRoutingIdNone;

  // Carries replicated information, such as frame name and sandbox flags, for
  // this view's main frame, which will be a proxy when |main_frame_routing_id|
  // is None (due to site isolation), or a RenderFrame in all other cases.
  FrameReplicationState replicated_frame_state;

  // Used for devtools instrumentation and trace-ability. The token is
  // propagated to Blink's LocalFrame and both Blink and content/
  // can tag calls and requests with this instrumentation token in order to
  // attribute them to the context frame.
  // |devtools_main_frame_token| is only defined by the browser and is never
  // sent back from the renderer in the control calls.
  mojo_base.mojom.UnguessableToken devtools_main_frame_token;

  // The ID of the proxy object for the main frame in this view. It is only
  // used if |main_frame_routing_id| is None, and exactly one of the two
  // should be set to an id other than None at any time.
  int32 proxy_routing_id = IPC.mojom.kRoutingIdNone;

  // Whether the RenderView should initially be hidden.
  bool hidden;

  // Whether the RenderView will never be visible.
  bool never_visible;

  // Whether the window associated with this view was created with an opener.
  bool window_was_created_with_opener;

  // Whether or not the frame has previously committed a real load.
  bool has_committed_real_load;

  // The initial renderer size.
  VisualProperties visual_properties;

  // Whether lookup of frames in the created RenderView (e.g. lookup via
  // window.open or via <a target=...>) should be renderer-wide (i.e. going
  // beyond the usual opener-relationship-based BrowsingInstance boundaries).
  bool renderer_wide_named_frame_lookup;
};

struct CreateFrameWidgetParams {
  // Gives the routing ID for the RenderWidget that will be attached to the
  // new RenderFrame. If the RenderFrame does not need a RenderWidget, this
  // is MSG_ROUTING_NONE and the other parameters are not read.
  int32 routing_id;

  // Tells the new RenderWidget whether it is initially hidden.
  bool hidden;
};

struct CreateFrameParams {
  // Specifies the routing ID of the new RenderFrame object.
  int32 routing_id;

  // If a valid |proxy_routing_id| is provided, the new frame will be
  // configured to replace the proxy on commit.
  int32 proxy_routing_id;

  // Specifies the new frame's opener.  The opener will be null if this is
  // MSG_ROUTING_NONE.
  int32 opener_routing_id;

  // The new frame should be created as a child of the object
  // identified by |parent_routing_id| or as top level if that is
  // MSG_ROUTING_NONE.
  int32 parent_routing_id;

  // Identifies the previous sibling of the new frame, so that the new frame is
  // inserted into the correct place in the frame tree.  If this is
  // MSG_ROUTING_NONE, the frame will be created as the leftmost child of its
  // parent frame, in front of any other children.
  int32 previous_sibling_routing_id;

  // The InterfaceProvider through which the RenderFrame can access services
  // exposed by its RenderFrameHost.
  service_manager.mojom.InterfaceProvider interface_provider;

  // When the new frame has a parent, |replication_state| holds the new frame's
  // properties replicated from the process rendering the parent frame, such as
  // the new frame's sandbox flags.
  FrameReplicationState replication_state;

  // Used for devtools instrumentation and trace-ability. The token is
  // propagated to Blink's LocalFrame and both Blink and content/
  // can tag calls and requests with this instrumentation token in order to
  // attribute them to the context frame.
  // |devtools_frame_token| is only defined by the browser and is never
  // sent back from the renderer in the control calls.
  mojo_base.mojom.UnguessableToken devtools_frame_token;

  // When the new frame has a parent, |frame_owner_properties| holds the
  // properties of the HTMLFrameOwnerElement from the parent process.
  // Note that unlike FrameReplicationState, this is not replicated for remote
  // frames.
  FrameOwnerProperties frame_owner_properties;

  // Specifies properties for a new RenderWidget that will be attached to the
  // new RenderFrame (if one is needed).
  CreateFrameWidgetParams widget_params;

  // Whether or not the frame has previously committed a real load.
  bool has_committed_real_load;
};

struct UpdateScrollbarThemeParams {
  float initial_button_delay;
  float autoscroll_button_delay;
  bool jump_on_track_click;
  ScrollerStyle preferred_scroller_style;
  bool redraw;
  ScrollbarButtonsPlacement button_placement;
  bool scroll_view_rubber_banding;
};

// The primordial Channel-associated interface implemented by a render process.
// This should be used for implementing browser-to-renderer control messages
// which need to retain FIFO with respect to legacy IPC messages.
interface Renderer {
  // Tells the renderer to ask its embedder to bind |service_request| to an
  // embedder-provided renderer-side service implementation. This is required to
  // ensure that embedder-provided renderer-side service is initialized at the
  // appropriate time.
  CreateEmbedderRendererService(service_manager.mojom.Service& service_request);

  // Tells the renderer to create a new view.
  CreateView(CreateViewParams params);

  // Tells the renderer to create a new RenderFrame.
  CreateFrame(CreateFrameParams params);

  // Tells the renderer to create a new RenderFrameProxy object with
  // |routing_id|.  |render_view_routing_id| identifies the
  // RenderView to be associated with this proxy.  The new proxy's opener should
  // be set to the object identified by |opener_routing_id|, or to null if that
  // is MSG_ROUTING_NONE.  The new proxy should be created as a child of the
  // object identified by |parent_routing_id| or as top level if that is
  // MSG_ROUTING_NONE.
  // |devtools_frame_token| is used for devtools instrumentation
  // and trace-ability. It is defined by the browser and is never
  // sent back from the renderer in the control calls.
  CreateFrameProxy(int32 routing_id, int32 render_view_routing_id,
                   int32 opener_routing_id, int32 parent_routing_id,
                   FrameReplicationState replication_state,
                   mojo_base.mojom.UnguessableToken devtools_frame_token);

  // Tells the renderer to create an EmbeddedWorkerInstanceClient, which is what
  // manages service worker startup and shutdown.
  // TODO(shimazu): Send all params for starting service worker to reduce the
  // number of IPCs.
  SetUpEmbeddedWorkerChannelForServiceWorker(
      EmbeddedWorkerInstanceClient& client_request);

  // Tells the renderer that the network type has changed so that
  // navigator.onLine and navigator.connection can be updated.
  OnNetworkConnectionChanged(NetworkConnectionType connection_type,
                             double max_bandwidth_mbps);

  // Tells the renderer process that the network quality estimate has changed.
  // EffectiveConnectionType is the connection type whose typical performance is
  // most similar to the measured performance of the network in use.
  // The downstream throughput is computed in kilobits per second. If an
  // estimate of the HTTP or transport RTT is unavailable, it will be set to
  // net::nqe::internal::InvalidRTT(). If the throughput estimate is
  // unavailable, it will be set to net::nqe::internal::INVALID_RTT_THROUGHPUT.
  OnNetworkQualityChanged(
      network.mojom.EffectiveConnectionType effective_connection_type,
      mojo_base.mojom.TimeDelta http_rtt,
      mojo_base.mojom.TimeDelta transport_rtt,
      double bandwidth_kbps);

  // Tells the renderer to suspend/resume the webkit timers. Only for use on
  // Android.
  SetWebKitSharedTimersSuspended(bool suspend);

  // Sets the user-agent string. This is needed because getting the value in the
  // renderer from the system leads to a wrong value due to sandboxing. This
  // must be called as early as possible, during the renderer process
  // initialization.
  SetUserAgent(string user_agent);

  // Tells the renderer about a scrollbar appearance change. Only for use on
  // OS X.
  UpdateScrollbarTheme(UpdateScrollbarThemeParams params);

  // Notification that the OS X Aqua color preferences changed.
  OnSystemColorsChanged(int32 aqua_color_variant, string highlight_text_color,
                        string highlight_color);

  // Tells the renderer to empty its plugin list cache, optional reloading
  // pages containing plugins.
  PurgePluginListCache(bool reload_pages);


  // Tells the renderer process to enter or leave background mode.
  SetProcessBackgrounded(bool background);

  // Tells the scheduler about "keep-alive" state which can be due to:
  // service workers, shared workers, or fetch keep-alive.
  // If set to true, then the scheduler should not freeze the renderer.
  SetSchedulerKeepActive(bool keep_active);

  // Tells the renderer process to purge and suspend.
  ProcessPurgeAndSuspend();

  // Tells the renderer process that it has been locked to a site (i.e., a
  // scheme plus eTLD+1, such as https://google.com), or to a more specific
  // origin.
  SetIsLockedToSite();

  // Tells the renderer to enable V8's memory saving mode when possible.
  // This is only used when site-per-process is enabled. If the process
  // only contains subframes, V8's low memory mode will be enabled.
  // If a main frame exists or is created, the low memory mode will
  // be disabled.
  EnableV8LowMemoryMode();
};
