Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(337)

Side by Side Diff: Source/core/css/parser/MediaQueryTokenizer.cpp

Issue 221383003: Fixed MediaQueryTokenizer escape support (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Disabled escape tests on old parser Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/css/parser/MediaQueryTokenizer.h" 6 #include "core/css/parser/MediaQueryTokenizer.h"
7 7
8 namespace WebCore { 8 namespace WebCore {
9 #include "MediaQueryTokenizerCodepoints.cpp" 9 #include "MediaQueryTokenizerCodepoints.cpp"
10 } 10 }
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 return true; 346 return true;
347 } 347 }
348 return false; 348 return false;
349 } 349 }
350 350
351 // http://www.w3.org/TR/css3-syntax/#consume-a-name 351 // http://www.w3.org/TR/css3-syntax/#consume-a-name
352 String MediaQueryTokenizer::consumeName() 352 String MediaQueryTokenizer::consumeName()
353 { 353 {
354 // FIXME: Is this as efficient as it can be? 354 // FIXME: Is this as efficient as it can be?
355 // The possibility of escape chars mandates a copy AFAICT. 355 // The possibility of escape chars mandates a copy AFAICT.
356 Vector<UChar> result; 356 StringBuilder result;
357 while (true) { 357 while (true) {
358 if (isNameChar(m_input.currentInputChar())) { 358 UChar cc = consume();
359 result.append(consume()); 359 if (isNameChar(cc)) {
360 result.append(cc);
360 continue; 361 continue;
361 } 362 }
362 if (nextTwoCharsAreValidEscape()) { 363 if (twoCharsAreValidEscape(cc, m_input.currentInputChar())) {
363 // "consume()" fixes a spec bug.
364 // The first code point should be consumed before consuming the esca ped code point.
365 consume();
366 result.append(consumeEscape()); 364 result.append(consumeEscape());
367 continue; 365 continue;
368 } 366 }
369 return String(result); 367 reconsume(cc);
368 return result.toString();
370 } 369 }
371 } 370 }
372 371
373 // http://www.w3.org/TR/css-syntax-3/#consume-an-escaped-code-point 372 // http://www.w3.org/TR/css-syntax-3/#consume-an-escaped-code-point
374 UChar MediaQueryTokenizer::consumeEscape() 373 UChar MediaQueryTokenizer::consumeEscape()
375 { 374 {
376 UChar cc = consume(); 375 UChar cc = consume();
377 ASSERT(cc != '\n'); 376 ASSERT(cc != '\n');
378 if (isASCIIHexDigit(cc)) { 377 if (isASCIIHexDigit(cc)) {
379 unsigned consumedHexDigits = 1; 378 unsigned consumedHexDigits = 1;
380 String hexChars; 379 StringBuilder hexChars;
381 do { 380 hexChars.append(cc);
381 while (consumedHexDigits < 6 && isASCIIHexDigit(m_input.currentInputChar ())) {
382 cc = consume();
382 hexChars.append(cc); 383 hexChars.append(cc);
383 cc = consume();
384 consumedHexDigits++; 384 consumedHexDigits++;
385 } while (consumedHexDigits < 6 && isASCIIHexDigit(cc)); 385 };
386 bool ok = false; 386 bool ok = false;
387 UChar codePoint = hexChars.toUIntStrict(&ok, 16); 387 UChar codePoint = hexChars.toString().toUIntStrict(&ok, 16);
388 if (!ok) 388 if (!ok)
389 return WTF::Unicode::replacementCharacter; 389 return WTF::Unicode::replacementCharacter;
390 return codePoint; 390 return codePoint;
391 } 391 }
392 392
393 // Replaces NULLs with replacement characters, since we do not perform prepr ocessing 393 // Replaces NULLs with replacement characters, since we do not perform prepr ocessing
394 if (cc == kEndOfFileMarker) 394 if (cc == kEndOfFileMarker)
395 return WTF::Unicode::replacementCharacter; 395 return WTF::Unicode::replacementCharacter;
396 return cc; 396 return cc;
397 } 397 }
398 398
399 bool MediaQueryTokenizer::nextTwoCharsAreValidEscape() 399 bool MediaQueryTokenizer::nextTwoCharsAreValidEscape(unsigned offset)
400 { 400 {
401 if (m_input.leftChars() < 2) 401 if (m_input.leftChars() < offset + 1)
402 return false; 402 return false;
403 return twoCharsAreValidEscape(m_input.peek(1), m_input.peek(2)); 403 return twoCharsAreValidEscape(m_input.peek(offset), m_input.peek(offset + 1) );
404 } 404 }
405 405
406 // http://www.w3.org/TR/css3-syntax/#starts-with-a-number 406 // http://www.w3.org/TR/css3-syntax/#starts-with-a-number
407 bool MediaQueryTokenizer::nextCharsAreNumber() 407 bool MediaQueryTokenizer::nextCharsAreNumber()
408 { 408 {
409 UChar first = m_input.currentInputChar(); 409 UChar first = m_input.currentInputChar();
410 UChar second = m_input.peek(1); 410 UChar second = m_input.peek(1);
411 if (isASCIIDigit(first)) 411 if (isASCIIDigit(first))
412 return true; 412 return true;
413 if (first == '+' || first == '-') 413 if (first == '+' || first == '-')
414 return ((isASCIIDigit(second)) || (second == '.' && isASCIIDigit(m_input .peek(2)))); 414 return ((isASCIIDigit(second)) || (second == '.' && isASCIIDigit(m_input .peek(2))));
415 if (first =='.') 415 if (first =='.')
416 return (isASCIIDigit(second)); 416 return (isASCIIDigit(second));
417 return false; 417 return false;
418 } 418 }
419 419
420 // http://www.w3.org/TR/css3-syntax/#would-start-an-identifier 420 // http://www.w3.org/TR/css3-syntax/#would-start-an-identifier
421 bool MediaQueryTokenizer::nextCharsAreIdentifier() 421 bool MediaQueryTokenizer::nextCharsAreIdentifier()
422 { 422 {
423 UChar firstChar = m_input.currentInputChar(); 423 UChar firstChar = m_input.currentInputChar();
424 if (isNameStart(firstChar) || nextTwoCharsAreValidEscape()) 424 if (isNameStart(firstChar) || nextTwoCharsAreValidEscape(0))
425 return true; 425 return true;
426 426
427 if (firstChar == '-') { 427 if (firstChar == '-') {
428 if (isNameStart(m_input.peek(1))) 428 if (isNameStart(m_input.peek(1)))
429 return true; 429 return true;
430 return nextTwoCharsAreValidEscape(); 430 return nextTwoCharsAreValidEscape(1);
431 } 431 }
432 432
433 return false; 433 return false;
434 } 434 }
435 435
436 } // namespace WebCore 436 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/css/parser/MediaQueryTokenizer.h ('k') | Source/core/css/parser/MediaQueryTokenizerTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698