/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */


#include "domstubs.idl"

interface nsIPrincipal;

[builtinclass, scriptable, uuid(8e49f7b0-1f98-4939-bf91-e9c39cd56434)]
interface nsITabParent : nsISupports
{
  void getChildProcessOffset(out int32_t aCssX, out int32_t aCssY);

  readonly attribute boolean useAsyncPanZoom;

  /**
   * Manages the docshell active state of the remote browser. Setting the
   * docShell to be active will also cause it to render layers and upload
   * them to the compositor. Setting the docShell as not active will clear
   * those layers.
   */
  attribute boolean docShellIsActive;

  /**
   * When set to true, this tells the child to paint and upload layers to
   * the compositor. When set to false, previous layers are cleared from
   * the compositor, but only if preserveLayers is also set to false.
   */
  attribute boolean renderLayers;

  /**
   * True if layers are being rendered and the compositor has reported
   * receiving them.
   */
  readonly attribute boolean hasLayers;

  /**
   * Sends a message to the child ensuring that they paint as early as
   * possible. This will send the message to paint even if renderLayers
   * is already true.
   */
  void forceRepaint();

  /**
   * As an optimisation, setting the docshell's active state to
   * inactive also triggers a layer invalidation to free up some
   * potentially unhelpful memory usage. Calling preserveLayers
   * will cause the layers to be preserved even for inactive
   * docshells.
   */
  void preserveLayers(in boolean aPreserveLayers);

  /**
   * During interactions where painting performance
   * is more important than scrolling, we may temporarily
   * suppress the displayport. Each enable called must be matched
   * with a disable call.
   */
  void suppressDisplayport(in bool aEnabled);

  readonly attribute uint64_t tabId;

  /**
   * The OS level process Id of the related child process.
   */
  readonly attribute int32_t osPid;

  /**
   * Navigate by key. If aForDocumentNavigation is true, navigate by document.
   * If aForDocumentNavigation is false, navigate by element.
   *
   * If aForward is true, navigate to the first focusable element or document.
   * If aForward is false, navigate to the last focusable element or document.
   */
  void navigateByKey(in bool aForward, in bool aForDocumentNavigation);

  readonly attribute boolean hasContentOpener;
  /**
   * True if we've previously received layers for this tab when switching to
   * it.
   */
  readonly attribute boolean hasPresented;

  /**
   * Ensures that the content process which has this tab parent has all of the
   * permissions required to load a document with the given principal.
   */
  void transmitPermissionsForPrincipal(in nsIPrincipal aPrincipal);

  /**
   * True if any of the frames loaded in the TabChild have registered
   * an onbeforeunload event handler.
   */
  readonly attribute boolean hasBeforeUnload;

  /**
   * Notify APZ to start autoscrolling.
   * (aAnchorX, aAnchorY) are the coordinates of the autoscroll anchor,
   * in CSS coordinates relative to the screen. aScrollId and 
   * aPresShellId identify the scroll frame that content chose to scroll.
   * Returns whether we were successfully able to notify APZ.
   * If this function returns true, APZ (which may live in another process)
   * may still reject the autoscroll, but it's then APZ's reponsibility
   * to notify content via an "autoscroll-rejected-by-apz" message.
   */
  boolean startApzAutoscroll(in float aAnchorX, in float aAnchorY,
                             in nsViewID aScrollId, in uint32_t aPresShellId);

  /**
   * Notify APZ to stop autoscrolling.
   * aScrollId and aPresShellId identify the scroll frame that is being
   * autoscrolled.
   */
  void stopApzAutoscroll(in nsViewID aScrollId, in uint32_t aPresShellId);
};
