| Index: third_party/WebKit/Source/wtf/text/StringImpl.cpp
|
| diff --git a/third_party/WebKit/Source/wtf/text/StringImpl.cpp b/third_party/WebKit/Source/wtf/text/StringImpl.cpp
|
| index 3eb20fafa09863a5f2b07ee43fe90946ec56d42f..ef28e2bf4a2e01fcc1f29acdaefeb7d7f9854f48 100644
|
| --- a/third_party/WebKit/Source/wtf/text/StringImpl.cpp
|
| +++ b/third_party/WebKit/Source/wtf/text/StringImpl.cpp
|
| @@ -1338,6 +1338,51 @@ size_t StringImpl::findIgnoringCase(StringImpl* matchString, unsigned index)
|
| return findIgnoringCaseInner(characters16() + index, matchString->characters16(), index, searchLength, matchLength);
|
| }
|
|
|
| +template <typename SearchCharacterType, typename MatchCharacterType>
|
| +ALWAYS_INLINE static size_t findIgnoringASCIICaseInner(const SearchCharacterType* searchCharacters, const MatchCharacterType* matchCharacters, unsigned index, unsigned searchLength, unsigned matchLength)
|
| +{
|
| + // delta is the number of additional times to test; delta == 0 means test only once.
|
| + unsigned delta = searchLength - matchLength;
|
| +
|
| + unsigned i = 0;
|
| + // keep looping until we match
|
| + while (!equalIgnoringASCIICase(searchCharacters + i, matchCharacters, matchLength)) {
|
| + if (i == delta)
|
| + return kNotFound;
|
| + ++i;
|
| + }
|
| + return index + i;
|
| +}
|
| +
|
| +size_t StringImpl::findIgnoringASCIICase(StringImpl* matchString, unsigned index)
|
| +{
|
| + // Check for null or empty string to match against
|
| + if (!matchString)
|
| + return kNotFound;
|
| + unsigned matchLength = matchString->length();
|
| + if (!matchLength)
|
| + return min(index, length());
|
| +
|
| + // Check index & matchLength are in range.
|
| + if (index > length())
|
| + return kNotFound;
|
| + unsigned searchLength = length() - index;
|
| + if (matchLength > searchLength)
|
| + return kNotFound;
|
| +
|
| + if (is8Bit()) {
|
| + const LChar* searchStart = characters8() + index;
|
| + if (matchString->is8Bit())
|
| + return findIgnoringASCIICaseInner(searchStart, matchString->characters8(), index, searchLength, matchLength);
|
| + return findIgnoringASCIICaseInner(searchStart, matchString->characters16(), index, searchLength, matchLength);
|
| + }
|
| +
|
| + const UChar* searchStart = characters16() + index;
|
| + if (matchString->is8Bit())
|
| + return findIgnoringASCIICaseInner(searchStart, matchString->characters8(), index, searchLength, matchLength);
|
| + return findIgnoringASCIICaseInner(searchStart, matchString->characters16(), index, searchLength, matchLength);
|
| +}
|
| +
|
| size_t StringImpl::findNextLineStart(unsigned index)
|
| {
|
| if (is8Bit())
|
| @@ -1505,6 +1550,34 @@ bool StringImpl::startsWithIgnoringCase(const StringImpl* prefix) const
|
| return equalSubstringIgnoringCase(this, 0, prefix);
|
| }
|
|
|
| +ALWAYS_INLINE static bool equalSubstringIgnoringASCIICase(const StringImpl* stringImpl, unsigned startOffset, const StringImpl* matchString)
|
| +{
|
| + ASSERT(stringImpl);
|
| + ASSERT(matchString);
|
| + ASSERT(matchString->length() <= stringImpl->length());
|
| + ASSERT(startOffset + matchString->length() <= stringImpl->length());
|
| +
|
| + unsigned matchLength = matchString->length();
|
| + if (stringImpl->is8Bit()) {
|
| + const LChar* start = stringImpl->characters8() + startOffset;
|
| + if (matchString->is8Bit())
|
| + return equalIgnoringASCIICase(start, matchString->characters8(), matchLength);
|
| + return equalIgnoringASCIICase(start, matchString->characters16(), matchLength);
|
| + }
|
| + const UChar* start = stringImpl->characters16() + startOffset;
|
| + if (matchString->is8Bit())
|
| + return equalIgnoringASCIICase(start, matchString->characters8(), matchLength);
|
| + return equalIgnoringASCIICase(start, matchString->characters16(), matchLength);
|
| +}
|
| +
|
| +bool StringImpl::startsWithIgnoringASCIICase(const StringImpl* prefix) const
|
| +{
|
| + ASSERT(prefix);
|
| + if (prefix->length() > length())
|
| + return false;
|
| + return equalSubstringIgnoringASCIICase(this, 0, prefix);
|
| +}
|
| +
|
| bool StringImpl::endsWith(UChar character) const
|
| {
|
| return m_length && (*this)[m_length - 1] == character;
|
| @@ -1536,6 +1609,15 @@ bool StringImpl::endsWithIgnoringCase(const StringImpl* suffix) const
|
| return equalSubstringIgnoringCase(this, length() - suffixLength, suffix);
|
| }
|
|
|
| +bool StringImpl::endsWithIgnoringASCIICase(const StringImpl* suffix) const
|
| +{
|
| + ASSERT(suffix);
|
| + unsigned suffixLength = suffix->length();
|
| + if (suffixLength > length())
|
| + return false;
|
| + return equalSubstringIgnoringASCIICase(this, length() - suffixLength, suffix);
|
| +}
|
| +
|
| PassRefPtr<StringImpl> StringImpl::replace(UChar oldC, UChar newC)
|
| {
|
| if (oldC == newC)
|
|
|