// Copyright 2017 The Cobalt Authors. 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 API for hiding, showing, focusing, blurring, and receiving input
// from an on screen keyboard.

[
  Conditional=COBALT_ENABLE_ON_SCREEN_KEYBOARD
] interface OnScreenKeyboard : EventTarget {
  Promise<void> show();
  Promise<void> hide();
  Promise<void> focus();
  Promise<void> blur();
  Promise<void> updateSuggestions(sequence<DOMString> suggestions);
  readonly attribute boolean shown;
  // If the keyboard has suggestions implemented. If false, calling
  // updateSuggestions() will result in the promise being immediately rejected.
  readonly attribute boolean suggestionsSupported;

  // If the keyboard is shown, return bounding rectangle in screen pixel
  // coordinates, otherwise return NULL.
  readonly attribute DOMRect? boundingRect;

  // If the keyboard should keep focus, preventing focus from moving away from
  // the keyboard due to user input.
  attribute boolean keepFocus;

  attribute DOMString data;

  attribute EventHandler onshow;
  attribute EventHandler onhide;
  attribute EventHandler onfocus;
  attribute EventHandler onblur;
  attribute EventHandler oninput;
};
