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

// Custom, not a standard.

// This is an API for accessing system-level closed caption settings and
// exposing them to HTML5 apps. It supports detecting if captions are enabled at
// a system level, and retreiving values of various captioning style
// properties assigned by the system.

// For each captioning style property that this API supports, there are two
// attributes. The first accesses the system-level setting for a property, and
// the second determines the state of that property. For possible states, see
// ./caption_state.idl. To use a particular property, you should check its
// state first to ensure that the property is properly supported.
// For example, if you want to get your system's font size, you would first
// check the value of the "fontSizeState" attribute. If it contains
// "unsupported", then the system does not support font size settings, so use
// your application's font size settings instead. If it contains "unset", then
// the user has not set the property in their system, so you should also use
// your application settings instead. If it contains another value, then you
// can safely access the corresponding "fontSize" attribute. If you attempt
// to access a property that is unsupported or unset, it will return null.

// One property which behaves a bit differently is the one that determines
// whether captions are enabled or disabled at a system level. It is important
// to note that this property can both be read from and written to, and if using
// either of these behaviors, you should use the corresponding check to ensure
// that it is supported.  If you try to read from the property and doing so is
// not supported, it will return false. If you try to write to it and doing so
// is not supported, the value will silently not change.

[Constructor]
interface SystemCaptionSettings : EventTarget {

  // TODO: Make the functions for style properties return nullable enum types
  // instead of nullable DOMStrings.
  // It seems that Cobalt's bindings generation code does not support
  // nullable enums in IDL. To handle this, the attributes for style properties
  // return nullable DOMStrings instead.  The underlying Cobalt implementation
  // ensures that a string corresponding to the proper enum value is returned
  // by each attribute.

  readonly attribute DOMString? backgroundColor;
  readonly attribute CaptionState backgroundColorState;

  readonly attribute DOMString? backgroundOpacity;
  readonly attribute CaptionState backgroundOpacityState;

  readonly attribute DOMString? characterEdgeStyle;
  readonly attribute CaptionState characterEdgeStyleState;

  readonly attribute DOMString? fontColor;
  readonly attribute CaptionState fontColorState;

  readonly attribute DOMString? fontFamily;
  readonly attribute CaptionState fontFamilyState;

  readonly attribute DOMString? fontOpacity;
  readonly attribute CaptionState fontOpacityState;

  readonly attribute DOMString? fontSize;
  readonly attribute CaptionState fontSizeState;

  readonly attribute DOMString? windowColor;
  readonly attribute CaptionState windowColorState;

  readonly attribute DOMString? windowOpacity;
  readonly attribute CaptionState windowOpacityState;

  // "enabled" means that the user has chosen to enable closed captions
  // on the system.
  attribute boolean isEnabled;

  // There are separate checks for reading and writing to the enabled attribute,
  // as some systems allow the value to be queried but not written to. Setting
  // the enabled attribute will change the system-wide enabled setting.
  // Attemping to read isEnabled when supportsIsEnabled is false will
  // always return false. Attemping to set isEnabled when supportsSetEnabled is
  // false will fail silently.
  readonly attribute boolean supportsIsEnabled;
  readonly attribute boolean supportsSetEnabled;

  // Some platforms may specify that when setting a property, it should override
  // data from video streams and application settings (unless the application
  // has its own overrides). Depending on whether this attribute contains true
  // or false, the CaptionState return value should be interpreted differently.
  // Refer to the documentation in ./caption_state.idl for details.
  readonly attribute boolean supportsOverride;

  attribute EventHandler onchanged;

};