/*
 * 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 [
        CustomToJS,
        GenerateNativeConverter,
        CustomMarkFunction,
        InlineGetOwnPropertySlot
    ] Document : Node {

        // DOM Level 1 Core
        readonly attribute DocumentType doctype;
        readonly attribute 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;

        // 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

        // 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
                     setter raises (DOMException);
#else
        readonly attribute DOMString domain;
#endif
        readonly attribute DOMString URL;

                 attribute [ConvertNullToNullString] DOMString cookie
                     setter raises (DOMException),
                     getter raises (DOMException);

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

        readonly attribute HTMLHeadElement head;
        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);
        Range              caretRangeFromPoint(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_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
        CSSStyleDeclaration createCSSStyleDeclaration();
#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_CPP) || !LANGUAGE_CPP
#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);

        readonly attribute DOMString compatMode;

        // NodeSelector - Selector API
        [RequiresAllArguments=Raise] Element querySelector(in DOMString selectors)
            raises(DOMException);
        [RequiresAllArguments=Raise] 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.
        [DontEnum] void resetWMLPageState();
        [DontEnum] void initializeWMLPageState();
#endif

#if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
        readonly attribute boolean webkitIsFullScreen;
        readonly attribute boolean webkitFullScreenKeyboardInputAllowed;
        readonly attribute Element webkitCurrentFullScreenElement;
        void webkitCancelFullScreen();
#endif

#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
        // 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 oninvalid;
        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 onreadystatechange;
        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 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 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;
        attribute [DontEnum] EventListener onselectionchange;
        attribute [DontEnum,Conditional=TOUCH_EVENTS,EnabledAtRuntime] EventListener ontouchstart;
        attribute [DontEnum,Conditional=TOUCH_EVENTS,EnabledAtRuntime] EventListener ontouchmove;
        attribute [DontEnum,Conditional=TOUCH_EVENTS,EnabledAtRuntime] EventListener ontouchend;
        attribute [DontEnum,Conditional=TOUCH_EVENTS,EnabledAtRuntime] EventListener ontouchcancel;
        attribute [DontEnum, Conditional=FULLSCREEN_API] EventListener onwebkitfullscreenchange;
#endif

#if defined(ENABLE_TOUCH_EVENTS) && ENABLE_TOUCH_EVENTS
        [ReturnsNew, EnabledAtRuntime] Touch createTouch(in DOMWindow window,
                                                         in EventTarget target,
                                                         in long identifier,
                                                         in long pageX,
                                                         in long pageY,
                                                         in long ScreenX,
                                                         in long screenY)
            raises (DOMException);
        [ReturnsNew, EnabledAtRuntime, Custom] TouchList createTouchList()
            raises (DOMException);
#endif

#if defined(LANGUAGE_CPP) && LANGUAGE_CPP
        // Extra WebCore methods exposed to allow compile-time casting in C++
        boolean isHTMLDocument();
#endif

    };

}
