// Copyright (c) 2012 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.

// Use the <code>chrome.app.window</code> API to create windows. Windows
// have an optional frame with title bar and size controls. They are not
// associated with any Chrome browser windows. See the <a
// href="https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/window-state">
// Window State Sample</a> for a demonstration of these options.
namespace app.window {

  // Previously named Bounds.
  dictionary ContentBounds {
    long? left;
    long? top;
    long? width;
    long? height;
  };

  dictionary BoundsSpecification {
    // The X coordinate of the content or window.
    long? left;

    // The Y coordinate of the content or window.
    long? top;

    // The width of the content or window.
    long? width;

    // The height of the content or window.
    long? height;

    // The minimum width of the content or window.
    long? minWidth;

    // The minimum height of the content or window.
    long? minHeight;

    // The maximum width of the content or window.
    long? maxWidth;

    // The maximum height of the content or window.
    long? maxHeight;
  };

  dictionary Bounds {
    // This property can be used to read or write the current X coordinate of
    // the content or window.
    long left;

    // This property can be used to read or write the current Y coordinate of
    // the content or window.
    long top;

    // This property can be used to read or write the current width of the
    // content or window.
    long width;

    // This property can be used to read or write the current height of the
    // content or window.
    long height;

    // This property can be used to read or write the current minimum width of
    // the content or window. A value of <code>null</code> indicates
    // 'unspecified'.
    long? minWidth;

    // This property can be used to read or write the current minimum height of
    // the content or window. A value of <code>null</code> indicates
    // 'unspecified'.
    long? minHeight;

    // This property can be used to read or write the current maximum width of
    // the content or window. A value of <code>null</code> indicates
    // 'unspecified'.
    long? maxWidth;

    // This property can be used to read or write the current maximum height of
    // the content or window. A value of <code>null</code> indicates
    // 'unspecified'.
    long? maxHeight;

    // Set the left and top position of the content or window.
    static void setPosition(long left, long top);

    // Set the width and height of the content or window.
    static void setSize(long width, long height);

    // Set the minimum size constraints of the content or window. The minimum
    // width or height can be set to <code>null</code> to remove the constraint.
    // A value of <code>undefined</code> will leave a constraint unchanged.
    static void setMinimumSize(long minWidth, long minHeight);

    // Set the maximum size constraints of the content or window. The maximum
    // width or height can be set to <code>null</code> to remove the constraint.
    // A value of <code>undefined</code> will leave a constraint unchanged.
    static void setMaximumSize(long maxWidth, long maxHeight);
  };

  dictionary FrameOptions {
    // Frame type: <code>none</code> or <code>chrome</code> (defaults to
    // <code>chrome</code>).
    //
    // For <code>none</code>, the <code>-webkit-app-region</code> CSS property
    // can be used to apply draggability to the app's window.
    //
    // <code>-webkit-app-region: drag</code> can be used to mark regions
    // draggable. <code>no-drag</code> can be used to disable this style on
    // nested elements.
    DOMString? type;
    // Allows the frame color to be set. Frame coloring is only available if the
    // frame type is <code>chrome</code>.
    //
    // Frame coloring is new in Chrome 36.
    DOMString? color;
    // Allows the frame color of the window when active to be set. Frame
    // coloring is only available if the frame type is <code>chrome</code>.
    //
    // Frame coloring is only available if the frame type is
    // <code>chrome</code>.
    //
    // Frame coloring is new in Chrome 36.
    DOMString? activeColor;
    // Allows the frame color of the window when inactive to be set differently
    // to the active color. Frame
    // coloring is only available if the frame type is <code>chrome</code>.
    //
    // <code>inactiveColor</code> must be used in conjunction with <code>
    // color</code>.
    //
    // Frame coloring is new in Chrome 36.
    DOMString? inactiveColor;
  };

  // State of a window: normal, fullscreen, maximized, minimized.
  enum State { normal, fullscreen, maximized, minimized };

  // 'shell' is the default window type. 'panel' is managed by the OS
  // (Currently experimental, Ash only).
  [nodoc] enum WindowType { shell, panel };

