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

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

// TODO(yukishiino): HTMLObjectElement should not have [OverrideBuiltins].
[
    OverrideBuiltins,
    ActiveScriptWrappable,
    HTMLConstructor
] interface HTMLObjectElement : HTMLElement {
    [CEReactions, Reflect, URL] attribute DOMString data;
    [CEReactions, Reflect] attribute DOMString type;
    // TODO(foolip): attribute boolean typeMustMatch;
    [CEReactions, Reflect] attribute DOMString name;
    [CEReactions, Reflect] attribute DOMString useMap;
    [ImplementedAs=formOwner] readonly attribute HTMLFormElement? form;
    [CEReactions, Reflect] attribute DOMString width;
    [CEReactions, Reflect] attribute DOMString height;
    [CheckSecurity=ReturnValue] readonly attribute Document? contentDocument;
    // TODO(shanmuga.m): The spec uses the WindowProxy type for this attribute.
    readonly attribute Window? contentWindow;
    [CheckSecurity=ReturnValue, RaisesException] Document? getSVGDocument();

    readonly attribute boolean willValidate;
    readonly attribute ValidityState validity;
    readonly attribute DOMString validationMessage;
    boolean checkValidity();
    boolean reportValidity();
    void setCustomValidity(DOMString error);

    // obsolete members
    // https://html.spec.whatwg.org/#HTMLObjectElement-partial
    [CEReactions, Reflect] attribute DOMString align;
    [CEReactions, Reflect] attribute DOMString archive;
    [CEReactions, Reflect] attribute DOMString code;
    [CEReactions, Reflect] attribute boolean declare;
    [CEReactions, Reflect] attribute unsigned long hspace;
    [CEReactions, Reflect] attribute DOMString standby;
    [CEReactions, Reflect] attribute unsigned long vspace;
    [CEReactions, Reflect, URL] attribute DOMString codeBase;
    [CEReactions, Reflect] attribute DOMString codeType;

    [CEReactions, Reflect] attribute [TreatNullAs=EmptyString] DOMString border;

    // TODO(foolip): These getters and setters are not in the spec.
    [Custom, NotEnumerable] getter Node (DOMString name);
    [Custom] setter Node (DOMString name, Node value);
};
