📄 cssprimitivevalue.cpp
字号:
} 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 + -