/*
 * Copyright (C) 2006, 2007, 2011 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.
 */

[
    CustomToJSObject,
    JSGenerateToNativeObject,
    JSInlineGetOwnPropertySlot
] interface Document : Node {

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

    [ReturnNewObject] Element createElement(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString tagName)
        raises (DOMException);
    DocumentFragment   createDocumentFragment();
    [ReturnNewObject] Text createTextNode(in [Optional=DefaultIsUndefined] DOMString data);
    [ReturnNewObject] Comment createComment(in [Optional=DefaultIsUndefined] DOMString data);
    [ReturnNewObject] CDATASection createCDATASection(in [Optional=DefaultIsUndefined] DOMString data)
        raises(DOMException);
    [ObjCLegacyUnnamedParameters, ReturnNewObject] ProcessingInstruction createProcessingInstruction(in [Optional=DefaultIsUndefined] DOMString target,
                                                                                 in [Optional=DefaultIsUndefined] DOMString data)
        raises (DOMException);
    [ReturnNewObject] Attr createAttribute(in [Optional=DefaultIsUndefined] DOMString name)
        raises (DOMException);
    [ReturnNewObject] EntityReference createEntityReference(in [Optional=DefaultIsUndefined] DOMString name)
        raises(DOMException);
    NodeList           getElementsByTagName(in [Optional=DefaultIsUndefined] DOMString tagname);

    // Introduced in DOM Level 2:

    [ObjCLegacyUnnamedParameters, ReturnNewObject] Node importNode(in [Optional=DefaultIsUndefined] Node importedNode,
                                               in [Optional] boolean deep)
        raises (DOMException);
    [ObjCLegacyUnnamedParameters, ReturnNewObject] Element createElementNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI,
                                                       in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString qualifiedName)
        raises (DOMException);
    [ObjCLegacyUnnamedParameters, ReturnNewObject] Attr createAttributeNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI,
                                                      in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString qualifiedName)
        raises (DOMException);
    [ObjCLegacyUnnamedParameters] NodeList getElementsByTagNameNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI,
                                                   in [Optional=DefaultIsUndefined] DOMString localName);
    Element            getElementById(in [Optional=DefaultIsUndefined] DOMString elementId);

    // DOM Level 3 Core

    [TreatReturnedNullStringAs=Null] readonly attribute DOMString inputEncoding;

    [TreatReturnedNullStringAs=Null] readonly attribute DOMString xmlEncoding;
             [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] attribute DOMString xmlVersion
                setter raises (DOMException);
             attribute boolean xmlStandalone
                setter raises (DOMException);

    Node               adoptNode(in [Optional=DefaultIsUndefined] Node source)
        raises (DOMException);

#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C || defined(LANGUAGE_GOBJECT) && LANGUAGE_GOBJECT
    // document.documentURI was writable in DOM3 Core, but is read-only in DOM4
    // (see http://www.w3.org/TR/2011/WD-dom-20110915/#document). We need to keep
    // the writable version around for Objective C clients, but are moving to
    // read-only for other clients.
             [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] attribute DOMString documentURI;
#else
    [TreatReturnedNullStringAs=Null] readonly attribute DOMString documentURI;
