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

  // TODO(asargent) - We need to add support for referencing types in
  // other namespaces (crbug.com/158654). For now just duplicate this
  // dictionary from app.window.
  dictionary Bounds {
    long? left;
    long? top;
    long? width;
    long? height;
  };

  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();
    static void hide();
    static void setBounds(Bounds bounds);
    static void setMinWidth(optional long minWidth);
    static void setMinHeight(optional long minHeight);
    static void setMaxWidth(optional long maxWidth);
    static void setMaxHeight(optional long maxHeight);
    static void setIcon(DOMString icon_url);
    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();
  };
};
