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 0c1c402f5078b6f2741b5c25016ecd8592a26952..d3a07291b752994886c2f1f7e30386b70acef3da 100644 |
--- a/third_party/WebKit/Source/wtf/text/StringImpl.cpp |
+++ b/third_party/WebKit/Source/wtf/text/StringImpl.cpp |
@@ -1490,16 +1490,60 @@ bool StringImpl::startsWith(const char* matchString, unsigned matchLength) const |
return equalInner(this, 0, reinterpret_cast<const LChar*>(matchString), matchLength); |
} |
-bool StringImpl::endsWith(StringImpl* matchString, TextCaseSensitivity caseSensitivity) |
+ALWAYS_INLINE static bool equalSubstring(const StringImpl* stringImpl, unsigned startOffset, const StringImpl* matchString) |
{ |
+ ASSERT(stringImpl); |
ASSERT(matchString); |
- if (m_length >= matchString->m_length) { |
- unsigned start = m_length - matchString->m_length; |
- if (caseSensitivity == TextCaseSensitive) |
- return find(matchString, start) == start; |
- return findIgnoringCase(matchString, start) == start; |
+ 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 equal(start, matchString->characters8(), matchLength); |
+ return equal(start, matchString->characters16(), matchLength); |
} |
- return false; |
+ const UChar* start = stringImpl->characters16() + startOffset; |
+ if (matchString->is8Bit()) |
+ return equal(start, matchString->characters8(), matchLength); |
+ return equal(start, matchString->characters16(), matchLength); |
+} |
+ |
+bool StringImpl::startsWith(const StringImpl* prefix) const |
+{ |
+ ASSERT(prefix); |
+ if (prefix->length() > length()) |
+ return false; |
+ return equalSubstring(this, 0, prefix); |
+} |
+ |
+ALWAYS_INLINE static bool equalSubstringIgnoringCase(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 equalIgnoringCase(start, matchString->characters8(), matchLength); |
+ return equalIgnoringCase(start, matchString->characters16(), matchLength); |
+ } |
+ const UChar* start = stringImpl->characters16() + startOffset; |
+ if (matchString->is8Bit()) |
+ return equalIgnoringCase(start, matchString->characters8(), matchLength); |
+ return equalIgnoringCase(start, matchString->characters16(), matchLength); |
+} |
+ |
+bool StringImpl::startsWithIgnoringCase(const StringImpl* prefix) const |
+{ |
+ ASSERT(prefix); |
+ if (prefix->length() > length()) |
+ return false; |
+ return equalSubstringIgnoringCase(this, 0, prefix); |
} |
bool StringImpl::endsWith(UChar character) const |
@@ -1515,6 +1559,24 @@ bool StringImpl::endsWith(const char* matchString, unsigned matchLength) const |
return equalInner(this, length() - matchLength, reinterpret_cast<const LChar*>(matchString), matchLength); |
} |
+bool StringImpl::endsWith(const StringImpl* suffix) const |
+{ |
+ ASSERT(suffix); |
+ unsigned suffixLength = suffix->length(); |
+ if (suffixLength > length()) |
+ return false; |
+ return equalSubstring(this, length() - suffixLength, suffix); |
+} |
+ |
+bool StringImpl::endsWithIgnoringCase(const StringImpl* suffix) const |
+{ |
+ ASSERT(suffix); |
+ unsigned suffixLength = suffix->length(); |
+ if (suffixLength > length()) |
+ return false; |
+ return equalSubstringIgnoringCase(this, length() - suffixLength, suffix); |
+} |
+ |
PassRefPtr<StringImpl> StringImpl::replace(UChar oldC, UChar newC) |
{ |
if (oldC == newC) |