| Index: ios/third_party/blink/src/html_character_provider.h
|
| diff --git a/ios/third_party/blink/src/html_character_provider.h b/ios/third_party/blink/src/html_character_provider.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f6dd4271b779512ca7f821010b82f7adedf8cafc
|
| --- /dev/null
|
| +++ b/ios/third_party/blink/src/html_character_provider.h
|
| @@ -0,0 +1,166 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef IOS_THIRD_PARTY_BLINK_SRC_HTML_CHARACTER_PROVIDER_H_
|
| +#define IOS_THIRD_PARTY_BLINK_SRC_HTML_CHARACTER_PROVIDER_H_
|
| +
|
| +#include "ios/third_party/blink/src/html_tokenizer_adapter.h"
|
| +
|
| +namespace WebCore {
|
| +
|
| +const LChar kEndOfFileMarker = 0;
|
| +
|
| +// CharacterProvider provides input characters to WebCore::HTMLTokenizer.
|
| +// It replaces WebCore::SegmentedString (which sits ontop of WTF::String).
|
| +class CharacterProvider {
|
| + WTF_MAKE_NONCOPYABLE(CharacterProvider);
|
| +
|
| +public:
|
| + CharacterProvider()
|
| + : _totalBytes(0)
|
| + , _remainingBytes(0)
|
| + , _singleBytePtr(nullptr)
|
| + , _doubleBytePtr(nullptr)
|
| + , _littleEndian(false)
|
| + {
|
| + }
|
| +
|
| + void setContents(const LChar* str, size_t numberOfBytes)
|
| + {
|
| + _totalBytes = numberOfBytes;
|
| + _remainingBytes = numberOfBytes;
|
| + _singleBytePtr = str;
|
| + _doubleBytePtr = nullptr;
|
| + _littleEndian = false;
|
| + }
|
| +
|
| + void setContents(const UChar* str, size_t numberOfBytes)
|
| + {
|
| + _totalBytes = numberOfBytes;
|
| + _remainingBytes = numberOfBytes;
|
| + _singleBytePtr = nullptr;
|
| + _doubleBytePtr = str;
|
| + _littleEndian = false;
|
| + }
|
| +
|
| + void clear()
|
| + {
|
| + _totalBytes = 0;
|
| + _remainingBytes = 0;
|
| + _singleBytePtr = nullptr;
|
| + _doubleBytePtr = nullptr;
|
| + _littleEndian = false;
|
| + }
|
| +
|
| + bool startsWith(const LChar* str,
|
| + size_t byteCount,
|
| + bool caseInsensitive = false) const
|
| + {
|
| + if (!str || byteCount > _remainingBytes)
|
| + return false;
|
| +
|
| + for (size_t index = 0; index < byteCount; ++index) {
|
| + UChar lhs = characterAtIndex(index);
|
| + UChar rhs = str[index];
|
| +
|
| + if (caseInsensitive) {
|
| + if (isASCIIUpper(lhs))
|
| + lhs = toLowerCase(lhs);
|
| +
|
| + if (isASCIIUpper(rhs))
|
| + rhs = toLowerCase(rhs);
|
| + }
|
| +
|
| + if (lhs != rhs)
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| + }
|
| +
|
| + inline UChar currentCharacter() const
|
| + {
|
| + return characterAtIndex(0);
|
| + }
|
| +
|
| + inline UChar nextCharacter()
|
| + {
|
| + advanceBytePointer();
|
| + return characterAtIndex(0);
|
| + }
|
| +
|
| + inline void next()
|
| + {
|
| + advanceBytePointer();
|
| + }
|
| +
|
| + inline bool isEmpty() const
|
| + {
|
| + return !_remainingBytes;
|
| + }
|
| +
|
| + inline size_t remainingBytes() const
|
| + {
|
| + return _remainingBytes;
|
| + }
|
| +
|
| + inline size_t bytesProvided() const
|
| + {
|
| + return _totalBytes - _remainingBytes;
|
| + }
|
| +
|
| + inline void setLittleEndian()
|
| + {
|
| + _littleEndian = true;
|
| + }
|
| +
|
| +private:
|
| + void advanceBytePointer()
|
| + {
|
| + --_remainingBytes;
|
| + if (!_remainingBytes)
|
| + return;
|
| +
|
| + if (_singleBytePtr)
|
| + ++_singleBytePtr;
|
| + else {
|
| + DCHECK(_doubleBytePtr);
|
| + ++_doubleBytePtr;
|
| + }
|
| + }
|
| +
|
| + UChar characterAtIndex(size_t index) const
|
| + {
|
| + if (!_remainingBytes) {
|
| + // There is a quirk in the blink implementation wherein the empty state
|
| + // is not set on the source until next() has been called when
|
| + // _remainingBytes is zero. In this case, return kEndOfFileMarker.
|
| + return kEndOfFileMarker;
|
| + }
|
| +
|
| + ASSERT(_singleBytePtr || _doubleBytePtr);
|
| +
|
| + UChar character = kEndOfFileMarker;
|
| + if (_singleBytePtr)
|
| + character = _singleBytePtr[index];
|
| + else
|
| + character = _doubleBytePtr[index];
|
| +
|
| + if (_littleEndian)
|
| + character = ByteSwap(character);
|
| +
|
| + return character;
|
| + }
|
| +
|
| +private:
|
| + size_t _totalBytes;
|
| + size_t _remainingBytes;
|
| + const LChar* _singleBytePtr;
|
| + const UChar* _doubleBytePtr;
|
| + bool _littleEndian;
|
| +};
|
| +
|
| +}
|
| +
|
| +#endif // IOS_THIRD_PARTY_BLINK_SRC_HTML_CHARACTER_PROVIDER_H_
|
|
|