/*
 * 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;
    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;
};
