/*
 * 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=executingWindow] 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;
