/*
 * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
 *
 * 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.
 */

[
    InterfaceName=CSSPrimitiveValue,
    Exposed=Window
] interface DeprecatedCSSOMPrimitiveValue : DeprecatedCSSOMValue {
    // UnitTypes
    const unsigned short CSS_UNKNOWN = 0;
    const unsigned short CSS_NUMBER = 1;
    const unsigned short CSS_PERCENTAGE = 2;
    const unsigned short CSS_EMS = 3;
    const unsigned short CSS_EXS = 4;
    const unsigned short CSS_PX = 5;
    const unsigned short CSS_CM = 6;
    const unsigned short CSS_MM = 7;
    const unsigned short CSS_IN = 8;
    const unsigned short CSS_PT = 9;
    const unsigned short CSS_PC = 10;
    const unsigned short CSS_DEG = 11;
    const unsigned short CSS_RAD = 12;
    const unsigned short CSS_GRAD = 13;
    const unsigned short CSS_MS = 14;
    const unsigned short CSS_S = 15;
    const unsigned short CSS_HZ = 16;
    const unsigned short CSS_KHZ = 17;
    const unsigned short CSS_DIMENSION = 18;
    const unsigned short CSS_STRING = 19;
    const unsigned short CSS_URI = 20;
    const unsigned short CSS_IDENT = 21;
    const unsigned short CSS_ATTR = 22;
    const unsigned short CSS_COUNTER = 23;
    const unsigned short CSS_RECT = 24;
    const unsigned short CSS_RGBCOLOR = 25;
    // Do not add new units here; this is deprecated and we shouldn't expose anything not in DOM Level 2 Style.
    
    readonly attribute unsigned short primitiveType;

    undefined setFloatValue(optional unsigned short unitType = 0, optional unrestricted float floatValue = NaN);
    unrestricted float getFloatValue(optional unsigned short unitType = 0);

    undefined setStringValue(optional unsigned short stringType = 0, optional DOMString stringValue);
    DOMString getStringValue();

    DeprecatedCSSOMCounter getCounterValue();
    DeprecatedCSSOMRect getRectValue();
    DeprecatedCSSOMRGBColor getRGBColorValue();
};