#endif

    // DOM Level 2 Events (DocumentEvents interface)

    Event              createEvent(in [Optional=DefaultIsUndefined] DOMString eventType)
        raises(DOMException);

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

    Range              createRange();

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

    [ObjCLegacyUnnamedParameters] NodeIterator createNodeIterator(in [Optional=DefaultIsUndefined] Node root,
                                                   in [Optional=DefaultIsUndefined] unsigned long whatToShow,
                                                   in [Optional=DefaultIsUndefined] NodeFilter filter,
                                                   in [Optional=DefaultIsUndefined] boolean expandEntityReferences)
        raises(DOMException);
    [ObjCLegacyUnnamedParameters] TreeWalker createTreeWalker(in [Optional=DefaultIsUndefined] Node root,
                                               in [Optional=DefaultIsUndefined] unsigned long whatToShow,
                                               in [Optional=DefaultIsUndefined] NodeFilter filter,
                                               in [Optional=DefaultIsUndefined] 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)

    [ObjCLegacyUnnamedParameters] CSSStyleDeclaration getOverrideStyle(in [Optional=DefaultIsUndefined] Element element,
                                                        in [Optional=DefaultIsUndefined] DOMString pseudoElement);

    // DOM Level 3 XPath (XPathEvaluator interface)
    [ObjCLegacyUnnamedParameters] XPathExpression createExpression(in [Optional=DefaultIsUndefined] DOMString expression,
                                                    in [Optional=DefaultIsUndefined] XPathNSResolver resolver)
        raises(DOMException);
    XPathNSResolver    createNSResolver(in Node nodeResolver);
    [ObjCLegacyUnnamedParameters, V8Custom] XPathResult evaluate(in [Optional=DefaultIsUndefined] DOMString expression,
                                                  in [Optional=DefaultIsUndefined] Node contextNode,
                                                  in [Optional=DefaultIsUndefined] XPathNSResolver resolver,
                                                  in [Optional=DefaultIsUndefined] unsigned short type,
                                                  in [Optional=DefaultIsUndefined] XPathResult inResult)
        raises(DOMException);

    // Common extensions

    boolean            execCommand(in [Optional=DefaultIsUndefined] DOMString command,
                                   in [Optional=DefaultIsUndefined] boolean userInterface,
                                   in [TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] 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 [Optional=DefaultIsUndefined] DOMString command);
    boolean            queryCommandIndeterm(in [Optional=DefaultIsUndefined] DOMString command);
    boolean            queryCommandState(in [Optional=DefaultIsUndefined] DOMString command);
    boolean            queryCommandSupported(in [Optional=DefaultIsUndefined] DOMString command);
    DOMString          queryCommandValue(in [Optional=DefaultIsUndefined] DOMString command);

    // Moved down from HTMLDocument

             [TreatNullAs=NullString] attribute DOMString title;
    readonly attribute DOMString referrer;
#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
             [TreatNullAs=NullString] attribute DOMString domain
                 setter raises (DOMException);
#else
    readonly attribute DOMString domain;
#endif
    readonly attribute DOMString URL;

             [TreatNullAs=NullString] attribute DOMString cookie
                 setter raises (DOMException),
                 getter raises (DOMException);

             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 [Optional=DefaultIsUndefined] DOMString elementName);

#if defined(ENABLE_MICRODATA) && ENABLE_MICRODATA
    NodeList getItems(in [TreatNullAs=NullString, TreatUndefinedAs=NullString, Optional=DefaultIsUndefined] DOMString typeNames);
#endif

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

    // IE extensions

             [TreatReturnedNullStringAs=Undefined, TreatNullAs=NullString] attribute DOMString charset;
    [TreatReturnedNullStringAs=Undefined] readonly attribute DOMString defaultCharset;
    [TreatReturnedNullStringAs=Undefined] readonly attribute DOMString readyState;

    Element            elementFromPoint(in [Optional=DefaultIsUndefined] long x, 
                                        in [Optional=DefaultIsUndefined] long y);
    Range              caretRangeFromPoint(in [Optional=DefaultIsUndefined] long x, 
                                           in [Optional=DefaultIsUndefined] long y);

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

    // WebKit extensions

    [TreatReturnedNullStringAs=Null] readonly attribute DOMString preferredStylesheetSet;
             [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] attribute DOMString selectedStylesheetSet;

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

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

    // WebKit extension
    // FIXME: remove the first version once [Optional] is implemented for Objective-C.
    [ObjCUseDefaultView] CSSRuleList getMatchedCSSRules(in Element element,
                                              in DOMString pseudoElement);
    [ObjCUseDefaultView] 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
    CanvasRenderingContext getCSSCanvasContext(in DOMString contextId, in DOMString name, in long width, in long height);
