| 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 64bae95694bafcc6f7cbb224805a7a8969eb86fe..c5871328cc891ac11d8f45916c9ca5a919bc4d8d 100644
|
| --- a/third_party/WebKit/Source/wtf/text/StringImpl.cpp
|
| +++ b/third_party/WebKit/Source/wtf/text/StringImpl.cpp
|
| @@ -651,23 +651,26 @@ upconvert:
|
| return newImpl.release();
|
| }
|
|
|
| -static bool inline localeIdMatchesLang(const AtomicString& localeId, const char* lang)
|
| +ALWAYS_INLINE static bool startsWithIgnoringCase(const StringImpl* stringImpl, const LChar* prefix, unsigned prefixLength)
|
| {
|
| - if (equalIgnoringCase(localeId, lang))
|
| - return true;
|
| - static char localeIdPrefix[4];
|
| - static const char delimeter[4] = "-_@";
|
| + ASSERT(stringImpl);
|
| + if (prefixLength > stringImpl->length())
|
| + return false;
|
| + if (stringImpl->is8Bit())
|
| + return equalIgnoringCase(stringImpl->characters8(), prefix, prefixLength);
|
| + return equalIgnoringCase(stringImpl->characters16(), prefix, prefixLength);
|
| +}
|
|
|
| +static inline bool localeIdMatchesLang(const AtomicString& localeId, const char* lang)
|
| +{
|
| size_t langLength = strlen(lang);
|
| RELEASE_ASSERT(langLength >= 2 && langLength <= 3);
|
| - strncpy(localeIdPrefix, lang, langLength);
|
| - for (int i = 0; i < 3; ++i) {
|
| - localeIdPrefix[langLength] = delimeter[i];
|
| - // case-insensitive comparison
|
| - if (localeId.impl() && localeId.impl()->startsWith(localeIdPrefix, langLength + 1, TextCaseInsensitive))
|
| - return true;
|
| - }
|
| - return false;
|
| + if (!localeId.impl() || !startsWithIgnoringCase(localeId.impl(), reinterpret_cast<const LChar*>(lang), langLength))
|
| + return false;
|
| + if (localeId.impl()->length() == langLength)
|
| + return true;
|
| + const UChar maybeDelimiter = (*localeId.impl())[langLength];
|
| + return maybeDelimiter == '-' || maybeDelimiter == '_' || maybeDelimiter == '@';
|
| }
|
|
|
| typedef int32_t (*icuCaseConverter)(UChar*, int32_t, const UChar*, int32_t, const char*, UErrorCode*);
|
| @@ -1463,20 +1466,15 @@ size_t StringImpl::reverseFindIgnoringCase(StringImpl* matchString, unsigned ind
|
| return reverseFindIgnoringCaseInner(characters16(), matchString->characters16(), index, ourLength, matchLength);
|
| }
|
|
|
| -ALWAYS_INLINE static bool equalInner(const StringImpl* stringImpl, unsigned startOffset, const char* matchString, unsigned matchLength, TextCaseSensitivity caseSensitivity)
|
| +ALWAYS_INLINE static bool equalInner(const StringImpl* stringImpl, unsigned startOffset, const LChar* matchString, unsigned matchLength)
|
| {
|
| ASSERT(stringImpl);
|
| ASSERT(matchLength <= stringImpl->length());
|
| ASSERT(startOffset + matchLength <= stringImpl->length());
|
|
|
| - if (caseSensitivity == TextCaseSensitive) {
|
| - if (stringImpl->is8Bit())
|
| - return equal(stringImpl->characters8() + startOffset, reinterpret_cast<const LChar*>(matchString), matchLength);
|
| - return equal(stringImpl->characters16() + startOffset, reinterpret_cast<const LChar*>(matchString), matchLength);
|
| - }
|
| if (stringImpl->is8Bit())
|
| - return equalIgnoringCase(stringImpl->characters8() + startOffset, reinterpret_cast<const LChar*>(matchString), matchLength);
|
| - return equalIgnoringCase(stringImpl->characters16() + startOffset, reinterpret_cast<const LChar*>(matchString), matchLength);
|
| + return equal(stringImpl->characters8() + startOffset, matchString, matchLength);
|
| + return equal(stringImpl->characters16() + startOffset, matchString, matchLength);
|
| }
|
|
|
| bool StringImpl::startsWith(UChar character) const
|
| @@ -1484,12 +1482,12 @@ bool StringImpl::startsWith(UChar character) const
|
| return m_length && (*this)[0] == character;
|
| }
|
|
|
| -bool StringImpl::startsWith(const char* matchString, unsigned matchLength, TextCaseSensitivity caseSensitivity) const
|
| +bool StringImpl::startsWith(const char* matchString, unsigned matchLength) const
|
| {
|
| ASSERT(matchLength);
|
| if (matchLength > length())
|
| return false;
|
| - return equalInner(this, 0, matchString, matchLength, caseSensitivity);
|
| + return equalInner(this, 0, reinterpret_cast<const LChar*>(matchString), matchLength);
|
| }
|
|
|
| bool StringImpl::endsWith(StringImpl* matchString, TextCaseSensitivity caseSensitivity)
|
| @@ -1509,13 +1507,12 @@ bool StringImpl::endsWith(UChar character) const
|
| return m_length && (*this)[m_length - 1] == character;
|
| }
|
|
|
| -bool StringImpl::endsWith(const char* matchString, unsigned matchLength, TextCaseSensitivity caseSensitivity) const
|
| +bool StringImpl::endsWith(const char* matchString, unsigned matchLength) const
|
| {
|
| ASSERT(matchLength);
|
| if (matchLength > length())
|
| return false;
|
| - unsigned startOffset = length() - matchLength;
|
| - return equalInner(this, startOffset, matchString, matchLength, caseSensitivity);
|
| + return equalInner(this, length() - matchLength, reinterpret_cast<const LChar*>(matchString), matchLength);
|
| }
|
|
|
| PassRefPtr<StringImpl> StringImpl::replace(UChar oldC, UChar newC)
|
|
|