/*
 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 *
 * 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 html {

    interface [
        GenerateConstructor,
        HasOverridingNameGetter,
        InterfaceUUID=a183339c-8d74-412a-933d-6f6a4ad6266e,
        ImplementationUUID=d0f7d966-033c-4cbf-847c-1461dacc2f6a
    ] HTMLDocument : Document {
        [Custom] void open();
        void close();
        [Custom] void write(in DOMString text);
        [Custom] void writeln(in DOMString text);

        readonly attribute HTMLCollection embeds;
        readonly attribute HTMLCollection plugins;
        readonly attribute HTMLCollection scripts;

        // Extensions

#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
        // FIXME: This should eventually be available (if they are wanted) for all languages.
                 attribute [Custom, Deletable] HTMLCollection all;
#endif

        void clear();

        void captureEvents();
        void releaseEvents();

        readonly attribute long width;
        readonly attribute long height;
                 attribute [ConvertNullToNullString] DOMString dir;
                 attribute [ConvertNullToNullString] DOMString designMode;
        readonly attribute DOMString compatMode;

        readonly attribute Element activeElement;
        boolean hasFocus();

        // Deprecated attributes
                 attribute [ConvertNullToNullString] DOMString bgColor;
                 attribute [ConvertNullToNullString] DOMString fgColor;
                 attribute [ConvertNullToNullString] DOMString alinkColor;
                 attribute [ConvertNullToNullString] DOMString linkColor;
                 attribute [ConvertNullToNullString] DOMString vlinkColor;
    };

}
