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

callback CustomElementConstructor = Element ();

typedef (CanvasRenderingContext2D or WebGLRenderingContext) RenderingContext;

[
    SpecialWrapFor=(HTMLDocument,XMLDocument)
] interface Document : Node {

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

    [CustomElementCallbacks, PerWorldBindings, RaisesException] Element createElement(DOMString tagName);
    DocumentFragment createDocumentFragment();
    Text createTextNode(DOMString data);
    Comment createComment(DOMString data);
    [RaisesException, MeasureAs=DocumentCreateCDATASection] CDATASection createCDATASection([Default=Undefined] optional DOMString data); // Removed from DOM4.
    [RaisesException] ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data);
    [RaisesException, MeasureAs=DocumentCreateAttribute] Attr createAttribute([Default=Undefined] optional DOMString name); // Removed from DOM4.
    [DartNoAutoScope] HTMLCollection getElementsByTagName(DOMString localName);

    // Introduced in DOM Level 2:

    [CustomElementCallbacks, RaisesException, TypeChecking=Interface] Node importNode(Node node, optional boolean deep = false);
    [CustomElementCallbacks, RaisesException] Element createElementNS(DOMString? namespaceURI, DOMString qualifiedName);
    [RaisesException, DeprecateAs=DocumentCreateAttributeNS] Attr createAttributeNS([Default=Undefined] optional DOMString? namespaceURI,
                                                                                    [Default=Undefined] optional DOMString? qualifiedName); // Removed from DOM4.
    HTMLCollection getElementsByTagNameNS(DOMString? namespaceURI, DOMString localName);
    [PerWorldBindings, DartNoAutoScope] Element getElementById(DOMString elementId);

    // DOM Level 3 Core

    [MeasureAs=DocumentInputEncoding] readonly attribute DOMString? inputEncoding; // Removed from DOM4.

    [MeasureAs=DocumentXMLEncoding] readonly attribute DOMString? xmlEncoding; // Removed from DOM4.
    [RaisesException=Setter, MeasureAs=DocumentXMLVersion] attribute DOMString? xmlVersion; // Removed from DOM4.
    [RaisesException=Setter, MeasureAs=DocumentXMLStandalone] attribute boolean xmlStandalone; // Removed from DOM4.

    [RaisesException, CustomElementCallbacks, TypeChecking=Interface] Node adoptNode(Node node);

    [ImplementedAs=url] readonly attribute DOMString? documentURI;

    // DOM Level 2 Events (DocumentEvents interface)

    [RaisesException] Event createEvent(DOMString eventType);

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

    Range createRange();

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

    [RaisesException, TypeChecking=Interface] NodeIterator createNodeIterator(Node root,
                                                                              optional unsigned long whatToShow = 0xFFFFFFFF,
                                                                              optional NodeFilter? filter = null);
    [RaisesException, TypeChecking=Interface] TreeWalker createTreeWalker(Node root,
                                                                          optional unsigned long whatToShow = 0xFFFFFFFF,
                                                                          optional NodeFilter? filter = null);

    // DOM Level 2 Abstract Views (DocumentView interface)

    [ImplementedAs=domWindow] readonly attribute Window defaultView;

    // DOM Level 2 Style (DocumentStyle interface)

    readonly attribute StyleSheetList styleSheets;

    // DOM Level 2 Style (DocumentCSS interface)

    CSSStyleDeclaration getOverrideStyle([Default=Undefined] optional Element element,
                                         [Default=Undefined] optional DOMString pseudoElement);

    // DOM 4
    readonly attribute DOMString contentType;

    // Common extensions
    [CustomElementCallbacks]
    boolean            execCommand([Default=Undefined] optional DOMString command,
                                   [Default=Undefined] optional boolean userInterface,
                                   [TreatUndefinedAs=NullString, Default=Undefined] optional DOMString? value);

    boolean            queryCommandEnabled([Default=Undefined] optional DOMString command);
    boolean            queryCommandIndeterm([Default=Undefined] optional DOMString command);
    boolean            queryCommandState([Default=Undefined] optional DOMString command);
    boolean            queryCommandSupported([Default=Undefined] optional DOMString command);
    DOMString          queryCommandValue([Default=Undefined] optional DOMString command);

    // Moved down from HTMLDocument
             [TreatNullAs=NullString, CustomElementCallbacks] attribute DOMString dir;
             [TreatNullAs=NullString, CustomElementCallbacks] attribute DOMString designMode;
             [TreatNullAs=NullString, CustomElementCallbacks] attribute DOMString title;
    readonly attribute DOMString referrer;
             [TreatNullAs=NullString, RaisesException=Setter] attribute DOMString domain;
    readonly attribute DOMString URL;

             [TreatNullAs=NullString, RaisesException] attribute DOMString cookie;

    [RaisesException=Setter, CustomElementCallbacks, PerWorldBindings, TypeChecking=Interface, DartNoAutoScope] attribute HTMLElement? body;

    readonly attribute HTMLHeadElement head;
    readonly attribute HTMLCollection images;
    readonly attribute HTMLCollection applets;
    readonly attribute HTMLCollection embeds;
    [ImplementedAs=embeds] readonly attribute HTMLCollection plugins;
    readonly attribute HTMLCollection links;
    readonly attribute HTMLCollection forms;
    readonly attribute HTMLCollection scripts;
    readonly attribute HTMLCollection anchors;
    readonly attribute DOMString lastModified;

    [PerWorldBindings, DartNoAutoScope] NodeList getElementsByName([Default=Undefined] optional DOMString elementName);

    [PutForwards=href] readonly attribute Location location;

    // IE extensions
    [MeasureAs=DocumentCharset, TreatReturnedNullStringAs=Undefined, TreatNullAs=NullString] attribute DOMString charset;
    [MeasureAs=DocumentDefaultCharset, TreatReturnedNullStringAs=Undefined] readonly attribute DOMString defaultCharset;
    [TreatReturnedNullStringAs=Undefined] readonly attribute DOMString readyState;

    Element            elementFromPoint([Default=Undefined] optional long x,
                                        [Default=Undefined] optional long y);
    [MeasureAs=DocumentCaretRangeFromPoint]
    Range              caretRangeFromPoint([Default=Undefined] optional long x,
                                           [Default=Undefined] optional long y);

    // Mozilla extensions
    Selection          getSelection();
    readonly attribute DOMString? characterSet;

    // WebKit extensions

    readonly attribute DOMString? preferredStylesheetSet;
             attribute DOMString? selectedStylesheetSet;

    [MeasureAs=DocumentGetCSSCanvasContext] RenderingContext getCSSCanvasContext(DOMString contextId, DOMString name, long width, long height);

    // HTML 5
    HTMLCollection getElementsByClassName(DOMString classNames);
    readonly attribute Element activeElement;
    boolean hasFocus();

    readonly attribute DOMString compatMode;

    [MeasureAs=DocumentExitPointerLock] void exitPointerLock();
    [MeasureAs=DocumentPointerLockElement] readonly attribute Element pointerLockElement;

    // Event handler attributes
    attribute EventHandler onbeforecopy;
    attribute EventHandler onbeforecut;
    attribute EventHandler onbeforepaste;
    attribute EventHandler oncopy;
    attribute EventHandler oncut;
    attribute EventHandler onpaste;
    attribute EventHandler onpointerlockchange;
    attribute EventHandler onpointerlockerror;
    attribute EventHandler onreadystatechange;
    attribute EventHandler onsearch;
    [RuntimeEnabled=ExperimentalContentSecurityPolicyFeatures] attribute EventHandler onsecuritypolicyviolation;
    attribute EventHandler onselectionchange;
    attribute EventHandler onselectstart;
    [RuntimeEnabled=Touch] attribute EventHandler ontouchcancel;
    [RuntimeEnabled=Touch] attribute EventHandler ontouchend;
    [RuntimeEnabled=Touch] attribute EventHandler ontouchmove;
    [RuntimeEnabled=Touch] attribute EventHandler ontouchstart;
    attribute EventHandler onwheel;

    [RuntimeEnabled=Touch] Touch createTouch([Default=Undefined] optional Window window,
                                             [Default=Undefined] optional EventTarget target,
                                             [Default=Undefined] optional long identifier,
                                             [Default=Undefined] optional double pageX,
                                             [Default=Undefined] optional double pageY,
                                             [Default=Undefined] optional double screenX,
                                             [Default=Undefined] optional double screenY,
                                             [Default=Undefined] optional double webkitRadiusX,
                                             [Default=Undefined] optional double webkitRadiusY,
                                             [Default=Undefined] optional float webkitRotationAngle,
                                             [Default=Undefined] optional float webkitForce);
    [RuntimeEnabled=Touch] TouchList createTouchList(Touch... touches);

    [CallWith=ScriptState, CustomElementCallbacks, RaisesException, MeasureAs=DocumentRegisterElement] CustomElementConstructor registerElement(DOMString name, optional Dictionary options);
    [CustomElementCallbacks, PerWorldBindings, RaisesException, DartCustom] Element createElement(DOMString localName, DOMString? typeExtension);
    [CustomElementCallbacks, RaisesException, DartCustom] Element createElementNS(DOMString? namespaceURI, DOMString qualifiedName, DOMString? typeExtension);

    // Page visibility API.
    readonly attribute DOMString visibilityState;
    readonly attribute boolean hidden;

    // Deprecated prefixed page visibility API.
    // TODO(davidben): This is a property so attaching a deprecation warning results in false positives when outputting
    // document in the console. It's possible http://crbug.com/43394 will resolve this.
    [MeasureAs=PrefixedPageVisibility, ImplementedAs=visibilityState] readonly attribute DOMString webkitVisibilityState;
    [MeasureAs=PrefixedPageVisibility, ImplementedAs=hidden] readonly attribute boolean webkitHidden;

    readonly attribute HTMLScriptElement currentScript;
};

Document implements GlobalEventHandlers;
Document implements ParentNode;
