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, 2009, 2010, 2012 Apple Inc. All r
ights reserved. | 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All |
| 4 * rights reserved. |
4 * Copyright (C) 2011 Research In Motion Limited. All rights reserved. | 5 * Copyright (C) 2011 Research In Motion Limited. All rights reserved. |
5 * Copyright (C) 2013 Intel Corporation. All rights reserved. | 6 * Copyright (C) 2013 Intel Corporation. All rights reserved. |
6 * | 7 * |
7 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 11 * version 2 of the License, or (at your option) any later version. |
11 * | 12 * |
12 * This library is distributed in the hope that it will be useful, | 13 * This library is distributed in the hope that it will be useful, |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 if (value.isVariableReferenceValue()) | 412 if (value.isVariableReferenceValue()) |
412 return emptyString(); | 413 return emptyString(); |
413 } | 414 } |
414 | 415 |
415 return String(); | 416 return String(); |
416 } | 417 } |
417 | 418 |
418 String StylePropertySerializer::getPropertyValue( | 419 String StylePropertySerializer::getPropertyValue( |
419 CSSPropertyID propertyID) const { | 420 CSSPropertyID propertyID) const { |
420 const StylePropertyShorthand& shorthand = shorthandForProperty(propertyID); | 421 const StylePropertyShorthand& shorthand = shorthandForProperty(propertyID); |
421 // TODO(timloh): This is weird, why do we call this with non-shorthands at all
? | 422 // TODO(timloh): This is weird, why do we call this with non-shorthands at |
| 423 // all? |
422 if (!shorthand.length()) | 424 if (!shorthand.length()) |
423 return String(); | 425 return String(); |
424 | 426 |
425 String result = commonShorthandChecks(shorthand); | 427 String result = commonShorthandChecks(shorthand); |
426 if (!result.isNull()) | 428 if (!result.isNull()) |
427 return result; | 429 return result; |
428 | 430 |
429 switch (propertyID) { | 431 switch (propertyID) { |
430 case CSSPropertyAnimation: | 432 case CSSPropertyAnimation: |
431 return getLayeredShorthandValue(animationShorthand()); | 433 return getLayeredShorthandValue(animationShorthand()); |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 prefix = '/'; | 557 prefix = '/'; |
556 break; | 558 break; |
557 default: | 559 default: |
558 ASSERT_NOT_REACHED(); | 560 ASSERT_NOT_REACHED(); |
559 } | 561 } |
560 | 562 |
561 if (prefix && !result.isEmpty()) | 563 if (prefix && !result.isEmpty()) |
562 result.append(prefix); | 564 result.append(prefix); |
563 | 565 |
564 String value; | 566 String value; |
565 // In the font-variant shorthand a "none" ligatures value needs to be expanded
. | 567 // In the font-variant shorthand a "none" ligatures value needs to be |
| 568 // expanded. |
566 if (propertyID == CSSPropertyFontVariantLigatures && | 569 if (propertyID == CSSPropertyFontVariantLigatures && |
567 val->isIdentifierValue() && | 570 val->isIdentifierValue() && |
568 toCSSIdentifierValue(val)->getValueID() == CSSValueNone) { | 571 toCSSIdentifierValue(val)->getValueID() == CSSValueNone) { |
569 value = | 572 value = |
570 "no-common-ligatures no-discretionary-ligatures " | 573 "no-common-ligatures no-discretionary-ligatures " |
571 "no-historical-ligatures no-contextual"; | 574 "no-historical-ligatures no-contextual"; |
572 } else { | 575 } else { |
573 value = m_propertySet.propertyAt(foundPropertyIndex).value()->cssText(); | 576 value = m_propertySet.propertyAt(foundPropertyIndex).value()->cssText(); |
574 } | 577 } |
575 | 578 |
(...skipping 21 matching lines...) Expand all Loading... |
597 m_propertySet.propertyAt(fontSizePropertyIndex); | 600 m_propertySet.propertyAt(fontSizePropertyIndex); |
598 PropertyValueForSerializer fontFamilyProperty = | 601 PropertyValueForSerializer fontFamilyProperty = |
599 m_propertySet.propertyAt(fontFamilyPropertyIndex); | 602 m_propertySet.propertyAt(fontFamilyPropertyIndex); |
600 PropertyValueForSerializer fontVariantCapsProperty = | 603 PropertyValueForSerializer fontVariantCapsProperty = |
601 m_propertySet.propertyAt(fontVariantCapsPropertyIndex); | 604 m_propertySet.propertyAt(fontVariantCapsPropertyIndex); |
602 PropertyValueForSerializer fontVariantLigaturesProperty = | 605 PropertyValueForSerializer fontVariantLigaturesProperty = |
603 m_propertySet.propertyAt(fontVariantLigaturesPropertyIndex); | 606 m_propertySet.propertyAt(fontVariantLigaturesPropertyIndex); |
604 PropertyValueForSerializer fontVariantNumericProperty = | 607 PropertyValueForSerializer fontVariantNumericProperty = |
605 m_propertySet.propertyAt(fontVariantNumericPropertyIndex); | 608 m_propertySet.propertyAt(fontVariantNumericPropertyIndex); |
606 | 609 |
607 // Check that non-initial font-variant subproperties are not conflicting with
this serialization. | 610 // Check that non-initial font-variant subproperties are not conflicting with |
| 611 // this serialization. |
608 const CSSValue* ligaturesValue = fontVariantLigaturesProperty.value(); | 612 const CSSValue* ligaturesValue = fontVariantLigaturesProperty.value(); |
609 const CSSValue* numericValue = fontVariantNumericProperty.value(); | 613 const CSSValue* numericValue = fontVariantNumericProperty.value(); |
610 if ((ligaturesValue->isIdentifierValue() && | 614 if ((ligaturesValue->isIdentifierValue() && |
611 toCSSIdentifierValue(ligaturesValue)->getValueID() != CSSValueNormal) || | 615 toCSSIdentifierValue(ligaturesValue)->getValueID() != CSSValueNormal) || |
612 ligaturesValue->isValueList() || | 616 ligaturesValue->isValueList() || |
613 (numericValue->isIdentifierValue() && | 617 (numericValue->isIdentifierValue() && |
614 toCSSIdentifierValue(numericValue)->getValueID() != CSSValueNormal) || | 618 toCSSIdentifierValue(numericValue)->getValueID() != CSSValueNormal) || |
615 numericValue->isValueList()) | 619 numericValue->isValueList()) |
616 return emptyString(); | 620 return emptyString(); |
617 | 621 |
(...skipping 15 matching lines...) Expand all Loading... |
633 appendFontLonghandValueIfNotNormal(CSSPropertyLineHeight, result); | 637 appendFontLonghandValueIfNotNormal(CSSPropertyLineHeight, result); |
634 if (!result.isEmpty()) | 638 if (!result.isEmpty()) |
635 result.append(' '); | 639 result.append(' '); |
636 result.append(fontFamilyProperty.value()->cssText()); | 640 result.append(fontFamilyProperty.value()->cssText()); |
637 return result.toString(); | 641 return result.toString(); |
638 } | 642 } |
639 | 643 |
640 String StylePropertySerializer::fontVariantValue() const { | 644 String StylePropertySerializer::fontVariantValue() const { |
641 StringBuilder result; | 645 StringBuilder result; |
642 | 646 |
643 // TODO(drott): Decide how we want to return ligature values in shorthands, re
duced to "none" or | 647 // TODO(drott): Decide how we want to return ligature values in shorthands, |
644 // spelled out, filed as W3C bug: | 648 // reduced to "none" or spelled out, filed as W3C bug: |
645 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=29594 | 649 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=29594 |
646 appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantLigatures, result); | 650 appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantLigatures, result); |
647 appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantCaps, result); | 651 appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantCaps, result); |
648 appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantNumeric, result); | 652 appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantNumeric, result); |
649 | 653 |
650 if (result.isEmpty()) { | 654 if (result.isEmpty()) { |
651 return "normal"; | 655 return "normal"; |
652 } | 656 } |
653 | 657 |
654 return result.toString(); | 658 return result.toString(); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
709 for (size_t i = 0; i < size; i++) { | 713 for (size_t i = 0; i < size; i++) { |
710 values[i] = m_propertySet.getPropertyCSSValue(shorthand.properties()[i]); | 714 values[i] = m_propertySet.getPropertyCSSValue(shorthand.properties()[i]); |
711 if (values[i]->isBaseValueList()) { | 715 if (values[i]->isBaseValueList()) { |
712 const CSSValueList* valueList = toCSSValueList(values[i]); | 716 const CSSValueList* valueList = toCSSValueList(values[i]); |
713 numLayers = std::max(numLayers, valueList->length()); | 717 numLayers = std::max(numLayers, valueList->length()); |
714 } | 718 } |
715 } | 719 } |
716 | 720 |
717 StringBuilder result; | 721 StringBuilder result; |
718 | 722 |
719 // Now stitch the properties together. Implicit initial values are flagged as
such and | 723 // Now stitch the properties together. Implicit initial values are flagged as |
| 724 // such and |
720 // can safely be omitted. | 725 // can safely be omitted. |
721 for (size_t layer = 0; layer < numLayers; layer++) { | 726 for (size_t layer = 0; layer < numLayers; layer++) { |
722 StringBuilder layerResult; | 727 StringBuilder layerResult; |
723 bool useRepeatXShorthand = false; | 728 bool useRepeatXShorthand = false; |
724 bool useRepeatYShorthand = false; | 729 bool useRepeatYShorthand = false; |
725 bool useSingleWordShorthand = false; | 730 bool useSingleWordShorthand = false; |
726 bool foundPositionXCSSProperty = false; | 731 bool foundPositionXCSSProperty = false; |
727 bool foundPositionYCSSProperty = false; | 732 bool foundPositionYCSSProperty = false; |
728 | 733 |
729 for (unsigned propertyIndex = 0; propertyIndex < size; propertyIndex++) { | 734 for (unsigned propertyIndex = 0; propertyIndex < size; propertyIndex++) { |
(...skipping 24 matching lines...) Expand all Loading... |
754 property == CSSPropertyWebkitMaskRepeatX)) { | 759 property == CSSPropertyWebkitMaskRepeatX)) { |
755 ASSERT(shorthand.properties()[propertyIndex + 1] == | 760 ASSERT(shorthand.properties()[propertyIndex + 1] == |
756 CSSPropertyBackgroundRepeatY || | 761 CSSPropertyBackgroundRepeatY || |
757 shorthand.properties()[propertyIndex + 1] == | 762 shorthand.properties()[propertyIndex + 1] == |
758 CSSPropertyWebkitMaskRepeatY); | 763 CSSPropertyWebkitMaskRepeatY); |
759 const CSSValue& yValue = | 764 const CSSValue& yValue = |
760 values[propertyIndex + 1]->isValueList() | 765 values[propertyIndex + 1]->isValueList() |
761 ? toCSSValueList(values[propertyIndex + 1])->item(layer) | 766 ? toCSSValueList(values[propertyIndex + 1])->item(layer) |
762 : *values[propertyIndex + 1]; | 767 : *values[propertyIndex + 1]; |
763 | 768 |
764 // FIXME: At some point we need to fix this code to avoid returning an i
nvalid shorthand, | 769 // FIXME: At some point we need to fix this code to avoid returning an |
765 // since some longhand combinations are not serializable into a single s
horthand. | 770 // invalid shorthand, since some longhand combinations are not |
| 771 // serializable into a single shorthand. |
766 if (!value->isIdentifierValue() || !yValue.isIdentifierValue()) | 772 if (!value->isIdentifierValue() || !yValue.isIdentifierValue()) |
767 continue; | 773 continue; |
768 | 774 |
769 CSSValueID xId = toCSSIdentifierValue(value)->getValueID(); | 775 CSSValueID xId = toCSSIdentifierValue(value)->getValueID(); |
770 CSSValueID yId = toCSSIdentifierValue(yValue).getValueID(); | 776 CSSValueID yId = toCSSIdentifierValue(yValue).getValueID(); |
771 // Maybe advance propertyIndex to look at the next CSSValue in the list
for the checks below. | 777 // Maybe advance propertyIndex to look at the next CSSValue in the list |
| 778 // for the checks below. |
772 if (xId == yId) { | 779 if (xId == yId) { |
773 useSingleWordShorthand = true; | 780 useSingleWordShorthand = true; |
774 property = shorthand.properties()[++propertyIndex]; | 781 property = shorthand.properties()[++propertyIndex]; |
775 } else if (xId == CSSValueRepeat && yId == CSSValueNoRepeat) { | 782 } else if (xId == CSSValueRepeat && yId == CSSValueNoRepeat) { |
776 useRepeatXShorthand = true; | 783 useRepeatXShorthand = true; |
777 property = shorthand.properties()[++propertyIndex]; | 784 property = shorthand.properties()[++propertyIndex]; |
778 } else if (xId == CSSValueNoRepeat && yId == CSSValueRepeat) { | 785 } else if (xId == CSSValueNoRepeat && yId == CSSValueRepeat) { |
779 useRepeatYShorthand = true; | 786 useRepeatYShorthand = true; |
780 property = shorthand.properties()[++propertyIndex]; | 787 property = shorthand.properties()[++propertyIndex]; |
781 } | 788 } |
782 } | 789 } |
783 | 790 |
784 if (!(value->isInitialValue() && | 791 if (!(value->isInitialValue() && |
785 toCSSInitialValue(value)->isImplicit())) { | 792 toCSSInitialValue(value)->isImplicit())) { |
786 if (property == CSSPropertyBackgroundSize || | 793 if (property == CSSPropertyBackgroundSize || |
787 property == CSSPropertyWebkitMaskSize) { | 794 property == CSSPropertyWebkitMaskSize) { |
788 if (foundPositionYCSSProperty || foundPositionXCSSProperty) | 795 if (foundPositionYCSSProperty || foundPositionXCSSProperty) |
789 layerResult.append(" / "); | 796 layerResult.append(" / "); |
790 else | 797 else |
791 layerResult.append(" 0% 0% / "); | 798 layerResult.append(" 0% 0% / "); |
792 } else if (!layerResult.isEmpty()) { | 799 } else if (!layerResult.isEmpty()) { |
793 // Do this second to avoid ending up with an extra space in the output
if we hit the continue above. | 800 // Do this second to avoid ending up with an extra space in the output |
| 801 // if we hit the continue above. |
794 layerResult.append(' '); | 802 layerResult.append(' '); |
795 } | 803 } |
796 | 804 |
797 if (useRepeatXShorthand) { | 805 if (useRepeatXShorthand) { |
798 useRepeatXShorthand = false; | 806 useRepeatXShorthand = false; |
799 layerResult.append(getValueName(CSSValueRepeatX)); | 807 layerResult.append(getValueName(CSSValueRepeatX)); |
800 } else if (useRepeatYShorthand) { | 808 } else if (useRepeatYShorthand) { |
801 useRepeatYShorthand = false; | 809 useRepeatYShorthand = false; |
802 layerResult.append(getValueName(CSSValueRepeatY)); | 810 layerResult.append(getValueName(CSSValueRepeatY)); |
803 } else { | 811 } else { |
804 if (useSingleWordShorthand) | 812 if (useSingleWordShorthand) |
805 useSingleWordShorthand = false; | 813 useSingleWordShorthand = false; |
806 layerResult.append(value->cssText()); | 814 layerResult.append(value->cssText()); |
807 } | 815 } |
808 if (property == CSSPropertyBackgroundPositionX || | 816 if (property == CSSPropertyBackgroundPositionX || |
809 property == CSSPropertyWebkitMaskPositionX) | 817 property == CSSPropertyWebkitMaskPositionX) |
810 foundPositionXCSSProperty = true; | 818 foundPositionXCSSProperty = true; |
811 if (property == CSSPropertyBackgroundPositionY || | 819 if (property == CSSPropertyBackgroundPositionY || |
812 property == CSSPropertyWebkitMaskPositionY) { | 820 property == CSSPropertyWebkitMaskPositionY) { |
813 foundPositionYCSSProperty = true; | 821 foundPositionYCSSProperty = true; |
814 // background-position is a special case. If only the first offset is
specified, | 822 // background-position is a special case. If only the first offset is |
815 // the second one defaults to "center", not the same value. | 823 // specified, the second one defaults to "center", not the same value. |
816 } | 824 } |
817 } | 825 } |
818 } | 826 } |
819 if (!layerResult.isEmpty()) { | 827 if (!layerResult.isEmpty()) { |
820 if (!result.isEmpty()) | 828 if (!result.isEmpty()) |
821 result.append(", "); | 829 result.append(", "); |
822 result.append(layerResult); | 830 result.append(layerResult); |
823 } | 831 } |
824 } | 832 } |
825 | 833 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
939 const CSSValue& xValue = | 947 const CSSValue& xValue = |
940 repeatXList ? repeatXList->item(i % repeatXList->length()) : repeatX; | 948 repeatXList ? repeatXList->item(i % repeatXList->length()) : repeatX; |
941 const CSSValue& yValue = | 949 const CSSValue& yValue = |
942 repeatYList ? repeatYList->item(i % repeatYList->length()) : repeatY; | 950 repeatYList ? repeatYList->item(i % repeatYList->length()) : repeatY; |
943 appendBackgroundRepeatValue(builder, xValue, yValue); | 951 appendBackgroundRepeatValue(builder, xValue, yValue); |
944 } | 952 } |
945 return builder.toString(); | 953 return builder.toString(); |
946 } | 954 } |
947 | 955 |
948 } // namespace blink | 956 } // namespace blink |
OLD | NEW |