<!DOCTYPE html>
<html>
<head>
    <title>CSSOM CSSRule CSSImportRule interface</title>
    <link rel="author" title="Letitia Lew" href="mailto:lew.letitia@gmail.com">
    <link rel="help" href="http://www.w3.org/TR/cssom-1/#css-rules">
    <link rel="help" href="http://www.w3.org/TR/cssom-1/#the-cssrule-interface">
    <link rel="help" href="http://www.w3.org/TR/cssom-1/#the-cssimportrule-interface">
    <meta name="flags" content="dom">
    <meta name="assert" content="All properties for this CSSImportRule instance of CSSRule are initialized correctly">
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>

    <style id="styleElement" type="text/css">
        @import url("support/a-green.css");
        @import url("support/a-green.css") screen;
        @import url("support/a-green.css") all;
        @page { background-color: red; }
    </style>
</head>
<body>
    <div id="log"></div>

    <script type="text/javascript">
        var styleSheet, ruleList, rule, ruleWithMedia, ruleWithMediaAll;
        setup(function() {
            styleSheet = document.getElementById("styleElement").sheet;
            ruleList = styleSheet.cssRules;
            rule = ruleList[0];
            ruleWithMedia = ruleList[1];
            ruleWithMediaAll = ruleList[2];
        });

        test(function() {
            assert_true(rule instanceof CSSRule);
            assert_true(rule instanceof CSSImportRule);
            assert_true(ruleWithMedia instanceof CSSRule);
            assert_true(ruleWithMedia instanceof CSSImportRule);
        }, "CSSRule and CSSImportRule types");

        test(function() {
            assert_equals(rule.STYLE_RULE, 1);
            assert_equals(rule.IMPORT_RULE, 3);
            assert_equals(rule.MEDIA_RULE, 4);
            assert_equals(rule.FONT_FACE_RULE, 5);
            assert_equals(rule.PAGE_RULE, 6);
            assert_equals(rule.NAMESPACE_RULE, 10);
            assert_idl_attribute(rule, "type");
            assert_equals(typeof rule.type, "number");
        }, "Type of CSSRule#type and constant values");

        test(function() {
            assert_true(rule instanceof CSSRule);
            assert_idl_attribute(rule, "cssText");
            assert_idl_attribute(rule, "parentRule");
            assert_idl_attribute(rule, "parentStyleSheet");

            assert_readonly(rule, "type");
            assert_readonly(rule, "parentRule");
            assert_readonly(rule, "parentStyleSheet");
        }, "Existence and writability of CSSRule attributes");

        test(function() {
            assert_equals(rule.type, rule.IMPORT_RULE);
            assert_equals(typeof rule.cssText, "string");
            assert_equals(rule.cssText, '@import url("support/a-green.css");');
            assert_equals(ruleWithMedia.cssText, '@import url("support/a-green.css") screen;');
            assert_equals(ruleWithMediaAll.cssText, '@import url("support/a-green.css") all;');
            assert_equals(rule.parentRule, null);
            assert_true(rule.parentStyleSheet instanceof CSSStyleSheet);
        }, "Values of CSSRule attributes");

        test(function() {
            assert_idl_attribute(rule, "href");
            assert_idl_attribute(rule, "media");
            assert_idl_attribute(rule, "styleSheet");

            assert_readonly(rule, "href");
            assert_readonly(rule, "media");
            assert_readonly(rule, "styleSheet");
        }, "Existence and writability of CSSImportRule attributes");

        test(function() {
            assert_equals(typeof rule.href, "string");
            assert_true(rule.media instanceof MediaList);
            assert_true(rule.styleSheet instanceof CSSStyleSheet);
            assert_true(ruleWithMedia.media.length > 0);
            assert_equals(ruleWithMedia.media.mediaText, "screen");
        }, "Values of CSSImportRule attributes");

        test(function() {
            ruleWithMedia.media = "print";
            assert_equals(ruleWithMedia.media.mediaText, "print");
        }, "CSSImportRule : MediaList mediaText attribute should be updated due to [PutForwards]");

        test(function() {
            var ruleWithPage = ruleList[3];
            ruleWithPage.style = "margin-top: 10px;"
            assert_equals(ruleWithPage.style.cssText, "margin-top: 10px;");
        }, "CSSStyleDeclaration cssText attribute should be updated due to [PutForwards]");

        test(function() {
            styleSheet.media = "screen";
            assert_equals(styleSheet.media.mediaText, "screen");
        }, "StyleSheet : MediaList mediaText attribute should be updated due to [PutForwards]");
    </script>
</body>
</html>