  [noinline_doc] dictionary CreateWindowOptions {
    // Id to identify the window. This will be used to remember the size
    // and position of the window and restore that geometry when a window
    // with the same id is later opened.
    // If a window with a given id is created while another window with the same
    // id already exists, the currently opened window will be focused instead of
    // creating a new window.
    DOMString? id;

    // Used to specify the initial position, initial size and constraints of the
    // window's content (excluding window decorations).
    // If an <code>id</code> is also specified and a window with a matching
    // <code>id</code> has been shown before, the remembered bounds will be used
    // instead.
    //
    // Note that the padding between the inner and outer bounds is determined by
    // the OS. Therefore setting the same bounds property for both the
    // <code>innerBounds</code> and <code>outerBounds</code> will result in an
    // error.
    //
    // This property is new in Chrome 36.
    BoundsSpecification? innerBounds;

    // Used to specify the initial position, initial size and constraints of the
    // window (including window decorations such as the title bar and frame).
    // If an <code>id</code> is also specified and a window with a matching
    // <code>id</code> has been shown before, the remembered bounds will be used
    // instead.
    //
    // Note that the padding between the inner and outer bounds is determined by
    // the OS. Therefore setting the same bounds property for both the
    // <code>innerBounds</code> and <code>outerBounds</code> will result in an
    // error.
    //
    // This property is new in Chrome 36.
    BoundsSpecification? outerBounds;

    // Default width of the window.
    [nodoc, deprecated="Use $(ref:BoundsSpecification)."] long? defaultWidth;

    // Default height of the window.
    [nodoc, deprecated="Use $(ref:BoundsSpecification)."] long? defaultHeight;

    // Default X coordinate of the window.
    [nodoc, deprecated="Use $(ref:BoundsSpecification)."] long? defaultLeft;

    // Default Y coordinate of the window.
    [nodoc, deprecated="Use $(ref:BoundsSpecification)."] long? defaultTop;

    // Width of the window.
    [nodoc, deprecated="Use $(ref:BoundsSpecification)."] long? width;

    // Height of the window.
    [nodoc, deprecated="Use $(ref:BoundsSpecification)."] long? height;

    // X coordinate of the window.
    [nodoc, deprecated="Use $(ref:BoundsSpecification)."] long? left;

    // Y coordinate of the window.
    [nodoc, deprecated="Use $(ref:BoundsSpecification)."] long? top;

    // Minimum width of the window.
    [deprecated="Use innerBounds or outerBounds."] long? minWidth;

    // Minimum height of the window.
    [deprecated="Use innerBounds or outerBounds."] long? minHeight;

    // Maximum width of the window.
    [deprecated="Use innerBounds or outerBounds."] long? maxWidth;

    // Maximum height of the window.
    [deprecated="Use innerBounds or outerBounds."] long? maxHeight;

    // Type of window to create.
    [nodoc] WindowType? type;

    // Creates a special ime window. This window is not focusable and can be
    // stacked above virtual keyboard window. This is restriced to component ime
    // extensions.
    // Requires app.window.ime API permission.
    [nodoc] boolean? ime;

    // Frame type: <code>none</code> or <code>chrome</code> (defaults to
    // <code>chrome</code>). For <code>none</code>, the
    // <code>-webkit-app-region</code> CSS property can be used to apply
    // draggability to the app's window. <code>-webkit-app-region: drag</code>
    // can be used to mark regions draggable. <code>no-drag</code> can be used
    // to disable this style on nested elements.
    //
    // Use of <code>FrameOptions</code> is new in M36.
    (DOMString or FrameOptions)? frame;

    // Size and position of the content in the window (excluding the titlebar).
    // If an id is also specified and a window with a matching id has been shown
    // before, the remembered bounds of the window will be used instead.
    [deprecated="Use innerBounds or outerBounds."] ContentBounds? bounds;

    // Enable window background transparency.
    // Only supported in ash. Requires app.window.alpha API permission.
    boolean? alphaEnabled;

    // The initial state of the window, allowing it to be created already
    // fullscreen, maximized, or minimized. Defaults to 'normal'.
    State? state;

    // If true, the window will be created in a hidden state. Call show() on
    // the window to show it once it has been created. Defaults to false.
    boolean? hidden;

    // If true, the window will be resizable by the user. Defaults to true.
    boolean? resizable;

    // By default if you specify an id for the window, the window will only be
    // created if another window with the same id doesn't already exist. If a
    // window with the same id already exists that window is activated instead.
    // If you do want to create multiple windows with the same id, you can
    // set this property to false.
    [deprecated="Multiple windows with the same id is no longer supported."] boolean? singleton;

    // If true, the window will stay above most other windows. If there are
    // multiple windows of this kind, the currently focused window will be in
    // the foreground. Requires the <code>"alwaysOnTopWindows"</code>
    // permission. Defaults to false.
    //
    // Call <code>setAlwaysOnTop()</code> on the window to change this property
    // after creation.
    boolean? alwaysOnTop;

    // If true, the window will be focused when created. Defaults to true.
    boolean? focused;

    // If true, the window will be visible on all workspaces.
    // This is only available on dev channel.
    boolean? visibleOnAllWorkspaces;
  };

