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

interface HTMLDocument : Document {
    [Custom, CustomElementCallbacks] void open();
    [RaisesException] void close();

    // We support multiple DOMString arguments to match FF / IE, e.g.:
    // document.write("a", "b", "c") --> document.write("abc")
    // document.write() --> document.write("")
    [CallWith=ActiveWindow, CustomElementCallbacks, RaisesException] void write(DOMString... text);
    [CallWith=ActiveWindow, CustomElementCallbacks, RaisesException] void writeln(DOMString... text);

    // Extensions

    [Replaceable, ImplementedAs=allForBinding] readonly attribute HTMLAllCollection all;

    [MeasureAs=DocumentClear] void clear();

    [MeasureAs=DocumentCaptureEvents] void captureEvents();
    [MeasureAs=DocumentReleaseEvents] void releaseEvents();

    readonly attribute DOMString compatMode;

    // Deprecated attributes
    [TreatNullAs=NullString, CustomElementCallbacks] attribute DOMString bgColor;
    [TreatNullAs=NullString, CustomElementCallbacks] attribute DOMString fgColor;
    [TreatNullAs=NullString, CustomElementCallbacks] attribute DOMString alinkColor;
    [TreatNullAs=NullString, CustomElementCallbacks] attribute DOMString linkColor;
    [TreatNullAs=NullString, CustomElementCallbacks] attribute DOMString vlinkColor;
};

