133 lines
4.8 KiB
C++
133 lines
4.8 KiB
C++
// Copyright 2014 The Chromium Authors. All rights reserved.
|
|
// Copyright (C) 2016-2020 Apple Inc. All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are
|
|
// met:
|
|
//
|
|
// * Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
// * Redistributions in binary form must reproduce the above
|
|
// copyright notice, this list of conditions and the following disclaimer
|
|
// in the documentation and/or other materials provided with the
|
|
// distribution.
|
|
// * Neither the name of Google Inc. nor the names of its
|
|
// contributors may be used to endorse or promote products derived from
|
|
// this software without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
#pragma once
|
|
|
|
#include "CSSParserToken.h"
|
|
#include "CSSTokenizerInputStream.h"
|
|
#include <climits>
|
|
#include <wtf/text/StringView.h>
|
|
#include <wtf/text/WTFString.h>
|
|
|
|
namespace WebCore {
|
|
|
|
class CSSTokenizerInputStream;
|
|
class CSSParserObserverWrapper;
|
|
class CSSParserTokenRange;
|
|
|
|
class CSSTokenizer {
|
|
WTF_MAKE_NONCOPYABLE(CSSTokenizer);
|
|
WTF_MAKE_FAST_ALLOCATED;
|
|
public:
|
|
static std::unique_ptr<CSSTokenizer> tryCreate(const String&);
|
|
static std::unique_ptr<CSSTokenizer> tryCreate(const String&, CSSParserObserverWrapper&); // For the inspector
|
|
|
|
explicit CSSTokenizer(const String&);
|
|
CSSTokenizer(const String&, CSSParserObserverWrapper&); // For the inspector
|
|
|
|
CSSParserTokenRange tokenRange() const;
|
|
unsigned tokenCount();
|
|
|
|
Vector<String>&& escapedStringsForAdoption() { return WTFMove(m_stringPool); }
|
|
|
|
private:
|
|
CSSTokenizer(String&&, CSSParserObserverWrapper*, bool* constructionSuccess);
|
|
|
|
CSSParserToken nextToken();
|
|
|
|
UChar consume();
|
|
void reconsume(UChar);
|
|
|
|
CSSParserToken consumeNumericToken();
|
|
CSSParserToken consumeIdentLikeToken();
|
|
CSSParserToken consumeNumber();
|
|
CSSParserToken consumeStringTokenUntil(UChar);
|
|
CSSParserToken consumeUrlToken();
|
|
|
|
void consumeBadUrlRemnants();
|
|
void consumeSingleWhitespaceIfNext();
|
|
void consumeUntilCommentEndFound();
|
|
|
|
bool consumeIfNext(UChar);
|
|
StringView consumeName();
|
|
UChar32 consumeEscape();
|
|
|
|
bool nextTwoCharsAreValidEscape();
|
|
bool nextCharsAreNumber(UChar);
|
|
bool nextCharsAreNumber();
|
|
bool nextCharsAreIdentifier(UChar);
|
|
bool nextCharsAreIdentifier();
|
|
|
|
CSSParserToken blockStart(CSSParserTokenType);
|
|
CSSParserToken blockStart(CSSParserTokenType blockType, CSSParserTokenType, StringView);
|
|
CSSParserToken blockEnd(CSSParserTokenType, CSSParserTokenType startType);
|
|
|
|
CSSParserToken whiteSpace(UChar);
|
|
CSSParserToken leftParenthesis(UChar);
|
|
CSSParserToken rightParenthesis(UChar);
|
|
CSSParserToken leftBracket(UChar);
|
|
CSSParserToken rightBracket(UChar);
|
|
CSSParserToken leftBrace(UChar);
|
|
CSSParserToken rightBrace(UChar);
|
|
CSSParserToken plusOrFullStop(UChar);
|
|
CSSParserToken comma(UChar);
|
|
CSSParserToken hyphenMinus(UChar);
|
|
CSSParserToken asterisk(UChar);
|
|
CSSParserToken lessThan(UChar);
|
|
CSSParserToken solidus(UChar);
|
|
CSSParserToken colon(UChar);
|
|
CSSParserToken semiColon(UChar);
|
|
CSSParserToken hash(UChar);
|
|
CSSParserToken circumflexAccent(UChar);
|
|
CSSParserToken dollarSign(UChar);
|
|
CSSParserToken verticalLine(UChar);
|
|
CSSParserToken tilde(UChar);
|
|
CSSParserToken commercialAt(UChar);
|
|
CSSParserToken reverseSolidus(UChar);
|
|
CSSParserToken asciiDigit(UChar);
|
|
CSSParserToken letterU(UChar);
|
|
CSSParserToken nameStart(UChar);
|
|
CSSParserToken stringStart(UChar);
|
|
CSSParserToken endOfFile(UChar);
|
|
|
|
StringView registerString(const String&);
|
|
|
|
using CodePoint = CSSParserToken (CSSTokenizer::*)(UChar);
|
|
static const CodePoint codePoints[];
|
|
|
|
Vector<CSSParserTokenType, 8> m_blockStack;
|
|
CSSTokenizerInputStream m_input;
|
|
|
|
Vector<CSSParserToken, 32> m_tokens;
|
|
// We only allocate strings when escapes are used.
|
|
Vector<String> m_stringPool;
|
|
};
|
|
|
|
} // namespace WebCore
|