  // Called in the creating window (parent) before the load event is called in
  // the created window (child). The parent can set fields or functions on the
  // child usable from onload. E.g. background.js:
  //
  // <code>function(createdWindow) { createdWindow.contentWindow.foo =
  // function () { }; };</code>
  //
  // window.js:
  //
  // <code>window.onload = function () { foo(); }</code>
  callback CreateWindowCallback =
      void ([instanceOf=AppWindow] object createdWindow);

  [noinline_doc] dictionary AppWindow {
    // Focus the window.
    static void focus();

    // Fullscreens the window.
    //
    // The user will be able to restore the window by pressing ESC. An
    // application can prevent the fullscreen state to be left when ESC is
    // pressed by requesting the <b>overrideEscFullscreen</b> permission and
    // canceling the event by calling .preventDefault(), like this:
    //
    // <code>window.onKeyDown = function(e) { if (e.keyCode == 27 /* ESC */) {
    // e.preventDefault(); } };</code>
    static void fullscreen();

    // Is the window fullscreen?
    static boolean isFullscreen();

    // Minimize the window.
    static void minimize();

    // Is the window minimized?
    static boolean isMinimized();

    // Maximize the window.
    static void maximize();

    // Is the window maximized?
    static boolean isMaximized();

    // Restore the window, exiting a maximized, minimized, or fullscreen state.
    static void restore();

    // Move the window to the position (|left|, |top|).
    static void moveTo(long left, long top);

    // Resize the window to |width|x|height| pixels in size.
    static void resizeTo(long width, long height);

    // Draw attention to the window.
    static void drawAttention();

    // Clear attention to the window.
    static void clearAttention();

    // Close the window.
    static void close();

    // Show the window. Does nothing if the window is already visible.
    // Focus the window if |focused| is set to true or omitted.
    static void show(optional boolean focused);

    // Hide the window. Does nothing if the window is already hidden.
    static void hide();

    // Get the window's inner bounds as a $(ref:ContentBounds) object.
    [nocompile, deprecated="Use innerBounds or outerBounds."] static ContentBounds getBounds();

    // Set the window's inner bounds.
    [nocompile, deprecated="Use innerBounds or outerBounds."] static void setBounds(ContentBounds bounds);

    // Set the app icon for the window (experimental).
    // Currently this is only being implemented on Ash.
    // TODO(stevenjb): Investigate implementing this on Windows and OSX.
    [nodoc] static void setIcon(DOMString iconUrl);

    // Set a badge icon for the window.
    // TODO(benwells): Document this properly before going to stable.
    [nodoc] static void setBadgeIcon(DOMString iconUrl);

    // Clear the current for the window.
    // TODO(benwells): Document this properly before going to stable.
    [nodoc] static void clearBadge();

    // Is the window always on top?
    static boolean isAlwaysOnTop();

    // Accessors for testing.
    [nodoc] boolean hasFrameColor;
    [nodoc] long activeFrameColor;
    [nodoc] long inactiveFrameColor;
    [nodoc] boolean? firstShowHasHappened;

    // Set whether the window should stay above most other windows. Requires the
    // <code>"alwaysOnTopWindows"</code> permission.
    static void setAlwaysOnTop(boolean alwaysOnTop);

    // Can the window use alpha transparency?
    // TODO(jackhou): Document this properly before going to stable.
    [nodoc] static boolean alphaEnabled();

    // For platforms that support multiple workspaces, is this window visible on
    // all of them?
    // This is only available on dev channel.
    static void setVisibleOnAllWorkspaces(boolean alwaysVisible);

    // The JavaScript 'window' object for the created child.
    [instanceOf=Window] object contentWindow;

    // The id the window was created with.
    DOMString id;

    // The position, size and constraints of the window's content, which does
    // not include window decorations.
    // This property is new in Chrome 36.
    Bounds innerBounds;

    // The position, size and constraints of the window, which includes window
    // decorations, such as the title bar and frame.
    // This property is new in Chrome 36.
    Bounds outerBounds;
  };

