diff options
Diffstat (limited to 'WebCore/html/HTMLFontElement.cpp')
-rw-r--r-- | WebCore/html/HTMLFontElement.cpp | 159 |
1 files changed, 96 insertions, 63 deletions
diff --git a/WebCore/html/HTMLFontElement.cpp b/WebCore/html/HTMLFontElement.cpp index 81ae415..5239834 100644 --- a/WebCore/html/HTMLFontElement.cpp +++ b/WebCore/html/HTMLFontElement.cpp @@ -27,6 +27,7 @@ #include "CSSPropertyNames.h" #include "CSSValueKeywords.h" #include "HTMLNames.h" +#include "HTMLParserIdioms.h" using namespace WTF; @@ -45,49 +46,78 @@ PassRefPtr<HTMLFontElement> HTMLFontElement::create(const QualifiedName& tagName return adoptRef(new HTMLFontElement(tagName, document)); } -// Allows leading spaces. -// Allows trailing nonnumeric characters. -// Returns 10 for any size greater than 9. -static bool parseFontSizeNumber(const String& s, int& size) +// http://www.whatwg.org/specs/web-apps/current-work/multipage/rendering.html#fonts-and-colors +static bool parseFontSize(const String& input, int& size) { - unsigned pos = 0; - - // Skip leading spaces. - while (isSpaceOrNewline(s[pos])) - ++pos; - - // Skip a plus or minus. - bool sawPlus = false; - bool sawMinus = false; - if (s[pos] == '+') { - ++pos; - sawPlus = true; - } else if (s[pos] == '-') { - ++pos; - sawMinus = true; + + // Step 1 + // Step 2 + const UChar* position = input.characters(); + const UChar* end = position + input.length(); + + // Step 3 + while (position < end) { + if (!isHTMLSpace(*position)) + break; + ++position; } - - // Parse a single digit. - if (!isASCIIDigit(s[pos])) + + // Step 4 + if (position == end) return false; - int num = s[pos++] - '0'; - - // Check for an additional digit. - if (isASCIIDigit(s[pos])) - num = 10; - - if (sawPlus) { - size = num + 3; - return true; + ASSERT(position < end); + + // Step 5 + enum { + RelativePlus, + RelativeMinus, + Absolute + } mode; + + switch (*position) { + case '+': + mode = RelativePlus; + ++position; + break; + case '-': + mode = RelativeMinus; + ++position; + break; + default: + mode = Absolute; + break; } - - // Don't return 0 (which means 3) or a negative number (which means the same as 1). - if (sawMinus) { - size = num == 1 ? 2 : 1; - return true; + + // Step 6 + Vector<UChar, 16> digits; + while (position < end) { + if (!isASCIIDigit(*position)) + break; + digits.append(*position++); } - - size = num; + + // Step 7 + if (digits.isEmpty()) + return false; + + // Step 8 + int value = charactersToIntStrict(digits.data(), digits.size()); + + // Step 9 + if (mode == RelativePlus) + value += 3; + else if (mode == RelativeMinus) + value = 3 - value; + + // Step 10 + if (value > 7) + value = 7; + + // Step 11 + if (value < 1) + value = 1; + + size = value; return true; } @@ -105,32 +135,35 @@ bool HTMLFontElement::mapToEntry(const QualifiedName& attrName, MappedAttributeE bool HTMLFontElement::cssValueFromFontSizeNumber(const String& s, int& size) { - int num; - if (!parseFontSizeNumber(s, num)) + int num = 0; + if (!parseFontSize(s, num)) return false; - + switch (num) { - case 2: - size = CSSValueSmall; - break; - case 0: // treat 0 the same as 3, because people expect it to be between -1 and +1 - case 3: - size = CSSValueMedium; - break; - case 4: - size = CSSValueLarge; - break; - case 5: - size = CSSValueXLarge; - break; - case 6: - size = CSSValueXxLarge; - break; - default: - if (num > 6) - size = CSSValueWebkitXxxLarge; - else - size = CSSValueXSmall; + case 1: + // FIXME: The spec says that we're supposed to use CSSValueXxSmall here. + size = CSSValueXSmall; + break; + case 2: + size = CSSValueSmall; + break; + case 3: + size = CSSValueMedium; + break; + case 4: + size = CSSValueLarge; + break; + case 5: + size = CSSValueXLarge; + break; + case 6: + size = CSSValueXxLarge; + break; + case 7: + size = CSSValueWebkitXxxLarge; + break; + default: + ASSERT_NOT_REACHED(); } return true; } @@ -138,7 +171,7 @@ bool HTMLFontElement::cssValueFromFontSizeNumber(const String& s, int& size) void HTMLFontElement::parseMappedAttribute(Attribute* attr) { if (attr->name() == sizeAttr) { - int size; + int size = 0; if (cssValueFromFontSizeNumber(attr->value(), size)) addCSSProperty(attr, CSSPropertyFontSize, size); } else if (attr->name() == colorAttr) { |