| 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 | 
|---|