/*
 * Copyright (C) 2006, 2007 Apple 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:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. 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.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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. 
 */

cpp_quote("/*")
cpp_quote(" * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.")
cpp_quote(" *")
cpp_quote(" * Redistribution and use in source and binary forms, with or without")
cpp_quote(" * modification, are permitted provided that the following conditions")
cpp_quote(" * are met:")
cpp_quote(" * 1. Redistributions of source code must retain the above copyright")
cpp_quote(" *    notice, this list of conditions and the following disclaimer.")
cpp_quote(" * 2. Redistributions in binary form must reproduce the above copyright")
cpp_quote(" *    notice, this list of conditions and the following disclaimer in the")
cpp_quote(" *    documentation and/or other materials provided with the distribution.")
cpp_quote(" *")
cpp_quote(" * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY")
cpp_quote(" * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE")
cpp_quote(" * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR")
cpp_quote(" * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR")
cpp_quote(" * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,")
cpp_quote(" * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,")
cpp_quote(" * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR")
cpp_quote(" * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY")
cpp_quote(" * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT")
cpp_quote(" * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE")
cpp_quote(" * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ")
cpp_quote(" */")

import "oaidl.idl";
import "ocidl.idl";
import "DOMCore.idl";
import "IWebScriptObject.idl";

interface IDOMObject;
interface IDOMCSSValue;
interface IDOMCSSStyleDeclaration;
interface IDOMCSSStyleSheet;
interface IDOMCSSRule;
interface IDOMElement;

/*
    @interface DOMDocument (DOMViewCSS)
*/
[
    object,
    oleautomation,
    uuid(43EFE238-A4DF-400a-983D-FCE0C0F56BCD),
    pointer_default(unique)
]
interface IDOMViewCSS : IUnknown
{
    /*
        - (DOMCSSStyleDeclaration *)getComputedStyle:(DOMElement *)elt :(NSString *)pseudoElt;
    */
    HRESULT getComputedStyle([in] IDOMElement* elt, [in] BSTR pseudoElt, [out, retval] IDOMCSSStyleDeclaration** result);
}

/*
    @interface DOMCSSRuleList : DOMObject
*/
[
    object,
    oleautomation,
    uuid(D45DA43D-5EDB-4315-A097-3ED3FA089193),
    pointer_default(unique)
]
interface IDOMCSSRuleList : IDOMObject
{
    /*
        - (unsigned)length;
    */
    HRESULT length([out, retval] UINT* result);

    /*
        - (DOMCSSRule *)item:(unsigned)index;
    */
    HRESULT item([in] UINT index, [out, retval] IDOMCSSRule** result);
}

/*
    @interface DOMCSSRule : DOMObject
*/
[
    object,
    oleautomation,
    uuid(05947A31-9E1C-4c98-8608-6688959D6542),
    pointer_default(unique)
]
interface IDOMCSSRule : IDOMObject
{
    /*
        - (unsigned short)type;
    */
    HRESULT type([out, retval] unsigned short* result);

    /*
        - (NSString *)cssText;
    */
    HRESULT cssText([out, retval] BSTR* text);

    /*
        - (void)setCssText:(NSString *)cssText;
    */
    HRESULT setCssText([in] BSTR cssText);

    /*
        - (DOMCSSStyleSheet *)parentStyleSheet;
    */
    HRESULT parentStyleSheet([out, retval] IDOMCSSStyleSheet** sheet);

    /*
        - (DOMCSSRule *)parentRule;
    */
    HRESULT parentRule([out, retval] IDOMCSSRule** rule);
}

/*
    @interface DOMCSSStyleDeclaration : DOMObject
*/
[
    object,
    oleautomation,
    uuid(DBBE9A6B-D505-4647-B4AB-40A7CF3EE63E),
    pointer_default(unique)
]
interface IDOMCSSStyleDeclaration : IDOMObject
{
    /*
        - (NSString *)cssText;
    */
    HRESULT cssText([out, retval] BSTR* result);

    /*
        - (void)setCssText:(NSString *)cssText;
    */
    HRESULT setCssText([in] BSTR cssText);

    /*
        - (NSString *)getPropertyValue:(NSString *)propertyName;
    */
    HRESULT getPropertyValue([in] BSTR propertyName, [out, retval] BSTR* result);

    /*
        - (DOMCSSValue *)getPropertyCSSValue:(NSString *)propertyName;
    */
    HRESULT getPropertyCSSValue([in] BSTR propertyName, [out, retval] IDOMCSSValue** result);

    /*
        - (NSString *)removeProperty:(NSString *)propertyName;
    */
    HRESULT removeProperty([in] BSTR propertyName, [out, retval] BSTR* result);

    /*
        - (NSString *)getPropertyPriority:(NSString *)propertyName;
    */
    HRESULT getPropertyPriority([in] BSTR propertyName, [out, retval] BSTR* result);

    /*
        - (void)setProperty:(NSString *)propertyName :(NSString *)value :(NSString *)priority;
    */
    HRESULT setProperty([in] BSTR propertyName, [in] BSTR value, [in] BSTR priority);

    /*
        - (unsigned)length;
    */
    HRESULT length([out, retval] UINT* result);

    /*
        - (NSString *)item:(unsigned)index;
    */
    HRESULT item([in] UINT index, [out, retval] BSTR* result);

    /*
        - (DOMCSSRule *)parentRule;
    */
    HRESULT parentRule([out, retval] IDOMCSSRule** result);
}

/*
    @interface DOMCSSValue : DOMObject
*/
[
    object,
    oleautomation,
    uuid(51D29553-2AF7-4f52-AFE6-3C59196A8BAA),
    pointer_default(unique)
]
interface IDOMCSSValue : IDOMObject
{
    /*
        - (NSString *)cssText;
    */
    HRESULT cssText([out, retval] BSTR* text);

    /*
        - (void)setCssText:(NSString *)cssText;
    */
    HRESULT setCssText([in] BSTR text);

    /*
        - (unsigned short)cssValueType;
    */
    HRESULT cssValueType([out, retval] unsigned short *valueType);
}

/*
    @interface DOMCSSStyleSheet : DOMStyleSheet
*/
[
    object,
    oleautomation,
    uuid(14B1C213-1458-48a1-AD8F-54BFE64F9ECF),
    pointer_default(unique)
]
interface IDOMCSSStyleSheet : IDOMObject
{
    /*
        - (DOMCSSRule *)ownerRule;
    */
    HRESULT ownerRule([out, retval] IDOMCSSRule** rule);

    /*
        - (DOMCSSRuleList *)cssRules;
    */
    HRESULT cssRules([out, retval] IDOMCSSRuleList** ruleList);

    /*
        - (unsigned)insertRule:(NSString *)rule :(unsigned)index;
    */
    HRESULT insertRule([in] BSTR rule, [in] UINT index, [out, retval] UINT* result);

    /*
        - (void)deleteRule:(unsigned)index;
    */
    HRESULT deleteRule([in] UINT index);
}

/*
    @interface DOMElement (DOMElementCSSInlineStyle)
*/
[
    object,
    oleautomation,
    uuid(585127E2-D698-44c4-83EC-4D1E6E07E90D),
    pointer_default(unique)
]
interface IDOMElementCSSInlineStyle : IUnknown
{
    /*
        - (DOMCSSStyleDeclaration *)style;
    */
    HRESULT style([out, retval] IDOMCSSStyleDeclaration** result);
}
