/*
 * Copyright (C) 2006-2021 Apple Inc. All rights reserved.
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

typedef USVString CSSOMString;

[
    ExportMacro=WEBCORE_EXPORT,
    GenerateIsReachable,
    JSCustomHeader,
    JSCustomMarkFunction,
    SkipVTableValidation,
    Exposed=Window,
] interface CSSStyleDeclaration {
    [CEReactions] attribute CSSOMString cssText;
    readonly attribute unsigned long length;
    getter CSSOMString item(unsigned long index);
    CSSOMString getPropertyValue(CSSOMString property);
    CSSOMString getPropertyPriority(CSSOMString property);
    [CEReactions] undefined setProperty(CSSOMString property, [LegacyNullToEmptyString] CSSOMString value, optional [LegacyNullToEmptyString] CSSOMString priority = "");
    [CEReactions] CSSOMString removeProperty(CSSOMString property);
    readonly attribute CSSRule? parentRule;
    [CEReactions] attribute [LegacyNullToEmptyString] CSSOMString cssFloat;

    // Non-standard.
    DOMString? getPropertyShorthand(optional DOMString propertyName);
    boolean isPropertyImplicit(optional DOMString propertyName);
    DeprecatedCSSOMValue? getPropertyCSSValue(DOMString propertyName);
};
