/*
 * 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 [ReflectURL] 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;

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

}
