⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cssprimitivevalue.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    }    cleanup();    //if(m_type > CSS_DIMENSION) throw DOMException(INVALID_ACCESS_ERR);    m_value.num = floatValue;    m_type = unitType;}static double scaleFactorForConversion(unsigned short unitType){    double factor = 1.0;    switch (unitType) {        case CSSPrimitiveValue::CSS_PX:            break;        case CSSPrimitiveValue::CSS_CM:            factor = cssPixelsPerInch / 2.54; // (2.54 cm/in)            break;        case CSSPrimitiveValue::CSS_MM:            factor = cssPixelsPerInch / 25.4;            break;        case CSSPrimitiveValue::CSS_IN:            factor = cssPixelsPerInch;            break;        case CSSPrimitiveValue::CSS_PT:            factor = cssPixelsPerInch / 72.0;            break;        case CSSPrimitiveValue::CSS_PC:            factor = cssPixelsPerInch * 12.0 / 72.0; // 1 pc == 12 pt            break;        default:            break;    }    return factor;}double CSSPrimitiveValue::getDoubleValue(unsigned short unitType, ExceptionCode& ec){    ec = 0;    if (m_type < CSS_NUMBER || m_type > CSS_DIMENSION || unitType < CSS_NUMBER || unitType > CSS_DIMENSION) {        ec = INVALID_ACCESS_ERR;        return 0.0;    }    if (unitType == m_type || unitType < CSS_PX || unitType > CSS_PC)        return m_value.num;    double convertedValue = m_value.num;    // First convert the value from m_type into CSSPixels    double factor = scaleFactorForConversion(m_type);    convertedValue *= factor;    // Now convert from CSSPixels to the specified unitType    factor = scaleFactorForConversion(unitType);    convertedValue /= factor;    return convertedValue;}double CSSPrimitiveValue::getDoubleValue(unsigned short unitType){    if (m_type < CSS_NUMBER || m_type > CSS_DIMENSION || unitType < CSS_NUMBER || unitType > CSS_DIMENSION)        return 0;    if (unitType == m_type || unitType < CSS_PX || unitType > CSS_PC)        return m_value.num;    double convertedValue = m_value.num;    // First convert the value from m_type into CSSPixels    double factor = scaleFactorForConversion(m_type);    convertedValue *= factor;    // Now convert from CSSPixels to the specified unitType    factor = scaleFactorForConversion(unitType);    convertedValue /= factor;    return convertedValue;}void CSSPrimitiveValue::setStringValue(unsigned short stringType, const String& stringValue, ExceptionCode& ec){    ec = 0;    //if(m_type < CSS_STRING) throw DOMException(INVALID_ACCESS_ERR);    //if(m_type > CSS_ATTR) throw DOMException(INVALID_ACCESS_ERR);    if (m_type < CSS_STRING || m_type > CSS_ATTR) {        ec = SYNTAX_ERR;        return;    }    cleanup();    if (stringType != CSS_IDENT) {        m_value.string = stringValue.impl();        m_value.string->ref();        m_type = stringType;    }    // FIXME: parse ident}String CSSPrimitiveValue::getStringValue(ExceptionCode& ec) const{    ec = 0;    switch (m_type) {        case CSS_STRING:        case CSS_ATTR:        case CSS_URI:        case CSS_PARSER_VARIABLE_FUNCTION_SYNTAX:            return m_value.string;        case CSS_IDENT:            return valueOrPropertyName(m_value.ident);        default:            ec = INVALID_ACCESS_ERR;            break;    }    return String();}String CSSPrimitiveValue::getStringValue() const{    switch (m_type) {        case CSS_STRING:        case CSS_ATTR:        case CSS_URI:        case CSS_PARSER_VARIABLE_FUNCTION_SYNTAX:             return m_value.string;        case CSS_IDENT:            return valueOrPropertyName(m_value.ident);        default:            break;    }    return String();}Counter* CSSPrimitiveValue::getCounterValue(ExceptionCode& ec) const{    ec = 0;    if (m_type != CSS_COUNTER) {        ec = INVALID_ACCESS_ERR;        return 0;    }    return m_value.counter;}Rect* CSSPrimitiveValue::getRectValue(ExceptionCode& ec) const{    ec = 0;    if (m_type != CSS_RECT) {        ec = INVALID_ACCESS_ERR;        return 0;    }    return m_value.rect;}unsigned CSSPrimitiveValue::getRGBColorValue(ExceptionCode& ec) const{    ec = 0;    if (m_type != CSS_RGBCOLOR) {        ec = INVALID_ACCESS_ERR;        return 0;    }    return m_value.rgbcolor;}Pair* CSSPrimitiveValue::getPairValue(ExceptionCode& ec) const{    ec = 0;    if (m_type != CSS_PAIR) {        ec = INVALID_ACCESS_ERR;        return 0;    }    return m_value.pair;}unsigned short CSSPrimitiveValue::cssValueType() const{    return CSS_PRIMITIVE_VALUE;}bool CSSPrimitiveValue::parseString(const String& /*string*/, bool /*strict*/){    // FIXME    return false;}int CSSPrimitiveValue::getIdent(){    if (m_type != CSS_IDENT)        return 0;    return m_value.ident;}String CSSPrimitiveValue::cssText() const{    // FIXME: return the original value instead of a generated one (e.g. color    // name if it was specified) - check what spec says about this    String text;    switch (m_type) {        case CSS_UNKNOWN:            // FIXME            break;        case CSS_NUMBER:        case CSS_PARSER_INTEGER:            text = String::number(m_value.num);            break;        case CSS_PERCENTAGE:            text = String::format("%.6lg%%", m_value.num);            break;        case CSS_EMS:            text = String::format("%.6lgem", m_value.num);            break;        case CSS_EXS:            text = String::format("%.6lgex", m_value.num);            break;        case CSS_PX:            text = String::format("%.6lgpx", m_value.num);            break;        case CSS_CM:            text = String::format("%.6lgcm", m_value.num);            break;        case CSS_MM:            text = String::format("%.6lgmm", m_value.num);            break;        case CSS_IN:            text = String::format("%.6lgin", m_value.num);            break;        case CSS_PT:            text = String::format("%.6lgpt", m_value.num);            break;        case CSS_PC:            text = String::format("%.6lgpc", m_value.num);            break;        case CSS_DEG:            text = String::format("%.6lgdeg", m_value.num);            break;        case CSS_RAD:            text = String::format("%.6lgrad", m_value.num);            break;        case CSS_GRAD:            text = String::format("%.6lggrad", m_value.num);            break;        case CSS_MS:            text = String::format("%.6lgms", m_value.num);            break;        case CSS_S:            text = String::format("%.6lgs", m_value.num);            break;        case CSS_HZ:            text = String::format("%.6lghz", m_value.num);            break;        case CSS_KHZ:            text = String::format("%.6lgkhz", m_value.num);            break;        case CSS_TURN:            text = String::format("%.6lgturn", m_value.num);            break;        case CSS_DIMENSION:            // FIXME            break;        case CSS_STRING:            text = quoteStringIfNeeded(m_value.string);            break;        case CSS_URI:            text = "url(" + quoteURLIfNeeded(m_value.string) + ")";            break;        case CSS_IDENT:            text = valueOrPropertyName(m_value.ident);            break;        case CSS_ATTR:            // FIXME            break;        case CSS_COUNTER:            text = "counter(";            text += String::number(m_value.num);            text += ")";            // FIXME: Add list-style and separator            break;        case CSS_RECT: {            DEFINE_STATIC_LOCAL(const String, rectParen, ("rect("));            Rect* rectVal = getRectValue();            Vector<UChar> result;            result.reserveInitialCapacity(32);            append(result, rectParen);            append(result, rectVal->top()->cssText());            result.append(' ');            append(result, rectVal->right()->cssText());            result.append(' ');            append(result, rectVal->bottom()->cssText());            result.append(' ');            append(result, rectVal->left()->cssText());            result.append(')');            return String::adopt(result);        }        case CSS_RGBCOLOR:        case CSS_PARSER_HEXCOLOR: {            DEFINE_STATIC_LOCAL(const String, commaSpace, (", "));            DEFINE_STATIC_LOCAL(const String, rgbParen, ("rgb("));            DEFINE_STATIC_LOCAL(const String, rgbaParen, ("rgba("));            RGBA32 rgbColor = m_value.rgbcolor;            if (m_type == CSS_PARSER_HEXCOLOR)                Color::parseHexColor(m_value.string, rgbColor);            Color color(rgbColor);            Vector<UChar> result;            result.reserveInitialCapacity(32);            if (color.hasAlpha())                append(result, rgbaParen);            else                append(result, rgbParen);            appendNumber(result, static_cast<unsigned char>(color.red()));            append(result, commaSpace);            appendNumber(result, static_cast<unsigned char>(color.green()));            append(result, commaSpace);            appendNumber(result, static_cast<unsigned char>(color.blue()));            if (color.hasAlpha()) {                append(result, commaSpace);                append(result, String::number(static_cast<float>(color.alpha()) / 256.0f));            }            result.append(')');            return String::adopt(result);        }        case CSS_PAIR:            text = m_value.pair->first()->cssText();            text += " ";            text += m_value.pair->second()->cssText();            break;#if ENABLE(DASHBOARD_SUPPORT)        case CSS_DASHBOARD_REGION:            for (DashboardRegion* region = getDashboardRegionValue(); region; region = region->m_next.get()) {                if (!text.isEmpty())                    text.append(' ');                text += "dashboard-region(";                text += region->m_label;                if (region->m_isCircle)                    text += " circle";                else if (region->m_isRectangle)                    text += " rectangle";                else                    break;                if (region->top()->m_type == CSS_IDENT && region->top()->getIdent() == CSSValueInvalid) {                    ASSERT(region->right()->m_type == CSS_IDENT);                    ASSERT(region->bottom()->m_type == CSS_IDENT);                    ASSERT(region->left()->m_type == CSS_IDENT);                    ASSERT(region->right()->getIdent() == CSSValueInvalid);                    ASSERT(region->bottom()->getIdent() == CSSValueInvalid);                    ASSERT(region->left()->getIdent() == CSSValueInvalid);                } else {                    text.append(' ');                    text += region->top()->cssText() + " ";                    text += region->right()->cssText() + " ";                    text += region->bottom()->cssText() + " ";                    text += region->left()->cssText();                }                text += ")";            }            break;#endif        case CSS_PARSER_VARIABLE_FUNCTION_SYNTAX:            text = "-webkit-var(";            text += m_value.string;            text += ")";            break;        case CSS_PARSER_OPERATOR: {            char c = static_cast<char>(m_value.ident);            text = String(&c, 1U);            break;        }        case CSS_PARSER_IDENTIFIER:            text = quoteStringIfNeeded(m_value.string);            break;    }    return text;}CSSParserValue CSSPrimitiveValue::parserValue() const{    // We only have to handle a subset of types.    CSSParserValue value;    value.id = 0;    value.isInt = false;    value.unit = CSSPrimitiveValue::CSS_IDENT;    switch (m_type) {        case CSS_NUMBER:        case CSS_PERCENTAGE:        case CSS_EMS:        case CSS_EXS:        case CSS_PX:        case CSS_CM:        case CSS_MM:        case CSS_IN:        case CSS_PT:        case CSS_PC:        case CSS_DEG:        case CSS_RAD:        case CSS_GRAD:        case CSS_MS:        case CSS_S:        case CSS_HZ:        case CSS_KHZ:        case CSS_DIMENSION:        case CSS_TURN:            value.fValue = m_value.num;            value.unit = m_type;            break;        case CSS_STRING:        case CSS_URI:        case CSS_PARSER_VARIABLE_FUNCTION_SYNTAX:        case CSS_PARSER_HEXCOLOR:            value.string.characters = const_cast<UChar*>(m_value.string->characters());            value.string.length = m_value.string->length();            value.unit = m_type;            break;        case CSS_IDENT: {            value.id = m_value.ident;            String name = valueOrPropertyName(m_value.ident);            value.string.characters = const_cast<UChar*>(name.characters());            value.string.length = name.length();            break;        }        case CSS_PARSER_OPERATOR:            value.iValue = m_value.ident;            value.unit = CSSParserValue::Operator;            break;        case CSS_PARSER_INTEGER:            value.fValue = m_value.num;            value.unit = CSSPrimitiveValue::CSS_NUMBER;            value.isInt = true;            break;        case CSS_PARSER_IDENTIFIER:            value.string.characters = const_cast<UChar*>(m_value.string->characters());            value.string.length = m_value.string->length();            value.unit = CSSPrimitiveValue::CSS_IDENT;            break;        case CSS_UNKNOWN:        case CSS_ATTR:        case CSS_COUNTER:        case CSS_RECT:        case CSS_RGBCOLOR:        case CSS_PAIR:#if ENABLE(DASHBOARD_SUPPORT)        case CSS_DASHBOARD_REGION:#endif            ASSERT_NOT_REACHED();            break;    }        return value;}void CSSPrimitiveValue::addSubresourceStyleURLs(ListHashSet<KURL>& urls, const CSSStyleSheet* styleSheet){    if (m_type == CSS_URI)        addSubresourceURL(urls, styleSheet->completeURL(m_value.string));}} // namespace WebCore

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -