/*
 * Copyright 2016 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.
 */

// https://dvcs.w3.org/hg/speech-api/raw-file/9a0075d25326/speechapi.html#speechreco-section

[
  Constructor,
  ConstructorCallWith=EnvironmentSettings,
]
interface SpeechRecognition : EventTarget {
  // recognition parameters
  attribute DOMString lang;
  attribute boolean continuous;
  attribute boolean interimResults;
  attribute unsigned long maxAlternatives;

  // methods to drive the speech interaction
  [RaisesException] void start();
  void stop();
  void abort();

  // event methods
  attribute EventHandler onsoundstart;
  attribute EventHandler onsoundend;
  attribute EventHandler onresult;
  attribute EventHandler onnomatch;
  attribute EventHandler onerror;
};

typedef EventListener? EventHandler;
