// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

interface H5vccSystem {
  readonly attribute boolean areKeysReversed;
  readonly attribute DOMString buildId;
  readonly attribute DOMString platform;
  readonly attribute DOMString region;
  readonly attribute DOMString version;
  boolean triggerHelp();

  // enum UserOnExitStrategy
  //
  // When a user requests to leave the application, window.close() should be
  // called.
  const unsigned long USER_ON_EXIT_STRATEGY_CLOSE = 0;
  // When a user requests to leave the application, window.minimize() should be
  // called.
  const unsigned long USER_ON_EXIT_STRATEGY_MINIMIZE = 1;
  // The user should not be allowed to initiate an application exit request.
  const unsigned long USER_ON_EXIT_STRATEGY_NO_EXIT = 2;

  // This variable defines what Cobalt's preferred strategy should be for
  // handling internally triggered application exit requests (e.g. the user
  // chooses to back out of the application).  See the comments in the
  // enum above for more information about possible values.
  readonly attribute unsigned long userOnExitStrategy;
};
