From c8dd1d77918ca62bbdaa8439a17cc74a047cb0e4 Mon Sep 17 00:00:00 2001 From: iska Date: Tue, 24 Nov 2015 23:01:11 +0100 Subject: [PATCH] Fix consume CSS identifier input stream method http://www.w3.org/TR/CSS21/syndata.html#characters https://drafts.csswg.org/css-syntax/#consume-name --- HTMLKit/CSSCodePoints.h | 19 +++++++++++++++++++ HTMLKit/CSSInputStream.m | 6 ++++++ 2 files changed, 25 insertions(+) diff --git a/HTMLKit/CSSCodePoints.h b/HTMLKit/CSSCodePoints.h index 93ae3ef..0d1a0fc 100644 --- a/HTMLKit/CSSCodePoints.h +++ b/HTMLKit/CSSCodePoints.h @@ -113,6 +113,25 @@ NS_INLINE BOOL isValidEscapedCodePoint(UTF32Char codePoint) codePoint <= 0x10FFFF); } +NS_INLINE BOOL isValidIdentifierStart(UTF32Char first, UTF32Char second, UTF32Char third) +{ + if (first == HYPHEN_MINUS) { + if (isNameStart(second) || + second == HYPHEN_MINUS || + isValidEscape(second, third)) { + return YES; + } else { + return NO; + } + } else if (isNameStart(first)) { + return YES; + } else if (first == REVERSE_SOLIDUS) { + return isValidEscape(first, second); + } else { + return NO; + } +} + NS_INLINE void AppendCodePoint(CFMutableStringRef string, UTF32Char codePoint) { UniChar pair[2]; diff --git a/HTMLKit/CSSInputStream.m b/HTMLKit/CSSInputStream.m index e9825a7..5a024bd 100644 --- a/HTMLKit/CSSInputStream.m +++ b/HTMLKit/CSSInputStream.m @@ -26,6 +26,12 @@ { CFMutableStringRef value = CFStringCreateMutable(kCFAllocatorDefault, 0); + if (!isValidIdentifierStart([self inputCharacterPointAtOffset:0], + [self inputCharacterPointAtOffset:1], + [self inputCharacterPointAtOffset:2])) { + return nil; + } + while (YES) { UTF32Char codePoint = [self consumeNextInputCharacter]; if (codePoint == EOF) {