/*
 * Copyright (C) 2006, 2007, 2009 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.
 */

// http://dev.w3.org/csswg/cssom/#the-cssrule-interface

[
    DependentLifetime,
    WillBeGarbageCollected,
] interface CSSRule {
    const unsigned short STYLE_RULE = 1;
    const unsigned short CHARSET_RULE = 2;
    const unsigned short IMPORT_RULE = 3;
    const unsigned short MEDIA_RULE = 4;
    const unsigned short FONT_FACE_RULE = 5;
    const unsigned short PAGE_RULE = 6;
    // TODO(philipj): Implement CSSMarginRule.
    // const unsigned short MARGIN_RULE = 9;
    // TODO(philipj): Implement CSSNamespaceRule. crbug.com/389549
    // const unsigned short NAMESPACE_RULE = 10;
    readonly attribute unsigned short type;
    attribute DOMString cssText;
    readonly attribute CSSRule? parentRule;
    readonly attribute CSSStyleSheet? parentStyleSheet;

    // CSS Animations
    // http://dev.w3.org/csswg/css-animations/#interface-cssrule
    const unsigned short KEYFRAMES_RULE = 7;
    const unsigned short KEYFRAME_RULE = 8;

    // CSS Conditional Rules
    // http://dev.w3.org/csswg/css-conditional/#extentions-to-cssrule-interface
    const unsigned short SUPPORTS_RULE = 12;

    // CSS Device Adaptation
    // http://dev.w3.org/csswg/css-device-adapt/#css-rule-interface
    [RuntimeEnabled=CSSViewport] const unsigned short VIEWPORT_RULE = 15;

    // Non-standard APIs
    const unsigned short WEBKIT_KEYFRAMES_RULE = 7;
    const unsigned short WEBKIT_KEYFRAME_RULE = 8;
};
