/*
 * Copyright (C) 2016 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary form, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
 *     its contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

interface TestDOMJIT : Node {
    [DOMJIT=Getter] readonly attribute any anyAttr;
    [DOMJIT=Getter] readonly attribute boolean booleanAttr;
    [DOMJIT=Getter] readonly attribute byte byteAttr;
    [DOMJIT=Getter] readonly attribute octet octetAttr;
    [DOMJIT=Getter] readonly attribute short shortAttr;
    [DOMJIT=Getter] readonly attribute unsigned short unsignedShortAttr;
    [DOMJIT=Getter] readonly attribute long longAttr;
    [DOMJIT=Getter] readonly attribute unsigned long unsignedLongAttr;
    [DOMJIT=Getter] readonly attribute long long longLongAttr;
    [DOMJIT=Getter] readonly attribute unsigned long long unsignedLongLongAttr;
    [DOMJIT=Getter] readonly attribute float floatAttr;
    [DOMJIT=Getter] readonly attribute unrestricted float unrestrictedFloatAttr;
    [DOMJIT=Getter] readonly attribute double doubleAttr;
    [DOMJIT=Getter] readonly attribute unrestricted double unrestrictedDoubleAttr;
    [DOMJIT=Getter] readonly attribute DOMString domStringAttr;
    [DOMJIT=Getter] readonly attribute ByteString byteStringAttr;
    [DOMJIT=Getter] readonly attribute USVString usvStringAttr;
    [DOMJIT=Getter] readonly attribute Node nodeAttr;

    [DOMJIT=Getter] readonly attribute boolean? booleanNullableAttr;
    [DOMJIT=Getter] readonly attribute byte? byteNullableAttr;
    [DOMJIT=Getter] readonly attribute octet? octetNullableAttr;
    [DOMJIT=Getter] readonly attribute short? shortNullableAttr;
    [DOMJIT=Getter] readonly attribute unsigned short? unsignedShortNullableAttr;
    [DOMJIT=Getter] readonly attribute long? longNullableAttr;
    [DOMJIT=Getter] readonly attribute unsigned long? unsignedLongNullableAttr;
    [DOMJIT=Getter] readonly attribute long long? longLongNullableAttr;
    [DOMJIT=Getter] readonly attribute unsigned long long? unsignedLongLongNullableAttr;
    [DOMJIT=Getter] readonly attribute float? floatNullableAttr;
    [DOMJIT=Getter] readonly attribute unrestricted float? unrestrictedFloatNullableAttr;
    [DOMJIT=Getter] readonly attribute double? doubleNullableAttr;
    [DOMJIT=Getter] readonly attribute unrestricted double? unrestrictedDoubleNullableAttr;
    [DOMJIT=Getter] readonly attribute DOMString? domStringNullableAttr;
    [DOMJIT=Getter] readonly attribute ByteString? byteStringNullableAttr;
    [DOMJIT=Getter] readonly attribute USVString? usvStringNullableAttr;
    [DOMJIT=Getter] readonly attribute Node? nodeNullableAttr;

    [DOMJIT=ReadDOM] DOMString? getAttribute(DOMString name);
    [DOMJIT=ReadDOM] DOMString item(unsigned short x, unsigned short y);
    [DOMJIT=ReadDOM] boolean hasAttribute();
    [DOMJIT=ReadDOM] Element getElementById([RequiresExistingAtomString] DOMString elementId);
    [DOMJIT=ReadDOM] NodeList getElementsByName([AtomString] DOMString elementName);
};