  interface Functions {
    // The size and position of a window can be specified in a number of
    // different ways. The most simple option is not specifying anything at
    // all, in which case a default size and platform dependent position will
    // be used.
    //
    // To set the position, size and constraints of the window, use the
    // <code>innerBounds</code> or <code>outerBounds</code> properties. Inner
    // bounds do not include window decorations. Outer bounds include the
    // window's title bar and frame. Note that the padding between the inner and
    // outer bounds is determined by the OS. Therefore setting the same property
    // for both inner and outer bounds is considered an error (for example,
    // setting both <code>innerBounds.left</code> and
    // <code>outerBounds.left</code>).
    //
    // To automatically remember the positions of windows you can give them ids.
    // If a window has an id, This id is used to remember the size and position
    // of the window whenever it is moved or resized. This size and position is
    // then used instead of the specified bounds on subsequent opening of a
    // window with the same id. If you need to open a window with an id at a
    // location other than the remembered default, you can create it hidden,
    // move it to the desired location, then show it.
    static void create(DOMString url,
                       optional CreateWindowOptions options,
                       optional CreateWindowCallback callback);

    // Returns an $(ref:AppWindow) object for the
    // current script context (ie JavaScript 'window' object). This can also be
    // called on a handle to a script context for another page, for example:
    // otherWindow.chrome.app.window.current().
    [nocompile] static AppWindow current();
    [nocompile, nodoc] static void initializeAppWindow(object state);

    // Gets an array of all currently created app windows. This method is new in
    // Chrome 33.
    [nocompile] static AppWindow[] getAll();

    // Gets an $(ref:AppWindow) with the given id. If no window with the given id
    // exists null is returned. This method is new in Chrome 33.
    [nocompile] static AppWindow get(DOMString id);

    // Does the current platform support windows being visible on all
    // workspaces?
    [nocompile] static boolean canSetVisibleOnAllWorkspaces();
  };

  interface Events {
    // Fired when the window is resized.
    [nocompile] static void onBoundsChanged();

    // Fired when the window is closed. Note, this should be listened to from
    // a window other than the window being closed, for example from the
    // background page. This is because the window being closed will be in the
    // process of being torn down when the event is fired, which means not all
    // APIs in the window's script context will be functional.
    [nocompile] static void onClosed();

    // Fired when the window is fullscreened.
    [nocompile] static void onFullscreened();

    // Fired when the window is maximized.
    [nocompile] static void onMaximized();

    // Fired when the window is minimized.
    [nocompile] static void onMinimized();

    // Fired when the window is restored from being minimized or maximized.
    [nocompile] static void onRestored();

    // Fired when the window's ability to use alpha transparency changes.
    [nocompile, nodoc] static void onAlphaEnabledChanged();

    // Event for testing. Lets tests wait until a window has been shown.
    [nocompile, nodoc] static void onWindowFirstShown();
  };
};
