/*
 * 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 ();

// https://html.spec.whatwg.org/#the-document-object
enum DocumentReadyState { "loading", "interactive", "complete" };

// http://www.w3.org/TR/page-visibility/#VisibilityState
enum VisibilityState { "hidden", "visible", "prerender", "unloaded" };

// https://mikewest.github.io/cors-rfc1918/#feature-detect
enum AddressSpace { "local", "private", "public" };

// https://dom.spec.whatwg.org/#interface-document

// FIXME: Document should have a constructor. crbug.com/238234
interface Document : Node {
    [SameObject] readonly attribute DOMImplementation implementation;
    readonly attribute DOMString URL;
    // FIXME: documentURI should not be nullable.
    [ImplementedAs=url] readonly attribute DOMString? documentURI;
    readonly attribute DOMString origin;
    [RuntimeEnabled=suborigins] readonly attribute DOMString suborigin;
    readonly attribute DOMString compatMode;

    readonly attribute DOMString characterSet;
    [ImplementedAs=characterSet] readonly attribute DOMString charset; // legacy alias of .characterSet
    [ImplementedAs=characterSet] readonly attribute DOMString inputEncoding; // legacy alias of .characterSet
    readonly attribute DOMString contentType;

    readonly attribute DocumentType? doctype;
    readonly attribute Element? documentElement;
    HTMLCollection getElementsByTagName(DOMString localName);
    HTMLCollection getElementsByTagNameNS(DOMString? namespaceURI, DOMString localName);
    HTMLCollection getElementsByClassName(DOMString classNames);

    [NewObject, CustomElementCallbacks, PerWorldBindings, RaisesException] Element createElement(DOMString localName);
    [NewObject, CustomElementCallbacks, RaisesException] Element createElementNS(DOMString? namespaceURI, DOMString qualifiedName);
    [NewObject] DocumentFragment createDocumentFragment();
    [NewObject] Text createTextNode(DOMString data);
    [NewObject] Comment createComment(DOMString data);
    [NewObject, RaisesException] ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data);

    [NewObject, CustomElementCallbacks, RaisesException] Node importNode(Node node, optional boolean deep = false);
    [RaisesException, CustomElementCallbacks] Node adoptNode(Node node);

    [NewObject, RaisesException, MeasureAs=DocumentCreateAttribute] Attr createAttribute(DOMString localName);
    [NewObject, RaisesException, MeasureAs=DocumentCreateAttributeNS] Attr createAttributeNS(DOMString? namespaceURI, DOMString qualifiedName);

    [NewObject, RaisesException, CallWith=ExecutionContext] Event createEvent(DOMString eventType);

    [NewObject] Range createRange();

    // NodeFilter.SHOW_ALL = 0xFFFFFFFF
    [NewObject] NodeIterator createNodeIterator(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
    [NewObject] TreeWalker createTreeWalker(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);

    // FIXME: CDATASection has been removed from the spec. crbug.com/437205
    [RaisesException, MeasureAs=DocumentCreateCDATASection] CDATASection createCDATASection(DOMString data);

    // FIXME: xmlEncoding/xmlVersion/xmlStandalone have been removed from the spec.
    [MeasureAs=DocumentXMLEncoding] readonly attribute DOMString? xmlEncoding;
    [RaisesException=Setter, MeasureAs=DocumentXMLVersion] attribute DOMString? xmlVersion;
    [RaisesException=Setter, MeasureAs=DocumentXMLStandalone] attribute boolean xmlStandalone;

    // HTML
    // https://html.spec.whatwg.org/#the-document-object

    // resource metadata management

    // Inheritance of [Unforgeable] attributes is not supported.  So we have to
    // define the same unforgeable attributes in derived interfaces as well.
    // See that HTMLDocument and XMLDocument redefine 'location' attribute.
    // Keep all the definitions consistent.
    // TODO(yukishiino): Support inheritance of attributes defined on instance.
    [PutForwards=href, Unforgeable] readonly attribute Location? location;
    [RaisesException=Setter] attribute DOMString domain;
    readonly attribute DOMString referrer;
    [RaisesException] attribute DOMString cookie;
    readonly attribute DOMString lastModified;
    readonly attribute DocumentReadyState readyState;

    // DOM tree accessors
    [CustomElementCallbacks] attribute DOMString title;
    [CustomElementCallbacks] attribute DOMString dir;
    [RaisesException=Setter, CustomElementCallbacks, PerWorldBindings] attribute HTMLElement? body;
    readonly attribute HTMLHeadElement? head;
    [SameObject] readonly attribute HTMLCollection images;
    [SameObject] readonly attribute HTMLCollection embeds;
    [SameObject, ImplementedAs=embeds] readonly attribute HTMLCollection plugins;
    [SameObject] readonly attribute HTMLCollection links;
    [SameObject] readonly attribute HTMLCollection forms;
    [SameObject] readonly attribute HTMLCollection scripts;
    [PerWorldBindings] NodeList getElementsByName(DOMString elementName);
    readonly attribute HTMLScriptElement? currentScript;

    // dynamic markup insertion
    // FIXME: There are two open() methods in the spec.
    [Custom, CustomElementCallbacks, RaisesException] void open();
    [RaisesException] void close();
    [CallWith=EnteredWindow, CustomElementCallbacks, RaisesException] void write(DOMString... text);
    [CallWith=EnteredWindow, CustomElementCallbacks, RaisesException] void writeln(DOMString... text);

    // user interaction
    [ImplementedAs=domWindow] readonly attribute Window? defaultView;
    boolean hasFocus();
    [CustomElementCallbacks, MeasureAs=DocumentDesignMode] attribute DOMString designMode;
    [CustomElementCallbacks, RaisesException] boolean execCommand(DOMString commandId, optional boolean showUI = false, optional DOMString value = "");
    [RaisesException] boolean queryCommandEnabled(DOMString commandId);
    [RaisesException] boolean queryCommandIndeterm(DOMString commandId);
    [RaisesException] boolean queryCommandState(DOMString commandId);
    [RaisesException] boolean queryCommandSupported(DOMString commandId);
    [RaisesException] DOMString queryCommandValue(DOMString commandId);

    [LenientThis] attribute EventHandler onreadystatechange;

    // HTML obsolete features
    // https://html.spec.whatwg.org/#Document-partial

    // FIXME: *Color are on HTMLDocument.

    readonly attribute HTMLCollection anchors;
    readonly attribute HTMLCollection applets;

    // FIXME: clear(), captureEvents(), releaseEvents() and all are on HTMLDocument.

    // CSS Object Model (CSSOM)
    // http://dev.w3.org/csswg/cssom/#extensions-to-the-document-interface
    attribute DOMString? selectedStylesheetSet;
    readonly attribute DOMString? preferredStylesheetSet;

    readonly attribute Element? scrollingElement;

    // Visual Viewport API
    // https://github.com/WICG/ViewportAPI
    [RuntimeEnabled=VisualViewportAPI] readonly attribute VisualViewport? visualViewport;

    // Pointer Lock
    // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#extensions-to-the-document-interface
    attribute EventHandler onpointerlockchange;
    attribute EventHandler onpointerlockerror;
    [MeasureAs=DocumentPointerLockElement] readonly attribute Element? pointerLockElement;
    [MeasureAs=DocumentExitPointerLock] void exitPointerLock();

    // Touch Events
    // http://rawgit.com/w3c/touch-events/v1-errata/touchevents.html#extensions-to-the-document-interface
    // FIXME: The arguments should not be optional.
    [RuntimeEnabled=Touch, Measure, LegacyInterfaceTypeChecking] Touch createTouch([Default=Undefined] optional Window window,
                                                                                   [Default=Undefined] optional EventTarget target,
                                                                                   [Default=Undefined] optional long identifier,
                                                                                   [Default=Undefined] optional unrestricted double pageX,
                                                                                   [Default=Undefined] optional unrestricted double pageY,
                                                                                   [Default=Undefined] optional unrestricted double screenX,
                                                                                   [Default=Undefined] optional unrestricted double screenY,
                                                                                   [Default=Undefined] optional unrestricted double radiusX,
                                                                                   [Default=Undefined] optional unrestricted double radiusY,
                                                                                   [Default=Undefined] optional unrestricted float rotationAngle,
                                                                                   [Default=Undefined] optional unrestricted float force);
    [RuntimeEnabled=Touch] TouchList createTouchList(Touch... touches);

    // Custom Elements
    // http://w3c.github.io/webcomponents/spec/custom/#extensions-to-document-interface-to-register
    // FIXME: The registerElement return type should be Function.
    [CallWith=ScriptState, CustomElementCallbacks, RaisesException, MeasureAs=DocumentRegisterElement] CustomElementConstructor registerElement(DOMString type, optional ElementRegistrationOptions options);
    // http://w3c.github.io/webcomponents/spec/custom/#extensions-to-document-interface-to-instantiate
    // FIXME: The typeExtension arguments should not be nullable.
    [CustomElementCallbacks, PerWorldBindings, RaisesException] Element createElement(DOMString localName, DOMString? typeExtension);
    [CustomElementCallbacks, RaisesException] Element createElementNS(DOMString? namespaceURI, DOMString qualifiedName, DOMString? typeExtension);

    // Page Visibility
    // http://www.w3.org/TR/page-visibility/#sec-document-interface
    readonly attribute boolean hidden;
    readonly attribute VisibilityState visibilityState;

    // CORS and RFC1918
    // https://mikewest.github.io/cors-rfc1918/#feature-detect
    [RuntimeEnabled=CorsRFC1918, ImplementedAs=addressSpaceForBindings] readonly attribute AddressSpace addressSpace;

    // Non-standard APIs
    [MeasureAs=DocumentCaretRangeFromPoint] Range caretRangeFromPoint([Default=Undefined] optional long x, [Default=Undefined] optional long y);

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

    // Event handler attributes
    attribute EventHandler onbeforecopy;
    attribute EventHandler onbeforecut;
    attribute EventHandler onbeforepaste;
    attribute EventHandler oncopy;
    attribute EventHandler oncut;
    attribute EventHandler onpaste;
    attribute EventHandler onsearch;
    [RuntimeEnabled=ExperimentalContentSecurityPolicyFeatures] attribute EventHandler onsecuritypolicyviolation;
    attribute EventHandler onselectionchange;
    attribute EventHandler onselectstart;
    attribute EventHandler onwheel;
};

Document implements GlobalEventHandlers;
Document implements ParentNode;
Document implements NonElementParentNode;
Document implements DocumentOrShadowRoot;
