/*
 * Copyright (C) 2013 Google 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:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * 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.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
 * OWNER OR 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.
 */

// https://drafts.csswg.org/css-font-loading/#fontface-interface

enum FontFaceLoadStatus {
    "unloaded",
    "loading",
    "loaded",
    "error"
};

// TODO(foolip): This interface should be [Exposed=Window,Worker].
[
    ActiveScriptWrappable,
    DependentLifetime,
    // FIXME: This should be (DOMString or BinaryData), where BinaryData is typedef of (ArrayBuffer or ArrayBufferView)
    Constructor(DOMString family, (DOMString or ArrayBuffer or ArrayBufferView) source, optional FontFaceDescriptors descriptors),
    ConstructorCallWith=ExecutionContext,
    MeasureAs=FontFaceConstructor
] interface FontFace {
    [RaisesException=Setter, SetterCallWith=ExecutionContext] attribute DOMString family;
    [RaisesException=Setter, SetterCallWith=ExecutionContext] attribute DOMString style;
    [RaisesException=Setter, SetterCallWith=ExecutionContext] attribute DOMString weight;
    [RaisesException=Setter, SetterCallWith=ExecutionContext] attribute DOMString stretch;
    [RaisesException=Setter, SetterCallWith=ExecutionContext] attribute DOMString unicodeRange;
    [RaisesException=Setter, SetterCallWith=ExecutionContext] attribute DOMString variant;
    [RaisesException=Setter, SetterCallWith=ExecutionContext] attribute DOMString featureSettings;
    [RaisesException=Setter, SetterCallWith=ExecutionContext] attribute DOMString display;

    readonly attribute FontFaceLoadStatus status;

    [CallWith=ScriptState] Promise<FontFace> load();
    [CallWith=ScriptState] readonly attribute Promise<FontFace> loaded;
};
