/*
 * 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 [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;

        // 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
        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.
        [DontEnum] void resetWMLPageState();
        [DontEnum] void initializeWMLPageState();
#endif

#if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
        readonly attribute boolean webkitFullScreen;
        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 onformchange;
        // attribute [DontEnum] EventListener onforminput;
        // 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,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] 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

    };

}
