/*
 * 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 "DOMCSS.idl";

interface IDOMCSSRuleList;

[
    object,
    oleautomation,
    uuid(19126DDF-E82F-46c0-A2F9-16879D7DADC5),
    pointer_default(unique)
]
interface IDOMWindow : IDOMObject
{
    // DOM Level 2 AbstractView Interface
    //readonly attribute Document document;
    HRESULT document([out, retval] IDOMDocument** result);

    // DOM Level 2 Style Interface
    //CSSStyleDeclaration getComputedStyle(in Element element,
    //                                     in DOMString pseudoElement);
    HRESULT getComputedStyle([in] IDOMElement* element, [in] BSTR pseudoElement);

    // WebKit extensions
    //CSSRuleList getMatchedCSSRules(in Element element,
    //                               in DOMString pseudoElement,
    //                               in [Optional] boolean authorOnly);
    HRESULT getMatchedCSSRules([in] IDOMElement* element, [in] BSTR pseudoElement, [in] BOOL authorOnly, [out, retval] IDOMCSSRuleList** result);

    //readonly attribute double devicePixelRatio;
    HRESULT devicePixelRatio([out, retval] double* result);

    // Global constructors
    //attribute CSSPrimitiveValueConstructor CSSPrimitiveValue;
    //attribute CSSRuleConstructor CSSRule;
    //attribute CSSStyleDeclarationConstructor CSSStyleDeclaration;
    //attribute CSSValueConstructor CSSValue;
    //attribute DocumentConstructor Document;
    //attribute DocumentFragmentConstructor DocumentFragment;
    //attribute DOMParserConstructor DOMParser;
    //attribute ElementConstructor Element;
    //attribute EventConstructor Event;
    //attribute HTMLElementConstructor HTMLElement;
    //attribute HTMLDocumentConstructor HTMLDocument;
    //attribute MutationEventConstructor MutationEvent;
    //attribute NodeConstructor Node;
    //attribute NodeFilterConstructor NodeFilter;
    //attribute RangeConstructor Range;
    //attribute RangeExceptionConstructor RangeException;

    // Mozilla has a separate XMLDocument object for XML documents. 
    // We just use Document for this.
    //attribute DocumentConstructor XMLDocument;

    //attribute XMLSerializerConstructor XMLSerializer;

    //#ifdef XPATH_SUPPORT
    //attribute XPathEvaluatorConstructor XPathEvaluator;
    //attribute XPathResultConstructor XPathResult;
    //#endif
}
