| Index: Source/core/css/parser/MediaQueryTokenizer.cpp
|
| diff --git a/Source/core/css/parser/MediaQueryTokenizer.cpp b/Source/core/css/parser/MediaQueryTokenizer.cpp
|
| index 3e0df5872364ae6c1ec6676549a1c2f69a1b45e7..4e09cc260fed2d91b5c029d78e57d979e2b512c2 100644
|
| --- a/Source/core/css/parser/MediaQueryTokenizer.cpp
|
| +++ b/Source/core/css/parser/MediaQueryTokenizer.cpp
|
| @@ -353,20 +353,19 @@ String MediaQueryTokenizer::consumeName()
|
| {
|
| // FIXME: Is this as efficient as it can be?
|
| // The possibility of escape chars mandates a copy AFAICT.
|
| - Vector<UChar> result;
|
| + StringBuilder result;
|
| while (true) {
|
| - if (isNameChar(m_input.currentInputChar())) {
|
| - result.append(consume());
|
| + UChar cc = consume();
|
| + if (isNameChar(cc)) {
|
| + result.append(cc);
|
| continue;
|
| }
|
| - if (nextTwoCharsAreValidEscape()) {
|
| - // "consume()" fixes a spec bug.
|
| - // The first code point should be consumed before consuming the escaped code point.
|
| - consume();
|
| + if (twoCharsAreValidEscape(cc, m_input.currentInputChar())) {
|
| result.append(consumeEscape());
|
| continue;
|
| }
|
| - return String(result);
|
| + reconsume(cc);
|
| + return result.toString();
|
| }
|
| }
|
|
|
| @@ -377,14 +376,15 @@ UChar MediaQueryTokenizer::consumeEscape()
|
| ASSERT(cc != '\n');
|
| if (isASCIIHexDigit(cc)) {
|
| unsigned consumedHexDigits = 1;
|
| - String hexChars;
|
| - do {
|
| - hexChars.append(cc);
|
| + StringBuilder hexChars;
|
| + hexChars.append(cc);
|
| + while (consumedHexDigits < 6 && isASCIIHexDigit(m_input.currentInputChar())) {
|
| cc = consume();
|
| + hexChars.append(cc);
|
| consumedHexDigits++;
|
| - } while (consumedHexDigits < 6 && isASCIIHexDigit(cc));
|
| + };
|
| bool ok = false;
|
| - UChar codePoint = hexChars.toUIntStrict(&ok, 16);
|
| + UChar codePoint = hexChars.toString().toUIntStrict(&ok, 16);
|
| if (!ok)
|
| return WTF::Unicode::replacementCharacter;
|
| return codePoint;
|
| @@ -396,11 +396,11 @@ UChar MediaQueryTokenizer::consumeEscape()
|
| return cc;
|
| }
|
|
|
| -bool MediaQueryTokenizer::nextTwoCharsAreValidEscape()
|
| +bool MediaQueryTokenizer::nextTwoCharsAreValidEscape(unsigned offset)
|
| {
|
| - if (m_input.leftChars() < 2)
|
| + if (m_input.leftChars() < offset + 1)
|
| return false;
|
| - return twoCharsAreValidEscape(m_input.peek(1), m_input.peek(2));
|
| + return twoCharsAreValidEscape(m_input.peek(offset), m_input.peek(offset + 1));
|
| }
|
|
|
| // http://www.w3.org/TR/css3-syntax/#starts-with-a-number
|
| @@ -421,13 +421,13 @@ bool MediaQueryTokenizer::nextCharsAreNumber()
|
| bool MediaQueryTokenizer::nextCharsAreIdentifier()
|
| {
|
| UChar firstChar = m_input.currentInputChar();
|
| - if (isNameStart(firstChar) || nextTwoCharsAreValidEscape())
|
| + if (isNameStart(firstChar) || nextTwoCharsAreValidEscape(0))
|
| return true;
|
|
|
| if (firstChar == '-') {
|
| if (isNameStart(m_input.peek(1)))
|
| return true;
|
| - return nextTwoCharsAreValidEscape();
|
| + return nextTwoCharsAreValidEscape(1);
|
| }
|
|
|
| return false;
|
|
|