/*
 * Copyright (C) 2018 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

enum RecordingState { "inactive", "recording", "paused" };

[
    ActiveDOMObject,
    Conditional=MEDIA_STREAM,
    Constructor(MediaStream stream, optional MediaRecorderOptions options),
    ConstructorCallWith=Document,
    ConstructorMayThrowException,
    EnabledAtRuntime=MediaRecorder,
    Exposed=Window
] interface MediaRecorder : EventTarget {
    readonly attribute RecordingState state;
    // FIXME: Implement these:
    // readonly attribute MediaStream stream;
    // readonly attribute DOMString mimeType;
    // attribute EventHandler onstart;
    attribute EventHandler onstop;
    attribute EventHandler ondataavailable;
    // attribute EventHandler onpause;
    // attribute EventHandler onresume;
    attribute EventHandler onerror;
    // readonly attribute unsigned long videoBitsPerSecond;
    // readonly attribute unsigned long audioBitsPerSecond;

    [MayThrowException, ImplementedAs=startRecording] void start(optional long timeslice);
    [ImplementedAs=stopRecording] void stop();
    // void pause();
    // void resume();
    // void requestData();

    // static boolean isTypeSupported(DOMString type);
};

dictionary MediaRecorderOptions {
    DOMString mimeType;
    unsigned long audioBitsPerSecond;
    unsigned long videoBitsPerSecond;
    unsigned long bitsPerSecond;
};
