/*
 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
 * Copyright (C) 2006, 2007 Samuel Weinig <sam@webkit.org>
 *
 * 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.
 */

module core {

    interface [
        GenerateConstructor,
        GenerateToJS,
        GenerateNativeConverter,
        CustomMarkFunction,
        InlineGetOwnPropertySlot,
        InterfaceUUID=48BB95FC-2D08-4c54-BE65-7558736A4CAE,
        ImplementationUUID=FF5CBE81-F817-429c-A6C2-0CCCD2328062
    ] Document : Node {

        // DOM Level 1 Core
        readonly attribute DocumentType doctype;
        readonly attribute [V8Custom] DOMImplementation implementation;
        readonly attribute Element documentElement;

        [ReturnsNew] Element createElement(in [ConvertNullToNullString] DOMString tagName)
            raises (DOMException);
        DocumentFragment   createDocumentFragment();
        [ReturnsNew] Text createTextNode(in DOMString data);
        [ReturnsNew] Comment createComment(in DOMString data);
        [ReturnsNew] CDATASection createCDATASection(in DOMString data)
            raises(DOMException);
        [OldStyleObjC, ReturnsNew] ProcessingInstruction createProcessingInstruction(in DOMString target,
                                                                                     in DOMString data)
            raises (DOMException);
        [ReturnsNew] Attr createAttribute(in DOMString name)
            raises (DOMException);
        [ReturnsNew] EntityReference createEntityReference(in DOMString name)
            raises(DOMException);
        NodeList           getElementsByTagName(in DOMString tagname);

        // Introduced in DOM Level 2:

        [OldStyleObjC, ReturnsNew] Node importNode(in Node importedNode,
                                                   in boolean deep)
            raises (DOMException);
        [OldStyleObjC, ReturnsNew] Element createElementNS(in [ConvertNullToNullString] DOMString namespaceURI,
                                                           in [ConvertNullToNullString] DOMString qualifiedName)
            raises (DOMException);
        [OldStyleObjC, ReturnsNew] Attr createAttributeNS(in [ConvertNullToNullString] DOMString namespaceURI,
                                                          in [ConvertNullToNullString] DOMString qualifiedName)
            raises (DOMException);
        [OldStyleObjC] NodeList getElementsByTagNameNS(in [ConvertNullToNullString] DOMString namespaceURI,
                                                       in DOMString localName);
        Element            getElementById(in DOMString elementId);

        // DOM Level 3 Core

        readonly attribute [ConvertNullStringTo=Null] DOMString inputEncoding;

        readonly attribute [ConvertNullStringTo=Null] DOMString xmlEncoding;
                 attribute [ConvertNullStringTo=Null, ConvertNullToNullString] DOMString xmlVersion
                    setter raises (DOMException);
                 attribute boolean xmlStandalone
                    setter raises (DOMException);

        Node               adoptNode(in Node source)
            raises (DOMException);

                 attribute [ConvertNullStringTo=Null, ConvertNullToNullString] DOMString documentURI;

#if !defined(LANGUAGE_COM) || !LANGUAGE_COM
        // DOM Level 2 Events (DocumentEvents interface)

        Event              createEvent(in DOMString eventType)
            raises(DOMException);

        // DOM Level 2 Tranversal and Range (DocumentRange interface)

        Range              createRange();

        // DOM Level 2 Tranversal and Range (DocumentTraversal interface)

        [OldStyleObjC] NodeIterator createNodeIterator(in Node root,
                                                       in unsigned long whatToShow,
                                                       in NodeFilter filter,
                                                       in boolean expandEntityReferences)
            raises(DOMException);
        [OldStyleObjC] TreeWalker createTreeWalker(in Node root,
                                                   in unsigned long whatToShow,
                                                   in NodeFilter filter,
                                                   in boolean expandEntityReferences)
            raises(DOMException);

        // DOM Level 2 Abstract Views (DocumentView interface)

        readonly attribute DOMWindow defaultView;

        // DOM Level 2 Style (DocumentStyle interface)

        readonly attribute StyleSheetList styleSheets;

        // DOM Level 2 Style (DocumentCSS interface)

        [OldStyleObjC] CSSStyleDeclaration getOverrideStyle(in Element element,
                                                            in DOMString pseudoElement);
#if defined(ENABLE_XPATH) && ENABLE_XPATH
        // DOM Level 3 XPath (XPathEvaluator interface)
        [OldStyleObjC] XPathExpression createExpression(in DOMString expression,
                                                        in XPathNSResolver resolver)
            raises(DOMException);
        XPathNSResolver    createNSResolver(in Node nodeResolver);
        [OldStyleObjC, V8Custom] XPathResult evaluate(in DOMString expression,
                                                      in Node contextNode,
                                                      in XPathNSResolver resolver,
                                                      in unsigned short type,
                                                      in XPathResult inResult)
            raises(DOMException);
#endif // ENABLE_XPATH
#endif // !defined(LANGUAGE_COM)

        // Common extensions

        boolean            execCommand(in DOMString command,
                                       in boolean userInterface,
                                       in [ConvertUndefinedOrNullToNullString] DOMString value);

#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
        // FIXME: remove the these two versions once [Optional] is implemented for Objective-C.
        boolean            execCommand(in DOMString command,
                                       in boolean userInterface);
        boolean            execCommand(in DOMString command);
#endif

        boolean            queryCommandEnabled(in DOMString command);
        boolean            queryCommandIndeterm(in DOMString command);
        boolean            queryCommandState(in DOMString command);
        boolean            queryCommandSupported(in DOMString command);
        [ConvertNullStringTo=False] DOMString queryCommandValue(in DOMString command);

        // Moved down from HTMLDocument

                 attribute [ConvertNullToNullString] DOMString title;
        readonly attribute DOMString referrer;
#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
                 attribute [ConvertNullToNullString] DOMString domain;
#else
        readonly attribute DOMString domain;
#endif
        readonly attribute DOMString URL;

        // FIXME: the DOM spec states that this attribute can 
        // raise an exception on setting.
                 attribute [ConvertNullToNullString] DOMString cookie
                     /*setter raises (DOMException)*/;

        // FIXME: the DOM spec does NOT have this attribute
        // raising an exception.
                 attribute HTMLElement body
                     setter raises (DOMException);

        readonly attribute HTMLCollection images;
        readonly attribute HTMLCollection applets;
        readonly attribute HTMLCollection links;
        readonly attribute HTMLCollection forms;
        readonly attribute HTMLCollection anchors;
        readonly attribute DOMString lastModified;

        NodeList getElementsByName(in DOMString elementName);

#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
                 attribute [Custom] Location location;
#endif

        // IE extensions

                 attribute [ConvertNullStringTo=Undefined, ConvertNullToNullString] DOMString charset;
        readonly attribute [ConvertNullStringTo=Undefined] DOMString defaultCharset;
        readonly attribute [ConvertNullStringTo=Undefined] DOMString readyState;

        Element            elementFromPoint(in long x, in long y);

        // Mozilla extensions
#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
        DOMSelection       getSelection();
#endif
        readonly attribute [ConvertNullStringTo=Null] DOMString characterSet;

        // WebKit extensions

        readonly attribute [ConvertNullStringTo=Null] DOMString preferredStylesheetSet;
                 attribute [ConvertNullStringTo=Null, ConvertNullToNullString] DOMString selectedStylesheetSet;

#if !defined(LANGUAGE_COM) || !LANGUAGE_COM
#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
        CSSStyleDeclaration createCSSStyleDeclaration();
#endif
#endif

#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
        // DOM Level 2 Style Interface
        [OldStyleObjC, UsesView] CSSStyleDeclaration getComputedStyle(in Element element,
                                                                      in DOMString pseudoElement);

        // WebKit extension
        // FIXME: remove the first version once [Optional] is implemented for Objective-C.
        [UsesView] CSSRuleList getMatchedCSSRules(in Element element,
                                                  in DOMString pseudoElement);
        [UsesView] CSSRuleList getMatchedCSSRules(in Element element,
                                                  in DOMString pseudoElement,
                                                  in [Optional] boolean authorOnly);
                                                  
#endif

#if !defined(LANGUAGE_COM) || !LANGUAGE_COM
#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
        [V8Custom] DOMObject getCSSCanvasContext(in DOMString contextId, in DOMString name, in long width, in long height);
#endif
#endif

        // HTML 5
        NodeList getElementsByClassName(in DOMString tagname);

        // NodeSelector - Selector API
        Element querySelector(in DOMString selectors)
            raises(DOMException);
        NodeList querySelectorAll(in DOMString selectors)
            raises(DOMException);

#if defined(ENABLE_WML) && ENABLE_WML
        // Only used from within WML layout tests, WML doesn't have JS support at all.
        void resetWMLPageState();
        void initializeWMLPageState();
#endif

#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
#if !defined(LANGUAGE_COM) || !LANGUAGE_COM
        // Event handler DOM attributes
        attribute [DontEnum] EventListener onabort;
        attribute [DontEnum] EventListener onblur;
        attribute [DontEnum] EventListener onchange;
        attribute [DontEnum] EventListener onclick;
        attribute [DontEnum] EventListener oncontextmenu;
        attribute [DontEnum] EventListener ondblclick;
        attribute [DontEnum] EventListener ondrag;
        attribute [DontEnum] EventListener ondragend;
        attribute [DontEnum] EventListener ondragenter;
        attribute [DontEnum] EventListener ondragleave;
        attribute [DontEnum] EventListener ondragover;
        attribute [DontEnum] EventListener ondragstart;
        attribute [DontEnum] EventListener ondrop;
        attribute [DontEnum] EventListener onerror;
        attribute [DontEnum] EventListener onfocus;
        attribute [DontEnum] EventListener oninput;
        attribute [DontEnum] EventListener onkeydown;
        attribute [DontEnum] EventListener onkeypress;
        attribute [DontEnum] EventListener onkeyup;
        attribute [DontEnum] EventListener onload;
        attribute [DontEnum] EventListener onmousedown;
        attribute [DontEnum] EventListener onmousemove;
        attribute [DontEnum] EventListener onmouseout;
        attribute [DontEnum] EventListener onmouseover;
        attribute [DontEnum] EventListener onmouseup;
        attribute [DontEnum] EventListener onmousewheel;
        attribute [DontEnum] EventListener onscroll;
        attribute [DontEnum] EventListener onselect;
        attribute [DontEnum] EventListener onsubmit;

        // attribute [DontEnum] EventListener oncanplay;
        // attribute [DontEnum] EventListener oncanplaythrough;
        // attribute [DontEnum] EventListener ondurationchange;
        // attribute [DontEnum] EventListener onemptied;
        // attribute [DontEnum] EventListener onended;
        // attribute [DontEnum] EventListener onformchange;
        // attribute [DontEnum] EventListener onforminput;
        // attribute [DontEnum] EventListener oninvalid;
        // attribute [DontEnum] EventListener onloadeddata;
        // attribute [DontEnum] EventListener onloadedmetadata;
        // attribute [DontEnum] EventListener onloadstart;
        // attribute [DontEnum] EventListener onpause;
        // attribute [DontEnum] EventListener onplay;
        // attribute [DontEnum] EventListener onplaying;
        // attribute [DontEnum] EventListener onprogress;
        // attribute [DontEnum] EventListener onratechange;
        // attribute [DontEnum] EventListener onreadystatechange;
        // attribute [DontEnum] EventListener onseeked;
        // attribute [DontEnum] EventListener onseeking;
        // attribute [DontEnum] EventListener onshow;
        // attribute [DontEnum] EventListener onstalled;
        // attribute [DontEnum] EventListener onsuspend;
        // attribute [DontEnum] EventListener ontimeupdate;
        // attribute [DontEnum] EventListener onvolumechange;
        // attribute [DontEnum] EventListener onwaiting;

        // WebKit extensions
        attribute [DontEnum] EventListener onbeforecut;
        attribute [DontEnum] EventListener oncut;
        attribute [DontEnum] EventListener onbeforecopy;
        attribute [DontEnum] EventListener oncopy;
        attribute [DontEnum] EventListener onbeforepaste;
        attribute [DontEnum] EventListener onpaste;
        attribute [DontEnum] EventListener onreset;
        attribute [DontEnum] EventListener onsearch;
        attribute [DontEnum] EventListener onselectstart;
#endif
#endif
    };

}
