/*
 * Copyright (C) 2006, 2007, 2009, 2010 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 [
        DelegatingPutFunction,
        DelegatingGetOwnPropertySlot,
        CustomCall
    ] HTMLObjectElement : HTMLElement {
        readonly attribute HTMLFormElement form;
        attribute [Reflect] DOMString code;
        attribute [Reflect] DOMString align;
        attribute [Reflect] DOMString archive;
        attribute [Reflect] DOMString border;
        attribute [Reflect] DOMString codeBase;
        attribute [Reflect] DOMString codeType;
        attribute [Reflect, URL] DOMString data;
        attribute [Reflect] boolean declare;
        attribute [Reflect] DOMString height;
        attribute [Reflect] long hspace;
        attribute [Reflect] DOMString name;
        attribute [Reflect] DOMString standby;
        attribute [Reflect] DOMString type;
        attribute [Reflect] DOMString useMap;
        attribute [Reflect] long vspace;
        attribute [Reflect] DOMString width;
        readonly attribute boolean willValidate;
        readonly attribute ValidityState validity;
        readonly attribute DOMString validationMessage;
        boolean checkValidity();
        void setCustomValidity(in [ConvertUndefinedOrNullToNullString] DOMString error);

        // Introduced in DOM Level 2:
        readonly attribute [CheckFrameSecurity] Document contentDocument;

#if defined(ENABLE_SVG) && ENABLE_SVG
#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C || defined(ENABLE_SVG_DOM_OBJC_BINDINGS) && ENABLE_SVG_DOM_OBJC_BINDINGS
        [SVGCheckSecurityDocument] SVGDocument getSVGDocument() raises(DOMException);
#endif
#endif

#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
        // Objective-C extension:
        readonly attribute URL absoluteImageURL;
#endif
    };

}