#endif
#endif

    // HTML 5
    NodeList getElementsByClassName(in [Optional=DefaultIsUndefined] 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_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
    // Mozilla version
    [V8EnabledAtRuntime] readonly attribute boolean webkitIsFullScreen;
    [V8EnabledAtRuntime] readonly attribute boolean webkitFullScreenKeyboardInputAllowed;
    [V8EnabledAtRuntime] readonly attribute Element webkitCurrentFullScreenElement;
    [V8EnabledAtRuntime] void webkitCancelFullScreen();

    // W3C version
    [V8EnabledAtRuntime] readonly attribute boolean webkitFullscreenEnabled;
    [V8EnabledAtRuntime] readonly attribute Element webkitFullscreenElement;
    [V8EnabledAtRuntime] void webkitExitFullscreen();
#endif

    [Conditional=POINTER_LOCK] void webkitExitPointerLock();
    [Conditional=POINTER_LOCK] readonly attribute Element webkitPointerLockElement;

    [Conditional=CSS_REGIONS, V8EnabledAtRuntime=cssRegions] DOMNamedFlowCollection webkitGetNamedFlows();

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

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

    // WebKit extensions
    [NotEnumerable] attribute EventListener onbeforecut;
    [NotEnumerable] attribute EventListener oncut;
    [NotEnumerable] attribute EventListener onbeforecopy;
    [NotEnumerable] attribute EventListener oncopy;
    [NotEnumerable] attribute EventListener onbeforepaste;
    [NotEnumerable] attribute EventListener onpaste;
    [NotEnumerable] attribute EventListener onreset;
    [NotEnumerable] attribute EventListener onsearch;
    [NotEnumerable] attribute EventListener onselectstart;
    [NotEnumerable] attribute EventListener onselectionchange;
    [NotEnumerable,Conditional=TOUCH_EVENTS,V8EnabledAtRuntime=touch] attribute EventListener ontouchstart;
    [NotEnumerable,Conditional=TOUCH_EVENTS,V8EnabledAtRuntime=touch] attribute EventListener ontouchmove;
    [NotEnumerable,Conditional=TOUCH_EVENTS,V8EnabledAtRuntime=touch] attribute EventListener ontouchend;
    [NotEnumerable,Conditional=TOUCH_EVENTS,V8EnabledAtRuntime=touch] attribute EventListener ontouchcancel;
    [NotEnumerable, Conditional=FULLSCREEN_API] attribute EventListener onwebkitfullscreenchange;
    [NotEnumerable, Conditional=FULLSCREEN_API] attribute EventListener onwebkitfullscreenerror;
    [NotEnumerable, Conditional=POINTER_LOCK] attribute EventListener onwebkitpointerlockchange;
    [NotEnumerable, Conditional=POINTER_LOCK] attribute EventListener onwebkitpointerlockerror;
#endif

#if defined(ENABLE_TOUCH_EVENTS) && ENABLE_TOUCH_EVENTS
    [ReturnNewObject, V8EnabledAtRuntime=touch] Touch createTouch(in [Optional=DefaultIsUndefined] DOMWindow window,
                                                     in [Optional=DefaultIsUndefined] EventTarget target,
                                                     in [Optional=DefaultIsUndefined] long identifier,
                                                     in [Optional=DefaultIsUndefined] long pageX,
                                                     in [Optional=DefaultIsUndefined] long pageY,
                                                     in [Optional=DefaultIsUndefined] long screenX,
                                                     in [Optional=DefaultIsUndefined] long screenY,
                                                     in [Optional=DefaultIsUndefined] long webkitRadiusX,
                                                     in [Optional=DefaultIsUndefined] long webkitRadiusY,
                                                     in [Optional=DefaultIsUndefined] float webkitRotationAngle,
                                                     in [Optional=DefaultIsUndefined] float webkitForce)
        raises (DOMException);
    [ReturnNewObject, V8EnabledAtRuntime=touch, 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

    // Page visibility API.
    [Conditional=PAGE_VISIBILITY_API] readonly attribute DOMString webkitVisibilityState;
    [Conditional=PAGE_VISIBILITY_API] readonly attribute boolean webkitHidden;

    // Security Policy API: http://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#script-interfaces
    [Conditional=CSP_NEXT, V8EnabledAtRuntime=experimentalContentSecurityPolicyFeatures] readonly attribute DOMSecurityPolicy securityPolicy;

};

