// 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.

// This is used by the app window API internally to pass through messages to
// the shell window.
[nodoc] namespace app.currentWindowInternal {

  // Null or undefined indicates that a value should not change.
  dictionary Bounds {
    long? left;
    long? top;
    long? width;
    long? height;
  };

  // Null or undefined indicates that a value should not change. A value of 0
  // will clear the constraints.
  dictionary SizeConstraints {
    long? minWidth;
    long? minHeight;
    long? maxWidth;
    long? maxHeight;
  };

  dictionary RegionRect {
    long left;
    long top;
    long width;
    long height;
  };

  dictionary Region {
    RegionRect[]? rects;
  };

  interface Functions {
    static void focus();
    static void fullscreen();
    static void minimize();
    static void maximize();
    static void restore();
    static void drawAttention();
    static void clearAttention();
    static void show(optional boolean focused);
    static void hide();
    static void setBounds(DOMString boundsType, Bounds bounds);
    static void setSizeConstraints(DOMString boundsType,
                                   SizeConstraints constraints);
    static void setIcon(DOMString icon_url);
    static void setBadgeIcon(DOMString icon_url);
    static void clearBadge();
    static void setShape(Region region);
    static void setAlwaysOnTop(boolean always_on_top);
  };

  interface Events {
    static void onClosed();
    static void onBoundsChanged();
    static void onFullscreened();
    static void onMinimized();
    static void onMaximized();
    static void onRestored();
    // Only sent in tests.
    static void onWindowShownForTests();
  };
};
