| OLD | NEW |
| 1 /* | 1 /* |
| 2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) | 2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) |
| 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2012 Apple Inc. All rights reserv
ed. | 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2012 Apple Inc. All rights reserv
ed. |
| 4 * | 4 * |
| 5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
| 6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
| 7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
| 8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
| 9 * | 9 * |
| 10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
| 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 13 * Library General Public License for more details. | 13 * Library General Public License for more details. |
| 14 * | 14 * |
| 15 * You should have received a copy of the GNU Library General Public License | 15 * You should have received a copy of the GNU Library General Public License |
| 16 * along with this library; see the file COPYING.LIB. If not, write to | 16 * along with this library; see the file COPYING.LIB. If not, write to |
| 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 18 * Boston, MA 02110-1301, USA. | 18 * Boston, MA 02110-1301, USA. |
| 19 */ | 19 */ |
| 20 | 20 |
| 21 #include "config.h" | 21 #include "config.h" |
| 22 #include "core/css/CSSPrimitiveValue.h" | 22 #include "core/css/CSSPrimitiveValue.h" |
| 23 | 23 |
| 24 #include "bindings/core/v8/ExceptionState.h" | |
| 25 #include "core/css/CSSBasicShapes.h" | 24 #include "core/css/CSSBasicShapes.h" |
| 26 #include "core/css/CSSCalculationValue.h" | 25 #include "core/css/CSSCalculationValue.h" |
| 27 #include "core/css/CSSHelper.h" | 26 #include "core/css/CSSHelper.h" |
| 28 #include "core/css/CSSMarkup.h" | 27 #include "core/css/CSSMarkup.h" |
| 29 #include "core/css/CSSToLengthConversionData.h" | 28 #include "core/css/CSSToLengthConversionData.h" |
| 30 #include "core/css/Counter.h" | 29 #include "core/css/Counter.h" |
| 31 #include "core/css/Pair.h" | 30 #include "core/css/Pair.h" |
| 32 #include "core/css/RGBColor.h" | |
| 33 #include "core/css/Rect.h" | 31 #include "core/css/Rect.h" |
| 34 #include "core/css/StyleSheetContents.h" | 32 #include "core/css/StyleSheetContents.h" |
| 35 #include "core/dom/ExceptionCode.h" | |
| 36 #include "core/dom/Node.h" | 33 #include "core/dom/Node.h" |
| 37 #include "core/rendering/style/RenderStyle.h" | 34 #include "core/rendering/style/RenderStyle.h" |
| 38 #include "platform/Decimal.h" | 35 #include "platform/Decimal.h" |
| 39 #include "platform/LayoutUnit.h" | 36 #include "platform/LayoutUnit.h" |
| 40 #include "platform/fonts/FontMetrics.h" | 37 #include "platform/fonts/FontMetrics.h" |
| 41 #include "wtf/StdLibExtras.h" | 38 #include "wtf/StdLibExtras.h" |
| 42 #include "wtf/text/StringBuffer.h" | 39 #include "wtf/text/StringBuffer.h" |
| 43 #include "wtf/text/StringBuilder.h" | 40 #include "wtf/text/StringBuilder.h" |
| 44 | 41 |
| 45 using namespace WTF; | 42 using namespace WTF; |
| (...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 if (m_primitiveUnitType == CSS_CALC) { | 672 if (m_primitiveUnitType == CSS_CALC) { |
| 676 cssCalcValue()->accumulateLengthArray(lengthArray, multiplier); | 673 cssCalcValue()->accumulateLengthArray(lengthArray, multiplier); |
| 677 return; | 674 return; |
| 678 } | 675 } |
| 679 | 676 |
| 680 LengthUnitType lengthType; | 677 LengthUnitType lengthType; |
| 681 if (unitTypeToLengthUnitType(static_cast<UnitType>(m_primitiveUnitType), len
gthType)) | 678 if (unitTypeToLengthUnitType(static_cast<UnitType>(m_primitiveUnitType), len
gthType)) |
| 682 lengthArray.at(lengthType) += m_value.num * conversionToCanonicalUnitsSc
aleFactor(static_cast<UnitType>(m_primitiveUnitType)) * multiplier; | 679 lengthArray.at(lengthType) += m_value.num * conversionToCanonicalUnitsSc
aleFactor(static_cast<UnitType>(m_primitiveUnitType)) * multiplier; |
| 683 } | 680 } |
| 684 | 681 |
| 685 void CSSPrimitiveValue::setFloatValue(unsigned short, double, ExceptionState& ex
ceptionState) | |
| 686 { | |
| 687 // Keeping values immutable makes optimizations easier and allows sharing of
the primitive value objects. | |
| 688 // No other engine supports mutating style through this API. Computed style
is always read-only anyway. | |
| 689 // Supporting setter would require making primitive value copy-on-write and
taking care of style invalidation. | |
| 690 exceptionState.throwDOMException(NoModificationAllowedError, "CSSPrimitiveVa
lue objects are read-only."); | |
| 691 } | |
| 692 | |
| 693 double CSSPrimitiveValue::conversionToCanonicalUnitsScaleFactor(UnitType unitTyp
e) | 682 double CSSPrimitiveValue::conversionToCanonicalUnitsScaleFactor(UnitType unitTyp
e) |
| 694 { | 683 { |
| 695 double factor = 1.0; | 684 double factor = 1.0; |
| 696 // FIXME: the switch can be replaced by an array of scale factors. | 685 // FIXME: the switch can be replaced by an array of scale factors. |
| 697 switch (unitType) { | 686 switch (unitType) { |
| 698 // These are "canonical" units in their respective categories. | 687 // These are "canonical" units in their respective categories. |
| 699 case CSS_PX: | 688 case CSS_PX: |
| 700 case CSS_DEG: | 689 case CSS_DEG: |
| 701 case CSS_MS: | 690 case CSS_MS: |
| 702 case CSS_HZ: | 691 case CSS_HZ: |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 735 case CSS_KHZ: | 724 case CSS_KHZ: |
| 736 factor = 1000; | 725 factor = 1000; |
| 737 break; | 726 break; |
| 738 default: | 727 default: |
| 739 break; | 728 break; |
| 740 } | 729 } |
| 741 | 730 |
| 742 return factor; | 731 return factor; |
| 743 } | 732 } |
| 744 | 733 |
| 745 double CSSPrimitiveValue::getDoubleValue(UnitType unitType, ExceptionState& exce
ptionState) const | |
| 746 { | |
| 747 double result = 0; | |
| 748 bool success = getDoubleValueInternal(unitType, &result); | |
| 749 if (!success) { | |
| 750 exceptionState.throwDOMException(InvalidAccessError, "Failed to obtain a
double value."); | |
| 751 return 0.0; | |
| 752 } | |
| 753 | |
| 754 return result; | |
| 755 } | |
| 756 | |
| 757 double CSSPrimitiveValue::getDoubleValue(UnitType unitType) const | 734 double CSSPrimitiveValue::getDoubleValue(UnitType unitType) const |
| 758 { | 735 { |
| 759 double result = 0; | 736 double result = 0; |
| 760 getDoubleValueInternal(unitType, &result); | 737 getDoubleValueInternal(unitType, &result); |
| 761 return result; | 738 return result; |
| 762 } | 739 } |
| 763 | 740 |
| 764 double CSSPrimitiveValue::getDoubleValue() const | 741 double CSSPrimitiveValue::getDoubleValue() const |
| 765 { | 742 { |
| 766 return m_primitiveUnitType != CSS_CALC ? m_value.num : m_value.calc->doubleV
alue(); | 743 return m_primitiveUnitType != CSS_CALC ? m_value.num : m_value.calc->doubleV
alue(); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 906 return CSSPrimitiveValue::CSS_VMIN; | 883 return CSSPrimitiveValue::CSS_VMIN; |
| 907 case UnitTypeViewportMax: | 884 case UnitTypeViewportMax: |
| 908 return CSSPrimitiveValue::CSS_VMAX; | 885 return CSSPrimitiveValue::CSS_VMAX; |
| 909 case LengthUnitTypeCount: | 886 case LengthUnitTypeCount: |
| 910 break; | 887 break; |
| 911 } | 888 } |
| 912 ASSERT_NOT_REACHED(); | 889 ASSERT_NOT_REACHED(); |
| 913 return CSSPrimitiveValue::CSS_UNKNOWN; | 890 return CSSPrimitiveValue::CSS_UNKNOWN; |
| 914 } | 891 } |
| 915 | 892 |
| 916 void CSSPrimitiveValue::setStringValue(unsigned short, const String&, ExceptionS
tate& exceptionState) | |
| 917 { | |
| 918 // Keeping values immutable makes optimizations easier and allows sharing of
the primitive value objects. | |
| 919 // No other engine supports mutating style through this API. Computed style
is always read-only anyway. | |
| 920 // Supporting setter would require making primitive value copy-on-write and
taking care of style invalidation. | |
| 921 exceptionState.throwDOMException(NoModificationAllowedError, "CSSPrimitiveVa
lue objects are read-only."); | |
| 922 } | |
| 923 | |
| 924 String CSSPrimitiveValue::getStringValue(ExceptionState& exceptionState) const | |
| 925 { | |
| 926 switch (m_primitiveUnitType) { | |
| 927 case CSS_STRING: | |
| 928 case CSS_ATTR: | |
| 929 case CSS_URI: | |
| 930 return m_value.string; | |
| 931 case CSS_VALUE_ID: | |
| 932 return valueName(m_value.valueID); | |
| 933 case CSS_PROPERTY_ID: | |
| 934 return propertyName(m_value.propertyID); | |
| 935 default: | |
| 936 exceptionState.throwDOMException(InvalidAccessError, "This object's
value cannot be represented as a string."); | |
| 937 break; | |
| 938 } | |
| 939 | |
| 940 return String(); | |
| 941 } | |
| 942 | |
| 943 String CSSPrimitiveValue::getStringValue() const | 893 String CSSPrimitiveValue::getStringValue() const |
| 944 { | 894 { |
| 945 switch (m_primitiveUnitType) { | 895 switch (m_primitiveUnitType) { |
| 946 case CSS_STRING: | 896 case CSS_STRING: |
| 947 case CSS_ATTR: | 897 case CSS_ATTR: |
| 948 case CSS_URI: | 898 case CSS_URI: |
| 949 return m_value.string; | 899 return m_value.string; |
| 950 case CSS_VALUE_ID: | 900 case CSS_VALUE_ID: |
| 951 return valueName(m_value.valueID); | 901 return valueName(m_value.valueID); |
| 952 case CSS_PROPERTY_ID: | 902 case CSS_PROPERTY_ID: |
| 953 return propertyName(m_value.propertyID); | 903 return propertyName(m_value.propertyID); |
| 954 default: | 904 default: |
| 955 break; | 905 break; |
| 956 } | 906 } |
| 957 | 907 |
| 958 return String(); | 908 return String(); |
| 959 } | 909 } |
| 960 | 910 |
| 961 Counter* CSSPrimitiveValue::getCounterValue(ExceptionState& exceptionState) cons
t | |
| 962 { | |
| 963 if (m_primitiveUnitType != CSS_COUNTER) { | |
| 964 exceptionState.throwDOMException(InvalidAccessError, "This object is not
a counter value."); | |
| 965 return 0; | |
| 966 } | |
| 967 | |
| 968 return m_value.counter; | |
| 969 } | |
| 970 | |
| 971 Rect* CSSPrimitiveValue::getRectValue(ExceptionState& exceptionState) const | |
| 972 { | |
| 973 if (m_primitiveUnitType != CSS_RECT) { | |
| 974 exceptionState.throwDOMException(InvalidAccessError, "This object is not
a rect value."); | |
| 975 return 0; | |
| 976 } | |
| 977 | |
| 978 return m_value.rect; | |
| 979 } | |
| 980 | |
| 981 Quad* CSSPrimitiveValue::getQuadValue(ExceptionState& exceptionState) const | |
| 982 { | |
| 983 if (m_primitiveUnitType != CSS_QUAD) { | |
| 984 exceptionState.throwDOMException(InvalidAccessError, "This object is not
a quad value."); | |
| 985 return 0; | |
| 986 } | |
| 987 | |
| 988 return m_value.quad; | |
| 989 } | |
| 990 | |
| 991 PassRefPtrWillBeRawPtr<RGBColor> CSSPrimitiveValue::getRGBColorValue(ExceptionSt
ate& exceptionState) const | |
| 992 { | |
| 993 if (m_primitiveUnitType != CSS_RGBCOLOR) { | |
| 994 exceptionState.throwDOMException(InvalidAccessError, "This object is not
an RGB color value."); | |
| 995 return nullptr; | |
| 996 } | |
| 997 | |
| 998 // FIMXE: This should not return a new object for each invocation. | |
| 999 return RGBColor::create(m_value.rgbcolor); | |
| 1000 } | |
| 1001 | |
| 1002 Pair* CSSPrimitiveValue::getPairValue(ExceptionState& exceptionState) const | |
| 1003 { | |
| 1004 if (m_primitiveUnitType != CSS_PAIR) { | |
| 1005 exceptionState.throwDOMException(InvalidAccessError, "This object is not
a pair value."); | |
| 1006 return 0; | |
| 1007 } | |
| 1008 | |
| 1009 return m_value.pair; | |
| 1010 } | |
| 1011 | |
| 1012 static String formatNumber(double number, const char* suffix, unsigned suffixLen
gth) | 911 static String formatNumber(double number, const char* suffix, unsigned suffixLen
gth) |
| 1013 { | 912 { |
| 1014 Decimal decimal = Decimal::fromDouble(number); | 913 Decimal decimal = Decimal::fromDouble(number); |
| 1015 String result = decimal.toString(); | 914 String result = decimal.toString(); |
| 1016 result.append(suffix, suffixLength); | 915 result.append(suffix, suffixLength); |
| 1017 return result; | 916 return result; |
| 1018 } | 917 } |
| 1019 | 918 |
| 1020 template <unsigned characterCount> | 919 template <unsigned characterCount> |
| 1021 ALWAYS_INLINE static String formatNumber(double number, const char (&characters)
[characterCount]) | 920 ALWAYS_INLINE static String formatNumber(double number, const char (&characters)
[characterCount]) |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1234 text = m_value.shape->cssText(); | 1133 text = m_value.shape->cssText(); |
| 1235 break; | 1134 break; |
| 1236 } | 1135 } |
| 1237 | 1136 |
| 1238 ASSERT(!cssTextCache().contains(this)); | 1137 ASSERT(!cssTextCache().contains(this)); |
| 1239 cssTextCache().set(this, text); | 1138 cssTextCache().set(this, text); |
| 1240 m_hasCachedCSSText = true; | 1139 m_hasCachedCSSText = true; |
| 1241 return text; | 1140 return text; |
| 1242 } | 1141 } |
| 1243 | 1142 |
| 1244 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPrimitiveValue::cloneForCSSOM() con
st | |
| 1245 { | |
| 1246 RefPtrWillBeRawPtr<CSSPrimitiveValue> result = nullptr; | |
| 1247 | |
| 1248 switch (m_primitiveUnitType) { | |
| 1249 case CSS_STRING: | |
| 1250 case CSS_URI: | |
| 1251 case CSS_ATTR: | |
| 1252 case CSS_COUNTER_NAME: | |
| 1253 result = CSSPrimitiveValue::create(m_value.string, static_cast<UnitType>
(m_primitiveUnitType)); | |
| 1254 break; | |
| 1255 case CSS_COUNTER: | |
| 1256 result = CSSPrimitiveValue::create(m_value.counter->cloneForCSSOM()); | |
| 1257 break; | |
| 1258 case CSS_RECT: | |
| 1259 result = CSSPrimitiveValue::create(m_value.rect->cloneForCSSOM()); | |
| 1260 break; | |
| 1261 case CSS_QUAD: | |
| 1262 result = CSSPrimitiveValue::create(m_value.quad->cloneForCSSOM()); | |
| 1263 break; | |
| 1264 case CSS_PAIR: | |
| 1265 // Pair is not exposed to the CSSOM, no need for a deep clone. | |
| 1266 result = CSSPrimitiveValue::create(m_value.pair); | |
| 1267 break; | |
| 1268 case CSS_CALC: | |
| 1269 // CSSCalcValue is not exposed to the CSSOM, no need for a deep clone. | |
| 1270 result = CSSPrimitiveValue::create(m_value.calc); | |
| 1271 break; | |
| 1272 case CSS_SHAPE: | |
| 1273 // CSSShapeValue is not exposed to the CSSOM, no need for a deep clone. | |
| 1274 result = CSSPrimitiveValue::create(m_value.shape); | |
| 1275 break; | |
| 1276 case CSS_NUMBER: | |
| 1277 case CSS_PERCENTAGE: | |
| 1278 case CSS_EMS: | |
| 1279 case CSS_EXS: | |
| 1280 case CSS_REMS: | |
| 1281 case CSS_CHS: | |
| 1282 case CSS_PX: | |
| 1283 case CSS_CM: | |
| 1284 case CSS_MM: | |
| 1285 case CSS_IN: | |
| 1286 case CSS_PT: | |
| 1287 case CSS_PC: | |
| 1288 case CSS_DEG: | |
| 1289 case CSS_RAD: | |
| 1290 case CSS_GRAD: | |
| 1291 case CSS_MS: | |
| 1292 case CSS_S: | |
| 1293 case CSS_HZ: | |
| 1294 case CSS_KHZ: | |
| 1295 case CSS_TURN: | |
| 1296 case CSS_VW: | |
| 1297 case CSS_VH: | |
| 1298 case CSS_VMIN: | |
| 1299 case CSS_VMAX: | |
| 1300 case CSS_DPPX: | |
| 1301 case CSS_DPI: | |
| 1302 case CSS_DPCM: | |
| 1303 case CSS_FR: | |
| 1304 result = CSSPrimitiveValue::create(m_value.num, static_cast<UnitType>(m_
primitiveUnitType)); | |
| 1305 break; | |
| 1306 case CSS_PROPERTY_ID: | |
| 1307 result = CSSPrimitiveValue::createIdentifier(m_value.propertyID); | |
| 1308 break; | |
| 1309 case CSS_VALUE_ID: | |
| 1310 result = CSSPrimitiveValue::createIdentifier(m_value.valueID); | |
| 1311 break; | |
| 1312 case CSS_RGBCOLOR: | |
| 1313 result = CSSPrimitiveValue::createColor(m_value.rgbcolor); | |
| 1314 break; | |
| 1315 case CSS_DIMENSION: | |
| 1316 case CSS_UNKNOWN: | |
| 1317 case CSS_PARSER_HEXCOLOR: | |
| 1318 ASSERT_NOT_REACHED(); | |
| 1319 break; | |
| 1320 } | |
| 1321 if (result) | |
| 1322 result->setCSSOMSafe(); | |
| 1323 | |
| 1324 return result; | |
| 1325 } | |
| 1326 | |
| 1327 bool CSSPrimitiveValue::equals(const CSSPrimitiveValue& other) const | 1143 bool CSSPrimitiveValue::equals(const CSSPrimitiveValue& other) const |
| 1328 { | 1144 { |
| 1329 if (m_primitiveUnitType != other.m_primitiveUnitType) | 1145 if (m_primitiveUnitType != other.m_primitiveUnitType) |
| 1330 return false; | 1146 return false; |
| 1331 | 1147 |
| 1332 switch (m_primitiveUnitType) { | 1148 switch (m_primitiveUnitType) { |
| 1333 case CSS_UNKNOWN: | 1149 case CSS_UNKNOWN: |
| 1334 return false; | 1150 return false; |
| 1335 case CSS_NUMBER: | 1151 case CSS_NUMBER: |
| 1336 case CSS_PERCENTAGE: | 1152 case CSS_PERCENTAGE: |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1412 visitor->trace(m_value.shape); | 1228 visitor->trace(m_value.shape); |
| 1413 break; | 1229 break; |
| 1414 default: | 1230 default: |
| 1415 break; | 1231 break; |
| 1416 } | 1232 } |
| 1417 #endif | 1233 #endif |
| 1418 CSSValue::traceAfterDispatch(visitor); | 1234 CSSValue::traceAfterDispatch(visitor); |
| 1419 } | 1235 } |
| 1420 | 1236 |
| 1421 } // namespace blink | 1237 } // namespace blink |
| OLD | NEW |