/*
 * 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 "nsILoadInfo.idl"
#include "nsISupports.idl"

webidl BrowsingContext;

interface nsIPrincipal;
interface nsIPolicyContainer;
interface nsIURI;

%{ C++
namespace mozilla {
class OriginAttributes;
namespace dom {
class BrowserParent;
} // namespace dom
} // namespace mozilla
%}
[ref] native const_OriginAttributes(const mozilla::OriginAttributes);
[ptr] native BrowserParent(mozilla::dom::BrowserParent);
[ref] native MaybeCOEPRef(const mozilla::Maybe<nsILoadInfo::CrossOriginEmbedderPolicy>);

/*
 * nsIBrowsingContextReadyCallback.browsingContextReady() is called within
 * nsFrameLoader to indicate that the browsing context for a newly opened
 * window/tab is ready.
 */
[uuid(0524ee06-7f4c-4cd3-ab80-084562745cad)]
interface nsIBrowsingContextReadyCallback : nsISupports
{
  void browsingContextReady(in BrowsingContext bc);
};

/**
 * nsIOpenWindowInfo is a helper type which contains details used when opening
 * new content windows. This object is used to correctly create new initial
 * content documents when creating a new window.
 */
[scriptable, builtinclass, uuid(30359edb-126c-4f65-ae80-07fb158697f9)]
interface nsIOpenWindowInfo : nsISupports {
  /** BrowsingContext which requested the creation of this new window */
  [infallible]
  readonly attribute BrowsingContext parent;

  /** If `true`, the content document should be created initially-remote */
  [infallible]
  readonly attribute boolean isRemote;

  /** Should |opener| be set on the newly-created content window? */
  [infallible]
  readonly attribute boolean forceNoOpener;

  /** Whether this is a window opened for printing */
  [infallible]
  readonly attribute boolean isForPrinting;

  /**
   * Whether this is a window opened for window.print().
   * When this is true, isForPrinting is necessarily true as well.
   */
  [infallible]
  readonly attribute boolean isForWindowDotPrint;

  /** Whether this new window creation was prompted by web content */
  [infallible]
  readonly attribute boolean isTopLevelCreatedByWebContent;

  /**
   * Whether there is a user gesture activation for the document
   * opened in the window.
   */
  [infallible]
  readonly attribute boolean hasValidUserGestureActivation;

  /**
   * Whether there is a text directive user activation for the document
   * opened in the window. If true, the first text directive may be scrolled
   * into view.
   */
  [infallible]
  readonly attribute boolean textDirectiveUserActivation;

  /**
   * The principal to inherit into the initial about:blank.
   */
  [notxpcom, nostdcall, binaryname(PrincipalToInheritForAboutBlank)]
  nsIPrincipal binaryGetPrincipalToInheritForAboutBlank();

  /**
   * The partitioned principal to inherit into the initial about:blank.
   */
  [notxpcom, nostdcall, binaryname(PartitionedPrincipalToInheritForAboutBlank)]
  nsIPrincipal binaryGetPartitionedPrincipalToInheritForAboutBlank();

  /**
   * The base URI to inherit into the initial about:blank.
   */
  [notxpcom, nostdcall, binaryname(BaseUriToInheritForAboutBlank)]
  nsIURI binaryGetBaseUriToInheritForAboutBlank();

  /**
   * The CSP to inherit into the initial about:blank.
   */
  [notxpcom, nostdcall, binaryname(PolicyContainerToInheritForAboutBlank)]
  nsIPolicyContainer binaryGetPolicyContainerToInheritForAboutBlank();

  /**
   * The COEP to inherit into the initial about:blank.
   */
  [notxpcom, nostdcall, binaryname(CoepToInheritForAboutBlank)]
  MaybeCOEPRef binaryGetCoepToInheritForAboutBlank();

  /** BrowserParent instance to use in the new window */
  [notxpcom, nostdcall]
  BrowserParent getNextRemoteBrowser();

  /** Origin Attributes for the to-be-created toplevel BrowsingContext */
  [implicit_jscontext, binaryname(ScriptableOriginAttributes)]
  readonly attribute jsval originAttributes;

  [notxpcom, nostdcall, binaryname(GetOriginAttributes)]
  const_OriginAttributes binaryGetOriginAttributes();

  /* Callback to invoke when the browsing context for a new window is ready. */
  [notxpcom, nostdcall]
  nsIBrowsingContextReadyCallback browsingContextReadyCallback();

  /**
   * When creating a window fails, we will be called to notify an error via
   * callback. If no callback, do nothing.
   */
  void cancel();

  /**
   * Clone this open window info and update the princpals to be inherited by the
   * initial about:blank document.
   */
  nsIOpenWindowInfo cloneWithPrincipals(in nsIPrincipal aPrincipal, in nsIPrincipal aPartitionedPrincipal);
};
